diff --git a/contracts/.commitlintrc.yml b/.commitlintrc.yml similarity index 100% rename from contracts/.commitlintrc.yml rename to .commitlintrc.yml diff --git a/contracts/.czrc b/.czrc similarity index 100% rename from contracts/.czrc rename to .czrc diff --git a/contracts/.editorconfig b/.editorconfig similarity index 100% rename from contracts/.editorconfig rename to .editorconfig diff --git a/contracts/.env.example b/.env.example similarity index 100% rename from contracts/.env.example rename to .env.example diff --git a/contracts/.eslintrc.yml b/.eslintrc.yml similarity index 100% rename from contracts/.eslintrc.yml rename to .eslintrc.yml diff --git a/contracts/.gas-snapshot b/.gas-snapshot similarity index 100% rename from contracts/.gas-snapshot rename to .gas-snapshot diff --git a/.github/ISSUE_TEMPLATE/1.bug_report.yml b/.github/ISSUE_TEMPLATE/1.bug_report.yml index 29ed65e..904d24c 100644 --- a/.github/ISSUE_TEMPLATE/1.bug_report.yml +++ b/.github/ISSUE_TEMPLATE/1.bug_report.yml @@ -1,26 +1,30 @@ name: Bug Report description: Create a bug report for the Hypercerts protocol -labels: ['type:bug'] +labels: ["type:bug"] body: - type: markdown attributes: - value: If you leave out sections there is a high likelihood it will be moved to the [GitHub Discussions](https://github.com/Network-Goods/hypercerts/discussions). + value: + If you leave out sections there is a high likelihood it will be moved to the [GitHub + Discussions](https://github.com/Network-Goods/hypercerts/discussions). - type: dropdown attributes: label: Which area(s) of Hypercerts are affected? (leave empty if unsure) multiple: true options: - - 'Smart Contracts' - - 'SDK' - - 'Frontend Dapp' - - 'Docs' - - 'The Graph integration' - - 'OpenZeppelin Defender integration' - - 'Other' + - "Smart Contracts" + - "SDK" + - "Frontend Dapp" + - "Docs" + - "The Graph integration" + - "OpenZeppelin Defender integration" + - "Other" - type: textarea attributes: label: To Reproduce - description: Steps to reproduce the behavior, please provide a clear description of how to reproduce the issue. Screenshots can be provided in the issue body below. + description: + Steps to reproduce the behavior, please provide a clear description of how to reproduce the issue. Screenshots + can be provided in the issue body below. validations: required: true - type: textarea @@ -37,4 +41,6 @@ body: required: true - type: markdown attributes: - value: Before posting the issue go through the steps you've written down to make sure the steps provided are detailed and clear. Contributors should be able to follow the steps provided in order to reproduce the bug. + value: + Before posting the issue go through the steps you've written down to make sure the steps provided are detailed + and clear. Contributors should be able to follow the steps provided in order to reproduce the bug. diff --git a/.github/ISSUE_TEMPLATE/2.feature_request.yml b/.github/ISSUE_TEMPLATE/2.feature_request.yml index 78d90f4..5212b32 100644 --- a/.github/ISSUE_TEMPLATE/2.feature_request.yml +++ b/.github/ISSUE_TEMPLATE/2.feature_request.yml @@ -1,6 +1,6 @@ name: Feature Request description: Create a feature request -labels: 'type:featurerequest' +labels: ["type:featurerequest"] body: - type: markdown attributes: diff --git a/.github/ISSUE_TEMPLATE/3.docs_request.yml b/.github/ISSUE_TEMPLATE/3.docs_request.yml index 948be8b..5397cdc 100644 --- a/.github/ISSUE_TEMPLATE/3.docs_request.yml +++ b/.github/ISSUE_TEMPLATE/3.docs_request.yml @@ -1,13 +1,13 @@ -name: 'Docs Request' +name: "Docs Request" description: A request to update or improve documentation -title: 'Docs: ' -labels: - - 'category:docs' +title: "Docs: " +labels: ["category:docs"] body: - type: textarea attributes: label: What is the improvement or update you wish to see? - description: 'Example: I would like to see more examples of how to use the SDK to detect hypercert claim collisions.' + description: + "Example: I would like to see more examples of how to use the SDK to detect hypercert claim collisions." validations: required: true - type: textarea @@ -19,6 +19,6 @@ body: - type: input attributes: label: Does the docs page already exist? Please link to it. - description: 'Example: https://hypercerts.org/docs/api-reference/' + description: "Example: https://hypercerts.org/docs/api-reference/" validations: required: false diff --git a/.github/ISSUE_TEMPLATE/9.other.yml b/.github/ISSUE_TEMPLATE/9.other.yml index bac33a6..129b9a7 100644 --- a/.github/ISSUE_TEMPLATE/9.other.yml +++ b/.github/ISSUE_TEMPLATE/9.other.yml @@ -1,4 +1,4 @@ -name: 'Other' +name: "Other" description: For internal use only body: - type: textarea diff --git a/.github/workflows/ci-default.yml b/.github/workflows/ci-default.yml index 37fab32..dc2f4f4 100644 --- a/.github/workflows/ci-default.yml +++ b/.github/workflows/ci-default.yml @@ -3,11 +3,18 @@ name: ci-default env: INFURA_API_KEY: ${{ secrets.INFURA_API_KEY }} ALCHEMY_API_KEY: ${{ secrets.ALCHEMY_API_KEY }} + FOUNDRY_PROFILE: "ci" # Trigger the workflow when: on: - # A push occurs to one of the matched branches. + pull_request: + branches: + - "main" + - "dev" push: + branches: + - "main" + - "dev" # Allows you to run this workflow manually from the Actions tab workflow_dispatch: @@ -20,42 +27,97 @@ jobs: lint-and-test: # NOTE: This name appears in GitHub's Checks API. name: test - environment: testing runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 with: - # Check out pull request's HEAD commit instead of the merge commit to - # prevent gitlint from failing due to too long commit message titles, - # e.g. "Merge 3e621938d65caaa67f8e35d145335d889d470fc8 into 19a39b2f66cd7a165082d1486b2f1eb36ec2354a". - ref: ${{ github.event.pull_request.head.sha }} - # Fetch all history so gitlint can check the relevant commits. - fetch-depth: "0" + submodules: "recursive" + fetch-depth: 0 + + - name: Log content of lib/openzeppelin-contracts-upgradeable/package.json + run: | + cat lib/openzeppelin-contracts-upgradeable/package.json + + - name: Debug submodule state + run: | + echo "1. Current directory structure:" + ls -la + echo "\n2. Content of .gitmodules:" + cat .gitmodules + echo "\n3. Submodule status before:" + git submodule status + echo "\n4. Initialize submodules:" + git submodule update --init --recursive + echo "\n5. Submodule status after init:" + git submodule status + echo "\n6. List lib directory:" + ls -la lib/ + echo "\n7. Entering submodule:" + cd lib/openzeppelin-contracts-upgradeable + git remote -v + git fetch --all --tags --force + git tag -l + git checkout 2d081f24cac1a867f6f73d512f2022e1fa987854 + cd ../.. + + - name: Debug tags + run: | + cd lib/openzeppelin-contracts-upgradeable + git tag -l + cd ../.. + + - name: Debug OpenZeppelin version + run: | + cd lib/openzeppelin-contracts-upgradeable + echo "Current git status:" + git status + echo "\nCurrent commit hash:" + git rev-parse HEAD + echo "\nCurrent tag:" + git describe --tags + echo "\nAvailable branches:" + git branch -a + + - name: Debug directory structure + run: | + ls -la lib/openzeppelin-contracts-upgradeable/contracts/utils/cryptography/ + pwd + + - name: + Log content of lib/openzeppelin-contracts-upgradeable/contracts/utils/cryptography/MerkleProofUpgradeable.sol + run: | + cat lib/openzeppelin-contracts-upgradeable/contracts/utils/cryptography/MerkleProofUpgradeable.sol + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + - run: corepack enable + - name: Set up Node.js 18 uses: actions/setup-node@v4 with: cache: "pnpm" - - name: Install Foundry - uses: foundry-rs/foundry-toolchain@v1 - - name: Install + - name: Install dependencies run: | - pnpm install + pnpm i # Always run this step so that all linting errors can be seen at once. if: always() - - name: Build + + - name: Build packages run: | - pnpm run build + pnpm build # Always run this step so that all linting errors can be seen at once. if: always() - - name: Lint + + - name: Lint code run: | - pnpm run lint + pnpm lint # Always run this step so that all linting errors can be seen at once. if: always() - - name: Test + + - name: Test contracts run: | pnpm test # Always run this step so that all linting errors can be seen at once. diff --git a/contracts/.github/workflows/slither.yml b/.github/workflows/slither.yml similarity index 86% rename from contracts/.github/workflows/slither.yml rename to .github/workflows/slither.yml index 1f5bb71..e9293c4 100644 --- a/contracts/.github/workflows/slither.yml +++ b/.github/workflows/slither.yml @@ -1,14 +1,7 @@ name: Static Analysis on: - push: - branches: - - "main" - - "dev" - pull_request: - branches: - - "main" - - "dev" + workflow_dispatch: jobs: analyze: diff --git a/.gitignore b/.gitignore index f979d2f..22145fe 100644 --- a/.gitignore +++ b/.gitignore @@ -1,46 +1,44 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. +# directories +node_modules +**/artifacts +**/build +**/cache +**/coverage +**/contracts +**/.coverage_artifacts +**/.coverage_cache +**/.coverage_contracts +**/dist +**/deployments/localhost +**/out* +**/typechain +**/types +**/cache** +**/abi +**/rollup-cache -# dependencies -**/node_modules/ -.pnp/ +# files +*.env +*.log .pnp.* +coverage.json npm-debug.log* -.pnpm-debug.log* yarn-debug.log* yarn-error.log* -.yarn/* -!.yarn/patches -!.yarn/releases -!.yarn/plugins -!.yarn/sdks -!.yarn/versions - -# testing -coverage/ -.eslintcache - -# builds -out/ -build/ -dist/ -.turbo/ -.next/ -.docusaurus/ - -# files +**/.openzeppelin/*-31337.json .DS_Store -*.pem -*.env -.env*.local -*.log -coverage.json +/.idea +test*.svg +lcov.info + +# broadcasts +!/broadcast +/broadcast/* +/broadcast/*/31337/ -# typescript -*.tsbuildinfo -next-env.d.ts -.idea/ -.vscode/ -graph/.test.subgraph.yaml +# platform specific +shell.nix -# playwright -playwright-report/ +# IDES +.idea +.vscode \ No newline at end of file diff --git a/.gitmodules b/.gitmodules index e69de29..7a2a15b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -0,0 +1,12 @@ +[submodule "lib/murky"] + path = lib/murky + url = https://github.com/dmfxyz/murky +[submodule "lib/openzeppelin-contracts-upgradeable"] + path = lib/openzeppelin-contracts-upgradeable + url = https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable +[submodule "lib/forge-std"] + path = lib/forge-std + url = https://github.com/foundry-rs/forge-std +[submodule "lib/prb-test"] + path = lib/prb-test + url = https://github.com/paulrberg/prb-test/ diff --git a/contracts/.gitpod.yml b/.gitpod.yml similarity index 100% rename from contracts/.gitpod.yml rename to .gitpod.yml diff --git a/contracts/.husky/.gitignore b/.husky/.gitignore similarity index 100% rename from contracts/.husky/.gitignore rename to .husky/.gitignore diff --git a/contracts/.husky/commit-msg b/.husky/commit-msg similarity index 100% rename from contracts/.husky/commit-msg rename to .husky/commit-msg diff --git a/.husky/pre-commit b/.husky/pre-commit index 9b28a11..4ef4148 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1,6 @@ -#!/usr/bin/env sh -. "$(dirname -- "$0")/_/husky.sh" +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" -pnpm format:staged +pnpm dlx lint-staged +forge snapshot +pnpm docs diff --git a/.lintstagedignore b/.lintstagedignore deleted file mode 100644 index 339baae..0000000 --- a/.lintstagedignore +++ /dev/null @@ -1,10 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# root config -playwright.config.ts - -# patterns -graph/generated/ -e2e -docs -vendor \ No newline at end of file diff --git a/.lintstagedrc b/.lintstagedrc index ad678de..0e2564c 100644 --- a/.lintstagedrc +++ b/.lintstagedrc @@ -1,7 +1,4 @@ { - "**/*.{js,jsx,ts,tsx,sol}": [ - "eslint --ignore-path .gitignore --ignore-path .lintstagedignore", - "prettier --write" - ], - "**/*.{md,json}": ["prettier --write"] + "*.{js,json,md,ts,yml}": ["prettier --config ./.prettierrc.yml --write"], + "*.{sol}": ["forge fmt"] } diff --git a/contracts/.npmignore b/.npmignore similarity index 100% rename from contracts/.npmignore rename to .npmignore diff --git a/.npmrc b/.npmrc deleted file mode 100644 index 4c67914..0000000 --- a/.npmrc +++ /dev/null @@ -1 +0,0 @@ -link-workspace-packages=false \ No newline at end of file diff --git a/contracts/.openzeppelin/arbitrum-one.json b/.openzeppelin/arbitrum-one.json similarity index 100% rename from contracts/.openzeppelin/arbitrum-one.json rename to .openzeppelin/arbitrum-one.json diff --git a/contracts/.openzeppelin/celo.json b/.openzeppelin/celo.json similarity index 100% rename from contracts/.openzeppelin/celo.json rename to .openzeppelin/celo.json diff --git a/contracts/.openzeppelin/goerli.json b/.openzeppelin/goerli.json similarity index 100% rename from contracts/.openzeppelin/goerli.json rename to .openzeppelin/goerli.json diff --git a/contracts/.openzeppelin/optimism.json b/.openzeppelin/optimism.json similarity index 100% rename from contracts/.openzeppelin/optimism.json rename to .openzeppelin/optimism.json diff --git a/contracts/.openzeppelin/sepolia.json b/.openzeppelin/sepolia.json similarity index 100% rename from contracts/.openzeppelin/sepolia.json rename to .openzeppelin/sepolia.json diff --git a/contracts/.openzeppelin/unknown-314159.json b/.openzeppelin/unknown-314159.json similarity index 100% rename from contracts/.openzeppelin/unknown-314159.json rename to .openzeppelin/unknown-314159.json diff --git a/contracts/.openzeppelin/unknown-421614.json b/.openzeppelin/unknown-421614.json similarity index 100% rename from contracts/.openzeppelin/unknown-421614.json rename to .openzeppelin/unknown-421614.json diff --git a/contracts/.openzeppelin/unknown-8453.json b/.openzeppelin/unknown-8453.json similarity index 100% rename from contracts/.openzeppelin/unknown-8453.json rename to .openzeppelin/unknown-8453.json diff --git a/contracts/.openzeppelin/unknown-84532.json b/.openzeppelin/unknown-84532.json similarity index 100% rename from contracts/.openzeppelin/unknown-84532.json rename to .openzeppelin/unknown-84532.json diff --git a/.prettierignore b/.prettierignore index 2ec9d21..87bdd5b 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,42 +1,31 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. +# directories +.yarn/ +**/.coverage_artifacts +**/.coverage_cache +**/.coverage_contracts +**/artifacts +**/broadcast +**/build +**/cache +**/cache_hardhat +**/coverage +**/dist +**/lib +**/node_modules +**/out +**/types +**/deployments +**/.openzeppelin +**/docs +**/abi -# dependencies -**/node_modules/ -.pnp/ +# files +*.env +*.log +*.sol .pnp.* +coverage.json npm-debug.log* -.pnpm-debug.log* yarn-debug.log* yarn-error.log* -.yarn/* -!.yarn/patches -!.yarn/releases -!.yarn/plugins -!.yarn/sdks -!.yarn/versions - -# testing -coverage/ -.eslintcache - -# builds -out/ -build/ -.turbo/ -.next/ -.docusaurus/ -.graphclient/ - -# files .DS_Store -*.pem -*.env -.env*.local -*.log -coverage.json - -# typescript -*.tsbuildinfo -next-env.d.ts -.idea/ -.vscode/ \ No newline at end of file diff --git a/.prettierrc.json b/.prettierrc.json deleted file mode 100644 index bf357fb..0000000 --- a/.prettierrc.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "trailingComma": "all" -} diff --git a/contracts/.prettierrc.yml b/.prettierrc.yml similarity index 100% rename from contracts/.prettierrc.yml rename to .prettierrc.yml diff --git a/contracts/.solhint.json b/.solhint.json similarity index 100% rename from contracts/.solhint.json rename to .solhint.json diff --git a/contracts/.solhintignore b/.solhintignore similarity index 100% rename from contracts/.solhintignore rename to .solhintignore diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ab3bf87..9128992 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,11 +1,13 @@ # Contributing Guidelines -Thank you for your interest in contributing to Hypercerts! There are many ways to contribute, and this document should not be considered encompassing. +Thank you for your interest in contributing to Hypercerts! There are many ways to contribute, and this document should +not be considered encompassing. -If you have a general question on how to use and deploy our software, please read our [Documentation](https://hypercerts.org/docs/) or join our [Hypercerts community server on Discord](https://testnet.hypercerts.org/discord). +If you have a general question on how to use and deploy our software, please read our +[Documentation](https://hypercerts.org/docs/) or join our +[Hypercerts community server on Discord](https://testnet.hypercerts.org/discord). -For concrete feature requests and/or bug reports, please file an issue in this -repository as described below. +For concrete feature requests and/or bug reports, please file an issue in this repository as described below. @@ -19,26 +21,36 @@ repository as described below. [Development](#development) -- [Building](#building) -- [Contributing Code](#contributing-code) -- [Contributing Documentation](#contributing-documentation) -- [Style Guides](#style-guides) - - [Git Commit Messages](#git-commit-messages) - - [Code Style Guide](#code-style-guide) +- [Contributing Guidelines](#contributing-guidelines) - [Table of Contents](#table-of-contents) + - [Feature Requests](#feature-requests) + - [Bug Reports](#bug-reports) + - [Development](#development) + - [Building](#building) + - [Contributing Code](#contributing-code) + - [Contributing Documentation](#contributing-documentation) + - [Style Guides](#style-guides) + - [Git Commit Messages](#git-commit-messages) + - [Code Style Guide](#code-style-guide) ## Feature Requests -To request new functionality, there are two primary approaches that will be most effective at receiving input and making progress. +To request new functionality, there are two primary approaches that will be most effective at receiving input and making +progress. -If the feature is **small** - a change to a single piece of functionality, or an addition that can be expressed clearly and succinctly in a few sentences, then the most appropriate place to propose it is as a [new Feature request] in this repository. +If the feature is **small** - a change to a single piece of functionality, or an addition that can be expressed clearly +and succinctly in a few sentences, then the most appropriate place to propose it is as a [new Feature request] in this +repository. -If the feature is **more complicated**, involves protocol changes, or has potential safety or performance implications, then consider writing a proposal in [GitHub discussions]. This will allow a structured review and commenting of the proposed changes. You should aim to get the proposal approved by maintainers before starting on implementation. +If the feature is **more complicated**, involves protocol changes, or has potential safety or performance implications, +then consider writing a proposal in [GitHub discussions]. This will allow a structured review and commenting of the +proposed changes. You should aim to get the proposal approved by maintainers before starting on implementation. _Note that the project's committers still have the final word on what is accepted into the project._ -[new Feature request]: https://github.com/hypercerts-org/hypercerts/issues/new?assignees=&labels=type%3Afeaturerequest&projects=&template=2.feature_request.yml +[new Feature request]: + https://github.com/hypercerts-org/hypercerts/issues/new?assignees=&labels=type%3Afeaturerequest&projects=&template=2.feature_request.yml [GitHub discussions]: https://github.com/hypercerts-org/hypercerts/discussions @@ -47,14 +59,19 @@ _Note that the project's committers still have the final word on what is accepte Bugs are a reality for any software project. We can't fix what we don't know about. -If you believe a bug report presents a security risk, please follow [responsible disclosure](https://en.wikipedia.org/wiki/Responsible_disclosure) and report it directly to security@hypercerts.org instead of filing a public issue or posting it to a public forum. We will get back to you promptly. +If you believe a bug report presents a security risk, please follow +[responsible disclosure](https://en.wikipedia.org/wiki/Responsible_disclosure) and report it directly to +security@hypercerts.org instead of filing a public issue or posting it to a public forum. We will get back to you +promptly. -Otherwise, please, first search between [existing issues in our repository] and if the issue is not reported yet, [file a new one]. +Otherwise, please, first search between [existing issues in our repository] and if the issue is not reported yet, [file +a new one]. [existing issues in our repository]: https://github.com/hypercerts-org/hypercerts/issues -[file a new one]: https://github.com/hypercerts-org/hypercerts/issues/new?assignees=&labels=type%3Abug&projects=&template=1.bug_report.yml +[file a new one]: + https://github.com/hypercerts-org/hypercerts/issues/new?assignees=&labels=type%3Abug&projects=&template=1.bug_report.yml @@ -62,22 +79,25 @@ Otherwise, please, first search between [existing issues in our repository] and ### Building -Our development environment is documented in our [README](https://github.com/hypercerts-org/hypercerts/blob/main/README.md). +Our development environment is documented in our +[README](https://github.com/hypercerts-org/hypercerts/blob/main/README.md). ### Contributing Code -- **File issues:** Please make sure to first file an issue (i.e. feature request, bug report) before you actually start work on something. +- **File issues:** Please make sure to first file an issue (i.e. feature request, bug report) before you actually start + work on something. -- **Create branches:** If you have write permissions to the repository, you can create user-id prefixed branches (e.g. user/feature/foobar) in the main repository. Otherwise, fork the main repository and create your branches there. +- **Create branches:** If you have write permissions to the repository, you can create user-id prefixed branches (e.g. + user/feature/foobar) in the main repository. Otherwise, fork the main repository and create your branches there. - - Good habit: regularly rebase to the `HEAD` of `main` branch of the main repository to make sure you prevent nasty conflicts: + - Good habit: regularly rebase to the `HEAD` of `main` branch of the main repository to make sure you prevent nasty + conflicts: ```bash git rebase /main ``` - - Push your branch to GitHub regularly so others can see what you are working - on: + - Push your branch to GitHub regularly so others can see what you are working on: ```bash git push -u @@ -93,14 +113,17 @@ Our development environment is documented in our [README](https://github.com/hyp - When coding, please follow these standard practices: - - **Write tests:** Especially when fixing bugs, make a test so we know that we’ve fixed the bug and prevent it from reappearing in the future. + - **Write tests:** Especially when fixing bugs, make a test so we know that we’ve fixed the bug and prevent it from + reappearing in the future. - **Logging:** Please follow the logging conventions in the rest of the code base. - **Instrumentation:** Please following the instrumentation conventions in the rest of the code. - Try to instrument anything that would be relevant to an operational protocol. -- **Change Log:** Please write a change log fragment (e.g. in [SDK](sdk/RELEASE.md)) in the project if a `RELEASE.md` file exists. +- **Change Log:** Please write a change log fragment (e.g. in [SDK](sdk/RELEASE.md)) in the project if a `RELEASE.md` + file exists. -- **Documentation:** Please write documentation in the code as you go. If possible, also consider updating/augmenting the [developer documentation]. +- **Documentation:** Please write documentation in the code as you go. If possible, also consider updating/augmenting + the [developer documentation]. - **Check CI:** Don’t break the build! @@ -110,19 +133,25 @@ Our development environment is documented in our [README](https://github.com/hyp - Mark the draft pull request as _Ready for review_. - Please include good high-level descriptions of what the pull request does. - - The description should include references to all GitHub issues addressed by the pull request. Include the status ("done", "partially done", etc). + - The description should include references to all GitHub issues addressed by the pull request. Include the status + ("done", "partially done", etc). - Provide some details on how the code was tested. - - After you are nearing review (and definitely before merge) **squash commits into logical parts** (avoid squashing over merged commits, use rebase first!). Use proper commit messages which explain what was changed in the given commit and why. + - After you are nearing review (and definitely before merge) **squash commits into logical parts** (avoid squashing + over merged commits, use rebase first!). Use proper commit messages which explain what was changed in the given + commit and why. - **Get a code review:** - Code owners will be automatically assigned to review based on the files that were changed. - You can generally look up the last few people to edit the file to get the best person to review. - - When addressing the review: Make sure to address all comments, and respond to them so that the reviewer knows what has happened (e.g. "done" or "acknowledged" or "I don't think so because ..."). + - When addressing the review: Make sure to address all comments, and respond to them so that the reviewer knows what + has happened (e.g. "done" or "acknowledged" or "I don't think so because ..."). -- **Merge:** Once approved, the creator of the pull request should merge the branch, close the pull request, and delete the branch. If the creator does not have write access to the repository, one of the committers should do so instead. +- **Merge:** Once approved, the creator of the pull request should merge the branch, close the pull request, and delete + the branch. If the creator does not have write access to the repository, one of the committers should do so instead. -- **Signal to close issues:** Let the person who filed the issue close it. Ping them in a comment (e.g. @user) making sure you’ve commented how an issue was addressed. +- **Signal to close issues:** Let the person who filed the issue close it. Ping them in a comment (e.g. @user) making + sure you’ve commented how an issue was addressed. - Anyone else with write permissions should be able to close the issue if not addressed within a week. [developer documentation]: https://github.com/hypercerts-org/hypercerts/tree/main/docs/docs diff --git a/LICENSE-APACHE b/LICENSE-APACHE index 103c214..d4cc5a4 100644 --- a/LICENSE-APACHE +++ b/LICENSE-APACHE @@ -1,13 +1,10 @@ Copyright 2023 Hypercerts Foundation -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at +Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the +License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific +language governing permissions and limitations under the License. diff --git a/LICENSE-MIT b/LICENSE-MIT index d67b858..32a275d 100644 --- a/LICENSE-MIT +++ b/LICENSE-MIT @@ -1,21 +1,21 @@ The MIT License (MIT) -Copyright © 2023 Hypercerts Foundation +Copyright (c) 2022-2025 Hypercerts Foundation: Hypercerts protocol and marketplace. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Copyright (c) 2022 LooksRare for portions of marketplace: https://github.com/LooksRare/contracts-exchange-v2 commit: +7fca565 -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +Copyright (c) 2022 Paul Razvan Berg for inital template: https://github.com/paulrberg/foundry-template -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the +Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md index 2df6d15..5649d16 100644 --- a/README.md +++ b/README.md @@ -1,115 +1,167 @@ -# hypercerts [![License: Apache 2.0][license-badge]][license] [![Github Actions][gha-badge]][gha] +# hypercerts [![License: Apache 2.0][license-badge]][license] [![Github Actions][gha-badge]][gha][![Foundry][foundry-badge]][foundry] [license]: https://opensource.org/license/apache-2-0/ [license-badge]: https://img.shields.io/badge/License-Apache2.0-blue.svg [gha]: https://github.com/hypercerts-org/hypercerts/actions/workflows/ci-default.yml [gha-badge]: https://github.com/hypercerts-org/hypercerts/actions/workflows/ci-default.yml/badge.svg +[foundry]: https://getfoundry.sh/ +[foundry-badge]: https://img.shields.io/badge/Built%20with-Foundry-FFDB1C.svg -Hypercerts is a tool to build scalable retrospective reward systems for impact. -For more details, check out our [website](https://hypercerts.org/). - -## Organization - -- `/contracts`: Smart contracts (Foundry+Hardhat) - - - Manually deployed via hardhat tasks - - Note: This is not currently on CI/CD - - | Network | HypercertMinter (UUPS Proxy) | Safe | - | ------------ | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | - | Goerli | [0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07](https://goerli.etherscan.io/address/0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07) | [0x8CD35a62fF56A91485eBF97491612F1552dbc1c9](https://goerli.etherscan.io/address/0x8CD35a62fF56A91485eBF97491612F1552dbc1c9) | - | Sepolia | [0xa16DFb32Eb140a6f3F2AC68f41dAd8c7e83C4941](https://goerli.etherscan.io/address/0xa16DFb32Eb140a6f3F2AC68f41dAd8c7e83C4941) | TBD | - | Celo | [0x16bA53B74c234C870c61EFC04cD418B8f2865959](https://celoscan.io/address/0x16bA53B74c234C870c61EFC04cD418B8f2865959) | TBD | - | Optimism | [0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07](https://optimistic.etherscan.io/address/0x822F17A9A5EeCFd66dBAFf7946a8071C265D1d07) | [0x560adA72a80b4707e493cA8c3B7B7528930E7Be5](https://optimistic.etherscan.io/address/0x560adA72a80b4707e493cA8c3B7B7528930E7Be5) | - | Base Sepolia | [0xC2d179166bc9dbB00A03686a5b17eCe2224c2704](https://sepolia.basescan.org/address/0xC2d179166bc9dbB00A03686a5b17eCe2224c2704) | [0xA2Cb9D926b090577AD45fC0F40C753BF369B82Ff](https://sepolia.basescan.org/address/0xA2Cb9D926b090577AD45fC0F40C753BF369B82Ff) | - | Base Sepolia | [0xC2d179166bc9dbB00A03686a5b17eCe2224c2704](https://basescan.org/address/0xC2d179166bc9dbB00A03686a5b17eCe2224c2704) | [0x1FD06FD7743dB499a2d5bfBeD33A9Dc559a8D360](https://basescan.org/address/0x1FD06FD7743dB499a2d5bfBeD33A9Dc559a8D360) | - -- `/cors-proxy`: CORS proxy for Cloudflare Workers - - [via GitHub actions](https://github.com/hypercerts-org/hypercerts/actions/workflows/deploy-cors-proxy.yml) -- `/defender`: OpenZeppelin Defender integration - - [via GitHub actions](https://github.com/hypercerts-org/hypercerts/actions/workflows/deploy-defender.yml) -- `/docs`: documentation (Docusaurus) - - [on Fleek](https://hypercerts.on.fleek.co/docs/) - Production build on mainnet - - [on Cloudflare](https://testnet.hypercerts.org/docs) - Staging build on Goerli -- `/frontend`: frontend application (Next.js) - - [on Fleek](https://hypercerts.on.fleek.co/) - Production build on mainnet - - [on Cloudflare](https://testnet.hypercerts.org) - Staging build on Goerli -- `/graph`: The Graph integration - - [via GitHub actions](https://github.com/hypercerts-org/hypercerts/actions/workflows/deploy-graph.yml) - - [Goerli Subgraph](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-testnet) - - [Optimism Subgraph](https://thegraph.com/hosted-service/subgraph/hypercerts-admin/hypercerts-optimism-mainnet) -- `/sdk`: Hypercerts SDK - - Manually published to npm -- `/utils`: various scripts for operations - - Manually run - -## Quickstart with Dapp development - -### Setup and build the frontend - -First, make sure the environment variables are set for `./frontend`. -Take a look at `./frontend/.env.local.example` for the complete list. - -- You can either set these yourself (e.g. in CI/CD) -- or copy the file to `.env.local` and populate it. - -Then do a turbo build of all apps, run the following: - -```bash -yarn install -yarn build +Hypercerts is a tool to build scalable retrospective reward systems for impact. For more details, check out our +[website](https://hypercerts.org/). + +## Setup + +Create a copy of `.env.example` and rename the copy to `.env`. If your organization already has keys, ask your admin +where they are. + +- `MNEMONIC`: the seed phrase used for deploying the contract and upgrades + - Make sure there is sufficient balance in the account for these operations + - If you need a new address, you can run `yarn hardhat generate-address` +- `INFURA_API_KEY`: [Infura](https://www.infura.io/) is used as the gateway. +- `OPENZEPPELIN_API_KEY` and `OPENZEPPELIN_SECRET_KEY`: [OpenZeppelin Defender](https://defender.openzeppelin.com/) is + used for proposing upgrades to the multi-sig. +- `ETHERSCAN_API_KEY`: [Etherscan](https://etherscan.io/) +- `OPTIMISTIC_ETHERSCAN_API_KEY`: [Optimism Explorer](https://optimistic.etherscan.io/myapikey) + +## Usage + +Here's a list of the most frequently needed commands. + +Note that the project is configured to use both Hardhat and Foundry. We typically use Foundry for fast compiles and +testing. We typically use Hardhat to compile for deployment and to run operational tasks. + +### Foundry operations + +#### Build + +Build the contracts: + +```sh +forge build +``` + +#### Tests + +Solidity tests are executed using Foundry Run the tests: + +```sh +forge test +``` + +#### Gas Usage + +Get a gas report: + +```sh +forge test --gas-report +``` + +#### Analyze storage gaps + +```sh +forge inspect HypercertMinter storageLayout --pretty +``` + +#### Clean + +Delete the build artifacts and cache directories: + +```sh +forge clean +``` + +### Hardhat operations + +#### Build + +```sh +yarn build:hardhat ``` -The resulting static site can be found in `./build/`. +#### Deploy -### Running the prod server +Deployment of the contract to EVM compatible net is managed by +[OpenZeppelin](https://docs.openzeppelin.com/upgrades-plugins/1.x/api-hardhat-upgrades), primarily because of proxy +management and safety checks. -If you've already run the build, you can use `yarn serve:build` to serve the built files +```sh +yarn build:deploy +yarn hardhat deploy --network goerli +``` -### Running the frontend dev server +#### Transfer ownership -To run a dev server that watches for changes across code and Plasmic, run: +To transfer ownership of the proxy contract for upgrades, run the following: -```bash -yarn dev:frontend +```sh +yarn hardhat transfer-owner-minter --network base-sepolia --proxy PROXY_CONTRACT_ADDRESS --owner NEW_OWNER_ADDRESS ``` -## E2E Local Development +This is typically done to transfer control to a multi-sig (i.e. Gnosis Safe). -We now have a mostly localized development infrastructure that can be used when -developing the Dapp. The localized development infrastructure will spin up a -localchain, graph, and postgres. Your local machine must -have docker and docker compose installed. +#### Validate upgrade -### Setup environment variables +Validate contract upgradeability against deployment. -You will then need to create a `.env.local` file in the root of the repository with the following environment variables: +For example `goerli` deployment: +```sh +yarn hardhat validate-upgrade --network goerli --proxy PROXY_CONTRACT_ADDRESS ``` -# Required -PLASMIC_PROJECT_ID= -PLASMIC_PROJECT_API_TOKEN= -NEXT_PUBLIC_NFT_STORAGE_TOKEN= -NEXT_PUBLIC_WEB3_STORAGE_TOKEN= -NEXT_PUBLIC_WALLETCONNECT_ID= - -# Optional (used to fund an address on the localchain) -LOCAL_TESTING_ADDRESS= + +#### Propose Upgrade + +Propose an upgrade via OpenZeppelin Defender. For more information, see this +[guide](https://docs.openzeppelin.com/defender/guide-upgrades) + +```sh +yarn build:hardhat +yarn hardhat propose-upgrade-minter --network goerli --proxy PROXY_CONTRACT_ADDRESS --multisig OWNER_MULTISIG_ADDRESS ``` -### Starting the local development infrastructure +This will output an OpenZeppelin URL that multi-sig members can use to approve/reject the upgrade. + +### Other operations + +#### Format -Once you have your environment configured you can run the infrastructure like so: +Format the contracts with Prettier: +```sh +yarn prettier ``` -yarn dev:serve-e2e + +#### Lint + +Lint the contracts: + +```sh +yarn lint ``` -Once everything is done, the dapp will be served from http://127.0.0.1:3000. You will -need to point your metamask to the localchain at 127.0.0.1:8545 with ChainID 31337. +## Contracts + +### IHypercertToken + +This interface is the requirements set for hypercert-compliant tokens. This enables developer to use their own preferred +token implementation or standard. + +### HypercertMinter + +Example implementation for a hypercert token that is an `ERC1155 NFT` under the hood with an `Allowlist` extension. + +## Deploying to FVM + +### Verification + +To verify the contracts on Starboard, run the following command: + +Minter: `npx hardhat flatten src/protocol/HypercertMinter.sol > FlattenedHypercertMinter.sol` Proxy: +`npx hardhat flatten lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol > FlattenedProxy.sol` -## Playbooks +To validate, upload the flattened file to Filfox using the contact verification flow. -For setup and common operations for each subproject, navigate into the respective directory and check out the `README.md`. +In the `Metadata settings` section, add the following: -We also maintain a [playbook](https://hypercerts.org/docs/devops) for larger operations. +`{ "bytecodeHash": "none" }` diff --git a/contracts/RELEASE.md b/RELEASE.md similarity index 100% rename from contracts/RELEASE.md rename to RELEASE.md diff --git a/contracts/audits/marketplace/2024_05_29_signature_bug.md b/audits/marketplace/2024_05_29_signature_bug.md similarity index 100% rename from contracts/audits/marketplace/2024_05_29_signature_bug.md rename to audits/marketplace/2024_05_29_signature_bug.md diff --git a/contracts/audits/marketplace/Hypercerts_v01-1.md b/audits/marketplace/Hypercerts_v01-1.md similarity index 100% rename from contracts/audits/marketplace/Hypercerts_v01-1.md rename to audits/marketplace/Hypercerts_v01-1.md diff --git a/contracts/audits/marketplace/Hypercerts_v01-1.pdf b/audits/marketplace/Hypercerts_v01-1.pdf similarity index 100% rename from contracts/audits/marketplace/Hypercerts_v01-1.pdf rename to audits/marketplace/Hypercerts_v01-1.pdf diff --git a/contracts/audits/marketplace/Hypercerts_v02.md b/audits/marketplace/Hypercerts_v02.md similarity index 100% rename from contracts/audits/marketplace/Hypercerts_v02.md rename to audits/marketplace/Hypercerts_v02.md diff --git a/contracts/audits/marketplace/Hypercerts_v02.pdf b/audits/marketplace/Hypercerts_v02.pdf similarity index 100% rename from contracts/audits/marketplace/Hypercerts_v02.pdf rename to audits/marketplace/Hypercerts_v02.pdf diff --git a/contracts/audits/protocol/20230201-7naly3er.md b/audits/protocol/20230201-7naly3er.md similarity index 100% rename from contracts/audits/protocol/20230201-7naly3er.md rename to audits/protocol/20230201-7naly3er.md diff --git a/contracts/audits/protocol/20230201-slither.md b/audits/protocol/20230201-slither.md similarity index 100% rename from contracts/audits/protocol/20230201-slither.md rename to audits/protocol/20230201-slither.md diff --git a/contracts/audits/protocol/20230208-security-review.md b/audits/protocol/20230208-security-review.md similarity index 100% rename from contracts/audits/protocol/20230208-security-review.md rename to audits/protocol/20230208-security-review.md diff --git a/contracts/audits/protocol/Hypercerts-security-review.md b/audits/protocol/Hypercerts-security-review.md similarity index 100% rename from contracts/audits/protocol/Hypercerts-security-review.md rename to audits/protocol/Hypercerts-security-review.md diff --git a/contracts/.github/workflows/ci.yml b/contracts/.github/workflows/ci.yml deleted file mode 100644 index 1d98849..0000000 --- a/contracts/.github/workflows/ci.yml +++ /dev/null @@ -1,79 +0,0 @@ -name: "CI" - -# env: -# INFURA_API_KEY: ${{ secrets.INFURA_API_KEY }} -# MNEMONIC: ${{ secrets.MNEMONIC }} - -env: - FOUNDRY_PROFILE: "ci" - -on: - pull_request: - branches: - - "main" - - "dev" - push: - branches: - - "main" - - "dev" - -jobs: - ci-test: - runs-on: "ubuntu-latest" - steps: - - name: "Check out the repo" - uses: "actions/checkout@v3" - with: - submodules: "recursive" - - - name: "Install Foundry" - uses: "onbjerg/foundry-toolchain@v1" - with: - version: "nightly" - - - name: "Install Node.js" - uses: "actions/setup-node@v3" - with: - cache: "yarn" - node-version: "lts/*" - - - name: "Copy config" - run: | - mv ./.env.github .env - echo "::debug::$(less .env)" - - - name: "Install the Node.js dependencies" - run: "yarn install --immutable" - - - name: "Lint the contracts" - run: "yarn lint" - - - name: "Add lint summary" - run: | - echo "## Lint" >> $GITHUB_STEP_SUMMARY - echo "✅ Passed" >> $GITHUB_STEP_SUMMARY - - - name: "Show the Foundry config" - run: "forge config" - - - name: "Run the tests and report gas" - run: "forge test --gas-report" - - - name: "Report test coverage" - run: "forge coverage" - - - name: "Build the contracts" - run: | - forge --version - forge build --sizes - - - name: "Compile the contracts and generate the TypeChain bindings" - run: "yarn typechain" - - - name: "Hardhat: Test the contracts - primarily UUPS tests" - run: "yarn test:hardhat" - - - name: "Add test summary" - run: | - echo "## Test results" >> $GITHUB_STEP_SUMMARY - echo "✅ Passed" >> $GITHUB_STEP_SUMMARY diff --git a/contracts/.github/workflows/publish.yml b/contracts/.github/workflows/publish.yml deleted file mode 100644 index 6b16e46..0000000 --- a/contracts/.github/workflows/publish.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: Publish - -on: - push: - branches: - - main -jobs: - build: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 - with: - node-version: 16.x - registry-url: https://registry.npmjs.org/ - - run: yarn global add npm - - name: Compare package version to published version - run: | - echo "::set-output name=npm_version::$(npm view @protocol/hypercerts-protocol version)" - echo "::set-output name=package_version::$(cat package.json | grep version | head -1 | awk -F= "{ print $2 }" | sed 's/[version:,"]//g' | tr -d '[[:space:]]')" - id: get-versions - - name: print outpouts package vs published versions - run: | - echo ${{steps.get-versions.outputs.npm_version}} - echo ${{steps.get-versions.outputs.package_version}} - echo ${{steps.get-versions.outputs.package_version > steps.get-versions.outputs.npm_version}} - - run: yarn install - if: steps.get-versions.outputs.package_version > steps.get-versions.outputs.npm_version - - run: yarn build - if: steps.get-versions.outputs.package_version > steps.get-versions.outputs.npm_version - - run: yarn test - if: steps.get-versions.outputs.package_version > steps.get-versions.outputs.npm_version - - name: publishing - if: steps.get-versions.outputs.package_version > steps.get-versions.outputs.npm_version - run: | - echo '//registry.npmjs.org/:_authToken=${{secrets.NPM_TOKEN}}' > .npmrc - npm publish --access public --scope {hypercerts-npm-org} --otp ${{ secrets.NPM_TOKEN }} diff --git a/contracts/.gitignore b/contracts/.gitignore deleted file mode 100644 index 2d812b1..0000000 --- a/contracts/.gitignore +++ /dev/null @@ -1,46 +0,0 @@ -# directories -.yarn/* -!.yarn/patches -!.yarn/releases -!.yarn/plugins -!.yarn/sdks -!.yarn/versions -**/artifacts -**/build -**/cache -**/coverage -**/contracts -**/.coverage_artifacts -**/.coverage_cache -**/.coverage_contracts -**/dist -**/node_modules -**/deployments/localhost -**/out* -**/typechain -**/types -**/cache** -**/abi -**/rollup-cache - -# files -*.env -*.log -.pnp.* -coverage.json -npm-debug.log* -yarn-debug.log* -yarn-error.log* -**/.openzeppelin/*-31337.json -.DS_Store -/.idea -test*.svg -lcov.info - -# broadcasts -!/broadcast -/broadcast/* -/broadcast/*/31337/ - -# platform specific -shell.nix \ No newline at end of file diff --git a/contracts/.gitmodules b/contracts/.gitmodules deleted file mode 100644 index 7a2a15b..0000000 --- a/contracts/.gitmodules +++ /dev/null @@ -1,12 +0,0 @@ -[submodule "lib/murky"] - path = lib/murky - url = https://github.com/dmfxyz/murky -[submodule "lib/openzeppelin-contracts-upgradeable"] - path = lib/openzeppelin-contracts-upgradeable - url = https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable -[submodule "lib/forge-std"] - path = lib/forge-std - url = https://github.com/foundry-rs/forge-std -[submodule "lib/prb-test"] - path = lib/prb-test - url = https://github.com/paulrberg/prb-test/ diff --git a/contracts/.husky/pre-commit b/contracts/.husky/pre-commit deleted file mode 100755 index 4ef4148..0000000 --- a/contracts/.husky/pre-commit +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" - -pnpm dlx lint-staged -forge snapshot -pnpm docs diff --git a/contracts/.lintstagedrc b/contracts/.lintstagedrc deleted file mode 100644 index 0e2564c..0000000 --- a/contracts/.lintstagedrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "*.{js,json,md,ts,yml}": ["prettier --config ./.prettierrc.yml --write"], - "*.{sol}": ["forge fmt"] -} diff --git a/contracts/.prettierignore b/contracts/.prettierignore deleted file mode 100644 index 87bdd5b..0000000 --- a/contracts/.prettierignore +++ /dev/null @@ -1,31 +0,0 @@ -# directories -.yarn/ -**/.coverage_artifacts -**/.coverage_cache -**/.coverage_contracts -**/artifacts -**/broadcast -**/build -**/cache -**/cache_hardhat -**/coverage -**/dist -**/lib -**/node_modules -**/out -**/types -**/deployments -**/.openzeppelin -**/docs -**/abi - -# files -*.env -*.log -*.sol -.pnp.* -coverage.json -npm-debug.log* -yarn-debug.log* -yarn-error.log* -.DS_Store diff --git a/contracts/.vscode/settings.json b/contracts/.vscode/settings.json deleted file mode 100644 index ea8a1e8..0000000 --- a/contracts/.vscode/settings.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "editor.formatOnSave": true, - "solidity.packageDefaultDependenciesContractsDirectory": "src", - "solidity.packageDefaultDependenciesDirectory": "lib", - "solidity.remappings": ["./remappings.txt"], - "files.exclude": { - "**/.git": true, - "**/.svn": true, - "**/.hg": true, - "**/CVS": true, - "**/.DS_Store": true, - "**/Thumbs.db": true, - "cache": false, - "node_modules": false, - "out": true - } -} diff --git a/contracts/LICENSE b/contracts/LICENSE deleted file mode 100644 index dba1166..0000000 --- a/contracts/LICENSE +++ /dev/null @@ -1,4 +0,0 @@ -This project is dual licensed under MIT and Apache-2.0. - -MIT: https://www.opensource.org/licenses/mit -Apache-2.0: https://www.apache.org/licenses/license-2.0 \ No newline at end of file diff --git a/contracts/LICENSE-APACHE b/contracts/LICENSE-APACHE deleted file mode 100644 index d4cc5a4..0000000 --- a/contracts/LICENSE-APACHE +++ /dev/null @@ -1,10 +0,0 @@ -Copyright 2023 Hypercerts Foundation - -Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the -License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific -language governing permissions and limitations under the License. diff --git a/contracts/LICENSE-MIT b/contracts/LICENSE-MIT deleted file mode 100644 index 4e9e555..0000000 --- a/contracts/LICENSE-MIT +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 Hypercerts Foundation: Hypercerts protocol and marketplace. - -Copyright (c) 2022 LooksRare for portions of marketplace: https://github.com/LooksRare/contracts-exchange-v2 commit: -7fca565 - -Copyright (c) 2022 Paul Razvan Berg for inital template: https://github.com/paulrberg/foundry-template - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit -persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the -Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/contracts/README.md b/contracts/README.md deleted file mode 100644 index 2bc1d7e..0000000 --- a/contracts/README.md +++ /dev/null @@ -1,160 +0,0 @@ -# hypercerts-protocol [![Foundry][foundry-badge]][foundry] - -[foundry]: https://getfoundry.sh/ -[foundry-badge]: https://img.shields.io/badge/Built%20with-Foundry-FFDB1C.svg - -## Setup - -Create a copy of `.env.example` and rename the copy to `.env`. If your organization already has keys, ask your admin -where they are. - -- `MNEMONIC`: the seed phrase used for deploying the contract and upgrades - - Make sure there is sufficient balance in the account for these operations - - If you need a new address, you can run `yarn hardhat generate-address` -- `INFURA_API_KEY`: [Infura](https://www.infura.io/) is used as the gateway. -- `OPENZEPPELIN_API_KEY` and `OPENZEPPELIN_SECRET_KEY`: [OpenZeppelin Defender](https://defender.openzeppelin.com/) is - used for proposing upgrades to the multi-sig. -- `ETHERSCAN_API_KEY`: [Etherscan](https://etherscan.io/) -- `OPTIMISTIC_ETHERSCAN_API_KEY`: [Optimism Explorer](https://optimistic.etherscan.io/myapikey) - -## Usage - -Here's a list of the most frequently needed commands. - -Note that the project is configured to use both Hardhat and Foundry. We typically use Foundry for fast compiles and -testing. We typically use Hardhat to compile for deployment and to run operational tasks. - -### Foundry operations - -#### Build - -Build the contracts: - -```sh -forge build -``` - -#### Tests - -Solidity tests are executed using Foundry Run the tests: - -```sh -forge test -``` - -#### Gas Usage - -Get a gas report: - -```sh -forge test --gas-report -``` - -#### Analyze storage gaps - -```sh -forge inspect HypercertMinter storageLayout --pretty -``` - -#### Clean - -Delete the build artifacts and cache directories: - -```sh -forge clean -``` - -### Hardhat operations - -#### Build - -```sh -yarn build:hardhat -``` - -#### Deploy - -Deployment of the contract to EVM compatible net is managed by -[OpenZeppelin](https://docs.openzeppelin.com/upgrades-plugins/1.x/api-hardhat-upgrades), primarily because of proxy -management and safety checks. - -```sh -yarn build:deploy -yarn hardhat deploy --network goerli -``` - -#### Transfer ownership - -To transfer ownership of the proxy contract for upgrades, run the following: - -```sh -yarn hardhat transfer-owner-minter --network base-sepolia --proxy PROXY_CONTRACT_ADDRESS --owner NEW_OWNER_ADDRESS -``` - -This is typically done to transfer control to a multi-sig (i.e. Gnosis Safe). - -#### Validate upgrade - -Validate contract upgradeability against deployment. - -For example `goerli` deployment: - -```sh -yarn hardhat validate-upgrade --network goerli --proxy PROXY_CONTRACT_ADDRESS -``` - -#### Propose Upgrade - -Propose an upgrade via OpenZeppelin Defender. For more information, see this -[guide](https://docs.openzeppelin.com/defender/guide-upgrades) - -```sh -yarn build:hardhat -yarn hardhat propose-upgrade-minter --network goerli --proxy PROXY_CONTRACT_ADDRESS --multisig OWNER_MULTISIG_ADDRESS -``` - -This will output an OpenZeppelin URL that multi-sig members can use to approve/reject the upgrade. - -### Other operations - -#### Format - -Format the contracts with Prettier: - -```sh -yarn prettier -``` - -#### Lint - -Lint the contracts: - -```sh -yarn lint -``` - -## Contracts - -### IHypercertToken - -This interface is the requirements set for hypercert-compliant tokens. This enables developer to use their own preferred -token implementation or standard. - -### HypercertMinter - -Example implementation for a hypercert token that is an `ERC1155 NFT` under the hood with an `Allowlist` extension. - -## Deploying to FVM - -### Verification - -To verify the contracts on Starboard, run the following command: - -Minter: `npx hardhat flatten src/protocol/HypercertMinter.sol > FlattenedHypercertMinter.sol` Proxy: -`npx hardhat flatten lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol > FlattenedProxy.sol` - -To validate, upload the flattened file to Filfox using the contact verification flow. - -In the `Metadata settings` section, add the following: - -`{ "bytecodeHash": "none" }` diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/access/AccessControl.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/access/AccessControl.sol deleted file mode 100644 index 2ac2038..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/access/AccessControl.sol +++ /dev/null @@ -1,235 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControl.sol) - -pragma solidity ^0.8.0; - -import "./IAccessControl.sol"; -import "../utils/Context.sol"; -import "../utils/Strings.sol"; -import "../utils/introspection/ERC165.sol"; - -/** - * @dev Contract module that allows children to implement role-based access - * control mechanisms. This is a lightweight version that doesn't allow enumerating role - * members except through off-chain means by accessing the contract event logs. Some - * applications may benefit from on-chain enumerability, for those cases see - * {AccessControlEnumerable}. - * - * Roles are referred to by their `bytes32` identifier. These should be exposed - * in the external API and be unique. The best way to achieve this is by - * using `public constant` hash digests: - * - * ``` - * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); - * ``` - * - * Roles can be used to represent a set of permissions. To restrict access to a - * function call, use {hasRole}: - * - * ``` - * function foo() public { - * require(hasRole(MY_ROLE, msg.sender)); - * ... - * } - * ``` - * - * Roles can be granted and revoked dynamically via the {grantRole} and - * {revokeRole} functions. Each role has an associated admin role, and only - * accounts that have a role's admin role can call {grantRole} and {revokeRole}. - * - * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means - * that only accounts with this role will be able to grant or revoke other - * roles. More complex role relationships can be created by using - * {_setRoleAdmin}. - * - * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to - * grant and revoke this role. Extra precautions should be taken to secure - * accounts that have been granted it. - */ -abstract contract AccessControl is Context, IAccessControl, ERC165 { - struct RoleData { - mapping(address => bool) members; - bytes32 adminRole; - } - - mapping(bytes32 => RoleData) private _roles; - - bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; - - /** - * @dev Modifier that checks that an account has a specific role. Reverts - * with a standardized message including the required role. - * - * The format of the revert reason is given by the following regular expression: - * - * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ - * - * _Available since v4.1._ - */ - modifier onlyRole(bytes32 role) { - _checkRole(role); - _; - } - - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { - return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); - } - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) public view virtual override returns (bool) { - return _roles[role].members[account]; - } - - /** - * @dev Revert with a standard message if `_msgSender()` is missing `role`. - * Overriding this function changes the behavior of the {onlyRole} modifier. - * - * Format of the revert message is described in {_checkRole}. - * - * _Available since v4.6._ - */ - function _checkRole(bytes32 role) internal view virtual { - _checkRole(role, _msgSender()); - } - - /** - * @dev Revert with a standard message if `account` is missing `role`. - * - * The format of the revert reason is given by the following regular expression: - * - * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ - */ - function _checkRole(bytes32 role, address account) internal view virtual { - if (!hasRole(role, account)) { - revert( - string( - abi.encodePacked( - "AccessControl: account ", - Strings.toHexString(uint160(account), 20), - " is missing role ", - Strings.toHexString(uint256(role), 32) - ) - ) - ); - } - } - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { - return _roles[role].adminRole; - } - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { - _grantRole(role, account); - } - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { - _revokeRole(role, account); - } - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been revoked `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) public virtual override { - require(account == _msgSender(), "AccessControl: can only renounce roles for self"); - - _revokeRole(role, account); - } - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. Note that unlike {grantRole}, this function doesn't perform any - * checks on the calling account. - * - * [WARNING] - * ==== - * This function should only be called from the constructor when setting - * up the initial roles for the system. - * - * Using this function in any other way is effectively circumventing the admin - * system imposed by {AccessControl}. - * ==== - * - * NOTE: This function is deprecated in favor of {_grantRole}. - */ - function _setupRole(bytes32 role, address account) internal virtual { - _grantRole(role, account); - } - - /** - * @dev Sets `adminRole` as ``role``'s admin role. - * - * Emits a {RoleAdminChanged} event. - */ - function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { - bytes32 previousAdminRole = getRoleAdmin(role); - _roles[role].adminRole = adminRole; - emit RoleAdminChanged(role, previousAdminRole, adminRole); - } - - /** - * @dev Grants `role` to `account`. - * - * Internal function without access restriction. - */ - function _grantRole(bytes32 role, address account) internal virtual { - if (!hasRole(role, account)) { - _roles[role].members[account] = true; - emit RoleGranted(role, account, _msgSender()); - } - } - - /** - * @dev Revokes `role` from `account`. - * - * Internal function without access restriction. - */ - function _revokeRole(bytes32 role, address account) internal virtual { - if (hasRole(role, account)) { - _roles[role].members[account] = false; - emit RoleRevoked(role, account, _msgSender()); - } - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/access/AccessControlCrossChain.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/access/AccessControlCrossChain.sol deleted file mode 100644 index 21e4251..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/access/AccessControlCrossChain.sol +++ /dev/null @@ -1,44 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.4; - -import "./AccessControl.sol"; -import "../crosschain/CrossChainEnabled.sol"; - -/** - * @dev An extension to {AccessControl} with support for cross-chain access management. - * For each role, is extension implements an equivalent "aliased" role that is used for - * restricting calls originating from other chains. - * - * For example, if a function `myFunction` is protected by `onlyRole(SOME_ROLE)`, and - * if an address `x` has role `SOME_ROLE`, it would be able to call `myFunction` directly. - * A wallet or contract at the same address on another chain would however not be able - * to call this function. In order to do so, it would require to have the role - * `_crossChainRoleAlias(SOME_ROLE)`. - * - * This aliasing is required to protect against multiple contracts living at the same - * address on different chains but controlled by conflicting entities. - * - * _Available since v4.6._ - */ -abstract contract AccessControlCrossChain is AccessControl, CrossChainEnabled { - bytes32 public constant CROSSCHAIN_ALIAS = keccak256("CROSSCHAIN_ALIAS"); - - /** - * @dev See {AccessControl-_checkRole}. - */ - function _checkRole(bytes32 role) internal view virtual override { - if (_isCrossChain()) { - _checkRole(_crossChainRoleAlias(role), _crossChainSender()); - } else { - super._checkRole(role); - } - } - - /** - * @dev Returns the aliased role corresponding to `role`. - */ - function _crossChainRoleAlias(bytes32 role) internal pure virtual returns (bytes32) { - return role ^ CROSSCHAIN_ALIAS; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/access/AccessControlEnumerable.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/access/AccessControlEnumerable.sol deleted file mode 100644 index 354e1be..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/access/AccessControlEnumerable.sol +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControlEnumerable.sol) - -pragma solidity ^0.8.0; - -import "./IAccessControlEnumerable.sol"; -import "./AccessControl.sol"; -import "../utils/structs/EnumerableSet.sol"; - -/** - * @dev Extension of {AccessControl} that allows enumerating the members of each role. - */ -abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl { - using EnumerableSet for EnumerableSet.AddressSet; - - mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers; - - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { - return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId); - } - - /** - * @dev Returns one of the accounts that have `role`. `index` must be a - * value between 0 and {getRoleMemberCount}, non-inclusive. - * - * Role bearers are not sorted in any particular way, and their ordering may - * change at any point. - * - * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure - * you perform all queries on the same block. See the following - * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] - * for more information. - */ - function getRoleMember(bytes32 role, uint256 index) public view virtual override returns (address) { - return _roleMembers[role].at(index); - } - - /** - * @dev Returns the number of accounts that have `role`. Can be used - * together with {getRoleMember} to enumerate all bearers of a role. - */ - function getRoleMemberCount(bytes32 role) public view virtual override returns (uint256) { - return _roleMembers[role].length(); - } - - /** - * @dev Overload {_grantRole} to track enumerable memberships - */ - function _grantRole(bytes32 role, address account) internal virtual override { - super._grantRole(role, account); - _roleMembers[role].add(account); - } - - /** - * @dev Overload {_revokeRole} to track enumerable memberships - */ - function _revokeRole(bytes32 role, address account) internal virtual override { - super._revokeRole(role, account); - _roleMembers[role].remove(account); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/access/IAccessControl.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/access/IAccessControl.sol deleted file mode 100644 index f773ecc..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/access/IAccessControl.sol +++ /dev/null @@ -1,88 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) - -pragma solidity ^0.8.0; - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControl { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/access/IAccessControlEnumerable.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/access/IAccessControlEnumerable.sol deleted file mode 100644 index 61aaf57..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/access/IAccessControlEnumerable.sol +++ /dev/null @@ -1,31 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (access/IAccessControlEnumerable.sol) - -pragma solidity ^0.8.0; - -import "./IAccessControl.sol"; - -/** - * @dev External interface of AccessControlEnumerable declared to support ERC165 detection. - */ -interface IAccessControlEnumerable is IAccessControl { - /** - * @dev Returns one of the accounts that have `role`. `index` must be a - * value between 0 and {getRoleMemberCount}, non-inclusive. - * - * Role bearers are not sorted in any particular way, and their ordering may - * change at any point. - * - * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure - * you perform all queries on the same block. See the following - * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] - * for more information. - */ - function getRoleMember(bytes32 role, uint256 index) external view returns (address); - - /** - * @dev Returns the number of accounts that have `role`. Can be used - * together with {getRoleMember} to enumerate all bearers of a role. - */ - function getRoleMemberCount(bytes32 role) external view returns (uint256); -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/access/Ownable.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/access/Ownable.sol deleted file mode 100644 index 0b2ca8e..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/access/Ownable.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) - -pragma solidity ^0.8.0; - -import "../utils/Context.sol"; - -/** - * @dev Contract module which provides a basic access control mechanism, where - * there is an account (an owner) that can be granted exclusive access to - * specific functions. - * - * By default, the owner account will be the one that deploys the contract. This - * can later be changed with {transferOwnership}. - * - * This module is used through inheritance. It will make available the modifier - * `onlyOwner`, which can be applied to your functions to restrict their use to - * the owner. - */ -abstract contract Ownable is Context { - address private _owner; - - event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); - - /** - * @dev Initializes the contract setting the deployer as the initial owner. - */ - constructor() { - _transferOwnership(_msgSender()); - } - - /** - * @dev Returns the address of the current owner. - */ - function owner() public view virtual returns (address) { - return _owner; - } - - /** - * @dev Throws if called by any account other than the owner. - */ - modifier onlyOwner() { - require(owner() == _msgSender(), "Ownable: caller is not the owner"); - _; - } - - /** - * @dev Leaves the contract without owner. It will not be possible to call - * `onlyOwner` functions anymore. Can only be called by the current owner. - * - * NOTE: Renouncing ownership will leave the contract without an owner, - * thereby removing any functionality that is only available to the owner. - */ - function renounceOwnership() public virtual onlyOwner { - _transferOwnership(address(0)); - } - - /** - * @dev Transfers ownership of the contract to a new account (`newOwner`). - * Can only be called by the current owner. - */ - function transferOwnership(address newOwner) public virtual onlyOwner { - require(newOwner != address(0), "Ownable: new owner is the zero address"); - _transferOwnership(newOwner); - } - - /** - * @dev Transfers ownership of the contract to a new account (`newOwner`). - * Internal function without access restriction. - */ - function _transferOwnership(address newOwner) internal virtual { - address oldOwner = _owner; - _owner = newOwner; - emit OwnershipTransferred(oldOwner, newOwner); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/access/README.adoc b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/access/README.adoc deleted file mode 100644 index 0959e1a..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/access/README.adoc +++ /dev/null @@ -1,23 +0,0 @@ -= Access Control - -[.readme-notice] -NOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/access - -This directory provides ways to restrict who can access the functions of a contract or when they can do it. - -- {AccessControl} provides a general role based access control mechanism. Multiple hierarchical roles can be created and assigned each to multiple accounts. -- {Ownable} is a simpler mechanism with a single owner "role" that can be assigned to a single account. This simpler mechanism can be useful for quick tests but projects with production concerns are likely to outgrow it. - -== Authorization - -{{Ownable}} - -{{IAccessControl}} - -{{AccessControl}} - -{{AccessControlCrossChain}} - -{{IAccessControlEnumerable}} - -{{AccessControlEnumerable}} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/crosschain/CrossChainEnabled.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/crosschain/CrossChainEnabled.sol deleted file mode 100644 index cd30a67..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/crosschain/CrossChainEnabled.sol +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.4; - -import "./errors.sol"; - -/** - * @dev Provides information for building cross-chain aware contracts. This - * abstract contract provides accessors and modifiers to control the execution - * flow when receiving cross-chain messages. - * - * Actual implementations of cross-chain aware contracts, which are based on - * this abstraction, will have to inherit from a bridge-specific - * specialization. Such specializations are provided under - * `crosschain//CrossChainEnabled.sol`. - * - * _Available since v4.6._ - */ -abstract contract CrossChainEnabled { - /** - * @dev Throws if the current function call is not the result of a - * cross-chain execution. - */ - modifier onlyCrossChain() { - if (!_isCrossChain()) revert NotCrossChainCall(); - _; - } - - /** - * @dev Throws if the current function call is not the result of a - * cross-chain execution initiated by `account`. - */ - modifier onlyCrossChainSender(address expected) { - address actual = _crossChainSender(); - if (expected != actual) revert InvalidCrossChainSender(actual, expected); - _; - } - - /** - * @dev Returns whether the current function call is the result of a - * cross-chain message. - */ - function _isCrossChain() internal view virtual returns (bool); - - /** - * @dev Returns the address of the sender of the cross-chain message that - * triggered the current function call. - * - * IMPORTANT: Should revert with `NotCrossChainCall` if the current function - * call is not the result of a cross-chain message. - */ - function _crossChainSender() internal view virtual returns (address); -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/crosschain/README.adoc b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/crosschain/README.adoc deleted file mode 100644 index 2fce203..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/crosschain/README.adoc +++ /dev/null @@ -1,34 +0,0 @@ -= Cross Chain Awareness - -[.readme-notice] -NOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/crosschain - -This directory provides building blocks to improve cross-chain awareness of smart contracts. - -- {CrossChainEnabled} is an abstraction that contains accessors and modifiers to control the execution flow when receiving cross-chain messages. - -== CrossChainEnabled specializations - -The following specializations of {CrossChainEnabled} provide implementations of the {CrossChainEnabled} abstraction for specific bridges. This can be used to complexe cross-chain aware components such as {AccessControlCrossChain}. - -{{CrossChainEnabledAMB}} - -{{CrossChainEnabledArbitrumL1}} - -{{CrossChainEnabledArbitrumL2}} - -{{CrossChainEnabledOptimism}} - -{{CrossChainEnabledPolygonChild}} - -== Libraries for cross-chain - -In addition to the {CrossChainEnable} abstraction, cross-chain awareness is also available through libraries. These libraries can be used to build complex designs such as contracts with the ability to interact with multiple bridges. - -{{LibAMB}} - -{{LibArbitrumL1}} - -{{LibArbitrumL2}} - -{{LibOptimism}} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/crosschain/amb/CrossChainEnabledAMB.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/crosschain/amb/CrossChainEnabledAMB.sol deleted file mode 100644 index 445f047..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/crosschain/amb/CrossChainEnabledAMB.sol +++ /dev/null @@ -1,47 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.4; - -import "../CrossChainEnabled.sol"; -import "./LibAMB.sol"; - -/** - * @dev [AMB](https://docs.tokenbridge.net/amb-bridge/about-amb-bridge) - * specialization or the {CrossChainEnabled} abstraction. - * - * As of february 2020, AMB bridges are available between the following chains: - * - [ETH <> xDai](https://docs.tokenbridge.net/eth-xdai-amb-bridge/about-the-eth-xdai-amb) - * - [ETH <> qDai](https://docs.tokenbridge.net/eth-qdai-bridge/about-the-eth-qdai-amb) - * - [ETH <> ETC](https://docs.tokenbridge.net/eth-etc-amb-bridge/about-the-eth-etc-amb) - * - [ETH <> BSC](https://docs.tokenbridge.net/eth-bsc-amb/about-the-eth-bsc-amb) - * - [ETH <> POA](https://docs.tokenbridge.net/eth-poa-amb-bridge/about-the-eth-poa-amb) - * - [BSC <> xDai](https://docs.tokenbridge.net/bsc-xdai-amb/about-the-bsc-xdai-amb) - * - [POA <> xDai](https://docs.tokenbridge.net/poa-xdai-amb/about-the-poa-xdai-amb) - * - [Rinkeby <> xDai](https://docs.tokenbridge.net/rinkeby-xdai-amb-bridge/about-the-rinkeby-xdai-amb) - * - [Kovan <> Sokol](https://docs.tokenbridge.net/kovan-sokol-amb-bridge/about-the-kovan-sokol-amb) - * - * _Available since v4.6._ - */ -contract CrossChainEnabledAMB is CrossChainEnabled { - /// @custom:oz-upgrades-unsafe-allow state-variable-immutable - address private immutable _bridge; - - /// @custom:oz-upgrades-unsafe-allow constructor - constructor(address bridge) { - _bridge = bridge; - } - - /** - * @dev see {CrossChainEnabled-_isCrossChain} - */ - function _isCrossChain() internal view virtual override returns (bool) { - return LibAMB.isCrossChain(_bridge); - } - - /** - * @dev see {CrossChainEnabled-_crossChainSender} - */ - function _crossChainSender() internal view virtual override onlyCrossChain returns (address) { - return LibAMB.crossChainSender(_bridge); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/crosschain/amb/LibAMB.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/crosschain/amb/LibAMB.sol deleted file mode 100644 index 74ee922..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/crosschain/amb/LibAMB.sol +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.4; - -import {IAMB as AMB_Bridge} from "../../vendor/amb/IAMB.sol"; -import "../errors.sol"; - -/** - * @dev Primitives for cross-chain aware contracts using the - * [AMB](https://docs.tokenbridge.net/amb-bridge/about-amb-bridge) - * family of bridges. - */ -library LibAMB { - /** - * @dev Returns whether the current function call is the result of a - * cross-chain message relayed by `bridge`. - */ - function isCrossChain(address bridge) internal view returns (bool) { - return msg.sender == bridge; - } - - /** - * @dev Returns the address of the sender that triggered the current - * cross-chain message through `bridge`. - * - * NOTE: {isCrossChain} should be checked before trying to recover the - * sender, as it will revert with `NotCrossChainCall` if the current - * function call is not the result of a cross-chain message. - */ - function crossChainSender(address bridge) internal view returns (address) { - if (!isCrossChain(bridge)) revert NotCrossChainCall(); - return AMB_Bridge(bridge).messageSender(); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/crosschain/arbitrum/CrossChainEnabledArbitrumL1.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/crosschain/arbitrum/CrossChainEnabledArbitrumL1.sol deleted file mode 100644 index 69c5abd..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/crosschain/arbitrum/CrossChainEnabledArbitrumL1.sol +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.4; - -import "../CrossChainEnabled.sol"; -import "./LibArbitrumL1.sol"; - -/** - * @dev [Arbitrum](https://arbitrum.io/) specialization or the - * {CrossChainEnabled} abstraction the L1 side (mainnet). - * - * This version should only be deployed on L1 to process cross-chain messages - * originating from L2. For the other side, use {CrossChainEnabledArbitrumL2}. - * - * The bridge contract is provided and maintained by the arbitrum team. You can - * find the address of this contract on the rinkeby testnet in - * [Arbitrum's developer documentation](https://developer.offchainlabs.com/docs/useful_addresses). - * - * _Available since v4.6._ - */ -abstract contract CrossChainEnabledArbitrumL1 is CrossChainEnabled { - /// @custom:oz-upgrades-unsafe-allow state-variable-immutable - address private immutable _bridge; - - /// @custom:oz-upgrades-unsafe-allow constructor - constructor(address bridge) { - _bridge = bridge; - } - - /** - * @dev see {CrossChainEnabled-_isCrossChain} - */ - function _isCrossChain() internal view virtual override returns (bool) { - return LibArbitrumL1.isCrossChain(_bridge); - } - - /** - * @dev see {CrossChainEnabled-_crossChainSender} - */ - function _crossChainSender() internal view virtual override onlyCrossChain returns (address) { - return LibArbitrumL1.crossChainSender(_bridge); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/crosschain/arbitrum/CrossChainEnabledArbitrumL2.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/crosschain/arbitrum/CrossChainEnabledArbitrumL2.sol deleted file mode 100644 index 061862e..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/crosschain/arbitrum/CrossChainEnabledArbitrumL2.sol +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.4; - -import "../CrossChainEnabled.sol"; -import "./LibArbitrumL2.sol"; - -/** - * @dev [Arbitrum](https://arbitrum.io/) specialization or the - * {CrossChainEnabled} abstraction the L2 side (arbitrum). - * - * This version should only be deployed on L2 to process cross-chain messages - * originating from L1. For the other side, use {CrossChainEnabledArbitrumL1}. - * - * Arbitrum L2 includes the `ArbSys` contract at a fixed address. Therefore, - * this specialization of {CrossChainEnabled} does not include a constructor. - * - * _Available since v4.6._ - */ -abstract contract CrossChainEnabledArbitrumL2 is CrossChainEnabled { - /** - * @dev see {CrossChainEnabled-_isCrossChain} - */ - function _isCrossChain() internal view virtual override returns (bool) { - return LibArbitrumL2.isCrossChain(LibArbitrumL2.ARBSYS); - } - - /** - * @dev see {CrossChainEnabled-_crossChainSender} - */ - function _crossChainSender() internal view virtual override onlyCrossChain returns (address) { - return LibArbitrumL2.crossChainSender(LibArbitrumL2.ARBSYS); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/crosschain/arbitrum/LibArbitrumL1.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/crosschain/arbitrum/LibArbitrumL1.sol deleted file mode 100644 index 55c9a50..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/crosschain/arbitrum/LibArbitrumL1.sol +++ /dev/null @@ -1,42 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.4; - -import {IBridge as ArbitrumL1_Bridge} from "../../vendor/arbitrum/IBridge.sol"; -import {IInbox as ArbitrumL1_Inbox} from "../../vendor/arbitrum/IInbox.sol"; -import {IOutbox as ArbitrumL1_Outbox} from "../../vendor/arbitrum/IOutbox.sol"; -import "../errors.sol"; - -/** - * @dev Primitives for cross-chain aware contracts for - * [Arbitrum](https://arbitrum.io/). - * - * This version should only be used on L1 to process cross-chain messages - * originating from L2. For the other side, use {LibArbitrumL2}. - */ -library LibArbitrumL1 { - /** - * @dev Returns whether the current function call is the result of a - * cross-chain message relayed by the `bridge`. - */ - function isCrossChain(address bridge) internal view returns (bool) { - return msg.sender == bridge; - } - - /** - * @dev Returns the address of the sender that triggered the current - * cross-chain message through the `bridge`. - * - * NOTE: {isCrossChain} should be checked before trying to recover the - * sender, as it will revert with `NotCrossChainCall` if the current - * function call is not the result of a cross-chain message. - */ - function crossChainSender(address bridge) internal view returns (address) { - if (!isCrossChain(bridge)) revert NotCrossChainCall(); - - address sender = ArbitrumL1_Outbox(ArbitrumL1_Bridge(bridge).activeOutbox()).l2ToL1Sender(); - require(sender != address(0), "LibArbitrumL1: system messages without sender"); - - return sender; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/crosschain/arbitrum/LibArbitrumL2.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/crosschain/arbitrum/LibArbitrumL2.sol deleted file mode 100644 index c8a6f54..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/crosschain/arbitrum/LibArbitrumL2.sol +++ /dev/null @@ -1,42 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.4; - -import {IArbSys as ArbitrumL2_Bridge} from "../../vendor/arbitrum/IArbSys.sol"; -import "../errors.sol"; - -/** - * @dev Primitives for cross-chain aware contracts for - * [Arbitrum](https://arbitrum.io/). - * - * This version should only be used on L2 to process cross-chain messages - * originating from L1. For the other side, use {LibArbitrumL1}. - */ -library LibArbitrumL2 { - /** - * @dev Returns whether the current function call is the result of a - * cross-chain message relayed by `arbsys`. - */ - address public constant ARBSYS = 0x0000000000000000000000000000000000000064; - - function isCrossChain(address arbsys) internal view returns (bool) { - return ArbitrumL2_Bridge(arbsys).isTopLevelCall(); - } - - /** - * @dev Returns the address of the sender that triggered the current - * cross-chain message through `arbsys`. - * - * NOTE: {isCrossChain} should be checked before trying to recover the - * sender, as it will revert with `NotCrossChainCall` if the current - * function call is not the result of a cross-chain message. - */ - function crossChainSender(address arbsys) internal view returns (address) { - if (!isCrossChain(arbsys)) revert NotCrossChainCall(); - - return - ArbitrumL2_Bridge(arbsys).wasMyCallersAddressAliased() - ? ArbitrumL2_Bridge(arbsys).myCallersAddressWithoutAliasing() - : msg.sender; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/crosschain/errors.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/crosschain/errors.sol deleted file mode 100644 index fcc9477..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/crosschain/errors.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.4; - -error NotCrossChainCall(); -error InvalidCrossChainSender(address actual, address expected); diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/crosschain/optimism/CrossChainEnabledOptimism.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/crosschain/optimism/CrossChainEnabledOptimism.sol deleted file mode 100644 index fe3564c..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/crosschain/optimism/CrossChainEnabledOptimism.sol +++ /dev/null @@ -1,40 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.4; - -import "../CrossChainEnabled.sol"; -import "./LibOptimism.sol"; - -/** - * @dev [Optimism](https://www.optimism.io/) specialization or the - * {CrossChainEnabled} abstraction. - * - * The messenger (`CrossDomainMessenger`) contract is provided and maintained by - * the optimism team. You can find the address of this contract on mainnet and - * kovan in the [deployments section of Optimism monorepo](https://github.com/ethereum-optimism/optimism/tree/develop/packages/contracts/deployments). - * - * _Available since v4.6._ - */ -abstract contract CrossChainEnabledOptimism is CrossChainEnabled { - /// @custom:oz-upgrades-unsafe-allow state-variable-immutable - address private immutable _messenger; - - /// @custom:oz-upgrades-unsafe-allow constructor - constructor(address messenger) { - _messenger = messenger; - } - - /** - * @dev see {CrossChainEnabled-_isCrossChain} - */ - function _isCrossChain() internal view virtual override returns (bool) { - return LibOptimism.isCrossChain(_messenger); - } - - /** - * @dev see {CrossChainEnabled-_crossChainSender} - */ - function _crossChainSender() internal view virtual override onlyCrossChain returns (address) { - return LibOptimism.crossChainSender(_messenger); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/crosschain/optimism/LibOptimism.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/crosschain/optimism/LibOptimism.sol deleted file mode 100644 index 3dfc5da..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/crosschain/optimism/LibOptimism.sol +++ /dev/null @@ -1,35 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.4; - -import {ICrossDomainMessenger as Optimism_Bridge} from "../../vendor/optimism/ICrossDomainMessenger.sol"; -import "../errors.sol"; - -/** - * @dev Primitives for cross-chain aware contracts for [Optimism](https://www.optimism.io/). - * See the [documentation](https://community.optimism.io/docs/developers/bridge/messaging/#accessing-msg-sender) - * for the functionality used here. - */ -library LibOptimism { - /** - * @dev Returns whether the current function call is the result of a - * cross-chain message relayed by `messenger`. - */ - function isCrossChain(address messenger) internal view returns (bool) { - return msg.sender == messenger; - } - - /** - * @dev Returns the address of the sender that triggered the current - * cross-chain message through `messenger`. - * - * NOTE: {isCrossChain} should be checked before trying to recover the - * sender, as it will revert with `NotCrossChainCall` if the current - * function call is not the result of a cross-chain message. - */ - function crossChainSender(address messenger) internal view returns (address) { - if (!isCrossChain(messenger)) revert NotCrossChainCall(); - - return Optimism_Bridge(messenger).xDomainMessageSender(); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/crosschain/polygon/CrossChainEnabledPolygonChild.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/crosschain/polygon/CrossChainEnabledPolygonChild.sol deleted file mode 100644 index e7555a3..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/crosschain/polygon/CrossChainEnabledPolygonChild.sol +++ /dev/null @@ -1,71 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.4; - -import "../CrossChainEnabled.sol"; -import "../../security/ReentrancyGuard.sol"; -import "../../utils/Address.sol"; -import "../../vendor/polygon/IFxMessageProcessor.sol"; - -address constant DEFAULT_SENDER = 0x000000000000000000000000000000000000dEaD; - -/** - * @dev [Polygon](https://polygon.technology/) specialization or the - * {CrossChainEnabled} abstraction the child side (polygon/mumbai). - * - * This version should only be deployed on child chain to process cross-chain - * messages originating from the parent chain. - * - * The fxChild contract is provided and maintained by the polygon team. You can - * find the address of this contract polygon and mumbai in - * [Polygon's Fx-Portal documentation](https://docs.polygon.technology/docs/develop/l1-l2-communication/fx-portal/#contract-addresses). - * - * _Available since v4.6._ - */ -abstract contract CrossChainEnabledPolygonChild is IFxMessageProcessor, CrossChainEnabled, ReentrancyGuard { - /// @custom:oz-upgrades-unsafe-allow state-variable-immutable - address private immutable _fxChild; - address private _sender = DEFAULT_SENDER; - - /// @custom:oz-upgrades-unsafe-allow constructor - constructor(address fxChild) { - _fxChild = fxChild; - } - - /** - * @dev see {CrossChainEnabled-_isCrossChain} - */ - function _isCrossChain() internal view virtual override returns (bool) { - return msg.sender == _fxChild; - } - - /** - * @dev see {CrossChainEnabled-_crossChainSender} - */ - function _crossChainSender() internal view virtual override onlyCrossChain returns (address) { - return _sender; - } - - /** - * @dev External entry point to receive and relay messages originating - * from the fxChild. - * - * Non-reentrancy is crucial to avoid a cross-chain call being able - * to impersonate anyone by just looping through this with user-defined - * arguments. - * - * Note: if _fxChild calls any other function that does a delegate-call, - * then security could be compromised. - */ - function processMessageFromRoot( - uint256, /* stateId */ - address rootMessageSender, - bytes calldata data - ) external override nonReentrant { - require(msg.sender == _fxChild, "unauthorized cross-chain relay"); - - _sender = rootMessageSender; - Address.functionDelegateCall(address(this), data, "crosschain execution failled"); - _sender = DEFAULT_SENDER; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/finance/PaymentSplitter.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/finance/PaymentSplitter.sol deleted file mode 100644 index 94d2ab8..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/finance/PaymentSplitter.sol +++ /dev/null @@ -1,189 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol) - -pragma solidity ^0.8.0; - -import "../token/ERC20/utils/SafeERC20.sol"; -import "../utils/Address.sol"; -import "../utils/Context.sol"; - -/** - * @title PaymentSplitter - * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware - * that the Ether will be split in this way, since it is handled transparently by the contract. - * - * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each - * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim - * an amount proportional to the percentage of total shares they were assigned. - * - * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the - * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release} - * function. - * - * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and - * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you - * to run tests before sending real value to this contract. - */ -contract PaymentSplitter is Context { - event PayeeAdded(address account, uint256 shares); - event PaymentReleased(address to, uint256 amount); - event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount); - event PaymentReceived(address from, uint256 amount); - - uint256 private _totalShares; - uint256 private _totalReleased; - - mapping(address => uint256) private _shares; - mapping(address => uint256) private _released; - address[] private _payees; - - mapping(IERC20 => uint256) private _erc20TotalReleased; - mapping(IERC20 => mapping(address => uint256)) private _erc20Released; - - /** - * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at - * the matching position in the `shares` array. - * - * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no - * duplicates in `payees`. - */ - constructor(address[] memory payees, uint256[] memory shares_) payable { - require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch"); - require(payees.length > 0, "PaymentSplitter: no payees"); - - for (uint256 i = 0; i < payees.length; i++) { - _addPayee(payees[i], shares_[i]); - } - } - - /** - * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully - * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the - * reliability of the events, and not the actual splitting of Ether. - * - * To learn more about this see the Solidity documentation for - * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback - * functions]. - */ - receive() external payable virtual { - emit PaymentReceived(_msgSender(), msg.value); - } - - /** - * @dev Getter for the total shares held by payees. - */ - function totalShares() public view returns (uint256) { - return _totalShares; - } - - /** - * @dev Getter for the total amount of Ether already released. - */ - function totalReleased() public view returns (uint256) { - return _totalReleased; - } - - /** - * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20 - * contract. - */ - function totalReleased(IERC20 token) public view returns (uint256) { - return _erc20TotalReleased[token]; - } - - /** - * @dev Getter for the amount of shares held by an account. - */ - function shares(address account) public view returns (uint256) { - return _shares[account]; - } - - /** - * @dev Getter for the amount of Ether already released to a payee. - */ - function released(address account) public view returns (uint256) { - return _released[account]; - } - - /** - * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an - * IERC20 contract. - */ - function released(IERC20 token, address account) public view returns (uint256) { - return _erc20Released[token][account]; - } - - /** - * @dev Getter for the address of the payee number `index`. - */ - function payee(uint256 index) public view returns (address) { - return _payees[index]; - } - - /** - * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the - * total shares and their previous withdrawals. - */ - function release(address payable account) public virtual { - require(_shares[account] > 0, "PaymentSplitter: account has no shares"); - - uint256 totalReceived = address(this).balance + totalReleased(); - uint256 payment = _pendingPayment(account, totalReceived, released(account)); - - require(payment != 0, "PaymentSplitter: account is not due payment"); - - _released[account] += payment; - _totalReleased += payment; - - Address.sendValue(account, payment); - emit PaymentReleased(account, payment); - } - - /** - * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their - * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20 - * contract. - */ - function release(IERC20 token, address account) public virtual { - require(_shares[account] > 0, "PaymentSplitter: account has no shares"); - - uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token); - uint256 payment = _pendingPayment(account, totalReceived, released(token, account)); - - require(payment != 0, "PaymentSplitter: account is not due payment"); - - _erc20Released[token][account] += payment; - _erc20TotalReleased[token] += payment; - - SafeERC20.safeTransfer(token, account, payment); - emit ERC20PaymentReleased(token, account, payment); - } - - /** - * @dev internal logic for computing the pending payment of an `account` given the token historical balances and - * already released amounts. - */ - function _pendingPayment( - address account, - uint256 totalReceived, - uint256 alreadyReleased - ) private view returns (uint256) { - return (totalReceived * _shares[account]) / _totalShares - alreadyReleased; - } - - /** - * @dev Add a new payee to the contract. - * @param account The address of the payee to add. - * @param shares_ The number of shares owned by the payee. - */ - function _addPayee(address account, uint256 shares_) private { - require(account != address(0), "PaymentSplitter: account is the zero address"); - require(shares_ > 0, "PaymentSplitter: shares are 0"); - require(_shares[account] == 0, "PaymentSplitter: account already has shares"); - - _payees.push(account); - _shares[account] = shares_; - _totalShares = _totalShares + shares_; - emit PayeeAdded(account, shares_); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/finance/README.adoc b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/finance/README.adoc deleted file mode 100644 index b64af31..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/finance/README.adoc +++ /dev/null @@ -1,20 +0,0 @@ -= Finance - -[.readme-notice] -NOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/finance - -This directory includes primitives for financial systems: - -- {PaymentSplitter} allows to split Ether and ERC20 payments among a group of accounts. The sender does not need to be - aware that the assets will be split in this way, since it is handled transparently by the contract. The split can be - in equal parts or in any other arbitrary proportion. - -- {VestingWallet} handles the vesting of Ether and ERC20 tokens for a given beneficiary. Custody of multiple tokens can - be given to this contract, which will release the token to the beneficiary following a given, customizable, vesting - schedule. - -== Contracts - -{{PaymentSplitter}} - -{{VestingWallet}} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/finance/VestingWallet.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/finance/VestingWallet.sol deleted file mode 100644 index 486ad37..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/finance/VestingWallet.sol +++ /dev/null @@ -1,135 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (finance/VestingWallet.sol) -pragma solidity ^0.8.0; - -import "../token/ERC20/utils/SafeERC20.sol"; -import "../utils/Address.sol"; -import "../utils/Context.sol"; -import "../utils/math/Math.sol"; - -/** - * @title VestingWallet - * @dev This contract handles the vesting of Eth and ERC20 tokens for a given beneficiary. Custody of multiple tokens - * can be given to this contract, which will release the token to the beneficiary following a given vesting schedule. - * The vesting schedule is customizable through the {vestedAmount} function. - * - * Any token transferred to this contract will follow the vesting schedule as if they were locked from the beginning. - * Consequently, if the vesting has already started, any amount of tokens sent to this contract will (at least partly) - * be immediately releasable. - */ -contract VestingWallet is Context { - event EtherReleased(uint256 amount); - event ERC20Released(address indexed token, uint256 amount); - - uint256 private _released; - mapping(address => uint256) private _erc20Released; - address private immutable _beneficiary; - uint64 private immutable _start; - uint64 private immutable _duration; - - /** - * @dev Set the beneficiary, start timestamp and vesting duration of the vesting wallet. - */ - constructor( - address beneficiaryAddress, - uint64 startTimestamp, - uint64 durationSeconds - ) { - require(beneficiaryAddress != address(0), "VestingWallet: beneficiary is zero address"); - _beneficiary = beneficiaryAddress; - _start = startTimestamp; - _duration = durationSeconds; - } - - /** - * @dev The contract should be able to receive Eth. - */ - receive() external payable virtual {} - - /** - * @dev Getter for the beneficiary address. - */ - function beneficiary() public view virtual returns (address) { - return _beneficiary; - } - - /** - * @dev Getter for the start timestamp. - */ - function start() public view virtual returns (uint256) { - return _start; - } - - /** - * @dev Getter for the vesting duration. - */ - function duration() public view virtual returns (uint256) { - return _duration; - } - - /** - * @dev Amount of eth already released - */ - function released() public view virtual returns (uint256) { - return _released; - } - - /** - * @dev Amount of token already released - */ - function released(address token) public view virtual returns (uint256) { - return _erc20Released[token]; - } - - /** - * @dev Release the native token (ether) that have already vested. - * - * Emits a {TokensReleased} event. - */ - function release() public virtual { - uint256 releasable = vestedAmount(uint64(block.timestamp)) - released(); - _released += releasable; - emit EtherReleased(releasable); - Address.sendValue(payable(beneficiary()), releasable); - } - - /** - * @dev Release the tokens that have already vested. - * - * Emits a {TokensReleased} event. - */ - function release(address token) public virtual { - uint256 releasable = vestedAmount(token, uint64(block.timestamp)) - released(token); - _erc20Released[token] += releasable; - emit ERC20Released(token, releasable); - SafeERC20.safeTransfer(IERC20(token), beneficiary(), releasable); - } - - /** - * @dev Calculates the amount of ether that has already vested. Default implementation is a linear vesting curve. - */ - function vestedAmount(uint64 timestamp) public view virtual returns (uint256) { - return _vestingSchedule(address(this).balance + released(), timestamp); - } - - /** - * @dev Calculates the amount of tokens that has already vested. Default implementation is a linear vesting curve. - */ - function vestedAmount(address token, uint64 timestamp) public view virtual returns (uint256) { - return _vestingSchedule(IERC20(token).balanceOf(address(this)) + released(token), timestamp); - } - - /** - * @dev Virtual implementation of the vesting formula. This returns the amount vested, as a function of time, for - * an asset given its total historical allocation. - */ - function _vestingSchedule(uint256 totalAllocation, uint64 timestamp) internal view virtual returns (uint256) { - if (timestamp < start()) { - return 0; - } else if (timestamp > start() + duration()) { - return totalAllocation; - } else { - return (totalAllocation * (timestamp - start())) / duration(); - } - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/Governor.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/Governor.sol deleted file mode 100644 index a18b985..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/Governor.sol +++ /dev/null @@ -1,596 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (governance/Governor.sol) - -pragma solidity ^0.8.0; - -import "../token/ERC721/IERC721Receiver.sol"; -import "../token/ERC1155/IERC1155Receiver.sol"; -import "../utils/cryptography/ECDSA.sol"; -import "../utils/cryptography/draft-EIP712.sol"; -import "../utils/introspection/ERC165.sol"; -import "../utils/math/SafeCast.sol"; -import "../utils/structs/DoubleEndedQueue.sol"; -import "../utils/Address.sol"; -import "../utils/Context.sol"; -import "../utils/Timers.sol"; -import "./IGovernor.sol"; - -/** - * @dev Core of the governance system, designed to be extended though various modules. - * - * This contract is abstract and requires several function to be implemented in various modules: - * - * - A counting module must implement {quorum}, {_quorumReached}, {_voteSucceeded} and {_countVote} - * - A voting module must implement {_getVotes} - * - Additionanly, the {votingPeriod} must also be implemented - * - * _Available since v4.3._ - */ -abstract contract Governor is Context, ERC165, EIP712, IGovernor, IERC721Receiver, IERC1155Receiver { - using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque; - using SafeCast for uint256; - using Timers for Timers.BlockNumber; - - bytes32 public constant BALLOT_TYPEHASH = keccak256("Ballot(uint256 proposalId,uint8 support)"); - bytes32 public constant EXTENDED_BALLOT_TYPEHASH = - keccak256("ExtendedBallot(uint256 proposalId,uint8 support,string reason,bytes params)"); - - struct ProposalCore { - Timers.BlockNumber voteStart; - Timers.BlockNumber voteEnd; - bool executed; - bool canceled; - } - - string private _name; - - mapping(uint256 => ProposalCore) private _proposals; - - // This queue keeps track of the governor operating on itself. Calls to functions protected by the - // {onlyGovernance} modifier needs to be whitelisted in this queue. Whitelisting is set in {_beforeExecute}, - // consumed by the {onlyGovernance} modifier and eventually reset in {_afterExecute}. This ensures that the - // execution of {onlyGovernance} protected calls can only be achieved through successful proposals. - DoubleEndedQueue.Bytes32Deque private _governanceCall; - - /** - * @dev Restricts a function so it can only be executed through governance proposals. For example, governance - * parameter setters in {GovernorSettings} are protected using this modifier. - * - * The governance executing address may be different from the Governor's own address, for example it could be a - * timelock. This can be customized by modules by overriding {_executor}. The executor is only able to invoke these - * functions during the execution of the governor's {execute} function, and not under any other circumstances. Thus, - * for example, additional timelock proposers are not able to change governance parameters without going through the - * governance protocol (since v4.6). - */ - modifier onlyGovernance() { - require(_msgSender() == _executor(), "Governor: onlyGovernance"); - if (_executor() != address(this)) { - bytes32 msgDataHash = keccak256(_msgData()); - // loop until popping the expected operation - throw if deque is empty (operation not authorized) - while (_governanceCall.popFront() != msgDataHash) {} - } - _; - } - - /** - * @dev Sets the value for {name} and {version} - */ - constructor(string memory name_) EIP712(name_, version()) { - _name = name_; - } - - /** - * @dev Function to receive ETH that will be handled by the governor (disabled if executor is a third party contract) - */ - receive() external payable virtual { - require(_executor() == address(this)); - } - - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { - // In addition to the current interfaceId, also support previous version of the interfaceId that did not - // include the castVoteWithReasonAndParams() function as standard - return - interfaceId == - (type(IGovernor).interfaceId ^ - this.castVoteWithReasonAndParams.selector ^ - this.castVoteWithReasonAndParamsBySig.selector ^ - this.getVotesWithParams.selector) || - interfaceId == type(IGovernor).interfaceId || - interfaceId == type(IERC1155Receiver).interfaceId || - super.supportsInterface(interfaceId); - } - - /** - * @dev See {IGovernor-name}. - */ - function name() public view virtual override returns (string memory) { - return _name; - } - - /** - * @dev See {IGovernor-version}. - */ - function version() public view virtual override returns (string memory) { - return "1"; - } - - /** - * @dev See {IGovernor-hashProposal}. - * - * The proposal id is produced by hashing the RLC encoded `targets` array, the `values` array, the `calldatas` array - * and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id - * can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in - * advance, before the proposal is submitted. - * - * Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the - * same proposal (with same operation and same description) will have the same id if submitted on multiple governors - * across multiple networks. This also means that in order to execute the same operation twice (on the same - * governor) the proposer will have to change the description in order to avoid proposal id conflicts. - */ - function hashProposal( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) public pure virtual override returns (uint256) { - return uint256(keccak256(abi.encode(targets, values, calldatas, descriptionHash))); - } - - /** - * @dev See {IGovernor-state}. - */ - function state(uint256 proposalId) public view virtual override returns (ProposalState) { - ProposalCore storage proposal = _proposals[proposalId]; - - if (proposal.executed) { - return ProposalState.Executed; - } - - if (proposal.canceled) { - return ProposalState.Canceled; - } - - uint256 snapshot = proposalSnapshot(proposalId); - - if (snapshot == 0) { - revert("Governor: unknown proposal id"); - } - - if (snapshot >= block.number) { - return ProposalState.Pending; - } - - uint256 deadline = proposalDeadline(proposalId); - - if (deadline >= block.number) { - return ProposalState.Active; - } - - if (_quorumReached(proposalId) && _voteSucceeded(proposalId)) { - return ProposalState.Succeeded; - } else { - return ProposalState.Defeated; - } - } - - /** - * @dev See {IGovernor-proposalSnapshot}. - */ - function proposalSnapshot(uint256 proposalId) public view virtual override returns (uint256) { - return _proposals[proposalId].voteStart.getDeadline(); - } - - /** - * @dev See {IGovernor-proposalDeadline}. - */ - function proposalDeadline(uint256 proposalId) public view virtual override returns (uint256) { - return _proposals[proposalId].voteEnd.getDeadline(); - } - - /** - * @dev Part of the Governor Bravo's interface: _"The number of votes required in order for a voter to become a proposer"_. - */ - function proposalThreshold() public view virtual returns (uint256) { - return 0; - } - - /** - * @dev Amount of votes already cast passes the threshold limit. - */ - function _quorumReached(uint256 proposalId) internal view virtual returns (bool); - - /** - * @dev Is the proposal successful or not. - */ - function _voteSucceeded(uint256 proposalId) internal view virtual returns (bool); - - /** - * @dev Get the voting weight of `account` at a specific `blockNumber`, for a vote as described by `params`. - */ - function _getVotes( - address account, - uint256 blockNumber, - bytes memory params - ) internal view virtual returns (uint256); - - /** - * @dev Register a vote with a given support and voting weight. - * - * Note: Support is generic and can represent various things depending on the voting system used. - */ - function _countVote( - uint256 proposalId, - address account, - uint8 support, - uint256 weight, - bytes memory params - ) internal virtual; - - /** - * @dev Default additional encoded parameters used by castVote methods that don't include them - * - * Note: Should be overridden by specific implementations to use an appropriate value, the - * meaning of the additional params, in the context of that implementation - */ - function _defaultParams() internal view virtual returns (bytes memory) { - return ""; - } - - /** - * @dev See {IGovernor-propose}. - */ - function propose( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - string memory description - ) public virtual override returns (uint256) { - require( - getVotes(_msgSender(), block.number - 1) >= proposalThreshold(), - "Governor: proposer votes below proposal threshold" - ); - - uint256 proposalId = hashProposal(targets, values, calldatas, keccak256(bytes(description))); - - require(targets.length == values.length, "Governor: invalid proposal length"); - require(targets.length == calldatas.length, "Governor: invalid proposal length"); - require(targets.length > 0, "Governor: empty proposal"); - - ProposalCore storage proposal = _proposals[proposalId]; - require(proposal.voteStart.isUnset(), "Governor: proposal already exists"); - - uint64 snapshot = block.number.toUint64() + votingDelay().toUint64(); - uint64 deadline = snapshot + votingPeriod().toUint64(); - - proposal.voteStart.setDeadline(snapshot); - proposal.voteEnd.setDeadline(deadline); - - emit ProposalCreated( - proposalId, - _msgSender(), - targets, - values, - new string[](targets.length), - calldatas, - snapshot, - deadline, - description - ); - - return proposalId; - } - - /** - * @dev See {IGovernor-execute}. - */ - function execute( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) public payable virtual override returns (uint256) { - uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash); - - ProposalState status = state(proposalId); - require( - status == ProposalState.Succeeded || status == ProposalState.Queued, - "Governor: proposal not successful" - ); - _proposals[proposalId].executed = true; - - emit ProposalExecuted(proposalId); - - _beforeExecute(proposalId, targets, values, calldatas, descriptionHash); - _execute(proposalId, targets, values, calldatas, descriptionHash); - _afterExecute(proposalId, targets, values, calldatas, descriptionHash); - - return proposalId; - } - - /** - * @dev Internal execution mechanism. Can be overridden to implement different execution mechanism - */ - function _execute( - uint256, /* proposalId */ - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 /*descriptionHash*/ - ) internal virtual { - string memory errorMessage = "Governor: call reverted without message"; - for (uint256 i = 0; i < targets.length; ++i) { - (bool success, bytes memory returndata) = targets[i].call{value: values[i]}(calldatas[i]); - Address.verifyCallResult(success, returndata, errorMessage); - } - } - - /** - * @dev Hook before execution is triggered. - */ - function _beforeExecute( - uint256, /* proposalId */ - address[] memory targets, - uint256[] memory, /* values */ - bytes[] memory calldatas, - bytes32 /*descriptionHash*/ - ) internal virtual { - if (_executor() != address(this)) { - for (uint256 i = 0; i < targets.length; ++i) { - if (targets[i] == address(this)) { - _governanceCall.pushBack(keccak256(calldatas[i])); - } - } - } - } - - /** - * @dev Hook after execution is triggered. - */ - function _afterExecute( - uint256, /* proposalId */ - address[] memory, /* targets */ - uint256[] memory, /* values */ - bytes[] memory, /* calldatas */ - bytes32 /*descriptionHash*/ - ) internal virtual { - if (_executor() != address(this)) { - if (!_governanceCall.empty()) { - _governanceCall.clear(); - } - } - } - - /** - * @dev Internal cancel mechanism: locks up the proposal timer, preventing it from being re-submitted. Marks it as - * canceled to allow distinguishing it from executed proposals. - * - * Emits a {IGovernor-ProposalCanceled} event. - */ - function _cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) internal virtual returns (uint256) { - uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash); - ProposalState status = state(proposalId); - - require( - status != ProposalState.Canceled && status != ProposalState.Expired && status != ProposalState.Executed, - "Governor: proposal not active" - ); - _proposals[proposalId].canceled = true; - - emit ProposalCanceled(proposalId); - - return proposalId; - } - - /** - * @dev See {IGovernor-getVotes}. - */ - function getVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) { - return _getVotes(account, blockNumber, _defaultParams()); - } - - /** - * @dev See {IGovernor-getVotesWithParams}. - */ - function getVotesWithParams( - address account, - uint256 blockNumber, - bytes memory params - ) public view virtual override returns (uint256) { - return _getVotes(account, blockNumber, params); - } - - /** - * @dev See {IGovernor-castVote}. - */ - function castVote(uint256 proposalId, uint8 support) public virtual override returns (uint256) { - address voter = _msgSender(); - return _castVote(proposalId, voter, support, ""); - } - - /** - * @dev See {IGovernor-castVoteWithReason}. - */ - function castVoteWithReason( - uint256 proposalId, - uint8 support, - string calldata reason - ) public virtual override returns (uint256) { - address voter = _msgSender(); - return _castVote(proposalId, voter, support, reason); - } - - /** - * @dev See {IGovernor-castVoteWithReasonAndParams}. - */ - function castVoteWithReasonAndParams( - uint256 proposalId, - uint8 support, - string calldata reason, - bytes memory params - ) public virtual override returns (uint256) { - address voter = _msgSender(); - return _castVote(proposalId, voter, support, reason, params); - } - - /** - * @dev See {IGovernor-castVoteBySig}. - */ - function castVoteBySig( - uint256 proposalId, - uint8 support, - uint8 v, - bytes32 r, - bytes32 s - ) public virtual override returns (uint256) { - address voter = ECDSA.recover( - _hashTypedDataV4(keccak256(abi.encode(BALLOT_TYPEHASH, proposalId, support))), - v, - r, - s - ); - return _castVote(proposalId, voter, support, ""); - } - - /** - * @dev See {IGovernor-castVoteWithReasonAndParamsBySig}. - */ - function castVoteWithReasonAndParamsBySig( - uint256 proposalId, - uint8 support, - string calldata reason, - bytes memory params, - uint8 v, - bytes32 r, - bytes32 s - ) public virtual override returns (uint256) { - address voter = ECDSA.recover( - _hashTypedDataV4( - keccak256( - abi.encode( - EXTENDED_BALLOT_TYPEHASH, - proposalId, - support, - keccak256(bytes(reason)), - keccak256(params) - ) - ) - ), - v, - r, - s - ); - - return _castVote(proposalId, voter, support, reason, params); - } - - /** - * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve - * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function. Uses the _defaultParams(). - * - * Emits a {IGovernor-VoteCast} event. - */ - function _castVote( - uint256 proposalId, - address account, - uint8 support, - string memory reason - ) internal virtual returns (uint256) { - return _castVote(proposalId, account, support, reason, _defaultParams()); - } - - /** - * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve - * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function. - * - * Emits a {IGovernor-VoteCast} event. - */ - function _castVote( - uint256 proposalId, - address account, - uint8 support, - string memory reason, - bytes memory params - ) internal virtual returns (uint256) { - ProposalCore storage proposal = _proposals[proposalId]; - require(state(proposalId) == ProposalState.Active, "Governor: vote not currently active"); - - uint256 weight = _getVotes(account, proposal.voteStart.getDeadline(), params); - _countVote(proposalId, account, support, weight, params); - - if (params.length == 0) { - emit VoteCast(account, proposalId, support, weight, reason); - } else { - emit VoteCastWithParams(account, proposalId, support, weight, reason, params); - } - - return weight; - } - - /** - * @dev Relays a transaction or function call to an arbitrary target. In cases where the governance executor - * is some contract other than the governor itself, like when using a timelock, this function can be invoked - * in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake. - * Note that if the executor is simply the governor itself, use of `relay` is redundant. - */ - function relay( - address target, - uint256 value, - bytes calldata data - ) external virtual onlyGovernance { - Address.functionCallWithValue(target, data, value); - } - - /** - * @dev Address through which the governor executes action. Will be overloaded by module that execute actions - * through another contract such as a timelock. - */ - function _executor() internal view virtual returns (address) { - return address(this); - } - - /** - * @dev See {IERC721Receiver-onERC721Received}. - */ - function onERC721Received( - address, - address, - uint256, - bytes memory - ) public virtual override returns (bytes4) { - return this.onERC721Received.selector; - } - - /** - * @dev See {IERC1155Receiver-onERC1155Received}. - */ - function onERC1155Received( - address, - address, - uint256, - uint256, - bytes memory - ) public virtual override returns (bytes4) { - return this.onERC1155Received.selector; - } - - /** - * @dev See {IERC1155Receiver-onERC1155BatchReceived}. - */ - function onERC1155BatchReceived( - address, - address, - uint256[] memory, - uint256[] memory, - bytes memory - ) public virtual override returns (bytes4) { - return this.onERC1155BatchReceived.selector; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/IGovernor.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/IGovernor.sol deleted file mode 100644 index 6959825..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/IGovernor.sol +++ /dev/null @@ -1,276 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (governance/IGovernor.sol) - -pragma solidity ^0.8.0; - -import "../utils/introspection/ERC165.sol"; - -/** - * @dev Interface of the {Governor} core. - * - * _Available since v4.3._ - */ -abstract contract IGovernor is IERC165 { - enum ProposalState { - Pending, - Active, - Canceled, - Defeated, - Succeeded, - Queued, - Expired, - Executed - } - - /** - * @dev Emitted when a proposal is created. - */ - event ProposalCreated( - uint256 proposalId, - address proposer, - address[] targets, - uint256[] values, - string[] signatures, - bytes[] calldatas, - uint256 startBlock, - uint256 endBlock, - string description - ); - - /** - * @dev Emitted when a proposal is canceled. - */ - event ProposalCanceled(uint256 proposalId); - - /** - * @dev Emitted when a proposal is executed. - */ - event ProposalExecuted(uint256 proposalId); - - /** - * @dev Emitted when a vote is cast without params. - * - * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used. - */ - event VoteCast(address indexed voter, uint256 proposalId, uint8 support, uint256 weight, string reason); - - /** - * @dev Emitted when a vote is cast with params. - * - * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used. - * `params` are additional encoded parameters. Their intepepretation also depends on the voting module used. - */ - event VoteCastWithParams( - address indexed voter, - uint256 proposalId, - uint8 support, - uint256 weight, - string reason, - bytes params - ); - - /** - * @notice module:core - * @dev Name of the governor instance (used in building the ERC712 domain separator). - */ - function name() public view virtual returns (string memory); - - /** - * @notice module:core - * @dev Version of the governor instance (used in building the ERC712 domain separator). Default: "1" - */ - function version() public view virtual returns (string memory); - - /** - * @notice module:voting - * @dev A description of the possible `support` values for {castVote} and the way these votes are counted, meant to - * be consumed by UIs to show correct vote options and interpret the results. The string is a URL-encoded sequence of - * key-value pairs that each describe one aspect, for example `support=bravo&quorum=for,abstain`. - * - * There are 2 standard keys: `support` and `quorum`. - * - * - `support=bravo` refers to the vote options 0 = Against, 1 = For, 2 = Abstain, as in `GovernorBravo`. - * - `quorum=bravo` means that only For votes are counted towards quorum. - * - `quorum=for,abstain` means that both For and Abstain votes are counted towards quorum. - * - * If a counting module makes use of encoded `params`, it should include this under a `params` key with a unique - * name that describes the behavior. For example: - * - * - `params=fractional` might refer to a scheme where votes are divided fractionally between for/against/abstain. - * - `params=erc721` might refer to a scheme where specific NFTs are delegated to vote. - * - * NOTE: The string can be decoded by the standard - * https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams[`URLSearchParams`] - * JavaScript class. - */ - // solhint-disable-next-line func-name-mixedcase - function COUNTING_MODE() public pure virtual returns (string memory); - - /** - * @notice module:core - * @dev Hashing function used to (re)build the proposal id from the proposal details.. - */ - function hashProposal( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) public pure virtual returns (uint256); - - /** - * @notice module:core - * @dev Current state of a proposal, following Compound's convention - */ - function state(uint256 proposalId) public view virtual returns (ProposalState); - - /** - * @notice module:core - * @dev Block number used to retrieve user's votes and quorum. As per Compound's Comp and OpenZeppelin's - * ERC20Votes, the snapshot is performed at the end of this block. Hence, voting for this proposal starts at the - * beginning of the following block. - */ - function proposalSnapshot(uint256 proposalId) public view virtual returns (uint256); - - /** - * @notice module:core - * @dev Block number at which votes close. Votes close at the end of this block, so it is possible to cast a vote - * during this block. - */ - function proposalDeadline(uint256 proposalId) public view virtual returns (uint256); - - /** - * @notice module:user-config - * @dev Delay, in number of block, between the proposal is created and the vote starts. This can be increassed to - * leave time for users to buy voting power, of delegate it, before the voting of a proposal starts. - */ - function votingDelay() public view virtual returns (uint256); - - /** - * @notice module:user-config - * @dev Delay, in number of blocks, between the vote start and vote ends. - * - * NOTE: The {votingDelay} can delay the start of the vote. This must be considered when setting the voting - * duration compared to the voting delay. - */ - function votingPeriod() public view virtual returns (uint256); - - /** - * @notice module:user-config - * @dev Minimum number of cast voted required for a proposal to be successful. - * - * Note: The `blockNumber` parameter corresponds to the snapshot used for counting vote. This allows to scale the - * quorum depending on values such as the totalSupply of a token at this block (see {ERC20Votes}). - */ - function quorum(uint256 blockNumber) public view virtual returns (uint256); - - /** - * @notice module:reputation - * @dev Voting power of an `account` at a specific `blockNumber`. - * - * Note: this can be implemented in a number of ways, for example by reading the delegated balance from one (or - * multiple), {ERC20Votes} tokens. - */ - function getVotes(address account, uint256 blockNumber) public view virtual returns (uint256); - - /** - * @notice module:reputation - * @dev Voting power of an `account` at a specific `blockNumber` given additional encoded parameters. - */ - function getVotesWithParams( - address account, - uint256 blockNumber, - bytes memory params - ) public view virtual returns (uint256); - - /** - * @notice module:voting - * @dev Returns weither `account` has cast a vote on `proposalId`. - */ - function hasVoted(uint256 proposalId, address account) public view virtual returns (bool); - - /** - * @dev Create a new proposal. Vote start {IGovernor-votingDelay} blocks after the proposal is created and ends - * {IGovernor-votingPeriod} blocks after the voting starts. - * - * Emits a {ProposalCreated} event. - */ - function propose( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - string memory description - ) public virtual returns (uint256 proposalId); - - /** - * @dev Execute a successful proposal. This requires the quorum to be reached, the vote to be successful, and the - * deadline to be reached. - * - * Emits a {ProposalExecuted} event. - * - * Note: some module can modify the requirements for execution, for example by adding an additional timelock. - */ - function execute( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) public payable virtual returns (uint256 proposalId); - - /** - * @dev Cast a vote - * - * Emits a {VoteCast} event. - */ - function castVote(uint256 proposalId, uint8 support) public virtual returns (uint256 balance); - - /** - * @dev Cast a vote with a reason - * - * Emits a {VoteCast} event. - */ - function castVoteWithReason( - uint256 proposalId, - uint8 support, - string calldata reason - ) public virtual returns (uint256 balance); - - /** - * @dev Cast a vote with a reason and additional encoded parameters - * - * Emits a {VoteCast} event. - */ - function castVoteWithReasonAndParams( - uint256 proposalId, - uint8 support, - string calldata reason, - bytes memory params - ) public virtual returns (uint256 balance); - - /** - * @dev Cast a vote using the user's cryptographic signature. - * - * Emits a {VoteCast} event. - */ - function castVoteBySig( - uint256 proposalId, - uint8 support, - uint8 v, - bytes32 r, - bytes32 s - ) public virtual returns (uint256 balance); - - /** - * @dev Cast a vote with a reason and additional encoded parameters using the user's cryptographic signature. - * - * Emits a {VoteCast} event. - */ - function castVoteWithReasonAndParamsBySig( - uint256 proposalId, - uint8 support, - string calldata reason, - bytes memory params, - uint8 v, - bytes32 r, - bytes32 s - ) public virtual returns (uint256 balance); -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/README.adoc b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/README.adoc deleted file mode 100644 index 9e393e9..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/README.adoc +++ /dev/null @@ -1,176 +0,0 @@ -= Governance - -[.readme-notice] -NOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/governance - -This directory includes primitives for on-chain governance. - -== Governor - -This modular system of Governor contracts allows the deployment on-chain voting protocols similar to https://compound.finance/docs/governance[Compound's Governor Alpha & Bravo] and beyond, through the ability to easily customize multiple aspects of the protocol. - -[TIP] -==== -For a guided experience, set up your Governor contract using https://wizard.openzeppelin.com/#governor[Contracts Wizard]. - -For a written walkthrough, check out our guide on xref:ROOT:governance.adoc[How to set up on-chain governance]. -==== - -* {Governor}: The core contract that contains all the logic and primitives. It is abstract and requires choosing one of each of the modules below, or custom ones. - -Votes modules determine the source of voting power, and sometimes quorum number. - -* {GovernorVotes}: Extracts voting weight from an {ERC20Votes} token. - -* {GovernorVotesComp}: Extracts voting weight from a COMP-like or {ERC20VotesComp} token. - -* {GovernorVotesQuorumFraction}: Combines with `GovernorVotes` to set the quorum as a fraction of the total token supply. - -Counting modules determine valid voting options. - -* {GovernorCountingSimple}: Simple voting mechanism with 3 voting options: Against, For and Abstain. - -Timelock extensions add a delay for governance decisions to be executed. The workflow is extended to require a `queue` step before execution. With these modules, proposals are executed by the external timelock contract, thus it is the timelock that has to hold the assets that are being governed. - -* {GovernorTimelockControl}: Connects with an instance of {TimelockController}. Allows multiple proposers and executors, in addition to the Governor itself. - -* {GovernorTimelockCompound}: Connects with an instance of Compound's https://github.com/compound-finance/compound-protocol/blob/master/contracts/Timelock.sol[`Timelock`] contract. - -Other extensions can customize the behavior or interface in multiple ways. - -* {GovernorCompatibilityBravo}: Extends the interface to be fully `GovernorBravo`-compatible. Note that events are compatible regardless of whether this extension is included or not. - -* {GovernorSettings}: Manages some of the settings (voting delay, voting period duration, and proposal threshold) in a way that can be updated through a governance proposal, without requiring an upgrade. - -* {GovernorPreventLateQuorum}: Ensures there is a minimum voting period after quorum is reached as a security protection against large voters. - -In addition to modules and extensions, the core contract requires a few virtual functions to be implemented to your particular specifications: - -* <>: Delay (in number of blocks) since the proposal is submitted until voting power is fixed and voting starts. This can be used to enforce a delay after a proposal is published for users to buy tokens, or delegate their votes. -* <>: Delay (in number of blocks) since the proposal starts until voting ends. -* <>: Quorum required for a proposal to be successful. This function includes a `blockNumber` argument so the quorum can adapt through time, for example, to follow a token's `totalSupply`. - -NOTE: Functions of the `Governor` contract do not include access control. If you want to restrict access, you should add these checks by overloading the particular functions. Among these, {Governor-_cancel} is internal by default, and you will have to expose it (with the right access control mechanism) yourself if this function is needed. - -=== Core - -{{IGovernor}} - -{{Governor}} - -=== Modules - -{{GovernorCountingSimple}} - -{{GovernorVotes}} - -{{GovernorVotesQuorumFraction}} - -{{GovernorVotesComp}} - -=== Extensions - -{{GovernorTimelockControl}} - -{{GovernorTimelockCompound}} - -{{GovernorSettings}} - -{{GovernorPreventLateQuorum}} - -{{GovernorCompatibilityBravo}} - -=== Deprecated - -{{GovernorProposalThreshold}} - -== Utils - -{{Votes}} - -== Timelock - -In a governance system, the {TimelockController} contract is in charge of introducing a delay between a proposal and its execution. It can be used with or without a {Governor}. - -{{TimelockController}} - -[[timelock-terminology]] -==== Terminology - -* *Operation:* A transaction (or a set of transactions) that is the subject of the timelock. It has to be scheduled by a proposer and executed by an executor. The timelock enforces a minimum delay between the proposition and the execution (see xref:access-control.adoc#operation_lifecycle[operation lifecycle]). If the operation contains multiple transactions (batch mode), they are executed atomically. Operations are identified by the hash of their content. -* *Operation status:* -** *Unset:* An operation that is not part of the timelock mechanism. -** *Pending:* An operation that has been scheduled, before the timer expires. -** *Ready:* An operation that has been scheduled, after the timer expires. -** *Done:* An operation that has been executed. -* *Predecessor*: An (optional) dependency between operations. An operation can depend on another operation (its predecessor), forcing the execution order of these two operations. -* *Role*: -** *Admin:* An address (smart contract or EOA) that is in charge of granting the roles of Proposer and Executor. -** *Proposer:* An address (smart contract or EOA) that is in charge of scheduling (and cancelling) operations. -** *Executor:* An address (smart contract or EOA) that is in charge of executing operations once the timelock has expired. This role can be given to the zero address to allow anyone to execute operations. - -[[timelock-operation]] -==== Operation structure - -Operation executed by the xref:api:governance.adoc#TimelockController[`TimelockController`] can contain one or multiple subsequent calls. Depending on whether you need to multiple calls to be executed atomically, you can either use simple or batched operations. - -Both operations contain: - -* *Target*, the address of the smart contract that the timelock should operate on. -* *Value*, in wei, that should be sent with the transaction. Most of the time this will be 0. Ether can be deposited before-end or passed along when executing the transaction. -* *Data*, containing the encoded function selector and parameters of the call. This can be produced using a number of tools. For example, a maintenance operation granting role `ROLE` to `ACCOUNT` can be encode using web3js as follows: - -```javascript -const data = timelock.contract.methods.grantRole(ROLE, ACCOUNT).encodeABI() -``` - -* *Predecessor*, that specifies a dependency between operations. This dependency is optional. Use `bytes32(0)` if the operation does not have any dependency. -* *Salt*, used to disambiguate two otherwise identical operations. This can be any random value. - -In the case of batched operations, `target`, `value` and `data` are specified as arrays, which must be of the same length. - -[[timelock-operation-lifecycle]] -==== Operation lifecycle - -Timelocked operations are identified by a unique id (their hash) and follow a specific lifecycle: - -`Unset` -> `Pending` -> `Pending` + `Ready` -> `Done` - -* By calling xref:api:governance.adoc#TimelockController-schedule-address-uint256-bytes-bytes32-bytes32-uint256-[`schedule`] (or xref:api:governance.adoc#TimelockController-scheduleBatch-address---uint256---bytes---bytes32-bytes32-uint256-[`scheduleBatch`]), a proposer moves the operation from the `Unset` to the `Pending` state. This starts a timer that must be longer than the minimum delay. The timer expires at a timestamp accessible through the xref:api:governance.adoc#TimelockController-getTimestamp-bytes32-[`getTimestamp`] method. -* Once the timer expires, the operation automatically gets the `Ready` state. At this point, it can be executed. -* By calling xref:api:governance.adoc#TimelockController-TimelockController-execute-address-uint256-bytes-bytes32-bytes32-[`execute`] (or xref:api:governance.adoc#TimelockController-executeBatch-address---uint256---bytes---bytes32-bytes32-[`executeBatch`]), an executor triggers the operation's underlying transactions and moves it to the `Done` state. If the operation has a predecessor, it has to be in the `Done` state for this transition to succeed. -* xref:api:governance.adoc#TimelockController-TimelockController-cancel-bytes32-[`cancel`] allows proposers to cancel any `Pending` operation. This resets the operation to the `Unset` state. It is thus possible for a proposer to re-schedule an operation that has been cancelled. In this case, the timer restarts when the operation is re-scheduled. - -Operations status can be queried using the functions: - -* xref:api:governance.adoc#TimelockController-isOperationPending-bytes32-[`isOperationPending(bytes32)`] -* xref:api:governance.adoc#TimelockController-isOperationReady-bytes32-[`isOperationReady(bytes32)`] -* xref:api:governance.adoc#TimelockController-isOperationDone-bytes32-[`isOperationDone(bytes32)`] - -[[timelock-roles]] -==== Roles - -[[timelock-admin]] -===== Admin - -The admins are in charge of managing proposers and executors. For the timelock to be self-governed, this role should only be given to the timelock itself. Upon deployment, both the timelock and the deployer have this role. After further configuration and testing, the deployer can renounce this role such that all further maintenance operations have to go through the timelock process. - -This role is identified by the *TIMELOCK_ADMIN_ROLE* value: `0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5` - -[[timelock-proposer]] -===== Proposer - -The proposers are in charge of scheduling (and cancelling) operations. This is a critical role, that should be given to governing entities. This could be an EOA, a multisig, or a DAO. - -WARNING: *Proposer fight:* Having multiple proposers, while providing redundancy in case one becomes unavailable, can be dangerous. As proposer have their say on all operations, they could cancel operations they disagree with, including operations to remove them for the proposers. - -This role is identified by the *PROPOSER_ROLE* value: `0xb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1` - -[[timelock-executor]] -===== Executor - -The executors are in charge of executing the operations scheduled by the proposers once the timelock expires. Logic dictates that multisig or DAO that are proposers should also be executors in order to guarantee operations that have been scheduled will eventually be executed. However, having additional executors can reduce the cost (the executing transaction does not require validation by the multisig or DAO that proposed it), while ensuring whoever is in charge of execution cannot trigger actions that have not been scheduled by the proposers. Alternatively, it is possible to allow _any_ address to execute a proposal once the timelock has expired by granting the executor role to the zero address. - -This role is identified by the *EXECUTOR_ROLE* value: `0xd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63` - -WARNING: A live contract without at least one proposer and one executor is locked. Make sure these roles are filled by reliable entities before the deployer renounces its administrative rights in favour of the timelock contract itself. See the {AccessControl} documentation to learn more about role management. diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/TimelockController.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/TimelockController.sol deleted file mode 100644 index cef21d6..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/TimelockController.sol +++ /dev/null @@ -1,417 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (governance/TimelockController.sol) - -pragma solidity ^0.8.0; - -import "../access/AccessControl.sol"; -import "../token/ERC721/IERC721Receiver.sol"; -import "../token/ERC1155/IERC1155Receiver.sol"; -import "../utils/Address.sol"; - -/** - * @dev Contract module which acts as a timelocked controller. When set as the - * owner of an `Ownable` smart contract, it enforces a timelock on all - * `onlyOwner` maintenance operations. This gives time for users of the - * controlled contract to exit before a potentially dangerous maintenance - * operation is applied. - * - * By default, this contract is self administered, meaning administration tasks - * have to go through the timelock process. The proposer (resp executor) role - * is in charge of proposing (resp executing) operations. A common use case is - * to position this {TimelockController} as the owner of a smart contract, with - * a multisig or a DAO as the sole proposer. - * - * _Available since v3.3._ - */ -contract TimelockController is AccessControl, IERC721Receiver, IERC1155Receiver { - bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256("TIMELOCK_ADMIN_ROLE"); - bytes32 public constant PROPOSER_ROLE = keccak256("PROPOSER_ROLE"); - bytes32 public constant EXECUTOR_ROLE = keccak256("EXECUTOR_ROLE"); - bytes32 public constant CANCELLER_ROLE = keccak256("CANCELLER_ROLE"); - uint256 internal constant _DONE_TIMESTAMP = uint256(1); - - mapping(bytes32 => uint256) private _timestamps; - uint256 private _minDelay; - - /** - * @dev Emitted when a call is scheduled as part of operation `id`. - */ - event CallScheduled( - bytes32 indexed id, - uint256 indexed index, - address target, - uint256 value, - bytes data, - bytes32 predecessor, - uint256 delay - ); - - /** - * @dev Emitted when a call is performed as part of operation `id`. - */ - event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data); - - /** - * @dev Emitted when operation `id` is cancelled. - */ - event Cancelled(bytes32 indexed id); - - /** - * @dev Emitted when the minimum delay for future operations is modified. - */ - event MinDelayChange(uint256 oldDuration, uint256 newDuration); - - /** - * @dev Initializes the contract with a given `minDelay`, and a list of - * initial proposers and executors. The proposers receive both the - * proposer and the canceller role (for backward compatibility). The - * executors receive the executor role. - * - * NOTE: At construction, both the deployer and the timelock itself are - * administrators. This helps further configuration of the timelock by the - * deployer. After configuration is done, it is recommended that the - * deployer renounces its admin position and relies on timelocked - * operations to perform future maintenance. - */ - constructor( - uint256 minDelay, - address[] memory proposers, - address[] memory executors - ) { - _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE); - _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE); - _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE); - _setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE); - - // deployer + self administration - _setupRole(TIMELOCK_ADMIN_ROLE, _msgSender()); - _setupRole(TIMELOCK_ADMIN_ROLE, address(this)); - - // register proposers and cancellers - for (uint256 i = 0; i < proposers.length; ++i) { - _setupRole(PROPOSER_ROLE, proposers[i]); - _setupRole(CANCELLER_ROLE, proposers[i]); - } - - // register executors - for (uint256 i = 0; i < executors.length; ++i) { - _setupRole(EXECUTOR_ROLE, executors[i]); - } - - _minDelay = minDelay; - emit MinDelayChange(0, minDelay); - } - - /** - * @dev Modifier to make a function callable only by a certain role. In - * addition to checking the sender's role, `address(0)` 's role is also - * considered. Granting a role to `address(0)` is equivalent to enabling - * this role for everyone. - */ - modifier onlyRoleOrOpenRole(bytes32 role) { - if (!hasRole(role, address(0))) { - _checkRole(role, _msgSender()); - } - _; - } - - /** - * @dev Contract might receive/hold ETH as part of the maintenance process. - */ - receive() external payable {} - - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, AccessControl) returns (bool) { - return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId); - } - - /** - * @dev Returns whether an id correspond to a registered operation. This - * includes both Pending, Ready and Done operations. - */ - function isOperation(bytes32 id) public view virtual returns (bool pending) { - return getTimestamp(id) > 0; - } - - /** - * @dev Returns whether an operation is pending or not. - */ - function isOperationPending(bytes32 id) public view virtual returns (bool pending) { - return getTimestamp(id) > _DONE_TIMESTAMP; - } - - /** - * @dev Returns whether an operation is ready or not. - */ - function isOperationReady(bytes32 id) public view virtual returns (bool ready) { - uint256 timestamp = getTimestamp(id); - return timestamp > _DONE_TIMESTAMP && timestamp <= block.timestamp; - } - - /** - * @dev Returns whether an operation is done or not. - */ - function isOperationDone(bytes32 id) public view virtual returns (bool done) { - return getTimestamp(id) == _DONE_TIMESTAMP; - } - - /** - * @dev Returns the timestamp at with an operation becomes ready (0 for - * unset operations, 1 for done operations). - */ - function getTimestamp(bytes32 id) public view virtual returns (uint256 timestamp) { - return _timestamps[id]; - } - - /** - * @dev Returns the minimum delay for an operation to become valid. - * - * This value can be changed by executing an operation that calls `updateDelay`. - */ - function getMinDelay() public view virtual returns (uint256 duration) { - return _minDelay; - } - - /** - * @dev Returns the identifier of an operation containing a single - * transaction. - */ - function hashOperation( - address target, - uint256 value, - bytes calldata data, - bytes32 predecessor, - bytes32 salt - ) public pure virtual returns (bytes32 hash) { - return keccak256(abi.encode(target, value, data, predecessor, salt)); - } - - /** - * @dev Returns the identifier of an operation containing a batch of - * transactions. - */ - function hashOperationBatch( - address[] calldata targets, - uint256[] calldata values, - bytes[] calldata payloads, - bytes32 predecessor, - bytes32 salt - ) public pure virtual returns (bytes32 hash) { - return keccak256(abi.encode(targets, values, payloads, predecessor, salt)); - } - - /** - * @dev Schedule an operation containing a single transaction. - * - * Emits a {CallScheduled} event. - * - * Requirements: - * - * - the caller must have the 'proposer' role. - */ - function schedule( - address target, - uint256 value, - bytes calldata data, - bytes32 predecessor, - bytes32 salt, - uint256 delay - ) public virtual onlyRole(PROPOSER_ROLE) { - bytes32 id = hashOperation(target, value, data, predecessor, salt); - _schedule(id, delay); - emit CallScheduled(id, 0, target, value, data, predecessor, delay); - } - - /** - * @dev Schedule an operation containing a batch of transactions. - * - * Emits one {CallScheduled} event per transaction in the batch. - * - * Requirements: - * - * - the caller must have the 'proposer' role. - */ - function scheduleBatch( - address[] calldata targets, - uint256[] calldata values, - bytes[] calldata payloads, - bytes32 predecessor, - bytes32 salt, - uint256 delay - ) public virtual onlyRole(PROPOSER_ROLE) { - require(targets.length == values.length, "TimelockController: length mismatch"); - require(targets.length == payloads.length, "TimelockController: length mismatch"); - - bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt); - _schedule(id, delay); - for (uint256 i = 0; i < targets.length; ++i) { - emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay); - } - } - - /** - * @dev Schedule an operation that is to becomes valid after a given delay. - */ - function _schedule(bytes32 id, uint256 delay) private { - require(!isOperation(id), "TimelockController: operation already scheduled"); - require(delay >= getMinDelay(), "TimelockController: insufficient delay"); - _timestamps[id] = block.timestamp + delay; - } - - /** - * @dev Cancel an operation. - * - * Requirements: - * - * - the caller must have the 'canceller' role. - */ - function cancel(bytes32 id) public virtual onlyRole(CANCELLER_ROLE) { - require(isOperationPending(id), "TimelockController: operation cannot be cancelled"); - delete _timestamps[id]; - - emit Cancelled(id); - } - - /** - * @dev Execute an (ready) operation containing a single transaction. - * - * Emits a {CallExecuted} event. - * - * Requirements: - * - * - the caller must have the 'executor' role. - */ - // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending, - // thus any modifications to the operation during reentrancy should be caught. - // slither-disable-next-line reentrancy-eth - function execute( - address target, - uint256 value, - bytes calldata payload, - bytes32 predecessor, - bytes32 salt - ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) { - bytes32 id = hashOperation(target, value, payload, predecessor, salt); - - _beforeCall(id, predecessor); - _execute(target, value, payload); - emit CallExecuted(id, 0, target, value, payload); - _afterCall(id); - } - - /** - * @dev Execute an (ready) operation containing a batch of transactions. - * - * Emits one {CallExecuted} event per transaction in the batch. - * - * Requirements: - * - * - the caller must have the 'executor' role. - */ - function executeBatch( - address[] calldata targets, - uint256[] calldata values, - bytes[] calldata payloads, - bytes32 predecessor, - bytes32 salt - ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) { - require(targets.length == values.length, "TimelockController: length mismatch"); - require(targets.length == payloads.length, "TimelockController: length mismatch"); - - bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt); - - _beforeCall(id, predecessor); - for (uint256 i = 0; i < targets.length; ++i) { - address target = targets[i]; - uint256 value = values[i]; - bytes calldata payload = payloads[i]; - _execute(target, value, payload); - emit CallExecuted(id, i, target, value, payload); - } - _afterCall(id); - } - - /** - * @dev Execute an operation's call. - */ - function _execute( - address target, - uint256 value, - bytes calldata data - ) internal virtual { - (bool success, ) = target.call{value: value}(data); - require(success, "TimelockController: underlying transaction reverted"); - } - - /** - * @dev Checks before execution of an operation's calls. - */ - function _beforeCall(bytes32 id, bytes32 predecessor) private view { - require(isOperationReady(id), "TimelockController: operation is not ready"); - require(predecessor == bytes32(0) || isOperationDone(predecessor), "TimelockController: missing dependency"); - } - - /** - * @dev Checks after execution of an operation's calls. - */ - function _afterCall(bytes32 id) private { - require(isOperationReady(id), "TimelockController: operation is not ready"); - _timestamps[id] = _DONE_TIMESTAMP; - } - - /** - * @dev Changes the minimum timelock duration for future operations. - * - * Emits a {MinDelayChange} event. - * - * Requirements: - * - * - the caller must be the timelock itself. This can only be achieved by scheduling and later executing - * an operation where the timelock is the target and the data is the ABI-encoded call to this function. - */ - function updateDelay(uint256 newDelay) external virtual { - require(msg.sender == address(this), "TimelockController: caller must be timelock"); - emit MinDelayChange(_minDelay, newDelay); - _minDelay = newDelay; - } - - /** - * @dev See {IERC721Receiver-onERC721Received}. - */ - function onERC721Received( - address, - address, - uint256, - bytes memory - ) public virtual override returns (bytes4) { - return this.onERC721Received.selector; - } - - /** - * @dev See {IERC1155Receiver-onERC1155Received}. - */ - function onERC1155Received( - address, - address, - uint256, - uint256, - bytes memory - ) public virtual override returns (bytes4) { - return this.onERC1155Received.selector; - } - - /** - * @dev See {IERC1155Receiver-onERC1155BatchReceived}. - */ - function onERC1155BatchReceived( - address, - address, - uint256[] memory, - uint256[] memory, - bytes memory - ) public virtual override returns (bytes4) { - return this.onERC1155BatchReceived.selector; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/compatibility/GovernorCompatibilityBravo.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/compatibility/GovernorCompatibilityBravo.sol deleted file mode 100644 index 1d639f4..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/compatibility/GovernorCompatibilityBravo.sol +++ /dev/null @@ -1,289 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (governance/compatibility/GovernorCompatibilityBravo.sol) - -pragma solidity ^0.8.0; - -import "../../utils/Counters.sol"; -import "../../utils/math/SafeCast.sol"; -import "../extensions/IGovernorTimelock.sol"; -import "../Governor.sol"; -import "./IGovernorCompatibilityBravo.sol"; - -/** - * @dev Compatibility layer that implements GovernorBravo compatibility on to of {Governor}. - * - * This compatibility layer includes a voting system and requires a {IGovernorTimelock} compatible module to be added - * through inheritance. It does not include token bindings, not does it include any variable upgrade patterns. - * - * NOTE: When using this module, you may need to enable the Solidity optimizer to avoid hitting the contract size limit. - * - * _Available since v4.3._ - */ -abstract contract GovernorCompatibilityBravo is IGovernorTimelock, IGovernorCompatibilityBravo, Governor { - using Counters for Counters.Counter; - using Timers for Timers.BlockNumber; - - enum VoteType { - Against, - For, - Abstain - } - - struct ProposalDetails { - address proposer; - address[] targets; - uint256[] values; - string[] signatures; - bytes[] calldatas; - uint256 forVotes; - uint256 againstVotes; - uint256 abstainVotes; - mapping(address => Receipt) receipts; - bytes32 descriptionHash; - } - - mapping(uint256 => ProposalDetails) private _proposalDetails; - - // solhint-disable-next-line func-name-mixedcase - function COUNTING_MODE() public pure virtual override returns (string memory) { - return "support=bravo&quorum=bravo"; - } - - // ============================================== Proposal lifecycle ============================================== - /** - * @dev See {IGovernor-propose}. - */ - function propose( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - string memory description - ) public virtual override(IGovernor, Governor) returns (uint256) { - _storeProposal(_msgSender(), targets, values, new string[](calldatas.length), calldatas, description); - return super.propose(targets, values, calldatas, description); - } - - /** - * @dev See {IGovernorCompatibilityBravo-propose}. - */ - function propose( - address[] memory targets, - uint256[] memory values, - string[] memory signatures, - bytes[] memory calldatas, - string memory description - ) public virtual override returns (uint256) { - _storeProposal(_msgSender(), targets, values, signatures, calldatas, description); - return propose(targets, values, _encodeCalldata(signatures, calldatas), description); - } - - /** - * @dev See {IGovernorCompatibilityBravo-queue}. - */ - function queue(uint256 proposalId) public virtual override { - ProposalDetails storage details = _proposalDetails[proposalId]; - queue( - details.targets, - details.values, - _encodeCalldata(details.signatures, details.calldatas), - details.descriptionHash - ); - } - - /** - * @dev See {IGovernorCompatibilityBravo-execute}. - */ - function execute(uint256 proposalId) public payable virtual override { - ProposalDetails storage details = _proposalDetails[proposalId]; - execute( - details.targets, - details.values, - _encodeCalldata(details.signatures, details.calldatas), - details.descriptionHash - ); - } - - function cancel(uint256 proposalId) public virtual override { - ProposalDetails storage details = _proposalDetails[proposalId]; - - require( - _msgSender() == details.proposer || getVotes(details.proposer, block.number - 1) < proposalThreshold(), - "GovernorBravo: proposer above threshold" - ); - - _cancel( - details.targets, - details.values, - _encodeCalldata(details.signatures, details.calldatas), - details.descriptionHash - ); - } - - /** - * @dev Encodes calldatas with optional function signature. - */ - function _encodeCalldata(string[] memory signatures, bytes[] memory calldatas) - private - pure - returns (bytes[] memory) - { - bytes[] memory fullcalldatas = new bytes[](calldatas.length); - - for (uint256 i = 0; i < signatures.length; ++i) { - fullcalldatas[i] = bytes(signatures[i]).length == 0 - ? calldatas[i] - : abi.encodePacked(bytes4(keccak256(bytes(signatures[i]))), calldatas[i]); - } - - return fullcalldatas; - } - - /** - * @dev Store proposal metadata for later lookup - */ - function _storeProposal( - address proposer, - address[] memory targets, - uint256[] memory values, - string[] memory signatures, - bytes[] memory calldatas, - string memory description - ) private { - bytes32 descriptionHash = keccak256(bytes(description)); - uint256 proposalId = hashProposal(targets, values, _encodeCalldata(signatures, calldatas), descriptionHash); - - ProposalDetails storage details = _proposalDetails[proposalId]; - if (details.descriptionHash == bytes32(0)) { - details.proposer = proposer; - details.targets = targets; - details.values = values; - details.signatures = signatures; - details.calldatas = calldatas; - details.descriptionHash = descriptionHash; - } - } - - // ==================================================== Views ===================================================== - /** - * @dev See {IGovernorCompatibilityBravo-proposals}. - */ - function proposals(uint256 proposalId) - public - view - virtual - override - returns ( - uint256 id, - address proposer, - uint256 eta, - uint256 startBlock, - uint256 endBlock, - uint256 forVotes, - uint256 againstVotes, - uint256 abstainVotes, - bool canceled, - bool executed - ) - { - id = proposalId; - eta = proposalEta(proposalId); - startBlock = proposalSnapshot(proposalId); - endBlock = proposalDeadline(proposalId); - - ProposalDetails storage details = _proposalDetails[proposalId]; - proposer = details.proposer; - forVotes = details.forVotes; - againstVotes = details.againstVotes; - abstainVotes = details.abstainVotes; - - ProposalState status = state(proposalId); - canceled = status == ProposalState.Canceled; - executed = status == ProposalState.Executed; - } - - /** - * @dev See {IGovernorCompatibilityBravo-getActions}. - */ - function getActions(uint256 proposalId) - public - view - virtual - override - returns ( - address[] memory targets, - uint256[] memory values, - string[] memory signatures, - bytes[] memory calldatas - ) - { - ProposalDetails storage details = _proposalDetails[proposalId]; - return (details.targets, details.values, details.signatures, details.calldatas); - } - - /** - * @dev See {IGovernorCompatibilityBravo-getReceipt}. - */ - function getReceipt(uint256 proposalId, address voter) public view virtual override returns (Receipt memory) { - return _proposalDetails[proposalId].receipts[voter]; - } - - /** - * @dev See {IGovernorCompatibilityBravo-quorumVotes}. - */ - function quorumVotes() public view virtual override returns (uint256) { - return quorum(block.number - 1); - } - - // ==================================================== Voting ==================================================== - /** - * @dev See {IGovernor-hasVoted}. - */ - function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) { - return _proposalDetails[proposalId].receipts[account].hasVoted; - } - - /** - * @dev See {Governor-_quorumReached}. In this module, only forVotes count toward the quorum. - */ - function _quorumReached(uint256 proposalId) internal view virtual override returns (bool) { - ProposalDetails storage details = _proposalDetails[proposalId]; - return quorum(proposalSnapshot(proposalId)) <= details.forVotes; - } - - /** - * @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be scritly over the againstVotes. - */ - function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) { - ProposalDetails storage details = _proposalDetails[proposalId]; - return details.forVotes > details.againstVotes; - } - - /** - * @dev See {Governor-_countVote}. In this module, the support follows Governor Bravo. - */ - function _countVote( - uint256 proposalId, - address account, - uint8 support, - uint256 weight, - bytes memory // params - ) internal virtual override { - ProposalDetails storage details = _proposalDetails[proposalId]; - Receipt storage receipt = details.receipts[account]; - - require(!receipt.hasVoted, "GovernorCompatibilityBravo: vote already cast"); - receipt.hasVoted = true; - receipt.support = support; - receipt.votes = SafeCast.toUint96(weight); - - if (support == uint8(VoteType.Against)) { - details.againstVotes += weight; - } else if (support == uint8(VoteType.For)) { - details.forVotes += weight; - } else if (support == uint8(VoteType.Abstain)) { - details.abstainVotes += weight; - } else { - revert("GovernorCompatibilityBravo: invalid vote type"); - } - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/compatibility/IGovernorCompatibilityBravo.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/compatibility/IGovernorCompatibilityBravo.sol deleted file mode 100644 index 83e4e1a..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/compatibility/IGovernorCompatibilityBravo.sol +++ /dev/null @@ -1,114 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (governance/compatibility/IGovernorCompatibilityBravo.sol) - -pragma solidity ^0.8.0; - -import "../IGovernor.sol"; - -/** - * @dev Interface extension that adds missing functions to the {Governor} core to provide `GovernorBravo` compatibility. - * - * _Available since v4.3._ - */ -abstract contract IGovernorCompatibilityBravo is IGovernor { - /** - * @dev Proposal structure from Compound Governor Bravo. Not actually used by the compatibility layer, as - * {{proposal}} returns a very different structure. - */ - struct Proposal { - uint256 id; - address proposer; - uint256 eta; - address[] targets; - uint256[] values; - string[] signatures; - bytes[] calldatas; - uint256 startBlock; - uint256 endBlock; - uint256 forVotes; - uint256 againstVotes; - uint256 abstainVotes; - bool canceled; - bool executed; - mapping(address => Receipt) receipts; - } - - /** - * @dev Receipt structure from Compound Governor Bravo - */ - struct Receipt { - bool hasVoted; - uint8 support; - uint96 votes; - } - - /** - * @dev Part of the Governor Bravo's interface. - */ - function quorumVotes() public view virtual returns (uint256); - - /** - * @dev Part of the Governor Bravo's interface: _"The official record of all proposals ever proposed"_. - */ - function proposals(uint256) - public - view - virtual - returns ( - uint256 id, - address proposer, - uint256 eta, - uint256 startBlock, - uint256 endBlock, - uint256 forVotes, - uint256 againstVotes, - uint256 abstainVotes, - bool canceled, - bool executed - ); - - /** - * @dev Part of the Governor Bravo's interface: _"Function used to propose a new proposal"_. - */ - function propose( - address[] memory targets, - uint256[] memory values, - string[] memory signatures, - bytes[] memory calldatas, - string memory description - ) public virtual returns (uint256); - - /** - * @dev Part of the Governor Bravo's interface: _"Queues a proposal of state succeeded"_. - */ - function queue(uint256 proposalId) public virtual; - - /** - * @dev Part of the Governor Bravo's interface: _"Executes a queued proposal if eta has passed"_. - */ - function execute(uint256 proposalId) public payable virtual; - - /** - * @dev Cancels a proposal only if sender is the proposer, or proposer delegates dropped below proposal threshold. - */ - function cancel(uint256 proposalId) public virtual; - - /** - * @dev Part of the Governor Bravo's interface: _"Gets actions of a proposal"_. - */ - function getActions(uint256 proposalId) - public - view - virtual - returns ( - address[] memory targets, - uint256[] memory values, - string[] memory signatures, - bytes[] memory calldatas - ); - - /** - * @dev Part of the Governor Bravo's interface: _"Gets the receipt for a voter on a given proposal"_. - */ - function getReceipt(uint256 proposalId, address voter) public view virtual returns (Receipt memory); -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorCountingSimple.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorCountingSimple.sol deleted file mode 100644 index a262ce4..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorCountingSimple.sol +++ /dev/null @@ -1,107 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (governance/extensions/GovernorCountingSimple.sol) - -pragma solidity ^0.8.0; - -import "../Governor.sol"; - -/** - * @dev Extension of {Governor} for simple, 3 options, vote counting. - * - * _Available since v4.3._ - */ -abstract contract GovernorCountingSimple is Governor { - /** - * @dev Supported vote types. Matches Governor Bravo ordering. - */ - enum VoteType { - Against, - For, - Abstain - } - - struct ProposalVote { - uint256 againstVotes; - uint256 forVotes; - uint256 abstainVotes; - mapping(address => bool) hasVoted; - } - - mapping(uint256 => ProposalVote) private _proposalVotes; - - /** - * @dev See {IGovernor-COUNTING_MODE}. - */ - // solhint-disable-next-line func-name-mixedcase - function COUNTING_MODE() public pure virtual override returns (string memory) { - return "support=bravo&quorum=for,abstain"; - } - - /** - * @dev See {IGovernor-hasVoted}. - */ - function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) { - return _proposalVotes[proposalId].hasVoted[account]; - } - - /** - * @dev Accessor to the internal vote counts. - */ - function proposalVotes(uint256 proposalId) - public - view - virtual - returns ( - uint256 againstVotes, - uint256 forVotes, - uint256 abstainVotes - ) - { - ProposalVote storage proposalvote = _proposalVotes[proposalId]; - return (proposalvote.againstVotes, proposalvote.forVotes, proposalvote.abstainVotes); - } - - /** - * @dev See {Governor-_quorumReached}. - */ - function _quorumReached(uint256 proposalId) internal view virtual override returns (bool) { - ProposalVote storage proposalvote = _proposalVotes[proposalId]; - - return quorum(proposalSnapshot(proposalId)) <= proposalvote.forVotes + proposalvote.abstainVotes; - } - - /** - * @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be strictly over the againstVotes. - */ - function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) { - ProposalVote storage proposalvote = _proposalVotes[proposalId]; - - return proposalvote.forVotes > proposalvote.againstVotes; - } - - /** - * @dev See {Governor-_countVote}. In this module, the support follows the `VoteType` enum (from Governor Bravo). - */ - function _countVote( - uint256 proposalId, - address account, - uint8 support, - uint256 weight, - bytes memory // params - ) internal virtual override { - ProposalVote storage proposalvote = _proposalVotes[proposalId]; - - require(!proposalvote.hasVoted[account], "GovernorVotingSimple: vote already cast"); - proposalvote.hasVoted[account] = true; - - if (support == uint8(VoteType.Against)) { - proposalvote.againstVotes += weight; - } else if (support == uint8(VoteType.For)) { - proposalvote.forVotes += weight; - } else if (support == uint8(VoteType.Abstain)) { - proposalvote.abstainVotes += weight; - } else { - revert("GovernorVotingSimple: invalid value for enum VoteType"); - } - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorPreventLateQuorum.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorPreventLateQuorum.sol deleted file mode 100644 index 5b58f60..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorPreventLateQuorum.sol +++ /dev/null @@ -1,108 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (governance/extensions/GovernorPreventLateQuorum.sol) - -pragma solidity ^0.8.0; - -import "../Governor.sol"; -import "../../utils/math/Math.sol"; - -/** - * @dev A module that ensures there is a minimum voting period after quorum is reached. This prevents a large voter from - * swaying a vote and triggering quorum at the last minute, by ensuring there is always time for other voters to react - * and try to oppose the decision. - * - * If a vote causes quorum to be reached, the proposal's voting period may be extended so that it does not end before at - * least a given number of blocks have passed (the "vote extension" parameter). This parameter can be set by the - * governance executor (e.g. through a governance proposal). - * - * _Available since v4.5._ - */ -abstract contract GovernorPreventLateQuorum is Governor { - using SafeCast for uint256; - using Timers for Timers.BlockNumber; - - uint64 private _voteExtension; - mapping(uint256 => Timers.BlockNumber) private _extendedDeadlines; - - /// @dev Emitted when a proposal deadline is pushed back due to reaching quorum late in its voting period. - event ProposalExtended(uint256 indexed proposalId, uint64 extendedDeadline); - - /// @dev Emitted when the {lateQuorumVoteExtension} parameter is changed. - event LateQuorumVoteExtensionSet(uint64 oldVoteExtension, uint64 newVoteExtension); - - /** - * @dev Initializes the vote extension parameter: the number of blocks that are required to pass since a proposal - * reaches quorum until its voting period ends. If necessary the voting period will be extended beyond the one set - * at proposal creation. - */ - constructor(uint64 initialVoteExtension) { - _setLateQuorumVoteExtension(initialVoteExtension); - } - - /** - * @dev Returns the proposal deadline, which may have been extended beyond that set at proposal creation, if the - * proposal reached quorum late in the voting period. See {Governor-proposalDeadline}. - */ - function proposalDeadline(uint256 proposalId) public view virtual override returns (uint256) { - return Math.max(super.proposalDeadline(proposalId), _extendedDeadlines[proposalId].getDeadline()); - } - - /** - * @dev Casts a vote and detects if it caused quorum to be reached, potentially extending the voting period. See - * {Governor-_castVote}. - * - * May emit a {ProposalExtended} event. - */ - function _castVote( - uint256 proposalId, - address account, - uint8 support, - string memory reason, - bytes memory params - ) internal virtual override returns (uint256) { - uint256 result = super._castVote(proposalId, account, support, reason, params); - - Timers.BlockNumber storage extendedDeadline = _extendedDeadlines[proposalId]; - - if (extendedDeadline.isUnset() && _quorumReached(proposalId)) { - uint64 extendedDeadlineValue = block.number.toUint64() + lateQuorumVoteExtension(); - - if (extendedDeadlineValue > proposalDeadline(proposalId)) { - emit ProposalExtended(proposalId, extendedDeadlineValue); - } - - extendedDeadline.setDeadline(extendedDeadlineValue); - } - - return result; - } - - /** - * @dev Returns the current value of the vote extension parameter: the number of blocks that are required to pass - * from the time a proposal reaches quorum until its voting period ends. - */ - function lateQuorumVoteExtension() public view virtual returns (uint64) { - return _voteExtension; - } - - /** - * @dev Changes the {lateQuorumVoteExtension}. This operation can only be performed by the governance executor, - * generally through a governance proposal. - * - * Emits a {LateQuorumVoteExtensionSet} event. - */ - function setLateQuorumVoteExtension(uint64 newVoteExtension) public virtual onlyGovernance { - _setLateQuorumVoteExtension(newVoteExtension); - } - - /** - * @dev Changes the {lateQuorumVoteExtension}. This is an internal function that can be exposed in a public function - * like {setLateQuorumVoteExtension} if another access control mechanism is needed. - * - * Emits a {LateQuorumVoteExtensionSet} event. - */ - function _setLateQuorumVoteExtension(uint64 newVoteExtension) internal virtual { - emit LateQuorumVoteExtensionSet(_voteExtension, newVoteExtension); - _voteExtension = newVoteExtension; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorProposalThreshold.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorProposalThreshold.sol deleted file mode 100644 index 3feebac..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorProposalThreshold.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (governance/extensions/GovernorProposalThreshold.sol) - -pragma solidity ^0.8.0; - -import "../Governor.sol"; - -/** - * @dev Extension of {Governor} for proposal restriction to token holders with a minimum balance. - * - * _Available since v4.3._ - * _Deprecated since v4.4._ - */ -abstract contract GovernorProposalThreshold is Governor { - function propose( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - string memory description - ) public virtual override returns (uint256) { - return super.propose(targets, values, calldatas, description); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorSettings.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorSettings.sol deleted file mode 100644 index a3187c6..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorSettings.sol +++ /dev/null @@ -1,114 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (governance/extensions/GovernorSettings.sol) - -pragma solidity ^0.8.0; - -import "../Governor.sol"; - -/** - * @dev Extension of {Governor} for settings updatable through governance. - * - * _Available since v4.4._ - */ -abstract contract GovernorSettings is Governor { - uint256 private _votingDelay; - uint256 private _votingPeriod; - uint256 private _proposalThreshold; - - event VotingDelaySet(uint256 oldVotingDelay, uint256 newVotingDelay); - event VotingPeriodSet(uint256 oldVotingPeriod, uint256 newVotingPeriod); - event ProposalThresholdSet(uint256 oldProposalThreshold, uint256 newProposalThreshold); - - /** - * @dev Initialize the governance parameters. - */ - constructor( - uint256 initialVotingDelay, - uint256 initialVotingPeriod, - uint256 initialProposalThreshold - ) { - _setVotingDelay(initialVotingDelay); - _setVotingPeriod(initialVotingPeriod); - _setProposalThreshold(initialProposalThreshold); - } - - /** - * @dev See {IGovernor-votingDelay}. - */ - function votingDelay() public view virtual override returns (uint256) { - return _votingDelay; - } - - /** - * @dev See {IGovernor-votingPeriod}. - */ - function votingPeriod() public view virtual override returns (uint256) { - return _votingPeriod; - } - - /** - * @dev See {Governor-proposalThreshold}. - */ - function proposalThreshold() public view virtual override returns (uint256) { - return _proposalThreshold; - } - - /** - * @dev Update the voting delay. This operation can only be performed through a governance proposal. - * - * Emits a {VotingDelaySet} event. - */ - function setVotingDelay(uint256 newVotingDelay) public virtual onlyGovernance { - _setVotingDelay(newVotingDelay); - } - - /** - * @dev Update the voting period. This operation can only be performed through a governance proposal. - * - * Emits a {VotingPeriodSet} event. - */ - function setVotingPeriod(uint256 newVotingPeriod) public virtual onlyGovernance { - _setVotingPeriod(newVotingPeriod); - } - - /** - * @dev Update the proposal threshold. This operation can only be performed through a governance proposal. - * - * Emits a {ProposalThresholdSet} event. - */ - function setProposalThreshold(uint256 newProposalThreshold) public virtual onlyGovernance { - _setProposalThreshold(newProposalThreshold); - } - - /** - * @dev Internal setter for the voting delay. - * - * Emits a {VotingDelaySet} event. - */ - function _setVotingDelay(uint256 newVotingDelay) internal virtual { - emit VotingDelaySet(_votingDelay, newVotingDelay); - _votingDelay = newVotingDelay; - } - - /** - * @dev Internal setter for the voting period. - * - * Emits a {VotingPeriodSet} event. - */ - function _setVotingPeriod(uint256 newVotingPeriod) internal virtual { - // voting period must be at least one block long - require(newVotingPeriod > 0, "GovernorSettings: voting period too low"); - emit VotingPeriodSet(_votingPeriod, newVotingPeriod); - _votingPeriod = newVotingPeriod; - } - - /** - * @dev Internal setter for the proposal threshold. - * - * Emits a {ProposalThresholdSet} event. - */ - function _setProposalThreshold(uint256 newProposalThreshold) internal virtual { - emit ProposalThresholdSet(_proposalThreshold, newProposalThreshold); - _proposalThreshold = newProposalThreshold; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorTimelockCompound.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorTimelockCompound.sol deleted file mode 100644 index b6421b8..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorTimelockCompound.sol +++ /dev/null @@ -1,193 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (governance/extensions/GovernorTimelockCompound.sol) - -pragma solidity ^0.8.0; - -import "./IGovernorTimelock.sol"; -import "../Governor.sol"; -import "../../utils/math/SafeCast.sol"; -import "../../vendor/compound/ICompoundTimelock.sol"; - -/** - * @dev Extension of {Governor} that binds the execution process to a Compound Timelock. This adds a delay, enforced by - * the external timelock to all successful proposal (in addition to the voting duration). The {Governor} needs to be - * the admin of the timelock for any operation to be performed. A public, unrestricted, - * {GovernorTimelockCompound-__acceptAdmin} is available to accept ownership of the timelock. - * - * Using this model means the proposal will be operated by the {TimelockController} and not by the {Governor}. Thus, - * the assets and permissions must be attached to the {TimelockController}. Any asset sent to the {Governor} will be - * inaccessible. - * - * _Available since v4.3._ - */ -abstract contract GovernorTimelockCompound is IGovernorTimelock, Governor { - using SafeCast for uint256; - using Timers for Timers.Timestamp; - - struct ProposalTimelock { - Timers.Timestamp timer; - } - - ICompoundTimelock private _timelock; - - mapping(uint256 => ProposalTimelock) private _proposalTimelocks; - - /** - * @dev Emitted when the timelock controller used for proposal execution is modified. - */ - event TimelockChange(address oldTimelock, address newTimelock); - - /** - * @dev Set the timelock. - */ - constructor(ICompoundTimelock timelockAddress) { - _updateTimelock(timelockAddress); - } - - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, Governor) returns (bool) { - return interfaceId == type(IGovernorTimelock).interfaceId || super.supportsInterface(interfaceId); - } - - /** - * @dev Overridden version of the {Governor-state} function with added support for the `Queued` and `Expired` status. - */ - function state(uint256 proposalId) public view virtual override(IGovernor, Governor) returns (ProposalState) { - ProposalState status = super.state(proposalId); - - if (status != ProposalState.Succeeded) { - return status; - } - - uint256 eta = proposalEta(proposalId); - if (eta == 0) { - return status; - } else if (block.timestamp >= eta + _timelock.GRACE_PERIOD()) { - return ProposalState.Expired; - } else { - return ProposalState.Queued; - } - } - - /** - * @dev Public accessor to check the address of the timelock - */ - function timelock() public view virtual override returns (address) { - return address(_timelock); - } - - /** - * @dev Public accessor to check the eta of a queued proposal - */ - function proposalEta(uint256 proposalId) public view virtual override returns (uint256) { - return _proposalTimelocks[proposalId].timer.getDeadline(); - } - - /** - * @dev Function to queue a proposal to the timelock. - */ - function queue( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) public virtual override returns (uint256) { - uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash); - - require(state(proposalId) == ProposalState.Succeeded, "Governor: proposal not successful"); - - uint256 eta = block.timestamp + _timelock.delay(); - _proposalTimelocks[proposalId].timer.setDeadline(eta.toUint64()); - for (uint256 i = 0; i < targets.length; ++i) { - require( - !_timelock.queuedTransactions(keccak256(abi.encode(targets[i], values[i], "", calldatas[i], eta))), - "GovernorTimelockCompound: identical proposal action already queued" - ); - _timelock.queueTransaction(targets[i], values[i], "", calldatas[i], eta); - } - - emit ProposalQueued(proposalId, eta); - - return proposalId; - } - - /** - * @dev Overridden execute function that run the already queued proposal through the timelock. - */ - function _execute( - uint256 proposalId, - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 /*descriptionHash*/ - ) internal virtual override { - uint256 eta = proposalEta(proposalId); - require(eta > 0, "GovernorTimelockCompound: proposal not yet queued"); - Address.sendValue(payable(_timelock), msg.value); - for (uint256 i = 0; i < targets.length; ++i) { - _timelock.executeTransaction(targets[i], values[i], "", calldatas[i], eta); - } - } - - /** - * @dev Overridden version of the {Governor-_cancel} function to cancel the timelocked proposal if it as already - * been queued. - */ - function _cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) internal virtual override returns (uint256) { - uint256 proposalId = super._cancel(targets, values, calldatas, descriptionHash); - - uint256 eta = proposalEta(proposalId); - if (eta > 0) { - for (uint256 i = 0; i < targets.length; ++i) { - _timelock.cancelTransaction(targets[i], values[i], "", calldatas[i], eta); - } - _proposalTimelocks[proposalId].timer.reset(); - } - - return proposalId; - } - - /** - * @dev Address through which the governor executes action. In this case, the timelock. - */ - function _executor() internal view virtual override returns (address) { - return address(_timelock); - } - - /** - * @dev Accept admin right over the timelock. - */ - // solhint-disable-next-line private-vars-leading-underscore - function __acceptAdmin() public { - _timelock.acceptAdmin(); - } - - /** - * @dev Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates - * must be proposed, scheduled, and executed through governance proposals. - * - * For security reasons, the timelock must be handed over to another admin before setting up a new one. The two - * operations (hand over the timelock) and do the update can be batched in a single proposal. - * - * Note that if the timelock admin has been handed over in a previous operation, we refuse updates made through the - * timelock if admin of the timelock has already been accepted and the operation is executed outside the scope of - * governance. - - * CAUTION: It is not recommended to change the timelock while there are other queued governance proposals. - */ - function updateTimelock(ICompoundTimelock newTimelock) external virtual onlyGovernance { - _updateTimelock(newTimelock); - } - - function _updateTimelock(ICompoundTimelock newTimelock) private { - emit TimelockChange(address(_timelock), address(newTimelock)); - _timelock = newTimelock; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorTimelockControl.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorTimelockControl.sol deleted file mode 100644 index 8ab992f..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorTimelockControl.sol +++ /dev/null @@ -1,166 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (governance/extensions/GovernorTimelockControl.sol) - -pragma solidity ^0.8.0; - -import "./IGovernorTimelock.sol"; -import "../Governor.sol"; -import "../TimelockController.sol"; - -/** - * @dev Extension of {Governor} that binds the execution process to an instance of {TimelockController}. This adds a - * delay, enforced by the {TimelockController} to all successful proposal (in addition to the voting duration). The - * {Governor} needs the proposer (and ideally the executor) roles for the {Governor} to work properly. - * - * Using this model means the proposal will be operated by the {TimelockController} and not by the {Governor}. Thus, - * the assets and permissions must be attached to the {TimelockController}. Any asset sent to the {Governor} will be - * inaccessible. - * - * WARNING: Setting up the TimelockController to have additional proposers besides the governor is very risky, as it - * grants them powers that they must be trusted or known not to use: 1) {onlyGovernance} functions like {relay} are - * available to them through the timelock, and 2) approved governance proposals can be blocked by them, effectively - * executing a Denial of Service attack. This risk will be mitigated in a future release. - * - * _Available since v4.3._ - */ -abstract contract GovernorTimelockControl is IGovernorTimelock, Governor { - TimelockController private _timelock; - mapping(uint256 => bytes32) private _timelockIds; - - /** - * @dev Emitted when the timelock controller used for proposal execution is modified. - */ - event TimelockChange(address oldTimelock, address newTimelock); - - /** - * @dev Set the timelock. - */ - constructor(TimelockController timelockAddress) { - _updateTimelock(timelockAddress); - } - - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, Governor) returns (bool) { - return interfaceId == type(IGovernorTimelock).interfaceId || super.supportsInterface(interfaceId); - } - - /** - * @dev Overridden version of the {Governor-state} function with added support for the `Queued` status. - */ - function state(uint256 proposalId) public view virtual override(IGovernor, Governor) returns (ProposalState) { - ProposalState status = super.state(proposalId); - - if (status != ProposalState.Succeeded) { - return status; - } - - // core tracks execution, so we just have to check if successful proposal have been queued. - bytes32 queueid = _timelockIds[proposalId]; - if (queueid == bytes32(0)) { - return status; - } else if (_timelock.isOperationDone(queueid)) { - return ProposalState.Executed; - } else if (_timelock.isOperationPending(queueid)) { - return ProposalState.Queued; - } else { - return ProposalState.Canceled; - } - } - - /** - * @dev Public accessor to check the address of the timelock - */ - function timelock() public view virtual override returns (address) { - return address(_timelock); - } - - /** - * @dev Public accessor to check the eta of a queued proposal - */ - function proposalEta(uint256 proposalId) public view virtual override returns (uint256) { - uint256 eta = _timelock.getTimestamp(_timelockIds[proposalId]); - return eta == 1 ? 0 : eta; // _DONE_TIMESTAMP (1) should be replaced with a 0 value - } - - /** - * @dev Function to queue a proposal to the timelock. - */ - function queue( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) public virtual override returns (uint256) { - uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash); - - require(state(proposalId) == ProposalState.Succeeded, "Governor: proposal not successful"); - - uint256 delay = _timelock.getMinDelay(); - _timelockIds[proposalId] = _timelock.hashOperationBatch(targets, values, calldatas, 0, descriptionHash); - _timelock.scheduleBatch(targets, values, calldatas, 0, descriptionHash, delay); - - emit ProposalQueued(proposalId, block.timestamp + delay); - - return proposalId; - } - - /** - * @dev Overridden execute function that run the already queued proposal through the timelock. - */ - function _execute( - uint256, /* proposalId */ - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) internal virtual override { - _timelock.executeBatch{value: msg.value}(targets, values, calldatas, 0, descriptionHash); - } - - /** - * @dev Overridden version of the {Governor-_cancel} function to cancel the timelocked proposal if it as already - * been queued. - */ - // This function can reenter through the external call to the timelock, but we assume the timelock is trusted and - // well behaved (according to TimelockController) and this will not happen. - // slither-disable-next-line reentrancy-no-eth - function _cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) internal virtual override returns (uint256) { - uint256 proposalId = super._cancel(targets, values, calldatas, descriptionHash); - - if (_timelockIds[proposalId] != 0) { - _timelock.cancel(_timelockIds[proposalId]); - delete _timelockIds[proposalId]; - } - - return proposalId; - } - - /** - * @dev Address through which the governor executes action. In this case, the timelock. - */ - function _executor() internal view virtual override returns (address) { - return address(_timelock); - } - - /** - * @dev Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates - * must be proposed, scheduled, and executed through governance proposals. - * - * CAUTION: It is not recommended to change the timelock while there are other queued governance proposals. - */ - function updateTimelock(TimelockController newTimelock) external virtual onlyGovernance { - _updateTimelock(newTimelock); - } - - function _updateTimelock(TimelockController newTimelock) private { - emit TimelockChange(address(_timelock), address(newTimelock)); - _timelock = newTimelock; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorVotes.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorVotes.sol deleted file mode 100644 index f0a2276..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorVotes.sol +++ /dev/null @@ -1,31 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (governance/extensions/GovernorVotes.sol) - -pragma solidity ^0.8.0; - -import "../Governor.sol"; -import "../utils/IVotes.sol"; - -/** - * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token, or since v4.5 an {ERC721Votes} token. - * - * _Available since v4.3._ - */ -abstract contract GovernorVotes is Governor { - IVotes public immutable token; - - constructor(IVotes tokenAddress) { - token = tokenAddress; - } - - /** - * Read the voting weight from the token's built in snapshot mechanism (see {Governor-_getVotes}). - */ - function _getVotes( - address account, - uint256 blockNumber, - bytes memory /*params*/ - ) internal view virtual override returns (uint256) { - return token.getPastVotes(account, blockNumber); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorVotesComp.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorVotesComp.sol deleted file mode 100644 index c31c958..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorVotesComp.sol +++ /dev/null @@ -1,31 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (governance/extensions/GovernorVotesComp.sol) - -pragma solidity ^0.8.0; - -import "../Governor.sol"; -import "../../token/ERC20/extensions/ERC20VotesComp.sol"; - -/** - * @dev Extension of {Governor} for voting weight extraction from a Comp token. - * - * _Available since v4.3._ - */ -abstract contract GovernorVotesComp is Governor { - ERC20VotesComp public immutable token; - - constructor(ERC20VotesComp token_) { - token = token_; - } - - /** - * Read the voting weight from the token's built in snapshot mechanism (see {Governor-_getVotes}). - */ - function _getVotes( - address account, - uint256 blockNumber, - bytes memory /*params*/ - ) internal view virtual override returns (uint256) { - return token.getPriorVotes(account, blockNumber); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorVotesQuorumFraction.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorVotesQuorumFraction.sol deleted file mode 100644 index 40f912c..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/extensions/GovernorVotesQuorumFraction.sol +++ /dev/null @@ -1,85 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (governance/extensions/GovernorVotesQuorumFraction.sol) - -pragma solidity ^0.8.0; - -import "./GovernorVotes.sol"; - -/** - * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token and a quorum expressed as a - * fraction of the total supply. - * - * _Available since v4.3._ - */ -abstract contract GovernorVotesQuorumFraction is GovernorVotes { - uint256 private _quorumNumerator; - - event QuorumNumeratorUpdated(uint256 oldQuorumNumerator, uint256 newQuorumNumerator); - - /** - * @dev Initialize quorum as a fraction of the token's total supply. - * - * The fraction is specified as `numerator / denominator`. By default the denominator is 100, so quorum is - * specified as a percent: a numerator of 10 corresponds to quorum being 10% of total supply. The denominator can be - * customized by overriding {quorumDenominator}. - */ - constructor(uint256 quorumNumeratorValue) { - _updateQuorumNumerator(quorumNumeratorValue); - } - - /** - * @dev Returns the current quorum numerator. See {quorumDenominator}. - */ - function quorumNumerator() public view virtual returns (uint256) { - return _quorumNumerator; - } - - /** - * @dev Returns the quorum denominator. Defaults to 100, but may be overridden. - */ - function quorumDenominator() public view virtual returns (uint256) { - return 100; - } - - /** - * @dev Returns the quorum for a block number, in terms of number of votes: `supply * numerator / denominator`. - */ - function quorum(uint256 blockNumber) public view virtual override returns (uint256) { - return (token.getPastTotalSupply(blockNumber) * quorumNumerator()) / quorumDenominator(); - } - - /** - * @dev Changes the quorum numerator. - * - * Emits a {QuorumNumeratorUpdated} event. - * - * Requirements: - * - * - Must be called through a governance proposal. - * - New numerator must be smaller or equal to the denominator. - */ - function updateQuorumNumerator(uint256 newQuorumNumerator) external virtual onlyGovernance { - _updateQuorumNumerator(newQuorumNumerator); - } - - /** - * @dev Changes the quorum numerator. - * - * Emits a {QuorumNumeratorUpdated} event. - * - * Requirements: - * - * - New numerator must be smaller or equal to the denominator. - */ - function _updateQuorumNumerator(uint256 newQuorumNumerator) internal virtual { - require( - newQuorumNumerator <= quorumDenominator(), - "GovernorVotesQuorumFraction: quorumNumerator over quorumDenominator" - ); - - uint256 oldQuorumNumerator = _quorumNumerator; - _quorumNumerator = newQuorumNumerator; - - emit QuorumNumeratorUpdated(oldQuorumNumerator, newQuorumNumerator); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/extensions/IGovernorTimelock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/extensions/IGovernorTimelock.sol deleted file mode 100644 index 40402f6..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/extensions/IGovernorTimelock.sol +++ /dev/null @@ -1,26 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (governance/extensions/IGovernorTimelock.sol) - -pragma solidity ^0.8.0; - -import "../IGovernor.sol"; - -/** - * @dev Extension of the {IGovernor} for timelock supporting modules. - * - * _Available since v4.3._ - */ -abstract contract IGovernorTimelock is IGovernor { - event ProposalQueued(uint256 proposalId, uint256 eta); - - function timelock() public view virtual returns (address); - - function proposalEta(uint256 proposalId) public view virtual returns (uint256); - - function queue( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) public virtual returns (uint256 proposalId); -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/utils/IVotes.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/utils/IVotes.sol deleted file mode 100644 index 6317d77..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/utils/IVotes.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol) -pragma solidity ^0.8.0; - -/** - * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts. - * - * _Available since v4.5._ - */ -interface IVotes { - /** - * @dev Emitted when an account changes their delegate. - */ - event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); - - /** - * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes. - */ - event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance); - - /** - * @dev Returns the current amount of votes that `account` has. - */ - function getVotes(address account) external view returns (uint256); - - /** - * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`). - */ - function getPastVotes(address account, uint256 blockNumber) external view returns (uint256); - - /** - * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`). - * - * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes. - * Votes that have not been delegated are still part of total supply, even though they would not participate in a - * vote. - */ - function getPastTotalSupply(uint256 blockNumber) external view returns (uint256); - - /** - * @dev Returns the delegate that `account` has chosen. - */ - function delegates(address account) external view returns (address); - - /** - * @dev Delegates votes from the sender to `delegatee`. - */ - function delegate(address delegatee) external; - - /** - * @dev Delegates votes from signer to `delegatee`. - */ - function delegateBySig( - address delegatee, - uint256 nonce, - uint256 expiry, - uint8 v, - bytes32 r, - bytes32 s - ) external; -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/utils/Votes.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/utils/Votes.sol deleted file mode 100644 index 202c3f2..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/governance/utils/Votes.sol +++ /dev/null @@ -1,211 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/Votes.sol) -pragma solidity ^0.8.0; - -import "../../utils/Context.sol"; -import "../../utils/Counters.sol"; -import "../../utils/Checkpoints.sol"; -import "../../utils/cryptography/draft-EIP712.sol"; -import "./IVotes.sol"; - -/** - * @dev This is a base abstract contract that tracks voting units, which are a measure of voting power that can be - * transferred, and provides a system of vote delegation, where an account can delegate its voting units to a sort of - * "representative" that will pool delegated voting units from different accounts and can then use it to vote in - * decisions. In fact, voting units _must_ be delegated in order to count as actual votes, and an account has to - * delegate those votes to itself if it wishes to participate in decisions and does not have a trusted representative. - * - * This contract is often combined with a token contract such that voting units correspond to token units. For an - * example, see {ERC721Votes}. - * - * The full history of delegate votes is tracked on-chain so that governance protocols can consider votes as distributed - * at a particular block number to protect against flash loans and double voting. The opt-in delegate system makes the - * cost of this history tracking optional. - * - * When using this module the derived contract must implement {_getVotingUnits} (for example, make it return - * {ERC721-balanceOf}), and can use {_transferVotingUnits} to track a change in the distribution of those units (in the - * previous example, it would be included in {ERC721-_beforeTokenTransfer}). - * - * _Available since v4.5._ - */ -abstract contract Votes is IVotes, Context, EIP712 { - using Checkpoints for Checkpoints.History; - using Counters for Counters.Counter; - - bytes32 private constant _DELEGATION_TYPEHASH = - keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); - - mapping(address => address) private _delegation; - mapping(address => Checkpoints.History) private _delegateCheckpoints; - Checkpoints.History private _totalCheckpoints; - - mapping(address => Counters.Counter) private _nonces; - - /** - * @dev Returns the current amount of votes that `account` has. - */ - function getVotes(address account) public view virtual override returns (uint256) { - return _delegateCheckpoints[account].latest(); - } - - /** - * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`). - * - * Requirements: - * - * - `blockNumber` must have been already mined - */ - function getPastVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) { - return _delegateCheckpoints[account].getAtBlock(blockNumber); - } - - /** - * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`). - * - * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes. - * Votes that have not been delegated are still part of total supply, even though they would not participate in a - * vote. - * - * Requirements: - * - * - `blockNumber` must have been already mined - */ - function getPastTotalSupply(uint256 blockNumber) public view virtual override returns (uint256) { - require(blockNumber < block.number, "Votes: block not yet mined"); - return _totalCheckpoints.getAtBlock(blockNumber); - } - - /** - * @dev Returns the current total supply of votes. - */ - function _getTotalSupply() internal view virtual returns (uint256) { - return _totalCheckpoints.latest(); - } - - /** - * @dev Returns the delegate that `account` has chosen. - */ - function delegates(address account) public view virtual override returns (address) { - return _delegation[account]; - } - - /** - * @dev Delegates votes from the sender to `delegatee`. - */ - function delegate(address delegatee) public virtual override { - address account = _msgSender(); - _delegate(account, delegatee); - } - - /** - * @dev Delegates votes from signer to `delegatee`. - */ - function delegateBySig( - address delegatee, - uint256 nonce, - uint256 expiry, - uint8 v, - bytes32 r, - bytes32 s - ) public virtual override { - require(block.timestamp <= expiry, "Votes: signature expired"); - address signer = ECDSA.recover( - _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))), - v, - r, - s - ); - require(nonce == _useNonce(signer), "Votes: invalid nonce"); - _delegate(signer, delegatee); - } - - /** - * @dev Delegate all of `account`'s voting units to `delegatee`. - * - * Emits events {DelegateChanged} and {DelegateVotesChanged}. - */ - function _delegate(address account, address delegatee) internal virtual { - address oldDelegate = delegates(account); - _delegation[account] = delegatee; - - emit DelegateChanged(account, oldDelegate, delegatee); - _moveDelegateVotes(oldDelegate, delegatee, _getVotingUnits(account)); - } - - /** - * @dev Transfers, mints, or burns voting units. To register a mint, `from` should be zero. To register a burn, `to` - * should be zero. Total supply of voting units will be adjusted with mints and burns. - */ - function _transferVotingUnits( - address from, - address to, - uint256 amount - ) internal virtual { - if (from == address(0)) { - _totalCheckpoints.push(_add, amount); - } - if (to == address(0)) { - _totalCheckpoints.push(_subtract, amount); - } - _moveDelegateVotes(delegates(from), delegates(to), amount); - } - - /** - * @dev Moves delegated votes from one delegate to another. - */ - function _moveDelegateVotes( - address from, - address to, - uint256 amount - ) private { - if (from != to && amount > 0) { - if (from != address(0)) { - (uint256 oldValue, uint256 newValue) = _delegateCheckpoints[from].push(_subtract, amount); - emit DelegateVotesChanged(from, oldValue, newValue); - } - if (to != address(0)) { - (uint256 oldValue, uint256 newValue) = _delegateCheckpoints[to].push(_add, amount); - emit DelegateVotesChanged(to, oldValue, newValue); - } - } - } - - function _add(uint256 a, uint256 b) private pure returns (uint256) { - return a + b; - } - - function _subtract(uint256 a, uint256 b) private pure returns (uint256) { - return a - b; - } - - /** - * @dev Consumes a nonce. - * - * Returns the current value and increments nonce. - */ - function _useNonce(address owner) internal virtual returns (uint256 current) { - Counters.Counter storage nonce = _nonces[owner]; - current = nonce.current(); - nonce.increment(); - } - - /** - * @dev Returns an address nonce. - */ - function nonces(address owner) public view virtual returns (uint256) { - return _nonces[owner].current(); - } - - /** - * @dev Returns the contract's {EIP712} domain separator. - */ - // solhint-disable-next-line func-name-mixedcase - function DOMAIN_SEPARATOR() external view returns (bytes32) { - return _domainSeparatorV4(); - } - - /** - * @dev Must return the voting units held by an account. - */ - function _getVotingUnits(address) internal view virtual returns (uint256); -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC1155.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC1155.sol deleted file mode 100644 index f891132..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC1155.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC1155.sol) - -pragma solidity ^0.8.0; - -import "../token/ERC1155/IERC1155.sol"; diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC1155MetadataURI.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC1155MetadataURI.sol deleted file mode 100644 index 2aa885f..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC1155MetadataURI.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC1155MetadataURI.sol) - -pragma solidity ^0.8.0; - -import "../token/ERC1155/extensions/IERC1155MetadataURI.sol"; diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC1155Receiver.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC1155Receiver.sol deleted file mode 100644 index a6d4ead..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC1155Receiver.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC1155Receiver.sol) - -pragma solidity ^0.8.0; - -import "../token/ERC1155/IERC1155Receiver.sol"; diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC1271.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC1271.sol deleted file mode 100644 index 5ec44c7..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC1271.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC1271.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC1271 standard signature validation method for - * contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271]. - * - * _Available since v4.1._ - */ -interface IERC1271 { - /** - * @dev Should return whether the signature provided is valid for the provided data - * @param hash Hash of the data to be signed - * @param signature Signature byte array associated with _data - */ - function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue); -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol deleted file mode 100644 index 5fad104..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol +++ /dev/null @@ -1,95 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC1363.sol) - -pragma solidity ^0.8.0; - -import "./IERC20.sol"; -import "./IERC165.sol"; - -interface IERC1363 is IERC165, IERC20 { - /* - * Note: the ERC-165 identifier for this interface is 0x4bbee2df. - * 0x4bbee2df === - * bytes4(keccak256('transferAndCall(address,uint256)')) ^ - * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^ - * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^ - * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) - */ - - /* - * Note: the ERC-165 identifier for this interface is 0xfb9ec8ce. - * 0xfb9ec8ce === - * bytes4(keccak256('approveAndCall(address,uint256)')) ^ - * bytes4(keccak256('approveAndCall(address,uint256,bytes)')) - */ - - /** - * @dev Transfer tokens from `msg.sender` to another address and then call `onTransferReceived` on receiver - * @param to address The address which you want to transfer to - * @param value uint256 The amount of tokens to be transferred - * @return true unless throwing - */ - function transferAndCall(address to, uint256 value) external returns (bool); - - /** - * @dev Transfer tokens from `msg.sender` to another address and then call `onTransferReceived` on receiver - * @param to address The address which you want to transfer to - * @param value uint256 The amount of tokens to be transferred - * @param data bytes Additional data with no specified format, sent in call to `to` - * @return true unless throwing - */ - function transferAndCall( - address to, - uint256 value, - bytes memory data - ) external returns (bool); - - /** - * @dev Transfer tokens from one address to another and then call `onTransferReceived` on receiver - * @param from address The address which you want to send tokens from - * @param to address The address which you want to transfer to - * @param value uint256 The amount of tokens to be transferred - * @return true unless throwing - */ - function transferFromAndCall( - address from, - address to, - uint256 value - ) external returns (bool); - - /** - * @dev Transfer tokens from one address to another and then call `onTransferReceived` on receiver - * @param from address The address which you want to send tokens from - * @param to address The address which you want to transfer to - * @param value uint256 The amount of tokens to be transferred - * @param data bytes Additional data with no specified format, sent in call to `to` - * @return true unless throwing - */ - function transferFromAndCall( - address from, - address to, - uint256 value, - bytes memory data - ) external returns (bool); - - /** - * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender - * and then call `onApprovalReceived` on spender. - * @param spender address The address which will spend the funds - * @param value uint256 The amount of tokens to be spent - */ - function approveAndCall(address spender, uint256 value) external returns (bool); - - /** - * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender - * and then call `onApprovalReceived` on spender. - * @param spender address The address which will spend the funds - * @param value uint256 The amount of tokens to be spent - * @param data bytes Additional data with no specified format, sent in call to `spender` - */ - function approveAndCall( - address spender, - uint256 value, - bytes memory data - ) external returns (bool); -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC1363Receiver.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC1363Receiver.sol deleted file mode 100644 index bc5eadd..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC1363Receiver.sol +++ /dev/null @@ -1,32 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC1363Receiver.sol) - -pragma solidity ^0.8.0; - -interface IERC1363Receiver { - /* - * Note: the ERC-165 identifier for this interface is 0x88a7ca5c. - * 0x88a7ca5c === bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)")) - */ - - /** - * @notice Handle the receipt of ERC1363 tokens - * @dev Any ERC1363 smart contract calls this function on the recipient - * after a `transfer` or a `transferFrom`. This function MAY throw to revert and reject the - * transfer. Return of other than the magic value MUST result in the - * transaction being reverted. - * Note: the token contract address is always the message sender. - * @param operator address The address which called `transferAndCall` or `transferFromAndCall` function - * @param from address The address which are token transferred from - * @param value uint256 The amount of tokens transferred - * @param data bytes Additional data with no specified format - * @return `bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)"))` - * unless throwing - */ - function onTransferReceived( - address operator, - address from, - uint256 value, - bytes memory data - ) external returns (bytes4); -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC1363Spender.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC1363Spender.sol deleted file mode 100644 index 48f6fd5..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC1363Spender.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC1363Spender.sol) - -pragma solidity ^0.8.0; - -interface IERC1363Spender { - /* - * Note: the ERC-165 identifier for this interface is 0x7b04a2d0. - * 0x7b04a2d0 === bytes4(keccak256("onApprovalReceived(address,uint256,bytes)")) - */ - - /** - * @notice Handle the approval of ERC1363 tokens - * @dev Any ERC1363 smart contract calls this function on the recipient - * after an `approve`. This function MAY throw to revert and reject the - * approval. Return of other than the magic value MUST result in the - * transaction being reverted. - * Note: the token contract address is always the message sender. - * @param owner address The address which called `approveAndCall` function - * @param value uint256 The amount of tokens to be spent - * @param data bytes Additional data with no specified format - * @return `bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))` - * unless throwing - */ - function onApprovalReceived( - address owner, - uint256 value, - bytes memory data - ) external returns (bytes4); -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol deleted file mode 100644 index b97c4da..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol) - -pragma solidity ^0.8.0; - -import "../utils/introspection/IERC165.sol"; diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC1820Implementer.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC1820Implementer.sol deleted file mode 100644 index a83a7a3..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC1820Implementer.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC1820Implementer.sol) - -pragma solidity ^0.8.0; - -import "../utils/introspection/IERC1820Implementer.sol"; diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC1820Registry.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC1820Registry.sol deleted file mode 100644 index 1b1ba9f..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC1820Registry.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC1820Registry.sol) - -pragma solidity ^0.8.0; - -import "../utils/introspection/IERC1820Registry.sol"; diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol deleted file mode 100644 index a819316..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol) - -pragma solidity ^0.8.0; - -import "../token/ERC20/IERC20.sol"; diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC20Metadata.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC20Metadata.sol deleted file mode 100644 index aa5c639..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC20Metadata.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC20Metadata.sol) - -pragma solidity ^0.8.0; - -import "../token/ERC20/extensions/IERC20Metadata.sol"; diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC2981.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC2981.sol deleted file mode 100644 index 0635824..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC2981.sol +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/IERC2981.sol) - -pragma solidity ^0.8.0; - -import "../utils/introspection/IERC165.sol"; - -/** - * @dev Interface for the NFT Royalty Standard. - * - * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal - * support for royalty payments across all NFT marketplaces and ecosystem participants. - * - * _Available since v4.5._ - */ -interface IERC2981 is IERC165 { - /** - * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of - * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. - */ - function royaltyInfo(uint256 tokenId, uint256 salePrice) - external - view - returns (address receiver, uint256 royaltyAmount); -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC3156.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC3156.sol deleted file mode 100644 index 1238190..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC3156.sol +++ /dev/null @@ -1,7 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC3156.sol) - -pragma solidity ^0.8.0; - -import "./IERC3156FlashBorrower.sol"; -import "./IERC3156FlashLender.sol"; diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC3156FlashBorrower.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC3156FlashBorrower.sol deleted file mode 100644 index 68d0dac..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC3156FlashBorrower.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC3156FlashBorrower.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC3156 FlashBorrower, as defined in - * https://eips.ethereum.org/EIPS/eip-3156[ERC-3156]. - * - * _Available since v4.1._ - */ -interface IERC3156FlashBorrower { - /** - * @dev Receive a flash loan. - * @param initiator The initiator of the loan. - * @param token The loan currency. - * @param amount The amount of tokens lent. - * @param fee The additional amount of tokens to repay. - * @param data Arbitrary data structure, intended to contain user-defined parameters. - * @return The keccak256 hash of "ERC3156FlashBorrower.onFlashLoan" - */ - function onFlashLoan( - address initiator, - address token, - uint256 amount, - uint256 fee, - bytes calldata data - ) external returns (bytes32); -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC3156FlashLender.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC3156FlashLender.sol deleted file mode 100644 index 3101283..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC3156FlashLender.sol +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC3156FlashLender.sol) - -pragma solidity ^0.8.0; - -import "./IERC3156FlashBorrower.sol"; - -/** - * @dev Interface of the ERC3156 FlashLender, as defined in - * https://eips.ethereum.org/EIPS/eip-3156[ERC-3156]. - * - * _Available since v4.1._ - */ -interface IERC3156FlashLender { - /** - * @dev The amount of currency available to be lended. - * @param token The loan currency. - * @return The amount of `token` that can be borrowed. - */ - function maxFlashLoan(address token) external view returns (uint256); - - /** - * @dev The fee to be charged for a given loan. - * @param token The loan currency. - * @param amount The amount of tokens lent. - * @return The amount of `token` to be charged for the loan, on top of the returned principal. - */ - function flashFee(address token, uint256 amount) external view returns (uint256); - - /** - * @dev Initiate a flash loan. - * @param receiver The receiver of the tokens in the loan, and the receiver of the callback. - * @param token The loan currency. - * @param amount The amount of tokens lent. - * @param data Arbitrary data structure, intended to contain user-defined parameters. - */ - function flashLoan( - IERC3156FlashBorrower receiver, - address token, - uint256 amount, - bytes calldata data - ) external returns (bool); -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC721.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC721.sol deleted file mode 100644 index 822b311..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC721.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC721.sol) - -pragma solidity ^0.8.0; - -import "../token/ERC721/IERC721.sol"; diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC721Enumerable.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC721Enumerable.sol deleted file mode 100644 index e39a5a0..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC721Enumerable.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC721Enumerable.sol) - -pragma solidity ^0.8.0; - -import "../token/ERC721/extensions/IERC721Enumerable.sol"; diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC721Metadata.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC721Metadata.sol deleted file mode 100644 index afe2707..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC721Metadata.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC721Metadata.sol) - -pragma solidity ^0.8.0; - -import "../token/ERC721/extensions/IERC721Metadata.sol"; diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC721Receiver.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC721Receiver.sol deleted file mode 100644 index c9c153a..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC721Receiver.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC721Receiver.sol) - -pragma solidity ^0.8.0; - -import "../token/ERC721/IERC721Receiver.sol"; diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC777.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC777.sol deleted file mode 100644 index b97ba7b..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC777.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC777.sol) - -pragma solidity ^0.8.0; - -import "../token/ERC777/IERC777.sol"; diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC777Recipient.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC777Recipient.sol deleted file mode 100644 index 0ce2704..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC777Recipient.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC777Recipient.sol) - -pragma solidity ^0.8.0; - -import "../token/ERC777/IERC777Recipient.sol"; diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC777Sender.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC777Sender.sol deleted file mode 100644 index f1f17a2..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/IERC777Sender.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC777Sender.sol) - -pragma solidity ^0.8.0; - -import "../token/ERC777/IERC777Sender.sol"; diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/README.adoc b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/README.adoc deleted file mode 100644 index b6b96ff..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/README.adoc +++ /dev/null @@ -1,50 +0,0 @@ -= Interfaces - -[.readme-notice] -NOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/interfaces - -== List of standardized interfaces -These interfaces are available as `.sol` files, and also as compiler `.json` ABI files (through the npm package). These -are useful to interact with third party contracts that implement them. - -- {IERC20} -- {IERC20Metadata} -- {IERC165} -- {IERC721} -- {IERC721Receiver} -- {IERC721Enumerable} -- {IERC721Metadata} -- {IERC777} -- {IERC777Recipient} -- {IERC777Sender} -- {IERC1155} -- {IERC1155Receiver} -- {IERC1155MetadataURI} -- {IERC1271} -- {IERC1363} -- {IERC1820Implementer} -- {IERC1820Registry} -- {IERC2612} -- {IERC2981} -- {IERC3156FlashLender} -- {IERC3156FlashBorrower} - -== Detailed ABI - -{{IERC1271}} - -{{IERC1363}} - -{{IERC1363Receiver}} - -{{IERC1820Implementer}} - -{{IERC1820Registry}} - -{{IERC2612}} - -{{IERC2981}} - -{{IERC3156FlashLender}} - -{{IERC3156FlashBorrower}} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol deleted file mode 100644 index 3b73d74..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol) - -pragma solidity ^0.8.0; - -/** - * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified - * proxy whose upgrades are fully controlled by the current implementation. - */ -interface IERC1822Proxiable { - /** - * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation - * address. - * - * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks - * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this - * function revert if invoked through a proxy. - */ - function proxiableUUID() external view returns (bytes32); -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/draft-IERC2612.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/draft-IERC2612.sol deleted file mode 100644 index 1b3ae55..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/interfaces/draft-IERC2612.sol +++ /dev/null @@ -1,8 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/draft-IERC2612.sol) - -pragma solidity ^0.8.0; - -import "../token/ERC20/extensions/draft-IERC20Permit.sol"; - -interface IERC2612 is IERC20Permit {} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sol deleted file mode 100644 index b5d16e5..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sol +++ /dev/null @@ -1,42 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (metatx/ERC2771Context.sol) - -pragma solidity ^0.8.9; - -import "../utils/Context.sol"; - -/** - * @dev Context variant with ERC2771 support. - */ -abstract contract ERC2771Context is Context { - /// @custom:oz-upgrades-unsafe-allow state-variable-immutable - address private immutable _trustedForwarder; - - /// @custom:oz-upgrades-unsafe-allow constructor - constructor(address trustedForwarder) { - _trustedForwarder = trustedForwarder; - } - - function isTrustedForwarder(address forwarder) public view virtual returns (bool) { - return forwarder == _trustedForwarder; - } - - function _msgSender() internal view virtual override returns (address sender) { - if (isTrustedForwarder(msg.sender)) { - // The assembly code is more direct than the Solidity version using `abi.decode`. - assembly { - sender := shr(96, calldataload(sub(calldatasize(), 20))) - } - } else { - return super._msgSender(); - } - } - - function _msgData() internal view virtual override returns (bytes calldata) { - if (isTrustedForwarder(msg.sender)) { - return msg.data[:msg.data.length - 20]; - } else { - return super._msgData(); - } - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/metatx/MinimalForwarder.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/metatx/MinimalForwarder.sol deleted file mode 100644 index a7a1899..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/metatx/MinimalForwarder.sol +++ /dev/null @@ -1,67 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (metatx/MinimalForwarder.sol) - -pragma solidity ^0.8.0; - -import "../utils/cryptography/ECDSA.sol"; -import "../utils/cryptography/draft-EIP712.sol"; - -/** - * @dev Simple minimal forwarder to be used together with an ERC2771 compatible contract. See {ERC2771Context}. - */ -contract MinimalForwarder is EIP712 { - using ECDSA for bytes32; - - struct ForwardRequest { - address from; - address to; - uint256 value; - uint256 gas; - uint256 nonce; - bytes data; - } - - bytes32 private constant _TYPEHASH = - keccak256("ForwardRequest(address from,address to,uint256 value,uint256 gas,uint256 nonce,bytes data)"); - - mapping(address => uint256) private _nonces; - - constructor() EIP712("MinimalForwarder", "0.0.1") {} - - function getNonce(address from) public view returns (uint256) { - return _nonces[from]; - } - - function verify(ForwardRequest calldata req, bytes calldata signature) public view returns (bool) { - address signer = _hashTypedDataV4( - keccak256(abi.encode(_TYPEHASH, req.from, req.to, req.value, req.gas, req.nonce, keccak256(req.data))) - ).recover(signature); - return _nonces[req.from] == req.nonce && signer == req.from; - } - - function execute(ForwardRequest calldata req, bytes calldata signature) - public - payable - returns (bool, bytes memory) - { - require(verify(req, signature), "MinimalForwarder: signature does not match request"); - _nonces[req.from] = req.nonce + 1; - - (bool success, bytes memory returndata) = req.to.call{gas: req.gas, value: req.value}( - abi.encodePacked(req.data, req.from) - ); - - // Validate that the relayer has sent enough gas for the call. - // See https://ronan.eth.link/blog/ethereum-gas-dangers/ - if (gasleft() <= req.gas / 63) { - // We explicitly trigger invalid opcode to consume all gas and bubble-up the effects, since - // neither revert or assert consume all gas since Solidity 0.8.0 - // https://docs.soliditylang.org/en/v0.8.0/control-structures.html#panic-via-assert-and-error-via-require - assembly { - invalid() - } - } - - return (success, returndata); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/metatx/README.adoc b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/metatx/README.adoc deleted file mode 100644 index eccdeaf..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/metatx/README.adoc +++ /dev/null @@ -1,12 +0,0 @@ -= Meta Transactions - -[.readme-notice] -NOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/metatx - -== Core - -{{ERC2771Context}} - -== Utils - -{{MinimalForwarder}} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/AccessControlCrossChainMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/AccessControlCrossChainMock.sol deleted file mode 100644 index 90adb74..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/AccessControlCrossChainMock.sol +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.4; - -import "../access/AccessControlCrossChain.sol"; -import "../crosschain/arbitrum/CrossChainEnabledArbitrumL2.sol"; - -contract AccessControlCrossChainMock is AccessControlCrossChain, CrossChainEnabledArbitrumL2 { - constructor() { - _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); - } - - function setRoleAdmin(bytes32 roleId, bytes32 adminRoleId) public { - _setRoleAdmin(roleId, adminRoleId); - } - - function senderProtected(bytes32 roleId) public onlyRole(roleId) {} - - function crossChainRoleAlias(bytes32 role) public pure virtual returns (bytes32) { - return _crossChainRoleAlias(role); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/AccessControlEnumerableMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/AccessControlEnumerableMock.sol deleted file mode 100644 index 7b15e36..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/AccessControlEnumerableMock.sol +++ /dev/null @@ -1,17 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../access/AccessControlEnumerable.sol"; - -contract AccessControlEnumerableMock is AccessControlEnumerable { - constructor() { - _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); - } - - function setRoleAdmin(bytes32 roleId, bytes32 adminRoleId) public { - _setRoleAdmin(roleId, adminRoleId); - } - - function senderProtected(bytes32 roleId) public onlyRole(roleId) {} -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/AccessControlMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/AccessControlMock.sol deleted file mode 100644 index 86f5147..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/AccessControlMock.sol +++ /dev/null @@ -1,17 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../access/AccessControl.sol"; - -contract AccessControlMock is AccessControl { - constructor() { - _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); - } - - function setRoleAdmin(bytes32 roleId, bytes32 adminRoleId) public { - _setRoleAdmin(roleId, adminRoleId); - } - - function senderProtected(bytes32 roleId) public onlyRole(roleId) {} -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/AddressImpl.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/AddressImpl.sol deleted file mode 100644 index 702093c..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/AddressImpl.sol +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/Address.sol"; - -contract AddressImpl { - string public sharedAnswer; - - event CallReturnValue(string data); - - function isContract(address account) external view returns (bool) { - return Address.isContract(account); - } - - function sendValue(address payable receiver, uint256 amount) external { - Address.sendValue(receiver, amount); - } - - function functionCall(address target, bytes calldata data) external { - bytes memory returnData = Address.functionCall(target, data); - emit CallReturnValue(abi.decode(returnData, (string))); - } - - function functionCallWithValue( - address target, - bytes calldata data, - uint256 value - ) external payable { - bytes memory returnData = Address.functionCallWithValue(target, data, value); - emit CallReturnValue(abi.decode(returnData, (string))); - } - - function functionStaticCall(address target, bytes calldata data) external { - bytes memory returnData = Address.functionStaticCall(target, data); - emit CallReturnValue(abi.decode(returnData, (string))); - } - - function functionDelegateCall(address target, bytes calldata data) external { - bytes memory returnData = Address.functionDelegateCall(target, data); - emit CallReturnValue(abi.decode(returnData, (string))); - } - - // sendValue's tests require the contract to hold Ether - receive() external payable {} -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ArraysImpl.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ArraysImpl.sol deleted file mode 100644 index f720524..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ArraysImpl.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/Arrays.sol"; - -contract ArraysImpl { - using Arrays for uint256[]; - - uint256[] private _array; - - constructor(uint256[] memory array) { - _array = array; - } - - function findUpperBound(uint256 element) external view returns (uint256) { - return _array.findUpperBound(element); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/BadBeacon.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/BadBeacon.sol deleted file mode 100644 index bedcfed..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/BadBeacon.sol +++ /dev/null @@ -1,11 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -contract BadBeaconNoImpl {} - -contract BadBeaconNotContract { - function implementation() external pure returns (address) { - return address(0x1); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/Base64Mock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/Base64Mock.sol deleted file mode 100644 index b255487..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/Base64Mock.sol +++ /dev/null @@ -1,11 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/Base64.sol"; - -contract Base64Mock { - function encode(bytes memory value) external pure returns (string memory) { - return Base64.encode(value); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/BitmapMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/BitmapMock.sol deleted file mode 100644 index ccf8486..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/BitmapMock.sol +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/structs/BitMaps.sol"; - -contract BitMapMock { - using BitMaps for BitMaps.BitMap; - - BitMaps.BitMap private _bitmap; - - function get(uint256 index) public view returns (bool) { - return _bitmap.get(index); - } - - function setTo(uint256 index, bool value) public { - _bitmap.setTo(index, value); - } - - function set(uint256 index) public { - _bitmap.set(index); - } - - function unset(uint256 index) public { - _bitmap.unset(index); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/CallReceiverMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/CallReceiverMock.sol deleted file mode 100644 index 926db68..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/CallReceiverMock.sol +++ /dev/null @@ -1,57 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -contract CallReceiverMock { - string public sharedAnswer; - - event MockFunctionCalled(); - event MockFunctionCalledWithArgs(uint256 a, uint256 b); - - uint256[] private _array; - - function mockFunction() public payable returns (string memory) { - emit MockFunctionCalled(); - - return "0x1234"; - } - - function mockFunctionWithArgs(uint256 a, uint256 b) public payable returns (string memory) { - emit MockFunctionCalledWithArgs(a, b); - - return "0x1234"; - } - - function mockFunctionNonPayable() public returns (string memory) { - emit MockFunctionCalled(); - - return "0x1234"; - } - - function mockStaticFunction() public pure returns (string memory) { - return "0x1234"; - } - - function mockFunctionRevertsNoReason() public payable { - revert(); - } - - function mockFunctionRevertsReason() public payable { - revert("CallReceiverMock: reverting"); - } - - function mockFunctionThrows() public payable { - assert(false); - } - - function mockFunctionOutOfGas() public payable { - for (uint256 i = 0; ; ++i) { - _array.push(i); - } - } - - function mockFunctionWritesStorage() public returns (string memory) { - sharedAnswer = "42"; - return "0x1234"; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/CheckpointsImpl.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/CheckpointsImpl.sol deleted file mode 100644 index 5b9ec0a..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/CheckpointsImpl.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/Checkpoints.sol"; - -contract CheckpointsImpl { - using Checkpoints for Checkpoints.History; - - Checkpoints.History private _totalCheckpoints; - - function latest() public view returns (uint256) { - return _totalCheckpoints.latest(); - } - - function getAtBlock(uint256 blockNumber) public view returns (uint256) { - return _totalCheckpoints.getAtBlock(blockNumber); - } - - function push(uint256 value) public returns (uint256, uint256) { - return _totalCheckpoints.push(value); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ClashingImplementation.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ClashingImplementation.sol deleted file mode 100644 index 80aca0c..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ClashingImplementation.sol +++ /dev/null @@ -1,18 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -/** - * @dev Implementation contract with an admin() function made to clash with - * @dev TransparentUpgradeableProxy's to test correct functioning of the - * @dev Transparent Proxy feature. - */ -contract ClashingImplementation { - function admin() external pure returns (address) { - return 0x0000000000000000000000000000000011111142; - } - - function delegatedFunction() external pure returns (bool) { - return true; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ClonesMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ClonesMock.sol deleted file mode 100644 index 3719b0a..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ClonesMock.sol +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../proxy/Clones.sol"; -import "../utils/Address.sol"; - -contract ClonesMock { - using Address for address; - using Clones for address; - - event NewInstance(address instance); - - function clone(address implementation, bytes calldata initdata) public payable { - _initAndEmit(implementation.clone(), initdata); - } - - function cloneDeterministic( - address implementation, - bytes32 salt, - bytes calldata initdata - ) public payable { - _initAndEmit(implementation.cloneDeterministic(salt), initdata); - } - - function predictDeterministicAddress(address implementation, bytes32 salt) public view returns (address predicted) { - return implementation.predictDeterministicAddress(salt); - } - - function _initAndEmit(address instance, bytes memory initdata) private { - if (initdata.length > 0) { - instance.functionCallWithValue(initdata, msg.value); - } - emit NewInstance(instance); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ConditionalEscrowMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ConditionalEscrowMock.sol deleted file mode 100644 index ececf05..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ConditionalEscrowMock.sol +++ /dev/null @@ -1,18 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/escrow/ConditionalEscrow.sol"; - -// mock class using ConditionalEscrow -contract ConditionalEscrowMock is ConditionalEscrow { - mapping(address => bool) private _allowed; - - function setAllowed(address payee, bool allowed) public { - _allowed[payee] = allowed; - } - - function withdrawalAllowed(address payee) public view override returns (bool) { - return _allowed[payee]; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ContextMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ContextMock.sol deleted file mode 100644 index f17af38..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ContextMock.sol +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/Context.sol"; - -contract ContextMock is Context { - event Sender(address sender); - - function msgSender() public { - emit Sender(_msgSender()); - } - - event Data(bytes data, uint256 integerValue, string stringValue); - - function msgData(uint256 integerValue, string memory stringValue) public { - emit Data(_msgData(), integerValue, stringValue); - } -} - -contract ContextMockCaller { - function callSender(ContextMock context) public { - context.msgSender(); - } - - function callData( - ContextMock context, - uint256 integerValue, - string memory stringValue - ) public { - context.msgData(integerValue, stringValue); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/CountersImpl.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/CountersImpl.sol deleted file mode 100644 index 651b50b..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/CountersImpl.sol +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/Counters.sol"; - -contract CountersImpl { - using Counters for Counters.Counter; - - Counters.Counter private _counter; - - function current() public view returns (uint256) { - return _counter.current(); - } - - function increment() public { - _counter.increment(); - } - - function decrement() public { - _counter.decrement(); - } - - function reset() public { - _counter.reset(); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/Create2Impl.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/Create2Impl.sol deleted file mode 100644 index 070ad36..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/Create2Impl.sol +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/Create2.sol"; -import "../utils/introspection/ERC1820Implementer.sol"; - -contract Create2Impl { - function deploy( - uint256 value, - bytes32 salt, - bytes memory code - ) public { - Create2.deploy(value, salt, code); - } - - function deployERC1820Implementer(uint256 value, bytes32 salt) public { - Create2.deploy(value, salt, type(ERC1820Implementer).creationCode); - } - - function computeAddress(bytes32 salt, bytes32 codeHash) public view returns (address) { - return Create2.computeAddress(salt, codeHash); - } - - function computeAddressWithDeployer( - bytes32 salt, - bytes32 codeHash, - address deployer - ) public pure returns (address) { - return Create2.computeAddress(salt, codeHash, deployer); - } - - receive() external payable {} -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/DoubleEndedQueueMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/DoubleEndedQueueMock.sol deleted file mode 100644 index a9436b0..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/DoubleEndedQueueMock.sol +++ /dev/null @@ -1,58 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/structs/DoubleEndedQueue.sol"; - -// Bytes32Deque -contract Bytes32DequeMock { - using DoubleEndedQueue for DoubleEndedQueue.Bytes32Deque; - - event OperationResult(bytes32 value); - - DoubleEndedQueue.Bytes32Deque private _vector; - - function pushBack(bytes32 value) public { - _vector.pushBack(value); - } - - function pushFront(bytes32 value) public { - _vector.pushFront(value); - } - - function popFront() public returns (bytes32) { - bytes32 value = _vector.popFront(); - emit OperationResult(value); - return value; - } - - function popBack() public returns (bytes32) { - bytes32 value = _vector.popBack(); - emit OperationResult(value); - return value; - } - - function front() public view returns (bytes32) { - return _vector.front(); - } - - function back() public view returns (bytes32) { - return _vector.back(); - } - - function at(uint256 i) public view returns (bytes32) { - return _vector.at(i); - } - - function clear() public { - _vector.clear(); - } - - function length() public view returns (uint256) { - return _vector.length(); - } - - function empty() public view returns (bool) { - return _vector.empty(); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/DummyImplementation.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/DummyImplementation.sol deleted file mode 100644 index d865134..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/DummyImplementation.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -abstract contract Impl { - function version() public pure virtual returns (string memory); -} - -contract DummyImplementation { - uint256 public value; - string public text; - uint256[] public values; - - function initializeNonPayable() public { - value = 10; - } - - function initializePayable() public payable { - value = 100; - } - - function initializeNonPayableWithValue(uint256 _value) public { - value = _value; - } - - function initializePayableWithValue(uint256 _value) public payable { - value = _value; - } - - function initialize( - uint256 _value, - string memory _text, - uint256[] memory _values - ) public { - value = _value; - text = _text; - values = _values; - } - - function get() public pure returns (bool) { - return true; - } - - function version() public pure virtual returns (string memory) { - return "V1"; - } - - function reverts() public pure { - require(false, "DummyImplementation reverted"); - } -} - -contract DummyImplementationV2 is DummyImplementation { - function migrate(uint256 newVal) public payable { - value = newVal; - } - - function version() public pure override returns (string memory) { - return "V2"; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ECDSAMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ECDSAMock.sol deleted file mode 100644 index 97bd466..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ECDSAMock.sol +++ /dev/null @@ -1,41 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/cryptography/ECDSA.sol"; - -contract ECDSAMock { - using ECDSA for bytes32; - using ECDSA for bytes; - - function recover(bytes32 hash, bytes memory signature) public pure returns (address) { - return hash.recover(signature); - } - - // solhint-disable-next-line func-name-mixedcase - function recover_v_r_s( - bytes32 hash, - uint8 v, - bytes32 r, - bytes32 s - ) public pure returns (address) { - return hash.recover(v, r, s); - } - - // solhint-disable-next-line func-name-mixedcase - function recover_r_vs( - bytes32 hash, - bytes32 r, - bytes32 vs - ) public pure returns (address) { - return hash.recover(r, vs); - } - - function toEthSignedMessageHash(bytes32 hash) public pure returns (bytes32) { - return hash.toEthSignedMessageHash(); - } - - function toEthSignedMessageHash(bytes memory s) public pure returns (bytes32) { - return s.toEthSignedMessageHash(); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/EIP712External.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/EIP712External.sol deleted file mode 100644 index 6f24469..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/EIP712External.sol +++ /dev/null @@ -1,31 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/cryptography/draft-EIP712.sol"; -import "../utils/cryptography/ECDSA.sol"; - -contract EIP712External is EIP712 { - constructor(string memory name, string memory version) EIP712(name, version) {} - - function domainSeparator() external view returns (bytes32) { - return _domainSeparatorV4(); - } - - function verify( - bytes memory signature, - address signer, - address mailTo, - string memory mailContents - ) external view { - bytes32 digest = _hashTypedDataV4( - keccak256(abi.encode(keccak256("Mail(address to,string contents)"), mailTo, keccak256(bytes(mailContents)))) - ); - address recoveredSigner = ECDSA.recover(digest, signature); - require(recoveredSigner == signer); - } - - function getChainId() external view returns (uint256) { - return block.chainid; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC1155BurnableMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC1155BurnableMock.sol deleted file mode 100644 index 62138f2..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC1155BurnableMock.sol +++ /dev/null @@ -1,18 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC1155/extensions/ERC1155Burnable.sol"; - -contract ERC1155BurnableMock is ERC1155Burnable { - constructor(string memory uri) ERC1155(uri) {} - - function mint( - address to, - uint256 id, - uint256 value, - bytes memory data - ) public { - _mint(to, id, value, data); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC1155Mock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC1155Mock.sol deleted file mode 100644 index 0518ac2..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC1155Mock.sol +++ /dev/null @@ -1,51 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC1155/ERC1155.sol"; - -/** - * @title ERC1155Mock - * This mock just publicizes internal functions for testing purposes - */ -contract ERC1155Mock is ERC1155 { - constructor(string memory uri) ERC1155(uri) {} - - function setURI(string memory newuri) public { - _setURI(newuri); - } - - function mint( - address to, - uint256 id, - uint256 value, - bytes memory data - ) public { - _mint(to, id, value, data); - } - - function mintBatch( - address to, - uint256[] memory ids, - uint256[] memory values, - bytes memory data - ) public { - _mintBatch(to, ids, values, data); - } - - function burn( - address owner, - uint256 id, - uint256 value - ) public { - _burn(owner, id, value); - } - - function burnBatch( - address owner, - uint256[] memory ids, - uint256[] memory values - ) public { - _burnBatch(owner, ids, values); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC1155PausableMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC1155PausableMock.sol deleted file mode 100644 index b1a4a8e..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC1155PausableMock.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "./ERC1155Mock.sol"; -import "../token/ERC1155/extensions/ERC1155Pausable.sol"; - -contract ERC1155PausableMock is ERC1155Mock, ERC1155Pausable { - constructor(string memory uri) ERC1155Mock(uri) {} - - function pause() external { - _pause(); - } - - function unpause() external { - _unpause(); - } - - function _beforeTokenTransfer( - address operator, - address from, - address to, - uint256[] memory ids, - uint256[] memory amounts, - bytes memory data - ) internal virtual override(ERC1155, ERC1155Pausable) { - super._beforeTokenTransfer(operator, from, to, ids, amounts, data); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC1155ReceiverMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC1155ReceiverMock.sol deleted file mode 100644 index 6443a56..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC1155ReceiverMock.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC1155/IERC1155Receiver.sol"; -import "../utils/introspection/ERC165.sol"; - -contract ERC1155ReceiverMock is ERC165, IERC1155Receiver { - bytes4 private _recRetval; - bool private _recReverts; - bytes4 private _batRetval; - bool private _batReverts; - - event Received(address operator, address from, uint256 id, uint256 value, bytes data, uint256 gas); - event BatchReceived(address operator, address from, uint256[] ids, uint256[] values, bytes data, uint256 gas); - - constructor( - bytes4 recRetval, - bool recReverts, - bytes4 batRetval, - bool batReverts - ) { - _recRetval = recRetval; - _recReverts = recReverts; - _batRetval = batRetval; - _batReverts = batReverts; - } - - function onERC1155Received( - address operator, - address from, - uint256 id, - uint256 value, - bytes calldata data - ) external override returns (bytes4) { - require(!_recReverts, "ERC1155ReceiverMock: reverting on receive"); - emit Received(operator, from, id, value, data, gasleft()); - return _recRetval; - } - - function onERC1155BatchReceived( - address operator, - address from, - uint256[] calldata ids, - uint256[] calldata values, - bytes calldata data - ) external override returns (bytes4) { - require(!_batReverts, "ERC1155ReceiverMock: reverting on batch receive"); - emit BatchReceived(operator, from, ids, values, data, gasleft()); - return _batRetval; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC1155SupplyMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC1155SupplyMock.sol deleted file mode 100644 index 44b2080..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC1155SupplyMock.sol +++ /dev/null @@ -1,21 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "./ERC1155Mock.sol"; -import "../token/ERC1155/extensions/ERC1155Supply.sol"; - -contract ERC1155SupplyMock is ERC1155Mock, ERC1155Supply { - constructor(string memory uri) ERC1155Mock(uri) {} - - function _beforeTokenTransfer( - address operator, - address from, - address to, - uint256[] memory ids, - uint256[] memory amounts, - bytes memory data - ) internal virtual override(ERC1155, ERC1155Supply) { - super._beforeTokenTransfer(operator, from, to, ids, amounts, data); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC1155URIStorageMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC1155URIStorageMock.sol deleted file mode 100644 index e3cbce4..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC1155URIStorageMock.sol +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "./ERC1155Mock.sol"; -import "../token/ERC1155/extensions/ERC1155URIStorage.sol"; - -contract ERC1155URIStorageMock is ERC1155Mock, ERC1155URIStorage { - constructor(string memory _uri) ERC1155Mock(_uri) {} - - function uri(uint256 tokenId) public view virtual override(ERC1155, ERC1155URIStorage) returns (string memory) { - return ERC1155URIStorage.uri(tokenId); - } - - function setURI(uint256 tokenId, string memory _tokenURI) public { - _setURI(tokenId, _tokenURI); - } - - function setBaseURI(string memory baseURI) public { - _setBaseURI(baseURI); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC1271WalletMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC1271WalletMock.sol deleted file mode 100644 index c92acdb..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC1271WalletMock.sol +++ /dev/null @@ -1,17 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../access/Ownable.sol"; -import "../interfaces/IERC1271.sol"; -import "../utils/cryptography/ECDSA.sol"; - -contract ERC1271WalletMock is Ownable, IERC1271 { - constructor(address originalOwner) { - transferOwnership(originalOwner); - } - - function isValidSignature(bytes32 hash, bytes memory signature) public view override returns (bytes4 magicValue) { - return ECDSA.recover(hash, signature) == owner() ? this.isValidSignature.selector : bytes4(0); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165InterfacesSupported.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165InterfacesSupported.sol deleted file mode 100644 index 7a5e5bc..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165InterfacesSupported.sol +++ /dev/null @@ -1,58 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../../utils/introspection/IERC165.sol"; - -/** - * https://eips.ethereum.org/EIPS/eip-214#specification - * From the specification: - * > Any attempts to make state-changing operations inside an execution instance with STATIC set to true will instead - * throw an exception. - * > These operations include [...], LOG0, LOG1, LOG2, [...] - * - * therefore, because this contract is staticcall'd we need to not emit events (which is how solidity-coverage works) - * solidity-coverage ignores the /mocks folder, so we duplicate its implementation here to avoid instrumenting it - */ -contract SupportsInterfaceWithLookupMock is IERC165 { - /* - * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 - */ - bytes4 public constant INTERFACE_ID_ERC165 = 0x01ffc9a7; - - /** - * @dev A mapping of interface id to whether or not it's supported. - */ - mapping(bytes4 => bool) private _supportedInterfaces; - - /** - * @dev A contract implementing SupportsInterfaceWithLookup - * implement ERC165 itself. - */ - constructor() { - _registerInterface(INTERFACE_ID_ERC165); - } - - /** - * @dev Implement supportsInterface(bytes4) using a lookup table. - */ - function supportsInterface(bytes4 interfaceId) public view override returns (bool) { - return _supportedInterfaces[interfaceId]; - } - - /** - * @dev Private method for registering an interface. - */ - function _registerInterface(bytes4 interfaceId) internal { - require(interfaceId != 0xffffffff, "ERC165InterfacesSupported: invalid interface id"); - _supportedInterfaces[interfaceId] = true; - } -} - -contract ERC165InterfacesSupported is SupportsInterfaceWithLookupMock { - constructor(bytes4[] memory interfaceIds) { - for (uint256 i = 0; i < interfaceIds.length; i++) { - _registerInterface(interfaceIds[i]); - } - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165MissingData.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165MissingData.sol deleted file mode 100644 index 59cd51a..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165MissingData.sol +++ /dev/null @@ -1,7 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -contract ERC165MissingData { - function supportsInterface(bytes4 interfaceId) public view {} // missing return -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165NotSupported.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165NotSupported.sol deleted file mode 100644 index 486c7f0..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165NotSupported.sol +++ /dev/null @@ -1,5 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -contract ERC165NotSupported {} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC165CheckerMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC165CheckerMock.sol deleted file mode 100644 index bda5cfc..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC165CheckerMock.sol +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/introspection/ERC165Checker.sol"; - -contract ERC165CheckerMock { - using ERC165Checker for address; - - function supportsERC165(address account) public view returns (bool) { - return account.supportsERC165(); - } - - function supportsInterface(address account, bytes4 interfaceId) public view returns (bool) { - return account.supportsInterface(interfaceId); - } - - function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) public view returns (bool) { - return account.supportsAllInterfaces(interfaceIds); - } - - function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) public view returns (bool[] memory) { - return account.getSupportedInterfaces(interfaceIds); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC165Mock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC165Mock.sol deleted file mode 100644 index c123d0a..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC165Mock.sol +++ /dev/null @@ -1,7 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/introspection/ERC165.sol"; - -contract ERC165Mock is ERC165 {} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC165StorageMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC165StorageMock.sol deleted file mode 100644 index 4b0bae9..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC165StorageMock.sol +++ /dev/null @@ -1,11 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/introspection/ERC165Storage.sol"; - -contract ERC165StorageMock is ERC165Storage { - function registerInterface(bytes4 interfaceId) public { - _registerInterface(interfaceId); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC1820ImplementerMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC1820ImplementerMock.sol deleted file mode 100644 index a6012d7..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC1820ImplementerMock.sol +++ /dev/null @@ -1,11 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/introspection/ERC1820Implementer.sol"; - -contract ERC1820ImplementerMock is ERC1820Implementer { - function registerInterfaceForAddress(bytes32 interfaceHash, address account) public { - _registerInterfaceForAddress(interfaceHash, account); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC20BurnableMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC20BurnableMock.sol deleted file mode 100644 index 0ed6c0c..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC20BurnableMock.sol +++ /dev/null @@ -1,16 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC20/extensions/ERC20Burnable.sol"; - -contract ERC20BurnableMock is ERC20Burnable { - constructor( - string memory name, - string memory symbol, - address initialAccount, - uint256 initialBalance - ) ERC20(name, symbol) { - _mint(initialAccount, initialBalance); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC20CappedMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC20CappedMock.sol deleted file mode 100644 index edb36f2..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC20CappedMock.sol +++ /dev/null @@ -1,17 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC20/extensions/ERC20Capped.sol"; - -contract ERC20CappedMock is ERC20Capped { - constructor( - string memory name, - string memory symbol, - uint256 cap - ) ERC20(name, symbol) ERC20Capped(cap) {} - - function mint(address to, uint256 tokenId) public { - _mint(to, tokenId); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC20DecimalsMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC20DecimalsMock.sol deleted file mode 100644 index 1374cbc..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC20DecimalsMock.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC20/ERC20.sol"; - -contract ERC20DecimalsMock is ERC20 { - uint8 private immutable _decimals; - - constructor( - string memory name_, - string memory symbol_, - uint8 decimals_ - ) ERC20(name_, symbol_) { - _decimals = decimals_; - } - - function decimals() public view virtual override returns (uint8) { - return _decimals; - } - - function mint(address account, uint256 amount) public { - _mint(account, amount); - } - - function burn(address account, uint256 amount) public { - _burn(account, amount); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC20FlashMintMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC20FlashMintMock.sol deleted file mode 100644 index 0bb7871..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC20FlashMintMock.sol +++ /dev/null @@ -1,16 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC20/extensions/ERC20FlashMint.sol"; - -contract ERC20FlashMintMock is ERC20FlashMint { - constructor( - string memory name, - string memory symbol, - address initialAccount, - uint256 initialBalance - ) ERC20(name, symbol) { - _mint(initialAccount, initialBalance); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC20Mock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC20Mock.sol deleted file mode 100644 index fd7f991..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC20Mock.sol +++ /dev/null @@ -1,41 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC20/ERC20.sol"; - -// mock class using ERC20 -contract ERC20Mock is ERC20 { - constructor( - string memory name, - string memory symbol, - address initialAccount, - uint256 initialBalance - ) payable ERC20(name, symbol) { - _mint(initialAccount, initialBalance); - } - - function mint(address account, uint256 amount) public { - _mint(account, amount); - } - - function burn(address account, uint256 amount) public { - _burn(account, amount); - } - - function transferInternal( - address from, - address to, - uint256 value - ) public { - _transfer(from, to, value); - } - - function approveInternal( - address owner, - address spender, - uint256 value - ) public { - _approve(owner, spender, value); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC20PausableMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC20PausableMock.sol deleted file mode 100644 index 19160ba..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC20PausableMock.sol +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC20/extensions/ERC20Pausable.sol"; - -// mock class using ERC20Pausable -contract ERC20PausableMock is ERC20Pausable { - constructor( - string memory name, - string memory symbol, - address initialAccount, - uint256 initialBalance - ) ERC20(name, symbol) { - _mint(initialAccount, initialBalance); - } - - function pause() external { - _pause(); - } - - function unpause() external { - _unpause(); - } - - function mint(address to, uint256 amount) public { - _mint(to, amount); - } - - function burn(address from, uint256 amount) public { - _burn(from, amount); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC20PermitMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC20PermitMock.sol deleted file mode 100644 index 20302bf..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC20PermitMock.sol +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC20/extensions/draft-ERC20Permit.sol"; - -contract ERC20PermitMock is ERC20Permit { - constructor( - string memory name, - string memory symbol, - address initialAccount, - uint256 initialBalance - ) payable ERC20(name, symbol) ERC20Permit(name) { - _mint(initialAccount, initialBalance); - } - - function getChainId() external view returns (uint256) { - return block.chainid; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC20SnapshotMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC20SnapshotMock.sol deleted file mode 100644 index cb30483..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC20SnapshotMock.sol +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC20/extensions/ERC20Snapshot.sol"; - -contract ERC20SnapshotMock is ERC20Snapshot { - constructor( - string memory name, - string memory symbol, - address initialAccount, - uint256 initialBalance - ) ERC20(name, symbol) { - _mint(initialAccount, initialBalance); - } - - function snapshot() public { - _snapshot(); - } - - function mint(address account, uint256 amount) public { - _mint(account, amount); - } - - function burn(address account, uint256 amount) public { - _burn(account, amount); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC20VotesCompMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC20VotesCompMock.sol deleted file mode 100644 index 171071f..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC20VotesCompMock.sol +++ /dev/null @@ -1,21 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC20/extensions/ERC20VotesComp.sol"; - -contract ERC20VotesCompMock is ERC20VotesComp { - constructor(string memory name, string memory symbol) ERC20(name, symbol) ERC20Permit(name) {} - - function mint(address account, uint256 amount) public { - _mint(account, amount); - } - - function burn(address account, uint256 amount) public { - _burn(account, amount); - } - - function getChainId() external view returns (uint256) { - return block.chainid; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC20VotesMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC20VotesMock.sol deleted file mode 100644 index 0975e8b..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC20VotesMock.sol +++ /dev/null @@ -1,21 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC20/extensions/ERC20Votes.sol"; - -contract ERC20VotesMock is ERC20Votes { - constructor(string memory name, string memory symbol) ERC20(name, symbol) ERC20Permit(name) {} - - function mint(address account, uint256 amount) public { - _mint(account, amount); - } - - function burn(address account, uint256 amount) public { - _burn(account, amount); - } - - function getChainId() external view returns (uint256) { - return block.chainid; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC20WrapperMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC20WrapperMock.sol deleted file mode 100644 index cf34a7a..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC20WrapperMock.sol +++ /dev/null @@ -1,17 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC20/extensions/ERC20Wrapper.sol"; - -contract ERC20WrapperMock is ERC20Wrapper { - constructor( - IERC20 _underlyingToken, - string memory name, - string memory symbol - ) ERC20(name, symbol) ERC20Wrapper(_underlyingToken) {} - - function recover(address account) public returns (uint256) { - return _recover(account); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC2771ContextMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC2771ContextMock.sol deleted file mode 100644 index ee111d1..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC2771ContextMock.sol +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.9; - -import "./ContextMock.sol"; -import "../metatx/ERC2771Context.sol"; - -// By inheriting from ERC2771Context, Context's internal functions are overridden automatically -contract ERC2771ContextMock is ContextMock, ERC2771Context { - /// @custom:oz-upgrades-unsafe-allow constructor - constructor(address trustedForwarder) ERC2771Context(trustedForwarder) { - emit Sender(_msgSender()); // _msgSender() should be accessible during construction - } - - function _msgSender() internal view virtual override(Context, ERC2771Context) returns (address) { - return ERC2771Context._msgSender(); - } - - function _msgData() internal view virtual override(Context, ERC2771Context) returns (bytes calldata) { - return ERC2771Context._msgData(); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC3156FlashBorrowerMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC3156FlashBorrowerMock.sol deleted file mode 100644 index 288a278..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC3156FlashBorrowerMock.sol +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC20/IERC20.sol"; -import "../interfaces/IERC3156.sol"; -import "../utils/Address.sol"; - -/** - * @dev WARNING: this IERC3156FlashBorrower mock implementation is for testing purposes ONLY. - * Writing a secure flash lock borrower is not an easy task, and should be done with the utmost care. - * This is not an example of how it should be done, and no pattern present in this mock should be considered secure. - * Following best practices, always have your contract properly audited before using them to manipulate important funds on - * live networks. - */ -contract ERC3156FlashBorrowerMock is IERC3156FlashBorrower { - bytes32 internal constant _RETURN_VALUE = keccak256("ERC3156FlashBorrower.onFlashLoan"); - - bool immutable _enableApprove; - bool immutable _enableReturn; - - event BalanceOf(address token, address account, uint256 value); - event TotalSupply(address token, uint256 value); - - constructor(bool enableReturn, bool enableApprove) { - _enableApprove = enableApprove; - _enableReturn = enableReturn; - } - - function onFlashLoan( - address, /*initiator*/ - address token, - uint256 amount, - uint256 fee, - bytes calldata data - ) public override returns (bytes32) { - require(msg.sender == token); - - emit BalanceOf(token, address(this), IERC20(token).balanceOf(address(this))); - emit TotalSupply(token, IERC20(token).totalSupply()); - - if (data.length > 0) { - // WARNING: This code is for testing purposes only! Do not use. - Address.functionCall(token, data); - } - - if (_enableApprove) { - IERC20(token).approve(token, amount + fee); - } - - return _enableReturn ? _RETURN_VALUE : bytes32(0); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC721BurnableMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC721BurnableMock.sol deleted file mode 100644 index b30dbf5..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC721BurnableMock.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC721/extensions/ERC721Burnable.sol"; - -contract ERC721BurnableMock is ERC721Burnable { - constructor(string memory name, string memory symbol) ERC721(name, symbol) {} - - function exists(uint256 tokenId) public view returns (bool) { - return _exists(tokenId); - } - - function mint(address to, uint256 tokenId) public { - _mint(to, tokenId); - } - - function safeMint(address to, uint256 tokenId) public { - _safeMint(to, tokenId); - } - - function safeMint( - address to, - uint256 tokenId, - bytes memory _data - ) public { - _safeMint(to, tokenId, _data); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC721EnumerableMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC721EnumerableMock.sol deleted file mode 100644 index 73aee9d..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC721EnumerableMock.sol +++ /dev/null @@ -1,51 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC721/extensions/ERC721Enumerable.sol"; - -/** - * @title ERC721Mock - * This mock just provides a public safeMint, mint, and burn functions for testing purposes - */ -contract ERC721EnumerableMock is ERC721Enumerable { - string private _baseTokenURI; - - constructor(string memory name, string memory symbol) ERC721(name, symbol) {} - - function _baseURI() internal view virtual override returns (string memory) { - return _baseTokenURI; - } - - function setBaseURI(string calldata newBaseTokenURI) public { - _baseTokenURI = newBaseTokenURI; - } - - function baseURI() public view returns (string memory) { - return _baseURI(); - } - - function exists(uint256 tokenId) public view returns (bool) { - return _exists(tokenId); - } - - function mint(address to, uint256 tokenId) public { - _mint(to, tokenId); - } - - function safeMint(address to, uint256 tokenId) public { - _safeMint(to, tokenId); - } - - function safeMint( - address to, - uint256 tokenId, - bytes memory _data - ) public { - _safeMint(to, tokenId, _data); - } - - function burn(uint256 tokenId) public { - _burn(tokenId); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC721Mock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC721Mock.sol deleted file mode 100644 index 74a0923..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC721Mock.sol +++ /dev/null @@ -1,41 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC721/ERC721.sol"; - -/** - * @title ERC721Mock - * This mock just provides a public safeMint, mint, and burn functions for testing purposes - */ -contract ERC721Mock is ERC721 { - constructor(string memory name, string memory symbol) ERC721(name, symbol) {} - - function baseURI() public view returns (string memory) { - return _baseURI(); - } - - function exists(uint256 tokenId) public view returns (bool) { - return _exists(tokenId); - } - - function mint(address to, uint256 tokenId) public { - _mint(to, tokenId); - } - - function safeMint(address to, uint256 tokenId) public { - _safeMint(to, tokenId); - } - - function safeMint( - address to, - uint256 tokenId, - bytes memory _data - ) public { - _safeMint(to, tokenId, _data); - } - - function burn(uint256 tokenId) public { - _burn(tokenId); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC721PausableMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC721PausableMock.sol deleted file mode 100644 index 8d8e818..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC721PausableMock.sol +++ /dev/null @@ -1,45 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC721/extensions/ERC721Pausable.sol"; - -/** - * @title ERC721PausableMock - * This mock just provides a public mint, burn and exists functions for testing purposes - */ -contract ERC721PausableMock is ERC721Pausable { - constructor(string memory name, string memory symbol) ERC721(name, symbol) {} - - function pause() external { - _pause(); - } - - function unpause() external { - _unpause(); - } - - function exists(uint256 tokenId) public view returns (bool) { - return _exists(tokenId); - } - - function mint(address to, uint256 tokenId) public { - _mint(to, tokenId); - } - - function safeMint(address to, uint256 tokenId) public { - _safeMint(to, tokenId); - } - - function safeMint( - address to, - uint256 tokenId, - bytes memory _data - ) public { - _safeMint(to, tokenId, _data); - } - - function burn(uint256 tokenId) public { - _burn(tokenId); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC721ReceiverMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC721ReceiverMock.sol deleted file mode 100644 index a4923bf..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC721ReceiverMock.sol +++ /dev/null @@ -1,42 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC721/IERC721Receiver.sol"; - -contract ERC721ReceiverMock is IERC721Receiver { - enum Error { - None, - RevertWithMessage, - RevertWithoutMessage, - Panic - } - - bytes4 private immutable _retval; - Error private immutable _error; - - event Received(address operator, address from, uint256 tokenId, bytes data, uint256 gas); - - constructor(bytes4 retval, Error error) { - _retval = retval; - _error = error; - } - - function onERC721Received( - address operator, - address from, - uint256 tokenId, - bytes memory data - ) public override returns (bytes4) { - if (_error == Error.RevertWithMessage) { - revert("ERC721ReceiverMock: reverting"); - } else if (_error == Error.RevertWithoutMessage) { - revert(); - } else if (_error == Error.Panic) { - uint256 a = uint256(0) / uint256(0); - a; - } - emit Received(operator, from, tokenId, data, gasleft()); - return _retval; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC721RoyaltyMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC721RoyaltyMock.sol deleted file mode 100644 index 83a9074..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC721RoyaltyMock.sol +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC721/extensions/ERC721Royalty.sol"; - -contract ERC721RoyaltyMock is ERC721Royalty { - constructor(string memory name, string memory symbol) ERC721(name, symbol) {} - - function setTokenRoyalty( - uint256 tokenId, - address recipient, - uint96 fraction - ) public { - _setTokenRoyalty(tokenId, recipient, fraction); - } - - function setDefaultRoyalty(address recipient, uint96 fraction) public { - _setDefaultRoyalty(recipient, fraction); - } - - function mint(address to, uint256 tokenId) public { - _mint(to, tokenId); - } - - function burn(uint256 tokenId) public { - _burn(tokenId); - } - - function deleteDefaultRoyalty() public { - _deleteDefaultRoyalty(); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC721URIStorageMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC721URIStorageMock.sol deleted file mode 100644 index 9c3480f..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC721URIStorageMock.sol +++ /dev/null @@ -1,55 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC721/extensions/ERC721URIStorage.sol"; - -/** - * @title ERC721Mock - * This mock just provides a public safeMint, mint, and burn functions for testing purposes - */ -contract ERC721URIStorageMock is ERC721URIStorage { - string private _baseTokenURI; - - constructor(string memory name, string memory symbol) ERC721(name, symbol) {} - - function _baseURI() internal view virtual override returns (string memory) { - return _baseTokenURI; - } - - function setBaseURI(string calldata newBaseTokenURI) public { - _baseTokenURI = newBaseTokenURI; - } - - function baseURI() public view returns (string memory) { - return _baseURI(); - } - - function setTokenURI(uint256 tokenId, string memory _tokenURI) public { - _setTokenURI(tokenId, _tokenURI); - } - - function exists(uint256 tokenId) public view returns (bool) { - return _exists(tokenId); - } - - function mint(address to, uint256 tokenId) public { - _mint(to, tokenId); - } - - function safeMint(address to, uint256 tokenId) public { - _safeMint(to, tokenId); - } - - function safeMint( - address to, - uint256 tokenId, - bytes memory _data - ) public { - _safeMint(to, tokenId, _data); - } - - function burn(uint256 tokenId) public { - _burn(tokenId); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC721VotesMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC721VotesMock.sol deleted file mode 100644 index 0755ace..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC721VotesMock.sol +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC721/extensions/draft-ERC721Votes.sol"; - -contract ERC721VotesMock is ERC721Votes { - constructor(string memory name, string memory symbol) ERC721(name, symbol) EIP712(name, "1") {} - - function getTotalSupply() public view returns (uint256) { - return _getTotalSupply(); - } - - function mint(address account, uint256 tokenId) public { - _mint(account, tokenId); - } - - function burn(uint256 tokenId) public { - _burn(tokenId); - } - - function getChainId() external view returns (uint256) { - return block.chainid; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC777Mock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC777Mock.sol deleted file mode 100644 index f8a3b67..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC777Mock.sol +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/Context.sol"; -import "../token/ERC777/ERC777.sol"; - -contract ERC777Mock is Context, ERC777 { - event BeforeTokenTransfer(); - - constructor( - address initialHolder, - uint256 initialBalance, - string memory name, - string memory symbol, - address[] memory defaultOperators - ) ERC777(name, symbol, defaultOperators) { - _mint(initialHolder, initialBalance, "", ""); - } - - function mintInternal( - address to, - uint256 amount, - bytes memory userData, - bytes memory operatorData - ) public { - _mint(to, amount, userData, operatorData); - } - - function mintInternalExtended( - address to, - uint256 amount, - bytes memory userData, - bytes memory operatorData, - bool requireReceptionAck - ) public { - _mint(to, amount, userData, operatorData, requireReceptionAck); - } - - function approveInternal( - address holder, - address spender, - uint256 value - ) public { - _approve(holder, spender, value); - } - - function _beforeTokenTransfer( - address, - address, - address, - uint256 - ) internal override { - emit BeforeTokenTransfer(); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC777SenderRecipientMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC777SenderRecipientMock.sol deleted file mode 100644 index 169912f..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ERC777SenderRecipientMock.sol +++ /dev/null @@ -1,161 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC777/IERC777.sol"; -import "../token/ERC777/IERC777Sender.sol"; -import "../token/ERC777/IERC777Recipient.sol"; -import "../utils/Context.sol"; -import "../utils/introspection/IERC1820Registry.sol"; -import "../utils/introspection/ERC1820Implementer.sol"; - -contract ERC777SenderRecipientMock is Context, IERC777Sender, IERC777Recipient, ERC1820Implementer { - event TokensToSendCalled( - address operator, - address from, - address to, - uint256 amount, - bytes data, - bytes operatorData, - address token, - uint256 fromBalance, - uint256 toBalance - ); - - event TokensReceivedCalled( - address operator, - address from, - address to, - uint256 amount, - bytes data, - bytes operatorData, - address token, - uint256 fromBalance, - uint256 toBalance - ); - - // Emitted in ERC777Mock. Here for easier decoding - event BeforeTokenTransfer(); - - bool private _shouldRevertSend; - bool private _shouldRevertReceive; - - IERC1820Registry private _erc1820 = IERC1820Registry(0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24); - - bytes32 private constant _TOKENS_SENDER_INTERFACE_HASH = keccak256("ERC777TokensSender"); - bytes32 private constant _TOKENS_RECIPIENT_INTERFACE_HASH = keccak256("ERC777TokensRecipient"); - - function tokensToSend( - address operator, - address from, - address to, - uint256 amount, - bytes calldata userData, - bytes calldata operatorData - ) external override { - if (_shouldRevertSend) { - revert(); - } - - IERC777 token = IERC777(_msgSender()); - - uint256 fromBalance = token.balanceOf(from); - // when called due to burn, to will be the zero address, which will have a balance of 0 - uint256 toBalance = token.balanceOf(to); - - emit TokensToSendCalled( - operator, - from, - to, - amount, - userData, - operatorData, - address(token), - fromBalance, - toBalance - ); - } - - function tokensReceived( - address operator, - address from, - address to, - uint256 amount, - bytes calldata userData, - bytes calldata operatorData - ) external override { - if (_shouldRevertReceive) { - revert(); - } - - IERC777 token = IERC777(_msgSender()); - - uint256 fromBalance = token.balanceOf(from); - // when called due to burn, to will be the zero address, which will have a balance of 0 - uint256 toBalance = token.balanceOf(to); - - emit TokensReceivedCalled( - operator, - from, - to, - amount, - userData, - operatorData, - address(token), - fromBalance, - toBalance - ); - } - - function senderFor(address account) public { - _registerInterfaceForAddress(_TOKENS_SENDER_INTERFACE_HASH, account); - - address self = address(this); - if (account == self) { - registerSender(self); - } - } - - function registerSender(address sender) public { - _erc1820.setInterfaceImplementer(address(this), _TOKENS_SENDER_INTERFACE_HASH, sender); - } - - function recipientFor(address account) public { - _registerInterfaceForAddress(_TOKENS_RECIPIENT_INTERFACE_HASH, account); - - address self = address(this); - if (account == self) { - registerRecipient(self); - } - } - - function registerRecipient(address recipient) public { - _erc1820.setInterfaceImplementer(address(this), _TOKENS_RECIPIENT_INTERFACE_HASH, recipient); - } - - function setShouldRevertSend(bool shouldRevert) public { - _shouldRevertSend = shouldRevert; - } - - function setShouldRevertReceive(bool shouldRevert) public { - _shouldRevertReceive = shouldRevert; - } - - function send( - IERC777 token, - address to, - uint256 amount, - bytes memory data - ) public { - // This is 777's send function, not the Solidity send function - token.send(to, amount, data); // solhint-disable-line check-send-result - } - - function burn( - IERC777 token, - uint256 amount, - bytes memory data - ) public { - token.burn(amount, data); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/EnumerableMapMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/EnumerableMapMock.sol deleted file mode 100644 index 7cecd0d..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/EnumerableMapMock.sol +++ /dev/null @@ -1,133 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/structs/EnumerableMap.sol"; - -// UintToAddressMap -contract UintToAddressMapMock { - using EnumerableMap for EnumerableMap.UintToAddressMap; - - event OperationResult(bool result); - - EnumerableMap.UintToAddressMap private _map; - - function contains(uint256 key) public view returns (bool) { - return _map.contains(key); - } - - function set(uint256 key, address value) public { - bool result = _map.set(key, value); - emit OperationResult(result); - } - - function remove(uint256 key) public { - bool result = _map.remove(key); - emit OperationResult(result); - } - - function length() public view returns (uint256) { - return _map.length(); - } - - function at(uint256 index) public view returns (uint256 key, address value) { - return _map.at(index); - } - - function tryGet(uint256 key) public view returns (bool, address) { - return _map.tryGet(key); - } - - function get(uint256 key) public view returns (address) { - return _map.get(key); - } - - function getWithMessage(uint256 key, string calldata errorMessage) public view returns (address) { - return _map.get(key, errorMessage); - } -} - -// AddressToUintMap -contract AddressToUintMapMock { - using EnumerableMap for EnumerableMap.AddressToUintMap; - - event OperationResult(bool result); - - EnumerableMap.AddressToUintMap private _map; - - function contains(address key) public view returns (bool) { - return _map.contains(key); - } - - function set(address key, uint256 value) public { - bool result = _map.set(key, value); - emit OperationResult(result); - } - - function remove(address key) public { - bool result = _map.remove(key); - emit OperationResult(result); - } - - function length() public view returns (uint256) { - return _map.length(); - } - - function at(uint256 index) public view returns (address key, uint256 value) { - return _map.at(index); - } - - function tryGet(address key) public view returns (bool, uint256) { - return _map.tryGet(key); - } - - function get(address key) public view returns (uint256) { - return _map.get(key); - } - - function getWithMessage(address key, string calldata errorMessage) public view returns (uint256) { - return _map.get(key, errorMessage); - } -} - -contract Bytes32ToBytes32MapMock { - using EnumerableMap for EnumerableMap.Bytes32ToBytes32Map; - - event OperationResult(bool result); - - EnumerableMap.Bytes32ToBytes32Map private _map; - - function contains(bytes32 key) public view returns (bool) { - return _map.contains(key); - } - - function set(bytes32 key, bytes32 value) public { - bool result = _map.set(key, value); - emit OperationResult(result); - } - - function remove(bytes32 key) public { - bool result = _map.remove(key); - emit OperationResult(result); - } - - function length() public view returns (uint256) { - return _map.length(); - } - - function at(uint256 index) public view returns (bytes32 key, bytes32 value) { - return _map.at(index); - } - - function tryGet(bytes32 key) public view returns (bool, bytes32) { - return _map.tryGet(key); - } - - function get(bytes32 key) public view returns (bytes32) { - return _map.get(key); - } - - function getWithMessage(bytes32 key, string calldata errorMessage) public view returns (bytes32) { - return _map.get(key, errorMessage); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/EnumerableSetMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/EnumerableSetMock.sol deleted file mode 100644 index 922ce46..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/EnumerableSetMock.sol +++ /dev/null @@ -1,110 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/structs/EnumerableSet.sol"; - -// Bytes32Set -contract EnumerableBytes32SetMock { - using EnumerableSet for EnumerableSet.Bytes32Set; - - event OperationResult(bool result); - - EnumerableSet.Bytes32Set private _set; - - function contains(bytes32 value) public view returns (bool) { - return _set.contains(value); - } - - function add(bytes32 value) public { - bool result = _set.add(value); - emit OperationResult(result); - } - - function remove(bytes32 value) public { - bool result = _set.remove(value); - emit OperationResult(result); - } - - function length() public view returns (uint256) { - return _set.length(); - } - - function at(uint256 index) public view returns (bytes32) { - return _set.at(index); - } - - function values() public view returns (bytes32[] memory) { - return _set.values(); - } -} - -// AddressSet -contract EnumerableAddressSetMock { - using EnumerableSet for EnumerableSet.AddressSet; - - event OperationResult(bool result); - - EnumerableSet.AddressSet private _set; - - function contains(address value) public view returns (bool) { - return _set.contains(value); - } - - function add(address value) public { - bool result = _set.add(value); - emit OperationResult(result); - } - - function remove(address value) public { - bool result = _set.remove(value); - emit OperationResult(result); - } - - function length() public view returns (uint256) { - return _set.length(); - } - - function at(uint256 index) public view returns (address) { - return _set.at(index); - } - - function values() public view returns (address[] memory) { - return _set.values(); - } -} - -// UintSet -contract EnumerableUintSetMock { - using EnumerableSet for EnumerableSet.UintSet; - - event OperationResult(bool result); - - EnumerableSet.UintSet private _set; - - function contains(uint256 value) public view returns (bool) { - return _set.contains(value); - } - - function add(uint256 value) public { - bool result = _set.add(value); - emit OperationResult(result); - } - - function remove(uint256 value) public { - bool result = _set.remove(value); - emit OperationResult(result); - } - - function length() public view returns (uint256) { - return _set.length(); - } - - function at(uint256 index) public view returns (uint256) { - return _set.at(index); - } - - function values() public view returns (uint256[] memory) { - return _set.values(); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/EtherReceiverMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/EtherReceiverMock.sol deleted file mode 100644 index a11e646..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/EtherReceiverMock.sol +++ /dev/null @@ -1,17 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -contract EtherReceiverMock { - bool private _acceptEther; - - function setAcceptEther(bool acceptEther) public { - _acceptEther = acceptEther; - } - - receive() external payable { - if (!_acceptEther) { - revert(); - } - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/GovernorCompMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/GovernorCompMock.sol deleted file mode 100644 index c2d8733..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/GovernorCompMock.sol +++ /dev/null @@ -1,31 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../governance/extensions/GovernorCountingSimple.sol"; -import "../governance/extensions/GovernorVotesComp.sol"; - -contract GovernorCompMock is GovernorVotesComp, GovernorCountingSimple { - constructor(string memory name_, ERC20VotesComp token_) Governor(name_) GovernorVotesComp(token_) {} - - function quorum(uint256) public pure override returns (uint256) { - return 0; - } - - function votingDelay() public pure override returns (uint256) { - return 4; - } - - function votingPeriod() public pure override returns (uint256) { - return 16; - } - - function cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 salt - ) public returns (uint256 proposalId) { - return _cancel(targets, values, calldatas, salt); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/GovernorCompatibilityBravoMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/GovernorCompatibilityBravoMock.sol deleted file mode 100644 index 8f295f6..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/GovernorCompatibilityBravoMock.sol +++ /dev/null @@ -1,130 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../governance/compatibility/GovernorCompatibilityBravo.sol"; -import "../governance/extensions/GovernorTimelockCompound.sol"; -import "../governance/extensions/GovernorSettings.sol"; -import "../governance/extensions/GovernorVotesComp.sol"; - -contract GovernorCompatibilityBravoMock is - GovernorCompatibilityBravo, - GovernorSettings, - GovernorTimelockCompound, - GovernorVotesComp -{ - constructor( - string memory name_, - ERC20VotesComp token_, - uint256 votingDelay_, - uint256 votingPeriod_, - uint256 proposalThreshold_, - ICompoundTimelock timelock_ - ) - Governor(name_) - GovernorTimelockCompound(timelock_) - GovernorSettings(votingDelay_, votingPeriod_, proposalThreshold_) - GovernorVotesComp(token_) - {} - - function supportsInterface(bytes4 interfaceId) - public - view - virtual - override(IERC165, Governor, GovernorTimelockCompound) - returns (bool) - { - return super.supportsInterface(interfaceId); - } - - function quorum(uint256) public pure override returns (uint256) { - return 0; - } - - function state(uint256 proposalId) - public - view - virtual - override(IGovernor, Governor, GovernorTimelockCompound) - returns (ProposalState) - { - return super.state(proposalId); - } - - function proposalEta(uint256 proposalId) - public - view - virtual - override(IGovernorTimelock, GovernorTimelockCompound) - returns (uint256) - { - return super.proposalEta(proposalId); - } - - function proposalThreshold() public view override(Governor, GovernorSettings) returns (uint256) { - return super.proposalThreshold(); - } - - function propose( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - string memory description - ) public virtual override(IGovernor, Governor, GovernorCompatibilityBravo) returns (uint256) { - return super.propose(targets, values, calldatas, description); - } - - function queue( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 salt - ) public virtual override(IGovernorTimelock, GovernorTimelockCompound) returns (uint256) { - return super.queue(targets, values, calldatas, salt); - } - - function execute( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 salt - ) public payable virtual override(IGovernor, Governor) returns (uint256) { - return super.execute(targets, values, calldatas, salt); - } - - function _execute( - uint256 proposalId, - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) internal virtual override(Governor, GovernorTimelockCompound) { - super._execute(proposalId, targets, values, calldatas, descriptionHash); - } - - /** - * @notice WARNING: this is for mock purposes only. Ability to the _cancel function should be restricted for live - * deployments. - */ - function cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 salt - ) public returns (uint256 proposalId) { - return _cancel(targets, values, calldatas, salt); - } - - function _cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 salt - ) internal virtual override(Governor, GovernorTimelockCompound) returns (uint256 proposalId) { - return super._cancel(targets, values, calldatas, salt); - } - - function _executor() internal view virtual override(Governor, GovernorTimelockCompound) returns (address) { - return super._executor(); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/GovernorMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/GovernorMock.sol deleted file mode 100644 index dafb0a0..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/GovernorMock.sol +++ /dev/null @@ -1,50 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../governance/extensions/GovernorProposalThreshold.sol"; -import "../governance/extensions/GovernorSettings.sol"; -import "../governance/extensions/GovernorCountingSimple.sol"; -import "../governance/extensions/GovernorVotesQuorumFraction.sol"; - -contract GovernorMock is - GovernorProposalThreshold, - GovernorSettings, - GovernorVotesQuorumFraction, - GovernorCountingSimple -{ - constructor( - string memory name_, - IVotes token_, - uint256 votingDelay_, - uint256 votingPeriod_, - uint256 quorumNumerator_ - ) - Governor(name_) - GovernorSettings(votingDelay_, votingPeriod_, 0) - GovernorVotes(token_) - GovernorVotesQuorumFraction(quorumNumerator_) - {} - - function cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 salt - ) public returns (uint256 proposalId) { - return _cancel(targets, values, calldatas, salt); - } - - function proposalThreshold() public view override(Governor, GovernorSettings) returns (uint256) { - return super.proposalThreshold(); - } - - function propose( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - string memory description - ) public virtual override(Governor, GovernorProposalThreshold) returns (uint256) { - return super.propose(targets, values, calldatas, description); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/GovernorPreventLateQuorumMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/GovernorPreventLateQuorumMock.sol deleted file mode 100644 index 35bddc0..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/GovernorPreventLateQuorumMock.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../governance/extensions/GovernorPreventLateQuorum.sol"; -import "../governance/extensions/GovernorSettings.sol"; -import "../governance/extensions/GovernorCountingSimple.sol"; -import "../governance/extensions/GovernorVotes.sol"; - -contract GovernorPreventLateQuorumMock is - GovernorSettings, - GovernorVotes, - GovernorCountingSimple, - GovernorPreventLateQuorum -{ - uint256 private _quorum; - - constructor( - string memory name_, - IVotes token_, - uint256 votingDelay_, - uint256 votingPeriod_, - uint256 quorum_, - uint64 voteExtension_ - ) - Governor(name_) - GovernorSettings(votingDelay_, votingPeriod_, 0) - GovernorVotes(token_) - GovernorPreventLateQuorum(voteExtension_) - { - _quorum = quorum_; - } - - function quorum(uint256) public view virtual override returns (uint256) { - return _quorum; - } - - function proposalDeadline(uint256 proposalId) - public - view - virtual - override(Governor, GovernorPreventLateQuorum) - returns (uint256) - { - return super.proposalDeadline(proposalId); - } - - function proposalThreshold() public view virtual override(Governor, GovernorSettings) returns (uint256) { - return super.proposalThreshold(); - } - - function _castVote( - uint256 proposalId, - address account, - uint8 support, - string memory reason, - bytes memory params - ) internal virtual override(Governor, GovernorPreventLateQuorum) returns (uint256) { - return super._castVote(proposalId, account, support, reason, params); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/GovernorTimelockCompoundMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/GovernorTimelockCompoundMock.sol deleted file mode 100644 index 88a8829..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/GovernorTimelockCompoundMock.sol +++ /dev/null @@ -1,98 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../governance/extensions/GovernorTimelockCompound.sol"; -import "../governance/extensions/GovernorSettings.sol"; -import "../governance/extensions/GovernorCountingSimple.sol"; -import "../governance/extensions/GovernorVotesQuorumFraction.sol"; - -contract GovernorTimelockCompoundMock is - GovernorSettings, - GovernorTimelockCompound, - GovernorVotesQuorumFraction, - GovernorCountingSimple -{ - constructor( - string memory name_, - IVotes token_, - uint256 votingDelay_, - uint256 votingPeriod_, - ICompoundTimelock timelock_, - uint256 quorumNumerator_ - ) - Governor(name_) - GovernorTimelockCompound(timelock_) - GovernorSettings(votingDelay_, votingPeriod_, 0) - GovernorVotes(token_) - GovernorVotesQuorumFraction(quorumNumerator_) - {} - - function supportsInterface(bytes4 interfaceId) - public - view - virtual - override(Governor, GovernorTimelockCompound) - returns (bool) - { - return super.supportsInterface(interfaceId); - } - - function quorum(uint256 blockNumber) - public - view - override(IGovernor, GovernorVotesQuorumFraction) - returns (uint256) - { - return super.quorum(blockNumber); - } - - function cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 salt - ) public returns (uint256 proposalId) { - return _cancel(targets, values, calldatas, salt); - } - - /** - * Overriding nightmare - */ - function state(uint256 proposalId) - public - view - virtual - override(Governor, GovernorTimelockCompound) - returns (ProposalState) - { - return super.state(proposalId); - } - - function proposalThreshold() public view override(Governor, GovernorSettings) returns (uint256) { - return super.proposalThreshold(); - } - - function _execute( - uint256 proposalId, - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) internal virtual override(Governor, GovernorTimelockCompound) { - super._execute(proposalId, targets, values, calldatas, descriptionHash); - } - - function _cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 salt - ) internal virtual override(Governor, GovernorTimelockCompound) returns (uint256 proposalId) { - return super._cancel(targets, values, calldatas, salt); - } - - function _executor() internal view virtual override(Governor, GovernorTimelockCompound) returns (address) { - return super._executor(); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/GovernorTimelockControlMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/GovernorTimelockControlMock.sol deleted file mode 100644 index 455eac9..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/GovernorTimelockControlMock.sol +++ /dev/null @@ -1,100 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../governance/extensions/GovernorTimelockControl.sol"; -import "../governance/extensions/GovernorSettings.sol"; -import "../governance/extensions/GovernorCountingSimple.sol"; -import "../governance/extensions/GovernorVotesQuorumFraction.sol"; - -contract GovernorTimelockControlMock is - GovernorSettings, - GovernorTimelockControl, - GovernorVotesQuorumFraction, - GovernorCountingSimple -{ - constructor( - string memory name_, - IVotes token_, - uint256 votingDelay_, - uint256 votingPeriod_, - TimelockController timelock_, - uint256 quorumNumerator_ - ) - Governor(name_) - GovernorTimelockControl(timelock_) - GovernorSettings(votingDelay_, votingPeriod_, 0) - GovernorVotes(token_) - GovernorVotesQuorumFraction(quorumNumerator_) - {} - - function supportsInterface(bytes4 interfaceId) - public - view - virtual - override(Governor, GovernorTimelockControl) - returns (bool) - { - return super.supportsInterface(interfaceId); - } - - function quorum(uint256 blockNumber) - public - view - override(IGovernor, GovernorVotesQuorumFraction) - returns (uint256) - { - return super.quorum(blockNumber); - } - - function cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) public returns (uint256 proposalId) { - return _cancel(targets, values, calldatas, descriptionHash); - } - - /** - * Overriding nightmare - */ - function state(uint256 proposalId) - public - view - virtual - override(Governor, GovernorTimelockControl) - returns (ProposalState) - { - return super.state(proposalId); - } - - function proposalThreshold() public view override(Governor, GovernorSettings) returns (uint256) { - return super.proposalThreshold(); - } - - function _execute( - uint256 proposalId, - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) internal virtual override(Governor, GovernorTimelockControl) { - super._execute(proposalId, targets, values, calldatas, descriptionHash); - } - - function _cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) internal virtual override(Governor, GovernorTimelockControl) returns (uint256 proposalId) { - return super._cancel(targets, values, calldatas, descriptionHash); - } - - function _executor() internal view virtual override(Governor, GovernorTimelockControl) returns (address) { - return super._executor(); - } - - function nonGovernanceFunction() external {} -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/GovernorVoteMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/GovernorVoteMock.sol deleted file mode 100644 index 60a3d41..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/GovernorVoteMock.sol +++ /dev/null @@ -1,31 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../governance/extensions/GovernorCountingSimple.sol"; -import "../governance/extensions/GovernorVotes.sol"; - -contract GovernorVoteMocks is GovernorVotes, GovernorCountingSimple { - constructor(string memory name_, IVotes token_) Governor(name_) GovernorVotes(token_) {} - - function quorum(uint256) public pure override returns (uint256) { - return 0; - } - - function votingDelay() public pure override returns (uint256) { - return 4; - } - - function votingPeriod() public pure override returns (uint256) { - return 16; - } - - function cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 salt - ) public returns (uint256 proposalId) { - return _cancel(targets, values, calldatas, salt); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/GovernorWithParamsMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/GovernorWithParamsMock.sol deleted file mode 100644 index 35eb7ad..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/GovernorWithParamsMock.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../governance/extensions/GovernorCountingSimple.sol"; -import "../governance/extensions/GovernorVotes.sol"; - -contract GovernorWithParamsMock is GovernorVotes, GovernorCountingSimple { - event CountParams(uint256 uintParam, string strParam); - - constructor(string memory name_, IVotes token_) Governor(name_) GovernorVotes(token_) {} - - function quorum(uint256) public pure override returns (uint256) { - return 0; - } - - function votingDelay() public pure override returns (uint256) { - return 4; - } - - function votingPeriod() public pure override returns (uint256) { - return 16; - } - - function _getVotes( - address account, - uint256 blockNumber, - bytes memory params - ) internal view virtual override(Governor, GovernorVotes) returns (uint256) { - uint256 reduction = 0; - // If the user provides parameters, we reduce the voting weight by the amount of the integer param - if (params.length > 0) { - (reduction, ) = abi.decode(params, (uint256, string)); - } - // reverts on overflow - return super._getVotes(account, blockNumber, params) - reduction; - } - - function _countVote( - uint256 proposalId, - address account, - uint8 support, - uint256 weight, - bytes memory params - ) internal virtual override(Governor, GovernorCountingSimple) { - if (params.length > 0) { - (uint256 _uintParam, string memory _strParam) = abi.decode(params, (uint256, string)); - emit CountParams(_uintParam, _strParam); - } - return super._countVote(proposalId, account, support, weight, params); - } - - function cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 salt - ) public returns (uint256 proposalId) { - return _cancel(targets, values, calldatas, salt); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/InitializableMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/InitializableMock.sol deleted file mode 100644 index bdf5399..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/InitializableMock.sol +++ /dev/null @@ -1,90 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../proxy/utils/Initializable.sol"; - -/** - * @title InitializableMock - * @dev This contract is a mock to test initializable functionality - */ -contract InitializableMock is Initializable { - bool public initializerRan; - bool public onlyInitializingRan; - uint256 public x; - - function initialize() public initializer { - initializerRan = true; - } - - function initializeOnlyInitializing() public onlyInitializing { - onlyInitializingRan = true; - } - - function initializerNested() public initializer { - initialize(); - } - - function onlyInitializingNested() public initializer { - initializeOnlyInitializing(); - } - - function initializeWithX(uint256 _x) public payable initializer { - x = _x; - } - - function nonInitializable(uint256 _x) public payable { - x = _x; - } - - function fail() public pure { - require(false, "InitializableMock forced failure"); - } -} - -contract ConstructorInitializableMock is Initializable { - bool public initializerRan; - bool public onlyInitializingRan; - - constructor() initializer { - initialize(); - initializeOnlyInitializing(); - } - - function initialize() public initializer { - initializerRan = true; - } - - function initializeOnlyInitializing() public onlyInitializing { - onlyInitializingRan = true; - } -} - -contract ReinitializerMock is Initializable { - uint256 public counter; - - function initialize() public initializer { - doStuff(); - } - - function reinitialize(uint8 i) public reinitializer(i) { - doStuff(); - } - - function nestedReinitialize(uint8 i, uint8 j) public reinitializer(i) { - reinitialize(j); - } - - function chainReinitialize(uint8 i, uint8 j) public { - reinitialize(i); - reinitialize(j); - } - - function disableInitializers() public { - _disableInitializers(); - } - - function doStuff() public onlyInitializing { - counter++; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/MathMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/MathMock.sol deleted file mode 100644 index c651b6b..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/MathMock.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/math/Math.sol"; - -contract MathMock { - function max(uint256 a, uint256 b) public pure returns (uint256) { - return Math.max(a, b); - } - - function min(uint256 a, uint256 b) public pure returns (uint256) { - return Math.min(a, b); - } - - function average(uint256 a, uint256 b) public pure returns (uint256) { - return Math.average(a, b); - } - - function ceilDiv(uint256 a, uint256 b) public pure returns (uint256) { - return Math.ceilDiv(a, b); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/MerkleProofWrapper.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/MerkleProofWrapper.sol deleted file mode 100644 index 1e188df..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/MerkleProofWrapper.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/cryptography/MerkleProof.sol"; - -contract MerkleProofWrapper { - function verify( - bytes32[] memory proof, - bytes32 root, - bytes32 leaf - ) public pure returns (bool) { - return MerkleProof.verify(proof, root, leaf); - } - - function processProof(bytes32[] memory proof, bytes32 leaf) public pure returns (bytes32) { - return MerkleProof.processProof(proof, leaf); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/MulticallTest.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/MulticallTest.sol deleted file mode 100644 index f1a3a9c..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/MulticallTest.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "./MulticallTokenMock.sol"; - -contract MulticallTest { - function testReturnValues( - MulticallTokenMock multicallToken, - address[] calldata recipients, - uint256[] calldata amounts - ) external { - bytes[] memory calls = new bytes[](recipients.length); - for (uint256 i = 0; i < recipients.length; i++) { - calls[i] = abi.encodeWithSignature("transfer(address,uint256)", recipients[i], amounts[i]); - } - - bytes[] memory results = multicallToken.multicall(calls); - for (uint256 i = 0; i < results.length; i++) { - require(abi.decode(results[i], (bool))); - } - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/MulticallTokenMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/MulticallTokenMock.sol deleted file mode 100644 index de37968..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/MulticallTokenMock.sol +++ /dev/null @@ -1,10 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/Multicall.sol"; -import "./ERC20Mock.sol"; - -contract MulticallTokenMock is ERC20Mock, Multicall { - constructor(uint256 initialBalance) ERC20Mock("MulticallToken", "BCT", msg.sender, initialBalance) {} -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/MultipleInheritanceInitializableMocks.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/MultipleInheritanceInitializableMocks.sol deleted file mode 100644 index f8b6e46..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/MultipleInheritanceInitializableMocks.sol +++ /dev/null @@ -1,136 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../proxy/utils/Initializable.sol"; - -// Sample contracts showing upgradeability with multiple inheritance. -// Child contract inherits from Father and Mother contracts, and Father extends from Gramps. -// -// Human -// / \ -// | Gramps -// | | -// Mother Father -// | | -// -- Child -- - -/** - * Sample base intializable contract that is a human - */ -contract SampleHuman is Initializable { - bool public isHuman; - - function initialize() public initializer { - __SampleHuman_init(); - } - - // solhint-disable-next-line func-name-mixedcase - function __SampleHuman_init() internal onlyInitializing { - __SampleHuman_init_unchained(); - } - - // solhint-disable-next-line func-name-mixedcase - function __SampleHuman_init_unchained() internal onlyInitializing { - isHuman = true; - } -} - -/** - * Sample base intializable contract that defines a field mother - */ -contract SampleMother is Initializable, SampleHuman { - uint256 public mother; - - function initialize(uint256 value) public virtual initializer { - __SampleMother_init(value); - } - - // solhint-disable-next-line func-name-mixedcase - function __SampleMother_init(uint256 value) internal onlyInitializing { - __SampleHuman_init(); - __SampleMother_init_unchained(value); - } - - // solhint-disable-next-line func-name-mixedcase - function __SampleMother_init_unchained(uint256 value) internal onlyInitializing { - mother = value; - } -} - -/** - * Sample base intializable contract that defines a field gramps - */ -contract SampleGramps is Initializable, SampleHuman { - string public gramps; - - function initialize(string memory value) public virtual initializer { - __SampleGramps_init(value); - } - - // solhint-disable-next-line func-name-mixedcase - function __SampleGramps_init(string memory value) internal onlyInitializing { - __SampleHuman_init(); - __SampleGramps_init_unchained(value); - } - - // solhint-disable-next-line func-name-mixedcase - function __SampleGramps_init_unchained(string memory value) internal onlyInitializing { - gramps = value; - } -} - -/** - * Sample base intializable contract that defines a field father and extends from gramps - */ -contract SampleFather is Initializable, SampleGramps { - uint256 public father; - - function initialize(string memory _gramps, uint256 _father) public initializer { - __SampleFather_init(_gramps, _father); - } - - // solhint-disable-next-line func-name-mixedcase - function __SampleFather_init(string memory _gramps, uint256 _father) internal onlyInitializing { - __SampleGramps_init(_gramps); - __SampleFather_init_unchained(_father); - } - - // solhint-disable-next-line func-name-mixedcase - function __SampleFather_init_unchained(uint256 _father) internal onlyInitializing { - father = _father; - } -} - -/** - * Child extends from mother, father (gramps) - */ -contract SampleChild is Initializable, SampleMother, SampleFather { - uint256 public child; - - function initialize( - uint256 _mother, - string memory _gramps, - uint256 _father, - uint256 _child - ) public initializer { - __SampleChild_init(_mother, _gramps, _father, _child); - } - - // solhint-disable-next-line func-name-mixedcase - function __SampleChild_init( - uint256 _mother, - string memory _gramps, - uint256 _father, - uint256 _child - ) internal onlyInitializing { - __SampleMother_init(_mother); - __SampleFather_init(_gramps, _father); - __SampleChild_init_unchained(_child); - } - - // solhint-disable-next-line func-name-mixedcase - function __SampleChild_init_unchained(uint256 _child) internal onlyInitializing { - child = _child; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/OwnableMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/OwnableMock.sol deleted file mode 100644 index d60f1c4..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/OwnableMock.sol +++ /dev/null @@ -1,7 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../access/Ownable.sol"; - -contract OwnableMock is Ownable {} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/PausableMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/PausableMock.sol deleted file mode 100644 index 98bcfd5..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/PausableMock.sol +++ /dev/null @@ -1,31 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../security/Pausable.sol"; - -contract PausableMock is Pausable { - bool public drasticMeasureTaken; - uint256 public count; - - constructor() { - drasticMeasureTaken = false; - count = 0; - } - - function normalProcess() external whenNotPaused { - count++; - } - - function drasticMeasure() external whenPaused { - drasticMeasureTaken = true; - } - - function pause() external { - _pause(); - } - - function unpause() external { - _unpause(); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/PullPaymentMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/PullPaymentMock.sol deleted file mode 100644 index 8a708e3..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/PullPaymentMock.sol +++ /dev/null @@ -1,15 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../security/PullPayment.sol"; - -// mock class using PullPayment -contract PullPaymentMock is PullPayment { - constructor() payable {} - - // test helper function to call asyncTransfer - function callTransfer(address dest, uint256 amount) public { - _asyncTransfer(dest, amount); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ReentrancyAttack.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ReentrancyAttack.sol deleted file mode 100644 index 4de1812..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ReentrancyAttack.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/Context.sol"; - -contract ReentrancyAttack is Context { - function callSender(bytes4 data) public { - (bool success, ) = _msgSender().call(abi.encodeWithSelector(data)); - require(success, "ReentrancyAttack: failed call"); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ReentrancyMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ReentrancyMock.sol deleted file mode 100644 index 43425dd..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/ReentrancyMock.sol +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../security/ReentrancyGuard.sol"; -import "./ReentrancyAttack.sol"; - -contract ReentrancyMock is ReentrancyGuard { - uint256 public counter; - - constructor() { - counter = 0; - } - - function callback() external nonReentrant { - _count(); - } - - function countLocalRecursive(uint256 n) public nonReentrant { - if (n > 0) { - _count(); - countLocalRecursive(n - 1); - } - } - - function countThisRecursive(uint256 n) public nonReentrant { - if (n > 0) { - _count(); - (bool success, ) = address(this).call(abi.encodeWithSignature("countThisRecursive(uint256)", n - 1)); - require(success, "ReentrancyMock: failed call"); - } - } - - function countAndCall(ReentrancyAttack attacker) public nonReentrant { - _count(); - bytes4 func = bytes4(keccak256("callback()")); - attacker.callSender(func); - } - - function _count() private { - counter += 1; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/RegressionImplementation.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/RegressionImplementation.sol deleted file mode 100644 index be6b501..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/RegressionImplementation.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../proxy/utils/Initializable.sol"; - -contract Implementation1 is Initializable { - uint256 internal _value; - - function initialize() public initializer {} - - function setValue(uint256 _number) public { - _value = _number; - } -} - -contract Implementation2 is Initializable { - uint256 internal _value; - - function initialize() public initializer {} - - function setValue(uint256 _number) public { - _value = _number; - } - - function getValue() public view returns (uint256) { - return _value; - } -} - -contract Implementation3 is Initializable { - uint256 internal _value; - - function initialize() public initializer {} - - function setValue(uint256 _number) public { - _value = _number; - } - - function getValue(uint256 _number) public view returns (uint256) { - return _value + _number; - } -} - -contract Implementation4 is Initializable { - uint256 internal _value; - - function initialize() public initializer {} - - function setValue(uint256 _number) public { - _value = _number; - } - - function getValue() public view returns (uint256) { - return _value; - } - - fallback() external { - _value = 1; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/SafeCastMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/SafeCastMock.sol deleted file mode 100644 index d1f1aaa..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/SafeCastMock.sol +++ /dev/null @@ -1,66 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/math/SafeCast.sol"; - -contract SafeCastMock { - using SafeCast for uint256; - using SafeCast for int256; - - function toUint256(int256 a) public pure returns (uint256) { - return a.toUint256(); - } - - function toUint224(uint256 a) public pure returns (uint224) { - return a.toUint224(); - } - - function toUint128(uint256 a) public pure returns (uint128) { - return a.toUint128(); - } - - function toUint96(uint256 a) public pure returns (uint96) { - return a.toUint96(); - } - - function toUint64(uint256 a) public pure returns (uint64) { - return a.toUint64(); - } - - function toUint32(uint256 a) public pure returns (uint32) { - return a.toUint32(); - } - - function toUint16(uint256 a) public pure returns (uint16) { - return a.toUint16(); - } - - function toUint8(uint256 a) public pure returns (uint8) { - return a.toUint8(); - } - - function toInt256(uint256 a) public pure returns (int256) { - return a.toInt256(); - } - - function toInt128(int256 a) public pure returns (int128) { - return a.toInt128(); - } - - function toInt64(int256 a) public pure returns (int64) { - return a.toInt64(); - } - - function toInt32(int256 a) public pure returns (int32) { - return a.toInt32(); - } - - function toInt16(int256 a) public pure returns (int16) { - return a.toInt16(); - } - - function toInt8(int256 a) public pure returns (int8) { - return a.toInt8(); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/SafeERC20Helper.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/SafeERC20Helper.sol deleted file mode 100644 index f3bcc39..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/SafeERC20Helper.sol +++ /dev/null @@ -1,144 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/Context.sol"; -import "../token/ERC20/IERC20.sol"; -import "../token/ERC20/utils/SafeERC20.sol"; - -contract ERC20ReturnFalseMock is Context { - uint256 private _allowance; - - // IERC20's functions are not pure, but these mock implementations are: to prevent Solidity from issuing warnings, - // we write to a dummy state variable. - uint256 private _dummy; - - function transfer(address, uint256) public returns (bool) { - _dummy = 0; - return false; - } - - function transferFrom( - address, - address, - uint256 - ) public returns (bool) { - _dummy = 0; - return false; - } - - function approve(address, uint256) public returns (bool) { - _dummy = 0; - return false; - } - - function allowance(address, address) public view returns (uint256) { - require(_dummy == 0); // Dummy read from a state variable so that the function is view - return 0; - } -} - -contract ERC20ReturnTrueMock is Context { - mapping(address => uint256) private _allowances; - - // IERC20's functions are not pure, but these mock implementations are: to prevent Solidity from issuing warnings, - // we write to a dummy state variable. - uint256 private _dummy; - - function transfer(address, uint256) public returns (bool) { - _dummy = 0; - return true; - } - - function transferFrom( - address, - address, - uint256 - ) public returns (bool) { - _dummy = 0; - return true; - } - - function approve(address, uint256) public returns (bool) { - _dummy = 0; - return true; - } - - function setAllowance(uint256 allowance_) public { - _allowances[_msgSender()] = allowance_; - } - - function allowance(address owner, address) public view returns (uint256) { - return _allowances[owner]; - } -} - -contract ERC20NoReturnMock is Context { - mapping(address => uint256) private _allowances; - - // IERC20's functions are not pure, but these mock implementations are: to prevent Solidity from issuing warnings, - // we write to a dummy state variable. - uint256 private _dummy; - - function transfer(address, uint256) public { - _dummy = 0; - } - - function transferFrom( - address, - address, - uint256 - ) public { - _dummy = 0; - } - - function approve(address, uint256) public { - _dummy = 0; - } - - function setAllowance(uint256 allowance_) public { - _allowances[_msgSender()] = allowance_; - } - - function allowance(address owner, address) public view returns (uint256) { - return _allowances[owner]; - } -} - -contract SafeERC20Wrapper is Context { - using SafeERC20 for IERC20; - - IERC20 private _token; - - constructor(IERC20 token) { - _token = token; - } - - function transfer() public { - _token.safeTransfer(address(0), 0); - } - - function transferFrom() public { - _token.safeTransferFrom(address(0), address(0), 0); - } - - function approve(uint256 amount) public { - _token.safeApprove(address(0), amount); - } - - function increaseAllowance(uint256 amount) public { - _token.safeIncreaseAllowance(address(0), amount); - } - - function decreaseAllowance(uint256 amount) public { - _token.safeDecreaseAllowance(address(0), amount); - } - - function setAllowance(uint256 allowance_) public { - ERC20ReturnTrueMock(address(_token)).setAllowance(allowance_); - } - - function allowance() public view returns (uint256) { - return _token.allowance(address(0), address(0)); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/SafeMathMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/SafeMathMock.sol deleted file mode 100644 index 3d1f472..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/SafeMathMock.sol +++ /dev/null @@ -1,138 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/math/SafeMath.sol"; - -contract SafeMathMock { - function tryAdd(uint256 a, uint256 b) public pure returns (bool flag, uint256 value) { - return SafeMath.tryAdd(a, b); - } - - function trySub(uint256 a, uint256 b) public pure returns (bool flag, uint256 value) { - return SafeMath.trySub(a, b); - } - - function tryMul(uint256 a, uint256 b) public pure returns (bool flag, uint256 value) { - return SafeMath.tryMul(a, b); - } - - function tryDiv(uint256 a, uint256 b) public pure returns (bool flag, uint256 value) { - return SafeMath.tryDiv(a, b); - } - - function tryMod(uint256 a, uint256 b) public pure returns (bool flag, uint256 value) { - return SafeMath.tryMod(a, b); - } - - // using the do* naming convention to avoid warnings due to clashing opcode names - - function doAdd(uint256 a, uint256 b) public pure returns (uint256) { - return SafeMath.add(a, b); - } - - function doSub(uint256 a, uint256 b) public pure returns (uint256) { - return SafeMath.sub(a, b); - } - - function doMul(uint256 a, uint256 b) public pure returns (uint256) { - return SafeMath.mul(a, b); - } - - function doDiv(uint256 a, uint256 b) public pure returns (uint256) { - return SafeMath.div(a, b); - } - - function doMod(uint256 a, uint256 b) public pure returns (uint256) { - return SafeMath.mod(a, b); - } - - function subWithMessage( - uint256 a, - uint256 b, - string memory errorMessage - ) public pure returns (uint256) { - return SafeMath.sub(a, b, errorMessage); - } - - function divWithMessage( - uint256 a, - uint256 b, - string memory errorMessage - ) public pure returns (uint256) { - return SafeMath.div(a, b, errorMessage); - } - - function modWithMessage( - uint256 a, - uint256 b, - string memory errorMessage - ) public pure returns (uint256) { - return SafeMath.mod(a, b, errorMessage); - } - - function addMemoryCheck() public pure returns (uint256 mem) { - uint256 length = 32; - assembly { - mem := mload(0x40) - } - for (uint256 i = 0; i < length; ++i) { - SafeMath.add(1, 1); - } - assembly { - mem := sub(mload(0x40), mem) - } - } - - function subMemoryCheck() public pure returns (uint256 mem) { - uint256 length = 32; - assembly { - mem := mload(0x40) - } - for (uint256 i = 0; i < length; ++i) { - SafeMath.sub(1, 1); - } - assembly { - mem := sub(mload(0x40), mem) - } - } - - function mulMemoryCheck() public pure returns (uint256 mem) { - uint256 length = 32; - assembly { - mem := mload(0x40) - } - for (uint256 i = 0; i < length; ++i) { - SafeMath.mul(1, 1); - } - assembly { - mem := sub(mload(0x40), mem) - } - } - - function divMemoryCheck() public pure returns (uint256 mem) { - uint256 length = 32; - assembly { - mem := mload(0x40) - } - for (uint256 i = 0; i < length; ++i) { - SafeMath.div(1, 1); - } - assembly { - mem := sub(mload(0x40), mem) - } - } - - function modMemoryCheck() public pure returns (uint256 mem) { - uint256 length = 32; - assembly { - mem := mload(0x40) - } - for (uint256 i = 0; i < length; ++i) { - SafeMath.mod(1, 1); - } - assembly { - mem := sub(mload(0x40), mem) - } - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/SignatureCheckerMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/SignatureCheckerMock.sol deleted file mode 100644 index 3b399c1..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/SignatureCheckerMock.sol +++ /dev/null @@ -1,17 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/cryptography/SignatureChecker.sol"; - -contract SignatureCheckerMock { - using SignatureChecker for address; - - function isValidSignatureNow( - address signer, - bytes32 hash, - bytes memory signature - ) public view returns (bool) { - return signer.isValidSignatureNow(hash, signature); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/SignedMathMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/SignedMathMock.sol deleted file mode 100644 index 5a0b270..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/SignedMathMock.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/math/SignedMath.sol"; - -contract SignedMathMock { - function max(int256 a, int256 b) public pure returns (int256) { - return SignedMath.max(a, b); - } - - function min(int256 a, int256 b) public pure returns (int256) { - return SignedMath.min(a, b); - } - - function average(int256 a, int256 b) public pure returns (int256) { - return SignedMath.average(a, b); - } - - function abs(int256 n) public pure returns (uint256) { - return SignedMath.abs(n); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/SignedSafeMathMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/SignedSafeMathMock.sol deleted file mode 100644 index 8d10217..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/SignedSafeMathMock.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/math/SignedSafeMath.sol"; - -contract SignedSafeMathMock { - function mul(int256 a, int256 b) public pure returns (int256) { - return SignedSafeMath.mul(a, b); - } - - function div(int256 a, int256 b) public pure returns (int256) { - return SignedSafeMath.div(a, b); - } - - function sub(int256 a, int256 b) public pure returns (int256) { - return SignedSafeMath.sub(a, b); - } - - function add(int256 a, int256 b) public pure returns (int256) { - return SignedSafeMath.add(a, b); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/SingleInheritanceInitializableMocks.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/SingleInheritanceInitializableMocks.sol deleted file mode 100644 index 6c82dd2..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/SingleInheritanceInitializableMocks.sol +++ /dev/null @@ -1,49 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../proxy/utils/Initializable.sol"; - -/** - * @title MigratableMockV1 - * @dev This contract is a mock to test initializable functionality through migrations - */ -contract MigratableMockV1 is Initializable { - uint256 public x; - - function initialize(uint256 value) public payable initializer { - x = value; - } -} - -/** - * @title MigratableMockV2 - * @dev This contract is a mock to test migratable functionality with params - */ -contract MigratableMockV2 is MigratableMockV1 { - bool internal _migratedV2; - uint256 public y; - - function migrate(uint256 value, uint256 anotherValue) public payable { - require(!_migratedV2); - x = value; - y = anotherValue; - _migratedV2 = true; - } -} - -/** - * @title MigratableMockV3 - * @dev This contract is a mock to test migratable functionality without params - */ -contract MigratableMockV3 is MigratableMockV2 { - bool internal _migratedV3; - - function migrate() public payable { - require(!_migratedV3); - uint256 oldX = x; - x = y; - y = oldX; - _migratedV3 = true; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/StorageSlotMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/StorageSlotMock.sol deleted file mode 100644 index 5d099fc..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/StorageSlotMock.sol +++ /dev/null @@ -1,41 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/StorageSlot.sol"; - -contract StorageSlotMock { - using StorageSlot for bytes32; - - function setBoolean(bytes32 slot, bool value) public { - slot.getBooleanSlot().value = value; - } - - function setAddress(bytes32 slot, address value) public { - slot.getAddressSlot().value = value; - } - - function setBytes32(bytes32 slot, bytes32 value) public { - slot.getBytes32Slot().value = value; - } - - function setUint256(bytes32 slot, uint256 value) public { - slot.getUint256Slot().value = value; - } - - function getBoolean(bytes32 slot) public view returns (bool) { - return slot.getBooleanSlot().value; - } - - function getAddress(bytes32 slot) public view returns (address) { - return slot.getAddressSlot().value; - } - - function getBytes32(bytes32 slot) public view returns (bytes32) { - return slot.getBytes32Slot().value; - } - - function getUint256(bytes32 slot) public view returns (uint256) { - return slot.getUint256Slot().value; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/StringsMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/StringsMock.sol deleted file mode 100644 index f257734..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/StringsMock.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/Strings.sol"; - -contract StringsMock { - function fromUint256(uint256 value) public pure returns (string memory) { - return Strings.toString(value); - } - - function fromUint256Hex(uint256 value) public pure returns (string memory) { - return Strings.toHexString(value); - } - - function fromUint256HexFixed(uint256 value, uint256 length) public pure returns (string memory) { - return Strings.toHexString(value, length); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/TimersBlockNumberImpl.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/TimersBlockNumberImpl.sol deleted file mode 100644 index 84633e6..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/TimersBlockNumberImpl.sol +++ /dev/null @@ -1,39 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/Timers.sol"; - -contract TimersBlockNumberImpl { - using Timers for Timers.BlockNumber; - - Timers.BlockNumber private _timer; - - function getDeadline() public view returns (uint64) { - return _timer.getDeadline(); - } - - function setDeadline(uint64 timestamp) public { - _timer.setDeadline(timestamp); - } - - function reset() public { - _timer.reset(); - } - - function isUnset() public view returns (bool) { - return _timer.isUnset(); - } - - function isStarted() public view returns (bool) { - return _timer.isStarted(); - } - - function isPending() public view returns (bool) { - return _timer.isPending(); - } - - function isExpired() public view returns (bool) { - return _timer.isExpired(); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/TimersTimestampImpl.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/TimersTimestampImpl.sol deleted file mode 100644 index 07f9a1b..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/TimersTimestampImpl.sol +++ /dev/null @@ -1,39 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/Timers.sol"; - -contract TimersTimestampImpl { - using Timers for Timers.Timestamp; - - Timers.Timestamp private _timer; - - function getDeadline() public view returns (uint64) { - return _timer.getDeadline(); - } - - function setDeadline(uint64 timestamp) public { - _timer.setDeadline(timestamp); - } - - function reset() public { - _timer.reset(); - } - - function isUnset() public view returns (bool) { - return _timer.isUnset(); - } - - function isStarted() public view returns (bool) { - return _timer.isStarted(); - } - - function isPending() public view returns (bool) { - return _timer.isPending(); - } - - function isExpired() public view returns (bool) { - return _timer.isExpired(); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/UUPS/UUPSLegacy.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/UUPS/UUPSLegacy.sol deleted file mode 100644 index 550a622..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/UUPS/UUPSLegacy.sol +++ /dev/null @@ -1,58 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "./UUPSUpgradeableMock.sol"; - -// This contract implements the pre-4.5 UUPS upgrade function with a rollback test. -// It's used to test that newer UUPS contracts are considered valid upgrades by older UUPS contracts. -contract UUPSUpgradeableLegacyMock is UUPSUpgradeableMock { - // Inlined from ERC1967Upgrade - bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143; - - // ERC1967Upgrade._setImplementation is private so we reproduce it here. - // An extra underscore prevents a name clash error. - function __setImplementation(address newImplementation) private { - require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); - StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; - } - - function _upgradeToAndCallSecureLegacyV1( - address newImplementation, - bytes memory data, - bool forceCall - ) internal { - address oldImplementation = _getImplementation(); - - // Initial upgrade and setup call - __setImplementation(newImplementation); - if (data.length > 0 || forceCall) { - Address.functionDelegateCall(newImplementation, data); - } - - // Perform rollback test if not already in progress - StorageSlot.BooleanSlot storage rollbackTesting = StorageSlot.getBooleanSlot(_ROLLBACK_SLOT); - if (!rollbackTesting.value) { - // Trigger rollback using upgradeTo from the new implementation - rollbackTesting.value = true; - Address.functionDelegateCall( - newImplementation, - abi.encodeWithSignature("upgradeTo(address)", oldImplementation) - ); - rollbackTesting.value = false; - // Check rollback was effective - require(oldImplementation == _getImplementation(), "ERC1967Upgrade: upgrade breaks further upgrades"); - // Finally reset to the new implementation and log the upgrade - _upgradeTo(newImplementation); - } - } - - // hooking into the old mechanism - function upgradeTo(address newImplementation) external virtual override { - _upgradeToAndCallSecureLegacyV1(newImplementation, bytes(""), false); - } - - function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual override { - _upgradeToAndCallSecureLegacyV1(newImplementation, data, false); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/UUPS/UUPSUpgradeableMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/UUPS/UUPSUpgradeableMock.sol deleted file mode 100644 index 367303e..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/UUPS/UUPSUpgradeableMock.sol +++ /dev/null @@ -1,21 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../CountersImpl.sol"; -import "../../proxy/utils/UUPSUpgradeable.sol"; - -contract UUPSUpgradeableMock is CountersImpl, UUPSUpgradeable { - // Not having any checks in this function is dangerous! Do not do this outside tests! - function _authorizeUpgrade(address) internal virtual override {} -} - -contract UUPSUpgradeableUnsafeMock is UUPSUpgradeableMock { - function upgradeTo(address newImplementation) external virtual override { - ERC1967Upgrade._upgradeToAndCall(newImplementation, bytes(""), false); - } - - function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual override { - ERC1967Upgrade._upgradeToAndCall(newImplementation, data, false); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/VotesMock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/VotesMock.sol deleted file mode 100644 index b5e0513..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/VotesMock.sol +++ /dev/null @@ -1,40 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../governance/utils/Votes.sol"; - -contract VotesMock is Votes { - mapping(address => uint256) private _balances; - mapping(uint256 => address) private _owners; - - constructor(string memory name) EIP712(name, "1") {} - - function getTotalSupply() public view returns (uint256) { - return _getTotalSupply(); - } - - function delegate(address account, address newDelegation) public { - return _delegate(account, newDelegation); - } - - function _getVotingUnits(address account) internal view virtual override returns (uint256) { - return _balances[account]; - } - - function mint(address account, uint256 voteId) external { - _balances[account] += 1; - _owners[voteId] = account; - _transferVotingUnits(address(0), account, 1); - } - - function burn(uint256 voteId) external { - address owner = _owners[voteId]; - _balances[owner] -= 1; - _transferVotingUnits(owner, address(0), 1); - } - - function getChainId() external view returns (uint256) { - return block.chainid; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/compound/CompTimelock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/compound/CompTimelock.sol deleted file mode 100644 index 49ffa4b..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/compound/CompTimelock.sol +++ /dev/null @@ -1,174 +0,0 @@ -// SPDX-License-Identifier: BSD-3-Clause -// solhint-disable private-vars-leading-underscore -/** - * Copyright 2020 Compound Labs, Inc. - * - * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the - * following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following - * disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the - * following disclaimer in the documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote - * products derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -pragma solidity ^0.8.0; - -contract CompTimelock { - event NewAdmin(address indexed newAdmin); - event NewPendingAdmin(address indexed newPendingAdmin); - event NewDelay(uint256 indexed newDelay); - event CancelTransaction( - bytes32 indexed txHash, - address indexed target, - uint256 value, - string signature, - bytes data, - uint256 eta - ); - event ExecuteTransaction( - bytes32 indexed txHash, - address indexed target, - uint256 value, - string signature, - bytes data, - uint256 eta - ); - event QueueTransaction( - bytes32 indexed txHash, - address indexed target, - uint256 value, - string signature, - bytes data, - uint256 eta - ); - - uint256 public constant GRACE_PERIOD = 14 days; - uint256 public constant MINIMUM_DELAY = 2 days; - uint256 public constant MAXIMUM_DELAY = 30 days; - - address public admin; - address public pendingAdmin; - uint256 public delay; - - mapping(bytes32 => bool) public queuedTransactions; - - constructor(address admin_, uint256 delay_) { - require(delay_ >= MINIMUM_DELAY, "Timelock::constructor: Delay must exceed minimum delay."); - require(delay_ <= MAXIMUM_DELAY, "Timelock::setDelay: Delay must not exceed maximum delay."); - - admin = admin_; - delay = delay_; - } - - receive() external payable {} - - function setDelay(uint256 delay_) public { - require(msg.sender == address(this), "Timelock::setDelay: Call must come from Timelock."); - require(delay_ >= MINIMUM_DELAY, "Timelock::setDelay: Delay must exceed minimum delay."); - require(delay_ <= MAXIMUM_DELAY, "Timelock::setDelay: Delay must not exceed maximum delay."); - delay = delay_; - - emit NewDelay(delay); - } - - function acceptAdmin() public { - require(msg.sender == pendingAdmin, "Timelock::acceptAdmin: Call must come from pendingAdmin."); - admin = msg.sender; - pendingAdmin = address(0); - - emit NewAdmin(admin); - } - - function setPendingAdmin(address pendingAdmin_) public { - require(msg.sender == address(this), "Timelock::setPendingAdmin: Call must come from Timelock."); - pendingAdmin = pendingAdmin_; - - emit NewPendingAdmin(pendingAdmin); - } - - function queueTransaction( - address target, - uint256 value, - string memory signature, - bytes memory data, - uint256 eta - ) public returns (bytes32) { - require(msg.sender == admin, "Timelock::queueTransaction: Call must come from admin."); - require( - eta >= getBlockTimestamp() + delay, - "Timelock::queueTransaction: Estimated execution block must satisfy delay." - ); - - bytes32 txHash = keccak256(abi.encode(target, value, signature, data, eta)); - queuedTransactions[txHash] = true; - - emit QueueTransaction(txHash, target, value, signature, data, eta); - return txHash; - } - - function cancelTransaction( - address target, - uint256 value, - string memory signature, - bytes memory data, - uint256 eta - ) public { - require(msg.sender == admin, "Timelock::cancelTransaction: Call must come from admin."); - - bytes32 txHash = keccak256(abi.encode(target, value, signature, data, eta)); - queuedTransactions[txHash] = false; - - emit CancelTransaction(txHash, target, value, signature, data, eta); - } - - function executeTransaction( - address target, - uint256 value, - string memory signature, - bytes memory data, - uint256 eta - ) public payable returns (bytes memory) { - require(msg.sender == admin, "Timelock::executeTransaction: Call must come from admin."); - - bytes32 txHash = keccak256(abi.encode(target, value, signature, data, eta)); - require(queuedTransactions[txHash], "Timelock::executeTransaction: Transaction hasn't been queued."); - require(getBlockTimestamp() >= eta, "Timelock::executeTransaction: Transaction hasn't surpassed time lock."); - require(getBlockTimestamp() <= eta + GRACE_PERIOD, "Timelock::executeTransaction: Transaction is stale."); - - queuedTransactions[txHash] = false; - - bytes memory callData; - - if (bytes(signature).length == 0) { - callData = data; - } else { - callData = abi.encodePacked(bytes4(keccak256(bytes(signature))), data); - } - - // solium-disable-next-line security/no-call-value - (bool success, bytes memory returnData) = target.call{value: value}(callData); - require(success, "Timelock::executeTransaction: Transaction execution reverted."); - - emit ExecuteTransaction(txHash, target, value, signature, data, eta); - - return returnData; - } - - function getBlockTimestamp() internal view returns (uint256) { - // solium-disable-next-line security/no-block-members - return block.timestamp; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/crosschain/bridges.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/crosschain/bridges.sol deleted file mode 100644 index 6a2b974..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/crosschain/bridges.sol +++ /dev/null @@ -1,106 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../../utils/Address.sol"; -import "../../vendor/polygon/IFxMessageProcessor.sol"; - -abstract contract BaseRelayMock { - // needed to parse custom errors - error NotCrossChainCall(); - error InvalidCrossChainSender(address sender, address expected); - - address internal _currentSender; - - function relayAs( - address target, - bytes calldata data, - address sender - ) external virtual { - address previousSender = _currentSender; - - _currentSender = sender; - - (bool success, bytes memory returndata) = target.call(data); - Address.verifyCallResult(success, returndata, "low-level call reverted"); - - _currentSender = previousSender; - } -} - -/** - * AMB - */ -contract BridgeAMBMock is BaseRelayMock { - function messageSender() public view returns (address) { - return _currentSender; - } -} - -/** - * Arbitrum - */ -contract BridgeArbitrumL1Mock is BaseRelayMock { - /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment - address public immutable inbox = address(new BridgeArbitrumL1Inbox()); - /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment - address public immutable outbox = address(new BridgeArbitrumL1Outbox()); - - function activeOutbox() public view returns (address) { - return outbox; - } - - function currentSender() public view returns (address) { - return _currentSender; - } -} - -contract BridgeArbitrumL1Inbox { - /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment - address public immutable bridge = msg.sender; -} - -contract BridgeArbitrumL1Outbox { - /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment - address public immutable bridge = msg.sender; - - function l2ToL1Sender() public view returns (address) { - return BridgeArbitrumL1Mock(bridge).currentSender(); - } -} - -contract BridgeArbitrumL2Mock is BaseRelayMock { - function isTopLevelCall() public view returns (bool) { - return _currentSender != address(0); - } - - function wasMyCallersAddressAliased() public pure returns (bool) { - return true; - } - - function myCallersAddressWithoutAliasing() public view returns (address) { - return _currentSender; - } -} - -/** - * Optimism - */ -contract BridgeOptimismMock is BaseRelayMock { - function xDomainMessageSender() public view returns (address) { - return _currentSender; - } -} - -/** - * Polygon - */ -contract BridgePolygonChildMock is BaseRelayMock { - function relayAs( - address target, - bytes calldata data, - address sender - ) external override { - IFxMessageProcessor(target).processMessageFromRoot(0, sender, data); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/crosschain/receivers.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/crosschain/receivers.sol deleted file mode 100644 index 601a2ac..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/crosschain/receivers.sol +++ /dev/null @@ -1,54 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.4; - -import "../../access/Ownable.sol"; -import "../../crosschain/amb/CrossChainEnabledAMB.sol"; -import "../../crosschain/arbitrum/CrossChainEnabledArbitrumL1.sol"; -import "../../crosschain/arbitrum/CrossChainEnabledArbitrumL2.sol"; -import "../../crosschain/optimism/CrossChainEnabledOptimism.sol"; -import "../../crosschain/polygon/CrossChainEnabledPolygonChild.sol"; - -abstract contract Receiver is CrossChainEnabled { - // we don't use Ownable because it messes up testing for the upgradeable contracts - /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment - address public immutable owner = msg.sender; - - function crossChainRestricted() external onlyCrossChain {} - - function crossChainOwnerRestricted() external onlyCrossChainSender(owner) {} -} - -/** - * AMB - */ -contract CrossChainEnabledAMBMock is Receiver, CrossChainEnabledAMB { - /// @custom:oz-upgrades-unsafe-allow constructor - constructor(address bridge) CrossChainEnabledAMB(bridge) {} -} - -/** - * Arbitrum - */ -contract CrossChainEnabledArbitrumL1Mock is Receiver, CrossChainEnabledArbitrumL1 { - /// @custom:oz-upgrades-unsafe-allow constructor - constructor(address bridge) CrossChainEnabledArbitrumL1(bridge) {} -} - -contract CrossChainEnabledArbitrumL2Mock is Receiver, CrossChainEnabledArbitrumL2 {} - -/** - * Optimism - */ -contract CrossChainEnabledOptimismMock is Receiver, CrossChainEnabledOptimism { - /// @custom:oz-upgrades-unsafe-allow constructor - constructor(address bridge) CrossChainEnabledOptimism(bridge) {} -} - -/** - * Polygon - */ -contract CrossChainEnabledPolygonChildMock is Receiver, CrossChainEnabledPolygonChild { - /// @custom:oz-upgrades-unsafe-allow constructor - constructor(address bridge) CrossChainEnabledPolygonChild(bridge) {} -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/wizard/MyGovernor1.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/wizard/MyGovernor1.sol deleted file mode 100644 index a80d840..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/wizard/MyGovernor1.sol +++ /dev/null @@ -1,87 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.2; - -import "../../governance/Governor.sol"; -import "../../governance/extensions/GovernorCountingSimple.sol"; -import "../../governance/extensions/GovernorVotes.sol"; -import "../../governance/extensions/GovernorVotesQuorumFraction.sol"; -import "../../governance/extensions/GovernorTimelockControl.sol"; - -contract MyGovernor1 is - Governor, - GovernorTimelockControl, - GovernorVotes, - GovernorVotesQuorumFraction, - GovernorCountingSimple -{ - constructor(IVotes _token, TimelockController _timelock) - Governor("MyGovernor") - GovernorVotes(_token) - GovernorVotesQuorumFraction(4) - GovernorTimelockControl(_timelock) - {} - - function votingDelay() public pure override returns (uint256) { - return 1; // 1 block - } - - function votingPeriod() public pure override returns (uint256) { - return 45818; // 1 week - } - - // The following functions are overrides required by Solidity. - - function quorum(uint256 blockNumber) - public - view - override(IGovernor, GovernorVotesQuorumFraction) - returns (uint256) - { - return super.quorum(blockNumber); - } - - function state(uint256 proposalId) public view override(Governor, GovernorTimelockControl) returns (ProposalState) { - return super.state(proposalId); - } - - function propose( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - string memory description - ) public override(Governor, IGovernor) returns (uint256) { - return super.propose(targets, values, calldatas, description); - } - - function _execute( - uint256 proposalId, - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) internal override(Governor, GovernorTimelockControl) { - super._execute(proposalId, targets, values, calldatas, descriptionHash); - } - - function _cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) internal override(Governor, GovernorTimelockControl) returns (uint256) { - return super._cancel(targets, values, calldatas, descriptionHash); - } - - function _executor() internal view override(Governor, GovernorTimelockControl) returns (address) { - return super._executor(); - } - - function supportsInterface(bytes4 interfaceId) - public - view - override(Governor, GovernorTimelockControl) - returns (bool) - { - return super.supportsInterface(interfaceId); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/wizard/MyGovernor2.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/wizard/MyGovernor2.sol deleted file mode 100644 index 34c608c..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/wizard/MyGovernor2.sol +++ /dev/null @@ -1,93 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.2; - -import "../../governance/Governor.sol"; -import "../../governance/extensions/GovernorProposalThreshold.sol"; -import "../../governance/extensions/GovernorCountingSimple.sol"; -import "../../governance/extensions/GovernorVotes.sol"; -import "../../governance/extensions/GovernorVotesQuorumFraction.sol"; -import "../../governance/extensions/GovernorTimelockControl.sol"; - -contract MyGovernor2 is - Governor, - GovernorTimelockControl, - GovernorProposalThreshold, - GovernorVotes, - GovernorVotesQuorumFraction, - GovernorCountingSimple -{ - constructor(IVotes _token, TimelockController _timelock) - Governor("MyGovernor") - GovernorVotes(_token) - GovernorVotesQuorumFraction(4) - GovernorTimelockControl(_timelock) - {} - - function votingDelay() public pure override returns (uint256) { - return 1; // 1 block - } - - function votingPeriod() public pure override returns (uint256) { - return 45818; // 1 week - } - - function proposalThreshold() public pure override returns (uint256) { - return 1000e18; - } - - // The following functions are overrides required by Solidity. - - function quorum(uint256 blockNumber) - public - view - override(IGovernor, GovernorVotesQuorumFraction) - returns (uint256) - { - return super.quorum(blockNumber); - } - - function state(uint256 proposalId) public view override(Governor, GovernorTimelockControl) returns (ProposalState) { - return super.state(proposalId); - } - - function propose( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - string memory description - ) public override(Governor, GovernorProposalThreshold, IGovernor) returns (uint256) { - return super.propose(targets, values, calldatas, description); - } - - function _execute( - uint256 proposalId, - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) internal override(Governor, GovernorTimelockControl) { - super._execute(proposalId, targets, values, calldatas, descriptionHash); - } - - function _cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) internal override(Governor, GovernorTimelockControl) returns (uint256) { - return super._cancel(targets, values, calldatas, descriptionHash); - } - - function _executor() internal view override(Governor, GovernorTimelockControl) returns (address) { - return super._executor(); - } - - function supportsInterface(bytes4 interfaceId) - public - view - override(Governor, GovernorTimelockControl) - returns (bool) - { - return super.supportsInterface(interfaceId); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/wizard/MyGovernor3.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/wizard/MyGovernor3.sol deleted file mode 100644 index 70e4e87..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/mocks/wizard/MyGovernor3.sol +++ /dev/null @@ -1,96 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.2; - -import "../../governance/Governor.sol"; -import "../../governance/compatibility/GovernorCompatibilityBravo.sol"; -import "../../governance/extensions/GovernorVotes.sol"; -import "../../governance/extensions/GovernorVotesQuorumFraction.sol"; -import "../../governance/extensions/GovernorTimelockControl.sol"; - -contract MyGovernor is - Governor, - GovernorTimelockControl, - GovernorCompatibilityBravo, - GovernorVotes, - GovernorVotesQuorumFraction -{ - constructor(IVotes _token, TimelockController _timelock) - Governor("MyGovernor") - GovernorVotes(_token) - GovernorVotesQuorumFraction(4) - GovernorTimelockControl(_timelock) - {} - - function votingDelay() public pure override returns (uint256) { - return 1; // 1 block - } - - function votingPeriod() public pure override returns (uint256) { - return 45818; // 1 week - } - - function proposalThreshold() public pure override returns (uint256) { - return 1000e18; - } - - // The following functions are overrides required by Solidity. - - function quorum(uint256 blockNumber) - public - view - override(IGovernor, GovernorVotesQuorumFraction) - returns (uint256) - { - return super.quorum(blockNumber); - } - - function state(uint256 proposalId) - public - view - override(Governor, IGovernor, GovernorTimelockControl) - returns (ProposalState) - { - return super.state(proposalId); - } - - function propose( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - string memory description - ) public override(Governor, GovernorCompatibilityBravo, IGovernor) returns (uint256) { - return super.propose(targets, values, calldatas, description); - } - - function _execute( - uint256 proposalId, - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) internal override(Governor, GovernorTimelockControl) { - super._execute(proposalId, targets, values, calldatas, descriptionHash); - } - - function _cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) internal override(Governor, GovernorTimelockControl) returns (uint256) { - return super._cancel(targets, values, calldatas, descriptionHash); - } - - function _executor() internal view override(Governor, GovernorTimelockControl) returns (address) { - return super._executor(); - } - - function supportsInterface(bytes4 interfaceId) - public - view - override(Governor, IERC165, GovernorTimelockControl) - returns (bool) - { - return super.supportsInterface(interfaceId); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/package.json b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/package.json deleted file mode 100644 index 6f4fcf3..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/package.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "@openzeppelin/contracts", - "description": "Secure Smart Contract library for Solidity", - "version": "4.5.0", - "files": [ - "**/*.sol", - "/build/contracts/*.json", - "!/mocks/**/*" - ], - "scripts": { - "prepare": "bash ../scripts/prepare-contracts-package.sh", - "prepare-docs": "cd ..; npm run prepare-docs" - }, - "repository": { - "type": "git", - "url": "https://github.com/OpenZeppelin/openzeppelin-contracts.git" - }, - "keywords": [ - "solidity", - "ethereum", - "smart", - "contracts", - "security", - "zeppelin" - ], - "author": "OpenZeppelin Community ", - "license": "MIT", - "bugs": { - "url": "https://github.com/OpenZeppelin/openzeppelin-contracts/issues" - }, - "homepage": "https://openzeppelin.com/contracts/" -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/proxy/Clones.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/proxy/Clones.sol deleted file mode 100644 index 81c956c..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/proxy/Clones.sol +++ /dev/null @@ -1,84 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (proxy/Clones.sol) - -pragma solidity ^0.8.0; - -/** - * @dev https://eips.ethereum.org/EIPS/eip-1167[EIP 1167] is a standard for - * deploying minimal proxy contracts, also known as "clones". - * - * > To simply and cheaply clone contract functionality in an immutable way, this standard specifies - * > a minimal bytecode implementation that delegates all calls to a known, fixed address. - * - * The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2` - * (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the - * deterministic method. - * - * _Available since v3.4._ - */ -library Clones { - /** - * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. - * - * This function uses the create opcode, which should never revert. - */ - function clone(address implementation) internal returns (address instance) { - assembly { - let ptr := mload(0x40) - mstore(ptr, 0x602d8060093d393df3363d3d373d3d3d363d7300000000000000000000000000) - mstore(add(ptr, 0x13), shl(0x60, implementation)) - mstore(add(ptr, 0x27), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000) - instance := create(0, ptr, 0x36) - } - require(instance != address(0), "ERC1167: create failed"); - } - - /** - * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. - * - * This function uses the create2 opcode and a `salt` to deterministically deploy - * the clone. Using the same `implementation` and `salt` multiple time will revert, since - * the clones cannot be deployed twice at the same address. - */ - function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) { - assembly { - let ptr := mload(0x40) - mstore(ptr, 0x602d8060093d393df3363d3d373d3d3d363d7300000000000000000000000000) - mstore(add(ptr, 0x13), shl(0x60, implementation)) - mstore(add(ptr, 0x27), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000) - instance := create2(0, ptr, 0x36, salt) - } - require(instance != address(0), "ERC1167: create2 failed"); - } - - /** - * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. - */ - function predictDeterministicAddress( - address implementation, - bytes32 salt, - address deployer - ) internal pure returns (address predicted) { - assembly { - let ptr := mload(0x40) - mstore(ptr, 0x602d8060093d393df3363d3d373d3d3d363d7300000000000000000000000000) - mstore(add(ptr, 0x13), shl(0x60, implementation)) - mstore(add(ptr, 0x27), 0x5af43d82803e903d91602b57fd5bf3ff00000000000000000000000000000000) - mstore(add(ptr, 0x37), shl(0x60, deployer)) - mstore(add(ptr, 0x4b), salt) - mstore(add(ptr, 0x6b), keccak256(ptr, 0x36)) - predicted := keccak256(add(ptr, 0x36), 0x55) - } - } - - /** - * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. - */ - function predictDeterministicAddress(address implementation, bytes32 salt) - internal - view - returns (address predicted) - { - return predictDeterministicAddress(implementation, salt, address(this)); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Proxy.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Proxy.sol deleted file mode 100644 index 64e9d9f..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Proxy.sol +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Proxy.sol) - -pragma solidity ^0.8.0; - -import "../Proxy.sol"; -import "./ERC1967Upgrade.sol"; - -/** - * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an - * implementation address that can be changed. This address is stored in storage in the location specified by - * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the - * implementation behind the proxy. - */ -contract ERC1967Proxy is Proxy, ERC1967Upgrade { - /** - * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`. - * - * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded - * function call, and allows initializating the storage of the proxy like a Solidity constructor. - */ - constructor(address _logic, bytes memory _data) payable { - assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256("eip1967.proxy.implementation")) - 1)); - _upgradeToAndCall(_logic, _data, false); - } - - /** - * @dev Returns the current implementation address. - */ - function _implementation() internal view virtual override returns (address impl) { - return ERC1967Upgrade._getImplementation(); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Upgrade.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Upgrade.sol deleted file mode 100644 index 77fbdd1..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Upgrade.sol +++ /dev/null @@ -1,185 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol) - -pragma solidity ^0.8.2; - -import "../beacon/IBeacon.sol"; -import "../../interfaces/draft-IERC1822.sol"; -import "../../utils/Address.sol"; -import "../../utils/StorageSlot.sol"; - -/** - * @dev This abstract contract provides getters and event emitting update functions for - * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. - * - * _Available since v4.1._ - * - * @custom:oz-upgrades-unsafe-allow delegatecall - */ -abstract contract ERC1967Upgrade { - // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1 - bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143; - - /** - * @dev Storage slot with the address of the current implementation. - * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is - * validated in the constructor. - */ - bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; - - /** - * @dev Emitted when the implementation is upgraded. - */ - event Upgraded(address indexed implementation); - - /** - * @dev Returns the current implementation address. - */ - function _getImplementation() internal view returns (address) { - return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; - } - - /** - * @dev Stores a new address in the EIP1967 implementation slot. - */ - function _setImplementation(address newImplementation) private { - require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); - StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; - } - - /** - * @dev Perform implementation upgrade - * - * Emits an {Upgraded} event. - */ - function _upgradeTo(address newImplementation) internal { - _setImplementation(newImplementation); - emit Upgraded(newImplementation); - } - - /** - * @dev Perform implementation upgrade with additional setup call. - * - * Emits an {Upgraded} event. - */ - function _upgradeToAndCall( - address newImplementation, - bytes memory data, - bool forceCall - ) internal { - _upgradeTo(newImplementation); - if (data.length > 0 || forceCall) { - Address.functionDelegateCall(newImplementation, data); - } - } - - /** - * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call. - * - * Emits an {Upgraded} event. - */ - function _upgradeToAndCallUUPS( - address newImplementation, - bytes memory data, - bool forceCall - ) internal { - // Upgrades from old implementations will perform a rollback test. This test requires the new - // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing - // this special case will break upgrade paths from old UUPS implementation to new ones. - if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) { - _setImplementation(newImplementation); - } else { - try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) { - require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID"); - } catch { - revert("ERC1967Upgrade: new implementation is not UUPS"); - } - _upgradeToAndCall(newImplementation, data, forceCall); - } - } - - /** - * @dev Storage slot with the admin of the contract. - * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is - * validated in the constructor. - */ - bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; - - /** - * @dev Emitted when the admin account has changed. - */ - event AdminChanged(address previousAdmin, address newAdmin); - - /** - * @dev Returns the current admin. - */ - function _getAdmin() internal view returns (address) { - return StorageSlot.getAddressSlot(_ADMIN_SLOT).value; - } - - /** - * @dev Stores a new address in the EIP1967 admin slot. - */ - function _setAdmin(address newAdmin) private { - require(newAdmin != address(0), "ERC1967: new admin is the zero address"); - StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin; - } - - /** - * @dev Changes the admin of the proxy. - * - * Emits an {AdminChanged} event. - */ - function _changeAdmin(address newAdmin) internal { - emit AdminChanged(_getAdmin(), newAdmin); - _setAdmin(newAdmin); - } - - /** - * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. - * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor. - */ - bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; - - /** - * @dev Emitted when the beacon is upgraded. - */ - event BeaconUpgraded(address indexed beacon); - - /** - * @dev Returns the current beacon. - */ - function _getBeacon() internal view returns (address) { - return StorageSlot.getAddressSlot(_BEACON_SLOT).value; - } - - /** - * @dev Stores a new beacon in the EIP1967 beacon slot. - */ - function _setBeacon(address newBeacon) private { - require(Address.isContract(newBeacon), "ERC1967: new beacon is not a contract"); - require( - Address.isContract(IBeacon(newBeacon).implementation()), - "ERC1967: beacon implementation is not a contract" - ); - StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon; - } - - /** - * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does - * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that). - * - * Emits a {BeaconUpgraded} event. - */ - function _upgradeBeaconToAndCall( - address newBeacon, - bytes memory data, - bool forceCall - ) internal { - _setBeacon(newBeacon); - emit BeaconUpgraded(newBeacon); - if (data.length > 0 || forceCall) { - Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data); - } - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/proxy/Proxy.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/proxy/Proxy.sol deleted file mode 100644 index 6a358fa..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/proxy/Proxy.sol +++ /dev/null @@ -1,86 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (proxy/Proxy.sol) - -pragma solidity ^0.8.0; - -/** - * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM - * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to - * be specified by overriding the virtual {_implementation} function. - * - * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a - * different contract through the {_delegate} function. - * - * The success and return data of the delegated call will be returned back to the caller of the proxy. - */ -abstract contract Proxy { - /** - * @dev Delegates the current call to `implementation`. - * - * This function does not return to its internal call site, it will return directly to the external caller. - */ - function _delegate(address implementation) internal virtual { - assembly { - // Copy msg.data. We take full control of memory in this inline assembly - // block because it will not return to Solidity code. We overwrite the - // Solidity scratch pad at memory position 0. - calldatacopy(0, 0, calldatasize()) - - // Call the implementation. - // out and outsize are 0 because we don't know the size yet. - let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0) - - // Copy the returned data. - returndatacopy(0, 0, returndatasize()) - - switch result - // delegatecall returns 0 on error. - case 0 { - revert(0, returndatasize()) - } - default { - return(0, returndatasize()) - } - } - } - - /** - * @dev This is a virtual function that should be overridden so it returns the address to which the fallback function - * and {_fallback} should delegate. - */ - function _implementation() internal view virtual returns (address); - - /** - * @dev Delegates the current call to the address returned by `_implementation()`. - * - * This function does not return to its internal call site, it will return directly to the external caller. - */ - function _fallback() internal virtual { - _beforeFallback(); - _delegate(_implementation()); - } - - /** - * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other - * function in the contract matches the call data. - */ - fallback() external payable virtual { - _fallback(); - } - - /** - * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data - * is empty. - */ - receive() external payable virtual { - _fallback(); - } - - /** - * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback` - * call, or as part of the Solidity `fallback` or `receive` functions. - * - * If overridden should call `super._beforeFallback()`. - */ - function _beforeFallback() internal virtual {} -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/proxy/README.adoc b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/proxy/README.adoc deleted file mode 100644 index 3112c69..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/proxy/README.adoc +++ /dev/null @@ -1,85 +0,0 @@ -= Proxies - -[.readme-notice] -NOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/proxy - -This is a low-level set of contracts implementing different proxy patterns with and without upgradeability. For an in-depth overview of this pattern check out the xref:upgrades-plugins::proxies.adoc[Proxy Upgrade Pattern] page. - -Most of the proxies below are built on an abstract base contract. - -- {Proxy}: Abstract contract implementing the core delegation functionality. - -In order to avoid clashes with the storage variables of the implementation contract behind a proxy, we use https://eips.ethereum.org/EIPS/eip-1967[EIP1967] storage slots. - -- {ERC1967Upgrade}: Internal functions to get and set the storage slots defined in EIP1967. -- {ERC1967Proxy}: A proxy using EIP1967 storage slots. Not upgradeable by default. - -There are two alternative ways to add upgradeability to an ERC1967 proxy. Their differences are explained below in <>. - -- {TransparentUpgradeableProxy}: A proxy with a built in admin and upgrade interface. -- {UUPSUpgradeable}: An upgradeability mechanism to be included in the implementation contract. - -CAUTION: Using upgradeable proxies correctly and securely is a difficult task that requires deep knowledge of the proxy pattern, Solidity, and the EVM. Unless you want a lot of low level control, we recommend using the xref:upgrades-plugins::index.adoc[OpenZeppelin Upgrades Plugins] for Truffle and Hardhat. - -A different family of proxies are beacon proxies. This pattern, popularized by Dharma, allows multiple proxies to be upgraded to a different implementation in a single transaction. - -- {BeaconProxy}: A proxy that retrieves its implementation from a beacon contract. -- {UpgradeableBeacon}: A beacon contract with a built in admin that can upgrade the {BeaconProxy} pointing to it. - -In this pattern, the proxy contract doesn't hold the implementation address in storage like an ERC1967 proxy, instead the address is stored in a separate beacon contract. The `upgrade` operations that are sent to the beacon instead of to the proxy contract, and all proxies that follow that beacon are automatically upgraded. - -Outside the realm of upgradeability, proxies can also be useful to make cheap contract clones, such as those created by an on-chain factory contract that creates many instances of the same contract. These instances are designed to be both cheap to deploy, and cheap to call. - -- {Clones}: A library that can deploy cheap minimal non-upgradeable proxies. - -[[transparent-vs-uups]] -== Transparent vs UUPS Proxies - -The original proxies included in OpenZeppelin followed the https://blog.openzeppelin.com/the-transparent-proxy-pattern/[Transparent Proxy Pattern]. While this pattern is still provided, our recommendation is now shifting towards UUPS proxies, which are both lightweight and versatile. The name UUPS comes from https://eips.ethereum.org/EIPS/eip-1822[EIP1822], which first documented the pattern. - -While both of these share the same interface for upgrades, in UUPS proxies the upgrade is handled by the implementation, and can eventually be removed. Transparent proxies, on the other hand, include the upgrade and admin logic in the proxy itself. This means {TransparentUpgradeableProxy} is more expensive to deploy than what is possible with UUPS proxies. - -UUPS proxies are implemented using an {ERC1967Proxy}. Note that this proxy is not by itself upgradeable. It is the role of the implementation to include, alongside the contract's logic, all the code necessary to update the implementation's address that is stored at a specific slot in the proxy's storage space. This is where the {UUPSUpgradeable} contract comes in. Inheriting from it (and overriding the {xref-UUPSUpgradeable-_authorizeUpgrade-address-}[`_authorizeUpgrade`] function with the relevant access control mechanism) will turn your contract into a UUPS compliant implementation. - -Note that since both proxies use the same storage slot for the implementation address, using a UUPS compliant implementation with a {TransparentUpgradeableProxy} might allow non-admins to perform upgrade operations. - -By default, the upgrade functionality included in {UUPSUpgradeable} contains a security mechanism that will prevent any upgrades to a non UUPS compliant implementation. This prevents upgrades to an implementation contract that wouldn't contain the necessary upgrade mechanism, as it would lock the upgradeability of the proxy forever. This security mechanism can be bypassed by either of: - -- Adding a flag mechanism in the implementation that will disable the upgrade function when triggered. -- Upgrading to an implementation that features an upgrade mechanism without the additional security check, and then upgrading again to another implementation without the upgrade mechanism. - -The current implementation of this security mechanism uses https://eips.ethereum.org/EIPS/eip-1822[EIP1822] to detect the storage slot used by the implementation. A previous implementation, now deprecated, relied on a rollback check. It is possible to upgrade from a contract using the old mechanism to a new one. The inverse is however not possible, as old implementations (before version 4.5) did not include the `ERC1822` interface. - -== Core - -{{Proxy}} - -== ERC1967 - -{{ERC1967Proxy}} - -{{ERC1967Upgrade}} - -== Transparent Proxy - -{{TransparentUpgradeableProxy}} - -{{ProxyAdmin}} - -== Beacon - -{{BeaconProxy}} - -{{IBeacon}} - -{{UpgradeableBeacon}} - -== Minimal Clones - -{{Clones}} - -== Utils - -{{Initializable}} - -{{UUPSUpgradeable}} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/proxy/beacon/BeaconProxy.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/proxy/beacon/BeaconProxy.sol deleted file mode 100644 index 32eaa8e..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/proxy/beacon/BeaconProxy.sol +++ /dev/null @@ -1,62 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (proxy/beacon/BeaconProxy.sol) - -pragma solidity ^0.8.0; - -import "./IBeacon.sol"; -import "../Proxy.sol"; -import "../ERC1967/ERC1967Upgrade.sol"; - -/** - * @dev This contract implements a proxy that gets the implementation address for each call from a {UpgradeableBeacon}. - * - * The beacon address is stored in storage slot `uint256(keccak256('eip1967.proxy.beacon')) - 1`, so that it doesn't - * conflict with the storage layout of the implementation behind the proxy. - * - * _Available since v3.4._ - */ -contract BeaconProxy is Proxy, ERC1967Upgrade { - /** - * @dev Initializes the proxy with `beacon`. - * - * If `data` is nonempty, it's used as data in a delegate call to the implementation returned by the beacon. This - * will typically be an encoded function call, and allows initializating the storage of the proxy like a Solidity - * constructor. - * - * Requirements: - * - * - `beacon` must be a contract with the interface {IBeacon}. - */ - constructor(address beacon, bytes memory data) payable { - assert(_BEACON_SLOT == bytes32(uint256(keccak256("eip1967.proxy.beacon")) - 1)); - _upgradeBeaconToAndCall(beacon, data, false); - } - - /** - * @dev Returns the current beacon address. - */ - function _beacon() internal view virtual returns (address) { - return _getBeacon(); - } - - /** - * @dev Returns the current implementation address of the associated beacon. - */ - function _implementation() internal view virtual override returns (address) { - return IBeacon(_getBeacon()).implementation(); - } - - /** - * @dev Changes the proxy to use a new beacon. Deprecated: see {_upgradeBeaconToAndCall}. - * - * If `data` is nonempty, it's used as data in a delegate call to the implementation returned by the beacon. - * - * Requirements: - * - * - `beacon` must be a contract. - * - The implementation returned by `beacon` must be a contract. - */ - function _setBeacon(address beacon, bytes memory data) internal virtual { - _upgradeBeaconToAndCall(beacon, data, false); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol deleted file mode 100644 index fba3ee2..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol +++ /dev/null @@ -1,16 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol) - -pragma solidity ^0.8.0; - -/** - * @dev This is the interface that {BeaconProxy} expects of its beacon. - */ -interface IBeacon { - /** - * @dev Must return an address that can be used as a delegate call target. - * - * {BeaconProxy} will check that this address is a contract. - */ - function implementation() external view returns (address); -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/proxy/beacon/UpgradeableBeacon.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/proxy/beacon/UpgradeableBeacon.sol deleted file mode 100644 index 5d83ceb..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/proxy/beacon/UpgradeableBeacon.sol +++ /dev/null @@ -1,65 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (proxy/beacon/UpgradeableBeacon.sol) - -pragma solidity ^0.8.0; - -import "./IBeacon.sol"; -import "../../access/Ownable.sol"; -import "../../utils/Address.sol"; - -/** - * @dev This contract is used in conjunction with one or more instances of {BeaconProxy} to determine their - * implementation contract, which is where they will delegate all function calls. - * - * An owner is able to change the implementation the beacon points to, thus upgrading the proxies that use this beacon. - */ -contract UpgradeableBeacon is IBeacon, Ownable { - address private _implementation; - - /** - * @dev Emitted when the implementation returned by the beacon is changed. - */ - event Upgraded(address indexed implementation); - - /** - * @dev Sets the address of the initial implementation, and the deployer account as the owner who can upgrade the - * beacon. - */ - constructor(address implementation_) { - _setImplementation(implementation_); - } - - /** - * @dev Returns the current implementation address. - */ - function implementation() public view virtual override returns (address) { - return _implementation; - } - - /** - * @dev Upgrades the beacon to a new implementation. - * - * Emits an {Upgraded} event. - * - * Requirements: - * - * - msg.sender must be the owner of the contract. - * - `newImplementation` must be a contract. - */ - function upgradeTo(address newImplementation) public virtual onlyOwner { - _setImplementation(newImplementation); - emit Upgraded(newImplementation); - } - - /** - * @dev Sets the implementation contract address for this beacon - * - * Requirements: - * - * - `newImplementation` must be a contract. - */ - function _setImplementation(address newImplementation) private { - require(Address.isContract(newImplementation), "UpgradeableBeacon: implementation is not a contract"); - _implementation = newImplementation; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/proxy/transparent/ProxyAdmin.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/proxy/transparent/ProxyAdmin.sol deleted file mode 100644 index 8395342..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/proxy/transparent/ProxyAdmin.sol +++ /dev/null @@ -1,81 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (proxy/transparent/ProxyAdmin.sol) - -pragma solidity ^0.8.0; - -import "./TransparentUpgradeableProxy.sol"; -import "../../access/Ownable.sol"; - -/** - * @dev This is an auxiliary contract meant to be assigned as the admin of a {TransparentUpgradeableProxy}. For an - * explanation of why you would want to use this see the documentation for {TransparentUpgradeableProxy}. - */ -contract ProxyAdmin is Ownable { - /** - * @dev Returns the current implementation of `proxy`. - * - * Requirements: - * - * - This contract must be the admin of `proxy`. - */ - function getProxyImplementation(TransparentUpgradeableProxy proxy) public view virtual returns (address) { - // We need to manually run the static call since the getter cannot be flagged as view - // bytes4(keccak256("implementation()")) == 0x5c60da1b - (bool success, bytes memory returndata) = address(proxy).staticcall(hex"5c60da1b"); - require(success); - return abi.decode(returndata, (address)); - } - - /** - * @dev Returns the current admin of `proxy`. - * - * Requirements: - * - * - This contract must be the admin of `proxy`. - */ - function getProxyAdmin(TransparentUpgradeableProxy proxy) public view virtual returns (address) { - // We need to manually run the static call since the getter cannot be flagged as view - // bytes4(keccak256("admin()")) == 0xf851a440 - (bool success, bytes memory returndata) = address(proxy).staticcall(hex"f851a440"); - require(success); - return abi.decode(returndata, (address)); - } - - /** - * @dev Changes the admin of `proxy` to `newAdmin`. - * - * Requirements: - * - * - This contract must be the current admin of `proxy`. - */ - function changeProxyAdmin(TransparentUpgradeableProxy proxy, address newAdmin) public virtual onlyOwner { - proxy.changeAdmin(newAdmin); - } - - /** - * @dev Upgrades `proxy` to `implementation`. See {TransparentUpgradeableProxy-upgradeTo}. - * - * Requirements: - * - * - This contract must be the admin of `proxy`. - */ - function upgrade(TransparentUpgradeableProxy proxy, address implementation) public virtual onlyOwner { - proxy.upgradeTo(implementation); - } - - /** - * @dev Upgrades `proxy` to `implementation` and calls a function on the new implementation. See - * {TransparentUpgradeableProxy-upgradeToAndCall}. - * - * Requirements: - * - * - This contract must be the admin of `proxy`. - */ - function upgradeAndCall( - TransparentUpgradeableProxy proxy, - address implementation, - bytes memory data - ) public payable virtual onlyOwner { - proxy.upgradeToAndCall{value: msg.value}(implementation, data); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/proxy/transparent/TransparentUpgradeableProxy.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/proxy/transparent/TransparentUpgradeableProxy.sol deleted file mode 100644 index 10808d5..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/proxy/transparent/TransparentUpgradeableProxy.sol +++ /dev/null @@ -1,125 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (proxy/transparent/TransparentUpgradeableProxy.sol) - -pragma solidity ^0.8.0; - -import "../ERC1967/ERC1967Proxy.sol"; - -/** - * @dev This contract implements a proxy that is upgradeable by an admin. - * - * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector - * clashing], which can potentially be used in an attack, this contract uses the - * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two - * things that go hand in hand: - * - * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if - * that call matches one of the admin functions exposed by the proxy itself. - * 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the - * implementation. If the admin tries to call a function on the implementation it will fail with an error that says - * "admin cannot fallback to proxy target". - * - * These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing - * the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due - * to sudden errors when trying to call a function from the proxy implementation. - * - * Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way, - * you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy. - */ -contract TransparentUpgradeableProxy is ERC1967Proxy { - /** - * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and - * optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}. - */ - constructor( - address _logic, - address admin_, - bytes memory _data - ) payable ERC1967Proxy(_logic, _data) { - assert(_ADMIN_SLOT == bytes32(uint256(keccak256("eip1967.proxy.admin")) - 1)); - _changeAdmin(admin_); - } - - /** - * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin. - */ - modifier ifAdmin() { - if (msg.sender == _getAdmin()) { - _; - } else { - _fallback(); - } - } - - /** - * @dev Returns the current admin. - * - * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}. - * - * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the - * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. - * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103` - */ - function admin() external ifAdmin returns (address admin_) { - admin_ = _getAdmin(); - } - - /** - * @dev Returns the current implementation. - * - * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}. - * - * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the - * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. - * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc` - */ - function implementation() external ifAdmin returns (address implementation_) { - implementation_ = _implementation(); - } - - /** - * @dev Changes the admin of the proxy. - * - * Emits an {AdminChanged} event. - * - * NOTE: Only the admin can call this function. See {ProxyAdmin-changeProxyAdmin}. - */ - function changeAdmin(address newAdmin) external virtual ifAdmin { - _changeAdmin(newAdmin); - } - - /** - * @dev Upgrade the implementation of the proxy. - * - * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}. - */ - function upgradeTo(address newImplementation) external ifAdmin { - _upgradeToAndCall(newImplementation, bytes(""), false); - } - - /** - * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified - * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the - * proxied contract. - * - * NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}. - */ - function upgradeToAndCall(address newImplementation, bytes calldata data) external payable ifAdmin { - _upgradeToAndCall(newImplementation, data, true); - } - - /** - * @dev Returns the current admin. - */ - function _admin() internal view virtual returns (address) { - return _getAdmin(); - } - - /** - * @dev Makes sure the admin cannot access the fallback function. See {Proxy-_beforeFallback}. - */ - function _beforeFallback() internal virtual override { - require(msg.sender != _getAdmin(), "TransparentUpgradeableProxy: admin cannot fallback to proxy target"); - super._beforeFallback(); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol deleted file mode 100644 index 3026539..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol +++ /dev/null @@ -1,149 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (proxy/utils/Initializable.sol) - -pragma solidity ^0.8.2; - -import "../../utils/Address.sol"; - -/** - * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed - * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an - * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer - * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. - * - * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be - * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in - * case an upgrade adds a module that needs to be initialized. - * - * For example: - * - * [.hljs-theme-light.nopadding] - * ``` - * contract MyToken is ERC20Upgradeable { - * function initialize() initializer public { - * __ERC20_init("MyToken", "MTK"); - * } - * } - * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { - * function initializeV2() reinitializer(2) public { - * __ERC20Permit_init("MyToken"); - * } - * } - * ``` - * - * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as - * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. - * - * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure - * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. - * - * [CAUTION] - * ==== - * Avoid leaving a contract uninitialized. - * - * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation - * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke - * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: - * - * [.hljs-theme-light.nopadding] - * ``` - * /// @custom:oz-upgrades-unsafe-allow constructor - * constructor() { - * _disableInitializers(); - * } - * ``` - * ==== - */ -abstract contract Initializable { - /** - * @dev Indicates that the contract has been initialized. - * @custom:oz-retyped-from bool - */ - uint8 private _initialized; - - /** - * @dev Indicates that the contract is in the process of being initialized. - */ - bool private _initializing; - - /** - * @dev Triggered when the contract has been initialized or reinitialized. - */ - event Initialized(uint8 version); - - /** - * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, - * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`. - */ - modifier initializer() { - bool isTopLevelCall = _setInitializedVersion(1); - if (isTopLevelCall) { - _initializing = true; - } - _; - if (isTopLevelCall) { - _initializing = false; - emit Initialized(1); - } - } - - /** - * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the - * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be - * used to initialize parent contracts. - * - * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original - * initialization step. This is essential to configure modules that are added through upgrades and that require - * initialization. - * - * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in - * a contract, executing them in the right order is up to the developer or operator. - */ - modifier reinitializer(uint8 version) { - bool isTopLevelCall = _setInitializedVersion(version); - if (isTopLevelCall) { - _initializing = true; - } - _; - if (isTopLevelCall) { - _initializing = false; - emit Initialized(version); - } - } - - /** - * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the - * {initializer} and {reinitializer} modifiers, directly or indirectly. - */ - modifier onlyInitializing() { - require(_initializing, "Initializable: contract is not initializing"); - _; - } - - /** - * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. - * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized - * to any version. It is recommended to use this to lock implementation contracts that are designed to be called - * through proxies. - */ - function _disableInitializers() internal virtual { - _setInitializedVersion(type(uint8).max); - } - - function _setInitializedVersion(uint8 version) private returns (bool) { - // If the contract is initializing we ignore whether _initialized is set in order to support multiple - // inheritance patterns, but we only do this in the context of a constructor, and for the lowest level - // of initializers, because in other contexts the contract may have been reentered. - if (_initializing) { - require( - version == 1 && !Address.isContract(address(this)), - "Initializable: contract is already initialized" - ); - return false; - } else { - require(_initialized < version, "Initializable: contract is already initialized"); - _initialized = version; - return true; - } - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/proxy/utils/UUPSUpgradeable.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/proxy/utils/UUPSUpgradeable.sol deleted file mode 100644 index 7ccc503..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/proxy/utils/UUPSUpgradeable.sol +++ /dev/null @@ -1,95 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (proxy/utils/UUPSUpgradeable.sol) - -pragma solidity ^0.8.0; - -import "../../interfaces/draft-IERC1822.sol"; -import "../ERC1967/ERC1967Upgrade.sol"; - -/** - * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an - * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy. - * - * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is - * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing - * `UUPSUpgradeable` with a custom implementation of upgrades. - * - * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism. - * - * _Available since v4.1._ - */ -abstract contract UUPSUpgradeable is IERC1822Proxiable, ERC1967Upgrade { - /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment - address private immutable __self = address(this); - - /** - * @dev Check that the execution is being performed through a delegatecall call and that the execution context is - * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case - * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a - * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to - * fail. - */ - modifier onlyProxy() { - require(address(this) != __self, "Function must be called through delegatecall"); - require(_getImplementation() == __self, "Function must be called through active proxy"); - _; - } - - /** - * @dev Check that the execution is not being performed through a delegate call. This allows a function to be - * callable on the implementing contract but not through proxies. - */ - modifier notDelegated() { - require(address(this) == __self, "UUPSUpgradeable: must not be called through delegatecall"); - _; - } - - /** - * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the - * implementation. It is used to validate that the this implementation remains valid after an upgrade. - * - * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks - * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this - * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier. - */ - function proxiableUUID() external view virtual override notDelegated returns (bytes32) { - return _IMPLEMENTATION_SLOT; - } - - /** - * @dev Upgrade the implementation of the proxy to `newImplementation`. - * - * Calls {_authorizeUpgrade}. - * - * Emits an {Upgraded} event. - */ - function upgradeTo(address newImplementation) external virtual onlyProxy { - _authorizeUpgrade(newImplementation); - _upgradeToAndCallUUPS(newImplementation, new bytes(0), false); - } - - /** - * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call - * encoded in `data`. - * - * Calls {_authorizeUpgrade}. - * - * Emits an {Upgraded} event. - */ - function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy { - _authorizeUpgrade(newImplementation); - _upgradeToAndCallUUPS(newImplementation, data, true); - } - - /** - * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by - * {upgradeTo} and {upgradeToAndCall}. - * - * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}. - * - * ```solidity - * function _authorizeUpgrade(address) internal override onlyOwner {} - * ``` - */ - function _authorizeUpgrade(address newImplementation) internal virtual; -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/security/Pausable.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/security/Pausable.sol deleted file mode 100644 index 0c09e6c..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/security/Pausable.sol +++ /dev/null @@ -1,91 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) - -pragma solidity ^0.8.0; - -import "../utils/Context.sol"; - -/** - * @dev Contract module which allows children to implement an emergency stop - * mechanism that can be triggered by an authorized account. - * - * This module is used through inheritance. It will make available the - * modifiers `whenNotPaused` and `whenPaused`, which can be applied to - * the functions of your contract. Note that they will not be pausable by - * simply including this module, only once the modifiers are put in place. - */ -abstract contract Pausable is Context { - /** - * @dev Emitted when the pause is triggered by `account`. - */ - event Paused(address account); - - /** - * @dev Emitted when the pause is lifted by `account`. - */ - event Unpaused(address account); - - bool private _paused; - - /** - * @dev Initializes the contract in unpaused state. - */ - constructor() { - _paused = false; - } - - /** - * @dev Returns true if the contract is paused, and false otherwise. - */ - function paused() public view virtual returns (bool) { - return _paused; - } - - /** - * @dev Modifier to make a function callable only when the contract is not paused. - * - * Requirements: - * - * - The contract must not be paused. - */ - modifier whenNotPaused() { - require(!paused(), "Pausable: paused"); - _; - } - - /** - * @dev Modifier to make a function callable only when the contract is paused. - * - * Requirements: - * - * - The contract must be paused. - */ - modifier whenPaused() { - require(paused(), "Pausable: not paused"); - _; - } - - /** - * @dev Triggers stopped state. - * - * Requirements: - * - * - The contract must not be paused. - */ - function _pause() internal virtual whenNotPaused { - _paused = true; - emit Paused(_msgSender()); - } - - /** - * @dev Returns to normal state. - * - * Requirements: - * - * - The contract must be paused. - */ - function _unpause() internal virtual whenPaused { - _paused = false; - emit Unpaused(_msgSender()); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/security/PullPayment.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/security/PullPayment.sol deleted file mode 100644 index 6a50f2c..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/security/PullPayment.sol +++ /dev/null @@ -1,70 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (security/PullPayment.sol) - -pragma solidity ^0.8.0; - -import "../utils/escrow/Escrow.sol"; - -/** - * @dev Simple implementation of a - * https://consensys.github.io/smart-contract-best-practices/recommendations/#favor-pull-over-push-for-external-calls[pull-payment] - * strategy, where the paying contract doesn't interact directly with the - * receiver account, which must withdraw its payments itself. - * - * Pull-payments are often considered the best practice when it comes to sending - * Ether, security-wise. It prevents recipients from blocking execution, and - * eliminates reentrancy concerns. - * - * TIP: If you would like to learn more about reentrancy and alternative ways - * to protect against it, check out our blog post - * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. - * - * To use, derive from the `PullPayment` contract, and use {_asyncTransfer} - * instead of Solidity's `transfer` function. Payees can query their due - * payments with {payments}, and retrieve them with {withdrawPayments}. - */ -abstract contract PullPayment { - Escrow private immutable _escrow; - - constructor() { - _escrow = new Escrow(); - } - - /** - * @dev Withdraw accumulated payments, forwarding all gas to the recipient. - * - * Note that _any_ account can call this function, not just the `payee`. - * This means that contracts unaware of the `PullPayment` protocol can still - * receive funds this way, by having a separate account call - * {withdrawPayments}. - * - * WARNING: Forwarding all gas opens the door to reentrancy vulnerabilities. - * Make sure you trust the recipient, or are either following the - * checks-effects-interactions pattern or using {ReentrancyGuard}. - * - * @param payee Whose payments will be withdrawn. - */ - function withdrawPayments(address payable payee) public virtual { - _escrow.withdraw(payee); - } - - /** - * @dev Returns the payments owed to an address. - * @param dest The creditor's address. - */ - function payments(address dest) public view returns (uint256) { - return _escrow.depositsOf(dest); - } - - /** - * @dev Called by the payer to store the sent amount as credit to be pulled. - * Funds sent in this way are stored in an intermediate {Escrow} contract, so - * there is no danger of them being spent before withdrawal. - * - * @param dest The destination address of the funds. - * @param amount The amount to transfer. - */ - function _asyncTransfer(address dest, uint256 amount) internal virtual { - _escrow.deposit{value: amount}(dest); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/security/README.adoc b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/security/README.adoc deleted file mode 100644 index 66f398f..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/security/README.adoc +++ /dev/null @@ -1,20 +0,0 @@ -= Security - -[.readme-notice] -NOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/security - -These contracts aim to cover common security practices. - -* {PullPayment}: A pattern that can be used to avoid reentrancy attacks. -* {ReentrancyGuard}: A modifier that can prevent reentrancy during certain functions. -* {Pausable}: A common emergency response mechanism that can pause functionality while a remediation is pending. - -TIP: For an overview on reentrancy and the possible mechanisms to prevent it, read our article https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. - -== Contracts - -{{PullPayment}} - -{{ReentrancyGuard}} - -{{Pausable}} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/security/ReentrancyGuard.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/security/ReentrancyGuard.sol deleted file mode 100644 index ec8ccc7..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/security/ReentrancyGuard.sol +++ /dev/null @@ -1,63 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Contract module that helps prevent reentrant calls to a function. - * - * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier - * available, which can be applied to functions to make sure there are no nested - * (reentrant) calls to them. - * - * Note that because there is a single `nonReentrant` guard, functions marked as - * `nonReentrant` may not call one another. This can be worked around by making - * those functions `private`, and then adding `external` `nonReentrant` entry - * points to them. - * - * TIP: If you would like to learn more about reentrancy and alternative ways - * to protect against it, check out our blog post - * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. - */ -abstract contract ReentrancyGuard { - // Booleans are more expensive than uint256 or any type that takes up a full - // word because each write operation emits an extra SLOAD to first read the - // slot's contents, replace the bits taken up by the boolean, and then write - // back. This is the compiler's defense against contract upgrades and - // pointer aliasing, and it cannot be disabled. - - // The values being non-zero value makes deployment a bit more expensive, - // but in exchange the refund on every call to nonReentrant will be lower in - // amount. Since refunds are capped to a percentage of the total - // transaction's gas, it is best to keep them low in cases like this one, to - // increase the likelihood of the full refund coming into effect. - uint256 private constant _NOT_ENTERED = 1; - uint256 private constant _ENTERED = 2; - - uint256 private _status; - - constructor() { - _status = _NOT_ENTERED; - } - - /** - * @dev Prevents a contract from calling itself, directly or indirectly. - * Calling a `nonReentrant` function from another `nonReentrant` - * function is not supported. It is possible to prevent this from happening - * by making the `nonReentrant` function external, and making it call a - * `private` function that does the actual work. - */ - modifier nonReentrant() { - // On the first call to nonReentrant, _notEntered will be true - require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); - - // Any calls to nonReentrant after this point will fail - _status = _ENTERED; - - _; - - // By storing the original value once again, a refund is triggered (see - // https://eips.ethereum.org/EIPS/eip-2200) - _status = _NOT_ENTERED; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/ERC1155.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/ERC1155.sol deleted file mode 100644 index d14d269..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/ERC1155.sol +++ /dev/null @@ -1,511 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC1155/ERC1155.sol) - -pragma solidity ^0.8.0; - -import "./IERC1155.sol"; -import "./IERC1155Receiver.sol"; -import "./extensions/IERC1155MetadataURI.sol"; -import "../../utils/Address.sol"; -import "../../utils/Context.sol"; -import "../../utils/introspection/ERC165.sol"; - -/** - * @dev Implementation of the basic standard multi-token. - * See https://eips.ethereum.org/EIPS/eip-1155 - * Originally based on code by Enjin: https://github.com/enjin/erc-1155 - * - * _Available since v3.1._ - */ -contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { - using Address for address; - - // Mapping from token ID to account balances - mapping(uint256 => mapping(address => uint256)) private _balances; - - // Mapping from account to operator approvals - mapping(address => mapping(address => bool)) private _operatorApprovals; - - // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json - string private _uri; - - /** - * @dev See {_setURI}. - */ - constructor(string memory uri_) { - _setURI(uri_); - } - - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { - return - interfaceId == type(IERC1155).interfaceId || - interfaceId == type(IERC1155MetadataURI).interfaceId || - super.supportsInterface(interfaceId); - } - - /** - * @dev See {IERC1155MetadataURI-uri}. - * - * This implementation returns the same URI for *all* token types. It relies - * on the token type ID substitution mechanism - * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. - * - * Clients calling this function must replace the `\{id\}` substring with the - * actual token type ID. - */ - function uri(uint256) public view virtual override returns (string memory) { - return _uri; - } - - /** - * @dev See {IERC1155-balanceOf}. - * - * Requirements: - * - * - `account` cannot be the zero address. - */ - function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { - require(account != address(0), "ERC1155: address zero is not a valid owner"); - return _balances[id][account]; - } - - /** - * @dev See {IERC1155-balanceOfBatch}. - * - * Requirements: - * - * - `accounts` and `ids` must have the same length. - */ - function balanceOfBatch(address[] memory accounts, uint256[] memory ids) - public - view - virtual - override - returns (uint256[] memory) - { - require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); - - uint256[] memory batchBalances = new uint256[](accounts.length); - - for (uint256 i = 0; i < accounts.length; ++i) { - batchBalances[i] = balanceOf(accounts[i], ids[i]); - } - - return batchBalances; - } - - /** - * @dev See {IERC1155-setApprovalForAll}. - */ - function setApprovalForAll(address operator, bool approved) public virtual override { - _setApprovalForAll(_msgSender(), operator, approved); - } - - /** - * @dev See {IERC1155-isApprovedForAll}. - */ - function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { - return _operatorApprovals[account][operator]; - } - - /** - * @dev See {IERC1155-safeTransferFrom}. - */ - function safeTransferFrom( - address from, - address to, - uint256 id, - uint256 amount, - bytes memory data - ) public virtual override { - require( - from == _msgSender() || isApprovedForAll(from, _msgSender()), - "ERC1155: caller is not owner nor approved" - ); - _safeTransferFrom(from, to, id, amount, data); - } - - /** - * @dev See {IERC1155-safeBatchTransferFrom}. - */ - function safeBatchTransferFrom( - address from, - address to, - uint256[] memory ids, - uint256[] memory amounts, - bytes memory data - ) public virtual override { - require( - from == _msgSender() || isApprovedForAll(from, _msgSender()), - "ERC1155: transfer caller is not owner nor approved" - ); - _safeBatchTransferFrom(from, to, ids, amounts, data); - } - - /** - * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. - * - * Emits a {TransferSingle} event. - * - * Requirements: - * - * - `to` cannot be the zero address. - * - `from` must have a balance of tokens of type `id` of at least `amount`. - * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the - * acceptance magic value. - */ - function _safeTransferFrom( - address from, - address to, - uint256 id, - uint256 amount, - bytes memory data - ) internal virtual { - require(to != address(0), "ERC1155: transfer to the zero address"); - - address operator = _msgSender(); - uint256[] memory ids = _asSingletonArray(id); - uint256[] memory amounts = _asSingletonArray(amount); - - _beforeTokenTransfer(operator, from, to, ids, amounts, data); - - uint256 fromBalance = _balances[id][from]; - require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); - unchecked { - _balances[id][from] = fromBalance - amount; - } - _balances[id][to] += amount; - - emit TransferSingle(operator, from, to, id, amount); - - _afterTokenTransfer(operator, from, to, ids, amounts, data); - - _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); - } - - /** - * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. - * - * Emits a {TransferBatch} event. - * - * Requirements: - * - * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the - * acceptance magic value. - */ - function _safeBatchTransferFrom( - address from, - address to, - uint256[] memory ids, - uint256[] memory amounts, - bytes memory data - ) internal virtual { - require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); - require(to != address(0), "ERC1155: transfer to the zero address"); - - address operator = _msgSender(); - - _beforeTokenTransfer(operator, from, to, ids, amounts, data); - - for (uint256 i = 0; i < ids.length; ++i) { - uint256 id = ids[i]; - uint256 amount = amounts[i]; - - uint256 fromBalance = _balances[id][from]; - require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); - unchecked { - _balances[id][from] = fromBalance - amount; - } - _balances[id][to] += amount; - } - - emit TransferBatch(operator, from, to, ids, amounts); - - _afterTokenTransfer(operator, from, to, ids, amounts, data); - - _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); - } - - /** - * @dev Sets a new URI for all token types, by relying on the token type ID - * substitution mechanism - * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. - * - * By this mechanism, any occurrence of the `\{id\}` substring in either the - * URI or any of the amounts in the JSON file at said URI will be replaced by - * clients with the token type ID. - * - * For example, the `https://token-cdn-domain/\{id\}.json` URI would be - * interpreted by clients as - * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` - * for token type ID 0x4cce0. - * - * See {uri}. - * - * Because these URIs cannot be meaningfully represented by the {URI} event, - * this function emits no events. - */ - function _setURI(string memory newuri) internal virtual { - _uri = newuri; - } - - /** - * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. - * - * Emits a {TransferSingle} event. - * - * Requirements: - * - * - `to` cannot be the zero address. - * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the - * acceptance magic value. - */ - function _mint( - address to, - uint256 id, - uint256 amount, - bytes memory data - ) internal virtual { - require(to != address(0), "ERC1155: mint to the zero address"); - - address operator = _msgSender(); - uint256[] memory ids = _asSingletonArray(id); - uint256[] memory amounts = _asSingletonArray(amount); - - _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); - - _balances[id][to] += amount; - emit TransferSingle(operator, address(0), to, id, amount); - - _afterTokenTransfer(operator, address(0), to, ids, amounts, data); - - _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); - } - - /** - * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. - * - * Requirements: - * - * - `ids` and `amounts` must have the same length. - * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the - * acceptance magic value. - */ - function _mintBatch( - address to, - uint256[] memory ids, - uint256[] memory amounts, - bytes memory data - ) internal virtual { - require(to != address(0), "ERC1155: mint to the zero address"); - require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); - - address operator = _msgSender(); - - _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); - - for (uint256 i = 0; i < ids.length; i++) { - _balances[ids[i]][to] += amounts[i]; - } - - emit TransferBatch(operator, address(0), to, ids, amounts); - - _afterTokenTransfer(operator, address(0), to, ids, amounts, data); - - _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); - } - - /** - * @dev Destroys `amount` tokens of token type `id` from `from` - * - * Requirements: - * - * - `from` cannot be the zero address. - * - `from` must have at least `amount` tokens of token type `id`. - */ - function _burn( - address from, - uint256 id, - uint256 amount - ) internal virtual { - require(from != address(0), "ERC1155: burn from the zero address"); - - address operator = _msgSender(); - uint256[] memory ids = _asSingletonArray(id); - uint256[] memory amounts = _asSingletonArray(amount); - - _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); - - uint256 fromBalance = _balances[id][from]; - require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); - unchecked { - _balances[id][from] = fromBalance - amount; - } - - emit TransferSingle(operator, from, address(0), id, amount); - - _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); - } - - /** - * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. - * - * Requirements: - * - * - `ids` and `amounts` must have the same length. - */ - function _burnBatch( - address from, - uint256[] memory ids, - uint256[] memory amounts - ) internal virtual { - require(from != address(0), "ERC1155: burn from the zero address"); - require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); - - address operator = _msgSender(); - - _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); - - for (uint256 i = 0; i < ids.length; i++) { - uint256 id = ids[i]; - uint256 amount = amounts[i]; - - uint256 fromBalance = _balances[id][from]; - require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); - unchecked { - _balances[id][from] = fromBalance - amount; - } - } - - emit TransferBatch(operator, from, address(0), ids, amounts); - - _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); - } - - /** - * @dev Approve `operator` to operate on all of `owner` tokens - * - * Emits a {ApprovalForAll} event. - */ - function _setApprovalForAll( - address owner, - address operator, - bool approved - ) internal virtual { - require(owner != operator, "ERC1155: setting approval status for self"); - _operatorApprovals[owner][operator] = approved; - emit ApprovalForAll(owner, operator, approved); - } - - /** - * @dev Hook that is called before any token transfer. This includes minting - * and burning, as well as batched variants. - * - * The same hook is called on both single and batched variants. For single - * transfers, the length of the `id` and `amount` arrays will be 1. - * - * Calling conditions (for each `id` and `amount` pair): - * - * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens - * of token type `id` will be transferred to `to`. - * - When `from` is zero, `amount` tokens of token type `id` will be minted - * for `to`. - * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` - * will be burned. - * - `from` and `to` are never both zero. - * - `ids` and `amounts` have the same, non-zero length. - * - * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. - */ - function _beforeTokenTransfer( - address operator, - address from, - address to, - uint256[] memory ids, - uint256[] memory amounts, - bytes memory data - ) internal virtual {} - - /** - * @dev Hook that is called after any token transfer. This includes minting - * and burning, as well as batched variants. - * - * The same hook is called on both single and batched variants. For single - * transfers, the length of the `id` and `amount` arrays will be 1. - * - * Calling conditions (for each `id` and `amount` pair): - * - * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens - * of token type `id` will be transferred to `to`. - * - When `from` is zero, `amount` tokens of token type `id` will be minted - * for `to`. - * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` - * will be burned. - * - `from` and `to` are never both zero. - * - `ids` and `amounts` have the same, non-zero length. - * - * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. - */ - function _afterTokenTransfer( - address operator, - address from, - address to, - uint256[] memory ids, - uint256[] memory amounts, - bytes memory data - ) internal virtual {} - - function _doSafeTransferAcceptanceCheck( - address operator, - address from, - address to, - uint256 id, - uint256 amount, - bytes memory data - ) private { - if (to.isContract()) { - try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { - if (response != IERC1155Receiver.onERC1155Received.selector) { - revert("ERC1155: ERC1155Receiver rejected tokens"); - } - } catch Error(string memory reason) { - revert(reason); - } catch { - revert("ERC1155: transfer to non ERC1155Receiver implementer"); - } - } - } - - function _doSafeBatchTransferAcceptanceCheck( - address operator, - address from, - address to, - uint256[] memory ids, - uint256[] memory amounts, - bytes memory data - ) private { - if (to.isContract()) { - try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( - bytes4 response - ) { - if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { - revert("ERC1155: ERC1155Receiver rejected tokens"); - } - } catch Error(string memory reason) { - revert(reason); - } catch { - revert("ERC1155: transfer to non ERC1155Receiver implementer"); - } - } - } - - function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { - uint256[] memory array = new uint256[](1); - array[0] = element; - - return array; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol deleted file mode 100644 index f2190a4..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sol +++ /dev/null @@ -1,125 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol) - -pragma solidity ^0.8.0; - -import "../../utils/introspection/IERC165.sol"; - -/** - * @dev Required interface of an ERC1155 compliant contract, as defined in the - * https://eips.ethereum.org/EIPS/eip-1155[EIP]. - * - * _Available since v3.1._ - */ -interface IERC1155 is IERC165 { - /** - * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. - */ - event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); - - /** - * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all - * transfers. - */ - event TransferBatch( - address indexed operator, - address indexed from, - address indexed to, - uint256[] ids, - uint256[] values - ); - - /** - * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to - * `approved`. - */ - event ApprovalForAll(address indexed account, address indexed operator, bool approved); - - /** - * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. - * - * If an {URI} event was emitted for `id`, the standard - * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value - * returned by {IERC1155MetadataURI-uri}. - */ - event URI(string value, uint256 indexed id); - - /** - * @dev Returns the amount of tokens of token type `id` owned by `account`. - * - * Requirements: - * - * - `account` cannot be the zero address. - */ - function balanceOf(address account, uint256 id) external view returns (uint256); - - /** - * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. - * - * Requirements: - * - * - `accounts` and `ids` must have the same length. - */ - function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) - external - view - returns (uint256[] memory); - - /** - * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, - * - * Emits an {ApprovalForAll} event. - * - * Requirements: - * - * - `operator` cannot be the caller. - */ - function setApprovalForAll(address operator, bool approved) external; - - /** - * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. - * - * See {setApprovalForAll}. - */ - function isApprovedForAll(address account, address operator) external view returns (bool); - - /** - * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. - * - * Emits a {TransferSingle} event. - * - * Requirements: - * - * - `to` cannot be the zero address. - * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. - * - `from` must have a balance of tokens of type `id` of at least `amount`. - * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the - * acceptance magic value. - */ - function safeTransferFrom( - address from, - address to, - uint256 id, - uint256 amount, - bytes calldata data - ) external; - - /** - * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. - * - * Emits a {TransferBatch} event. - * - * Requirements: - * - * - `ids` and `amounts` must have the same length. - * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the - * acceptance magic value. - */ - function safeBatchTransferFrom( - address from, - address to, - uint256[] calldata ids, - uint256[] calldata amounts, - bytes calldata data - ) external; -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155Receiver.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155Receiver.sol deleted file mode 100644 index 0dd271d..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155Receiver.sol +++ /dev/null @@ -1,58 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) - -pragma solidity ^0.8.0; - -import "../../utils/introspection/IERC165.sol"; - -/** - * @dev _Available since v3.1._ - */ -interface IERC1155Receiver is IERC165 { - /** - * @dev Handles the receipt of a single ERC1155 token type. This function is - * called at the end of a `safeTransferFrom` after the balance has been updated. - * - * NOTE: To accept the transfer, this must return - * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` - * (i.e. 0xf23a6e61, or its own function selector). - * - * @param operator The address which initiated the transfer (i.e. msg.sender) - * @param from The address which previously owned the token - * @param id The ID of the token being transferred - * @param value The amount of tokens being transferred - * @param data Additional data with no specified format - * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed - */ - function onERC1155Received( - address operator, - address from, - uint256 id, - uint256 value, - bytes calldata data - ) external returns (bytes4); - - /** - * @dev Handles the receipt of a multiple ERC1155 token types. This function - * is called at the end of a `safeBatchTransferFrom` after the balances have - * been updated. - * - * NOTE: To accept the transfer(s), this must return - * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` - * (i.e. 0xbc197c81, or its own function selector). - * - * @param operator The address which initiated the batch transfer (i.e. msg.sender) - * @param from The address which previously owned the token - * @param ids An array containing ids of each token being transferred (order and length must match values array) - * @param values An array containing amounts of each token being transferred (order and length must match ids array) - * @param data Additional data with no specified format - * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed - */ - function onERC1155BatchReceived( - address operator, - address from, - uint256[] calldata ids, - uint256[] calldata values, - bytes calldata data - ) external returns (bytes4); -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/README.adoc b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/README.adoc deleted file mode 100644 index 13ffbdb..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/README.adoc +++ /dev/null @@ -1,49 +0,0 @@ -= ERC 1155 - -[.readme-notice] -NOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/token/erc1155 - -This set of interfaces and contracts are all related to the https://eips.ethereum.org/EIPS/eip-1155[ERC1155 Multi Token Standard]. - -The EIP consists of three interfaces which fulfill different roles, found here as {IERC1155}, {IERC1155MetadataURI} and {IERC1155Receiver}. - -{ERC1155} implements the mandatory {IERC1155} interface, as well as the optional extension {IERC1155MetadataURI}, by relying on the substitution mechanism to use the same URI for all token types, dramatically reducing gas costs. - -Additionally there are multiple custom extensions, including: - -* designation of addresses that can pause token transfers for all users ({ERC1155Pausable}). -* destruction of own tokens ({ERC1155Burnable}). - -NOTE: This core set of contracts is designed to be unopinionated, allowing developers to access the internal functions in ERC1155 (such as <>) and expose them as external functions in the way they prefer. On the other hand, xref:ROOT:erc1155.adoc#Presets[ERC1155 Presets] (such as {ERC1155PresetMinterPauser}) are designed using opinionated patterns to provide developers with ready to use, deployable contracts. - -== Core - -{{IERC1155}} - -{{IERC1155MetadataURI}} - -{{ERC1155}} - -{{IERC1155Receiver}} - -{{ERC1155Receiver}} - -== Extensions - -{{ERC1155Pausable}} - -{{ERC1155Burnable}} - -{{ERC1155Supply}} - -{{ERC1155URIStorage}} - -== Presets - -These contracts are preconfigured combinations of the above features. They can be used through inheritance or as models to copy and paste their source code. - -{{ERC1155PresetMinterPauser}} - -== Utilities - -{{ERC1155Holder}} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Burnable.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Burnable.sol deleted file mode 100644 index 4a7c86e..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Burnable.sol +++ /dev/null @@ -1,40 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Burnable.sol) - -pragma solidity ^0.8.0; - -import "../ERC1155.sol"; - -/** - * @dev Extension of {ERC1155} that allows token holders to destroy both their - * own tokens and those that they have been approved to use. - * - * _Available since v3.1._ - */ -abstract contract ERC1155Burnable is ERC1155 { - function burn( - address account, - uint256 id, - uint256 value - ) public virtual { - require( - account == _msgSender() || isApprovedForAll(account, _msgSender()), - "ERC1155: caller is not owner nor approved" - ); - - _burn(account, id, value); - } - - function burnBatch( - address account, - uint256[] memory ids, - uint256[] memory values - ) public virtual { - require( - account == _msgSender() || isApprovedForAll(account, _msgSender()), - "ERC1155: caller is not owner nor approved" - ); - - _burnBatch(account, ids, values); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Pausable.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Pausable.sol deleted file mode 100644 index 64790e2..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Pausable.sol +++ /dev/null @@ -1,38 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Pausable.sol) - -pragma solidity ^0.8.0; - -import "../ERC1155.sol"; -import "../../../security/Pausable.sol"; - -/** - * @dev ERC1155 token with pausable token transfers, minting and burning. - * - * Useful for scenarios such as preventing trades until the end of an evaluation - * period, or having an emergency switch for freezing all token transfers in the - * event of a large bug. - * - * _Available since v3.1._ - */ -abstract contract ERC1155Pausable is ERC1155, Pausable { - /** - * @dev See {ERC1155-_beforeTokenTransfer}. - * - * Requirements: - * - * - the contract must not be paused. - */ - function _beforeTokenTransfer( - address operator, - address from, - address to, - uint256[] memory ids, - uint256[] memory amounts, - bytes memory data - ) internal virtual override { - super._beforeTokenTransfer(operator, from, to, ids, amounts, data); - - require(!paused(), "ERC1155Pausable: token transfer while paused"); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Supply.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Supply.sol deleted file mode 100644 index 5caa527..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Supply.sol +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Supply.sol) - -pragma solidity ^0.8.0; - -import "../ERC1155.sol"; - -/** - * @dev Extension of ERC1155 that adds tracking of total supply per id. - * - * Useful for scenarios where Fungible and Non-fungible tokens have to be - * clearly identified. Note: While a totalSupply of 1 might mean the - * corresponding is an NFT, there is no guarantees that no other token with the - * same id are not going to be minted. - */ -abstract contract ERC1155Supply is ERC1155 { - mapping(uint256 => uint256) private _totalSupply; - - /** - * @dev Total amount of tokens in with a given id. - */ - function totalSupply(uint256 id) public view virtual returns (uint256) { - return _totalSupply[id]; - } - - /** - * @dev Indicates whether any token exist with a given id, or not. - */ - function exists(uint256 id) public view virtual returns (bool) { - return ERC1155Supply.totalSupply(id) > 0; - } - - /** - * @dev See {ERC1155-_beforeTokenTransfer}. - */ - function _beforeTokenTransfer( - address operator, - address from, - address to, - uint256[] memory ids, - uint256[] memory amounts, - bytes memory data - ) internal virtual override { - super._beforeTokenTransfer(operator, from, to, ids, amounts, data); - - if (from == address(0)) { - for (uint256 i = 0; i < ids.length; ++i) { - _totalSupply[ids[i]] += amounts[i]; - } - } - - if (to == address(0)) { - for (uint256 i = 0; i < ids.length; ++i) { - uint256 id = ids[i]; - uint256 amount = amounts[i]; - uint256 supply = _totalSupply[id]; - require(supply >= amount, "ERC1155: burn amount exceeds totalSupply"); - unchecked { - _totalSupply[id] = supply - amount; - } - } - } - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155URIStorage.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155URIStorage.sol deleted file mode 100644 index 42ecce7..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155URIStorage.sol +++ /dev/null @@ -1,62 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../../../utils/Strings.sol"; -import "../ERC1155.sol"; - -/** - * @dev ERC1155 token with storage based token URI management. - * Inspired by the ERC721URIStorage extension - * - * _Available since v4.6._ - */ -abstract contract ERC1155URIStorage is ERC1155 { - using Strings for uint256; - - // Optional base URI - string private _baseURI = ""; - - // Optional mapping for token URIs - mapping(uint256 => string) private _tokenURIs; - - /** - * @dev See {IERC1155MetadataURI-uri}. - * - * This implementation returns the concatenation of the `_baseURI` - * and the token-specific uri if the latter is set - * - * This enables the following behaviors: - * - * - if `_tokenURIs[tokenId]` is set, then the result is the concatenation - * of `_baseURI` and `_tokenURIs[tokenId]` (keep in mind that `_baseURI` - * is empty per default); - * - * - if `_tokenURIs[tokenId]` is NOT set then we fallback to `super.uri()` - * which in most cases will contain `ERC1155._uri`; - * - * - if `_tokenURIs[tokenId]` is NOT set, and if the parents do not have a - * uri value set, then the result is empty. - */ - function uri(uint256 tokenId) public view virtual override returns (string memory) { - string memory tokenURI = _tokenURIs[tokenId]; - - // If token URI is set, concatenate base URI and tokenURI (via abi.encodePacked). - return bytes(tokenURI).length > 0 ? string(abi.encodePacked(_baseURI, tokenURI)) : super.uri(tokenId); - } - - /** - * @dev Sets `tokenURI` as the tokenURI of `tokenId`. - */ - function _setURI(uint256 tokenId, string memory tokenURI) internal virtual { - _tokenURIs[tokenId] = tokenURI; - emit URI(uri(tokenId), tokenId); - } - - /** - * @dev Sets `baseURI` as the `_baseURI` for all tokens - */ - function _setBaseURI(string memory baseURI) internal virtual { - _baseURI = baseURI; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol deleted file mode 100644 index 520a297..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) - -pragma solidity ^0.8.0; - -import "../IERC1155.sol"; - -/** - * @dev Interface of the optional ERC1155MetadataExtension interface, as defined - * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. - * - * _Available since v3.1._ - */ -interface IERC1155MetadataURI is IERC1155 { - /** - * @dev Returns the URI for token type `id`. - * - * If the `\{id\}` substring is present in the URI, it must be replaced by - * clients with the actual token type ID. - */ - function uri(uint256 id) external view returns (string memory); -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/presets/ERC1155PresetMinterPauser.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/presets/ERC1155PresetMinterPauser.sol deleted file mode 100644 index e57fdcc..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/presets/ERC1155PresetMinterPauser.sol +++ /dev/null @@ -1,128 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/presets/ERC1155PresetMinterPauser.sol) - -pragma solidity ^0.8.0; - -import "../ERC1155.sol"; -import "../extensions/ERC1155Burnable.sol"; -import "../extensions/ERC1155Pausable.sol"; -import "../../../access/AccessControlEnumerable.sol"; -import "../../../utils/Context.sol"; - -/** - * @dev {ERC1155} token, including: - * - * - ability for holders to burn (destroy) their tokens - * - a minter role that allows for token minting (creation) - * - a pauser role that allows to stop all token transfers - * - * This contract uses {AccessControl} to lock permissioned functions using the - * different roles - head to its documentation for details. - * - * The account that deploys the contract will be granted the minter and pauser - * roles, as well as the default admin role, which will let it grant both minter - * and pauser roles to other accounts. - * - * _Deprecated in favor of https://wizard.openzeppelin.com/[Contracts Wizard]._ - */ -contract ERC1155PresetMinterPauser is Context, AccessControlEnumerable, ERC1155Burnable, ERC1155Pausable { - bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); - bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); - - /** - * @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE`, and `PAUSER_ROLE` to the account that - * deploys the contract. - */ - constructor(string memory uri) ERC1155(uri) { - _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); - - _setupRole(MINTER_ROLE, _msgSender()); - _setupRole(PAUSER_ROLE, _msgSender()); - } - - /** - * @dev Creates `amount` new tokens for `to`, of token type `id`. - * - * See {ERC1155-_mint}. - * - * Requirements: - * - * - the caller must have the `MINTER_ROLE`. - */ - function mint( - address to, - uint256 id, - uint256 amount, - bytes memory data - ) public virtual { - require(hasRole(MINTER_ROLE, _msgSender()), "ERC1155PresetMinterPauser: must have minter role to mint"); - - _mint(to, id, amount, data); - } - - /** - * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] variant of {mint}. - */ - function mintBatch( - address to, - uint256[] memory ids, - uint256[] memory amounts, - bytes memory data - ) public virtual { - require(hasRole(MINTER_ROLE, _msgSender()), "ERC1155PresetMinterPauser: must have minter role to mint"); - - _mintBatch(to, ids, amounts, data); - } - - /** - * @dev Pauses all token transfers. - * - * See {ERC1155Pausable} and {Pausable-_pause}. - * - * Requirements: - * - * - the caller must have the `PAUSER_ROLE`. - */ - function pause() public virtual { - require(hasRole(PAUSER_ROLE, _msgSender()), "ERC1155PresetMinterPauser: must have pauser role to pause"); - _pause(); - } - - /** - * @dev Unpauses all token transfers. - * - * See {ERC1155Pausable} and {Pausable-_unpause}. - * - * Requirements: - * - * - the caller must have the `PAUSER_ROLE`. - */ - function unpause() public virtual { - require(hasRole(PAUSER_ROLE, _msgSender()), "ERC1155PresetMinterPauser: must have pauser role to unpause"); - _unpause(); - } - - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) - public - view - virtual - override(AccessControlEnumerable, ERC1155) - returns (bool) - { - return super.supportsInterface(interfaceId); - } - - function _beforeTokenTransfer( - address operator, - address from, - address to, - uint256[] memory ids, - uint256[] memory amounts, - bytes memory data - ) internal virtual override(ERC1155, ERC1155Pausable) { - super._beforeTokenTransfer(operator, from, to, ids, amounts, data); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/presets/README.md b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/presets/README.md deleted file mode 100644 index 468200b..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/presets/README.md +++ /dev/null @@ -1 +0,0 @@ -Contract presets are now deprecated in favor of [Contracts Wizard](https://wizard.openzeppelin.com/) as a more powerful alternative. diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Holder.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Holder.sol deleted file mode 100644 index 7249de8..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Holder.sol +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/utils/ERC1155Holder.sol) - -pragma solidity ^0.8.0; - -import "./ERC1155Receiver.sol"; - -/** - * Simple implementation of `ERC1155Receiver` that will allow a contract to hold ERC1155 tokens. - * - * IMPORTANT: When inheriting this contract, you must include a way to use the received tokens, otherwise they will be - * stuck. - * - * @dev _Available since v3.1._ - */ -contract ERC1155Holder is ERC1155Receiver { - function onERC1155Received( - address, - address, - uint256, - uint256, - bytes memory - ) public virtual override returns (bytes4) { - return this.onERC1155Received.selector; - } - - function onERC1155BatchReceived( - address, - address, - uint256[] memory, - uint256[] memory, - bytes memory - ) public virtual override returns (bytes4) { - return this.onERC1155BatchReceived.selector; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Receiver.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Receiver.sol deleted file mode 100644 index 2e6804a..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Receiver.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC1155/utils/ERC1155Receiver.sol) - -pragma solidity ^0.8.0; - -import "../IERC1155Receiver.sol"; -import "../../../utils/introspection/ERC165.sol"; - -/** - * @dev _Available since v3.1._ - */ -abstract contract ERC1155Receiver is ERC165, IERC1155Receiver { - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { - return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol deleted file mode 100644 index dc963af..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol +++ /dev/null @@ -1,383 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/ERC20.sol) - -pragma solidity ^0.8.0; - -import "./IERC20.sol"; -import "./extensions/IERC20Metadata.sol"; -import "../../utils/Context.sol"; - -/** - * @dev Implementation of the {IERC20} interface. - * - * This implementation is agnostic to the way tokens are created. This means - * that a supply mechanism has to be added in a derived contract using {_mint}. - * For a generic mechanism see {ERC20PresetMinterPauser}. - * - * TIP: For a detailed writeup see our guide - * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How - * to implement supply mechanisms]. - * - * We have followed general OpenZeppelin Contracts guidelines: functions revert - * instead returning `false` on failure. This behavior is nonetheless - * conventional and does not conflict with the expectations of ERC20 - * applications. - * - * Additionally, an {Approval} event is emitted on calls to {transferFrom}. - * This allows applications to reconstruct the allowance for all accounts just - * by listening to said events. Other implementations of the EIP may not emit - * these events, as it isn't required by the specification. - * - * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} - * functions have been added to mitigate the well-known issues around setting - * allowances. See {IERC20-approve}. - */ -contract ERC20 is Context, IERC20, IERC20Metadata { - mapping(address => uint256) private _balances; - - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 private _totalSupply; - - string private _name; - string private _symbol; - - /** - * @dev Sets the values for {name} and {symbol}. - * - * The default value of {decimals} is 18. To select a different value for - * {decimals} you should overload it. - * - * All two of these values are immutable: they can only be set once during - * construction. - */ - constructor(string memory name_, string memory symbol_) { - _name = name_; - _symbol = symbol_; - } - - /** - * @dev Returns the name of the token. - */ - function name() public view virtual override returns (string memory) { - return _name; - } - - /** - * @dev Returns the symbol of the token, usually a shorter version of the - * name. - */ - function symbol() public view virtual override returns (string memory) { - return _symbol; - } - - /** - * @dev Returns the number of decimals used to get its user representation. - * For example, if `decimals` equals `2`, a balance of `505` tokens should - * be displayed to a user as `5.05` (`505 / 10 ** 2`). - * - * Tokens usually opt for a value of 18, imitating the relationship between - * Ether and Wei. This is the value {ERC20} uses, unless this function is - * overridden; - * - * NOTE: This information is only used for _display_ purposes: it in - * no way affects any of the arithmetic of the contract, including - * {IERC20-balanceOf} and {IERC20-transfer}. - */ - function decimals() public view virtual override returns (uint8) { - return 18; - } - - /** - * @dev See {IERC20-totalSupply}. - */ - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /** - * @dev See {IERC20-balanceOf}. - */ - function balanceOf(address account) public view virtual override returns (uint256) { - return _balances[account]; - } - - /** - * @dev See {IERC20-transfer}. - * - * Requirements: - * - * - `to` cannot be the zero address. - * - the caller must have a balance of at least `amount`. - */ - function transfer(address to, uint256 amount) public virtual override returns (bool) { - address owner = _msgSender(); - _transfer(owner, to, amount); - return true; - } - - /** - * @dev See {IERC20-allowance}. - */ - function allowance(address owner, address spender) public view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /** - * @dev See {IERC20-approve}. - * - * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on - * `transferFrom`. This is semantically equivalent to an infinite approval. - * - * Requirements: - * - * - `spender` cannot be the zero address. - */ - function approve(address spender, uint256 amount) public virtual override returns (bool) { - address owner = _msgSender(); - _approve(owner, spender, amount); - return true; - } - - /** - * @dev See {IERC20-transferFrom}. - * - * Emits an {Approval} event indicating the updated allowance. This is not - * required by the EIP. See the note at the beginning of {ERC20}. - * - * NOTE: Does not update the allowance if the current allowance - * is the maximum `uint256`. - * - * Requirements: - * - * - `from` and `to` cannot be the zero address. - * - `from` must have a balance of at least `amount`. - * - the caller must have allowance for ``from``'s tokens of at least - * `amount`. - */ - function transferFrom( - address from, - address to, - uint256 amount - ) public virtual override returns (bool) { - address spender = _msgSender(); - _spendAllowance(from, spender, amount); - _transfer(from, to, amount); - return true; - } - - /** - * @dev Atomically increases the allowance granted to `spender` by the caller. - * - * This is an alternative to {approve} that can be used as a mitigation for - * problems described in {IERC20-approve}. - * - * Emits an {Approval} event indicating the updated allowance. - * - * Requirements: - * - * - `spender` cannot be the zero address. - */ - function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { - address owner = _msgSender(); - _approve(owner, spender, allowance(owner, spender) + addedValue); - return true; - } - - /** - * @dev Atomically decreases the allowance granted to `spender` by the caller. - * - * This is an alternative to {approve} that can be used as a mitigation for - * problems described in {IERC20-approve}. - * - * Emits an {Approval} event indicating the updated allowance. - * - * Requirements: - * - * - `spender` cannot be the zero address. - * - `spender` must have allowance for the caller of at least - * `subtractedValue`. - */ - function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { - address owner = _msgSender(); - uint256 currentAllowance = allowance(owner, spender); - require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); - unchecked { - _approve(owner, spender, currentAllowance - subtractedValue); - } - - return true; - } - - /** - * @dev Moves `amount` of tokens from `sender` to `recipient`. - * - * This internal function is equivalent to {transfer}, and can be used to - * e.g. implement automatic token fees, slashing mechanisms, etc. - * - * Emits a {Transfer} event. - * - * Requirements: - * - * - `from` cannot be the zero address. - * - `to` cannot be the zero address. - * - `from` must have a balance of at least `amount`. - */ - function _transfer( - address from, - address to, - uint256 amount - ) internal virtual { - require(from != address(0), "ERC20: transfer from the zero address"); - require(to != address(0), "ERC20: transfer to the zero address"); - - _beforeTokenTransfer(from, to, amount); - - uint256 fromBalance = _balances[from]; - require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); - unchecked { - _balances[from] = fromBalance - amount; - } - _balances[to] += amount; - - emit Transfer(from, to, amount); - - _afterTokenTransfer(from, to, amount); - } - - /** @dev Creates `amount` tokens and assigns them to `account`, increasing - * the total supply. - * - * Emits a {Transfer} event with `from` set to the zero address. - * - * Requirements: - * - * - `account` cannot be the zero address. - */ - function _mint(address account, uint256 amount) internal virtual { - require(account != address(0), "ERC20: mint to the zero address"); - - _beforeTokenTransfer(address(0), account, amount); - - _totalSupply += amount; - _balances[account] += amount; - emit Transfer(address(0), account, amount); - - _afterTokenTransfer(address(0), account, amount); - } - - /** - * @dev Destroys `amount` tokens from `account`, reducing the - * total supply. - * - * Emits a {Transfer} event with `to` set to the zero address. - * - * Requirements: - * - * - `account` cannot be the zero address. - * - `account` must have at least `amount` tokens. - */ - function _burn(address account, uint256 amount) internal virtual { - require(account != address(0), "ERC20: burn from the zero address"); - - _beforeTokenTransfer(account, address(0), amount); - - uint256 accountBalance = _balances[account]; - require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); - unchecked { - _balances[account] = accountBalance - amount; - } - _totalSupply -= amount; - - emit Transfer(account, address(0), amount); - - _afterTokenTransfer(account, address(0), amount); - } - - /** - * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. - * - * This internal function is equivalent to `approve`, and can be used to - * e.g. set automatic allowances for certain subsystems, etc. - * - * Emits an {Approval} event. - * - * Requirements: - * - * - `owner` cannot be the zero address. - * - `spender` cannot be the zero address. - */ - function _approve( - address owner, - address spender, - uint256 amount - ) internal virtual { - require(owner != address(0), "ERC20: approve from the zero address"); - require(spender != address(0), "ERC20: approve to the zero address"); - - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @dev Updates `owner` s allowance for `spender` based on spent `amount`. - * - * Does not update the allowance amount in case of infinite allowance. - * Revert if not enough allowance is available. - * - * Might emit an {Approval} event. - */ - function _spendAllowance( - address owner, - address spender, - uint256 amount - ) internal virtual { - uint256 currentAllowance = allowance(owner, spender); - if (currentAllowance != type(uint256).max) { - require(currentAllowance >= amount, "ERC20: insufficient allowance"); - unchecked { - _approve(owner, spender, currentAllowance - amount); - } - } - } - - /** - * @dev Hook that is called before any transfer of tokens. This includes - * minting and burning. - * - * Calling conditions: - * - * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens - * will be transferred to `to`. - * - when `from` is zero, `amount` tokens will be minted for `to`. - * - when `to` is zero, `amount` of ``from``'s tokens will be burned. - * - `from` and `to` are never both zero. - * - * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. - */ - function _beforeTokenTransfer( - address from, - address to, - uint256 amount - ) internal virtual {} - - /** - * @dev Hook that is called after any transfer of tokens. This includes - * minting and burning. - * - * Calling conditions: - * - * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens - * has been transferred to `to`. - * - when `from` is zero, `amount` tokens have been minted for `to`. - * - when `to` is zero, `amount` of ``from``'s tokens have been burned. - * - `from` and `to` are never both zero. - * - * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. - */ - function _afterTokenTransfer( - address from, - address to, - uint256 amount - ) internal virtual {} -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol deleted file mode 100644 index f0ede8a..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol +++ /dev/null @@ -1,82 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); - - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `to`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address to, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `from` to `to` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom( - address from, - address to, - uint256 amount - ) external returns (bool); -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/README.adoc b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/README.adoc deleted file mode 100644 index df20c17..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/README.adoc +++ /dev/null @@ -1,83 +0,0 @@ -= ERC 20 - -[.readme-notice] -NOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/token/erc20 - -This set of interfaces, contracts, and utilities are all related to the https://eips.ethereum.org/EIPS/eip-20[ERC20 Token Standard]. - -TIP: For an overview of ERC20 tokens and a walk through on how to create a token contract read our xref:ROOT:erc20.adoc[ERC20 guide]. - -There are a few core contracts that implement the behavior specified in the EIP: - -* {IERC20}: the interface all ERC20 implementations should conform to. -* {IERC20Metadata}: the extended ERC20 interface including the <>, <> and <> functions. -* {ERC20}: the implementation of the ERC20 interface, including the <>, <> and <> optional standard extension to the base interface. - -Additionally there are multiple custom extensions, including: - -* {ERC20Burnable}: destruction of own tokens. -* {ERC20Capped}: enforcement of a cap to the total supply when minting tokens. -* {ERC20Pausable}: ability to pause token transfers. -* {ERC20Snapshot}: efficient storage of past token balances to be later queried at any point in time. -* {ERC20Permit}: gasless approval of tokens (standardized as ERC2612). -* {ERC20FlashMint}: token level support for flash loans through the minting and burning of ephemeral tokens (standardized as ERC3156). -* {ERC20Votes}: support for voting and vote delegation. -* {ERC20VotesComp}: support for voting and vote delegation (compatible with Compound's token, with uint96 restrictions). -* {ERC20Wrapper}: wrapper to create an ERC20 backed by another ERC20, with deposit and withdraw methods. Useful in conjunction with {ERC20Votes}. - -Finally, there are some utilities to interact with ERC20 contracts in various ways. - -* {SafeERC20}: a wrapper around the interface that eliminates the need to handle boolean return values. -* {TokenTimelock}: hold tokens for a beneficiary until a specified time. - -The following related EIPs are in draft status. - -- {ERC20Permit} - -NOTE: This core set of contracts is designed to be unopinionated, allowing developers to access the internal functions in ERC20 (such as <>) and expose them as external functions in the way they prefer. On the other hand, xref:ROOT:erc20.adoc#Presets[ERC20 Presets] (such as {ERC20PresetMinterPauser}) are designed using opinionated patterns to provide developers with ready to use, deployable contracts. - -== Core - -{{IERC20}} - -{{IERC20Metadata}} - -{{ERC20}} - -== Extensions - -{{ERC20Burnable}} - -{{ERC20Capped}} - -{{ERC20Pausable}} - -{{ERC20Snapshot}} - -{{ERC20Votes}} - -{{ERC20VotesComp}} - -{{ERC20Wrapper}} - -{{ERC20FlashMint}} - -== Draft EIPs - -The following EIPs are still in Draft status. Due to their nature as drafts, the details of these contracts may change and we cannot guarantee their xref:ROOT:releases-stability.adoc[stability]. Minor releases of OpenZeppelin Contracts may contain breaking changes for the contracts in this directory, which will be duly announced in the https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/CHANGELOG.md[changelog]. The EIPs included here are used by projects in production and this may make them less likely to change significantly. - -{{ERC20Permit}} - -== Presets - -These contracts are preconfigured combinations of the above features. They can be used through inheritance or as models to copy and paste their source code. - -{{ERC20PresetMinterPauser}} - -{{ERC20PresetFixedSupply}} - -== Utilities - -{{SafeERC20}} - -{{TokenTimelock}} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Burnable.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Burnable.sol deleted file mode 100644 index 1cd08ee..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Burnable.sol +++ /dev/null @@ -1,39 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol) - -pragma solidity ^0.8.0; - -import "../ERC20.sol"; -import "../../../utils/Context.sol"; - -/** - * @dev Extension of {ERC20} that allows token holders to destroy both their own - * tokens and those that they have an allowance for, in a way that can be - * recognized off-chain (via event analysis). - */ -abstract contract ERC20Burnable is Context, ERC20 { - /** - * @dev Destroys `amount` tokens from the caller. - * - * See {ERC20-_burn}. - */ - function burn(uint256 amount) public virtual { - _burn(_msgSender(), amount); - } - - /** - * @dev Destroys `amount` tokens from `account`, deducting from the caller's - * allowance. - * - * See {ERC20-_burn} and {ERC20-allowance}. - * - * Requirements: - * - * - the caller must have allowance for ``accounts``'s tokens of at least - * `amount`. - */ - function burnFrom(address account, uint256 amount) public virtual { - _spendAllowance(account, _msgSender(), amount); - _burn(account, amount); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Capped.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Capped.sol deleted file mode 100644 index 16f830d..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Capped.sol +++ /dev/null @@ -1,37 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/ERC20Capped.sol) - -pragma solidity ^0.8.0; - -import "../ERC20.sol"; - -/** - * @dev Extension of {ERC20} that adds a cap to the supply of tokens. - */ -abstract contract ERC20Capped is ERC20 { - uint256 private immutable _cap; - - /** - * @dev Sets the value of the `cap`. This value is immutable, it can only be - * set once during construction. - */ - constructor(uint256 cap_) { - require(cap_ > 0, "ERC20Capped: cap is 0"); - _cap = cap_; - } - - /** - * @dev Returns the cap on the token's total supply. - */ - function cap() public view virtual returns (uint256) { - return _cap; - } - - /** - * @dev See {ERC20-_mint}. - */ - function _mint(address account, uint256 amount) internal virtual override { - require(ERC20.totalSupply() + amount <= cap(), "ERC20Capped: cap exceeded"); - super._mint(account, amount); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20FlashMint.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20FlashMint.sol deleted file mode 100644 index 3d526c2..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20FlashMint.sol +++ /dev/null @@ -1,80 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20FlashMint.sol) - -pragma solidity ^0.8.0; - -import "../../../interfaces/IERC3156FlashBorrower.sol"; -import "../../../interfaces/IERC3156FlashLender.sol"; -import "../ERC20.sol"; - -/** - * @dev Implementation of the ERC3156 Flash loans extension, as defined in - * https://eips.ethereum.org/EIPS/eip-3156[ERC-3156]. - * - * Adds the {flashLoan} method, which provides flash loan support at the token - * level. By default there is no fee, but this can be changed by overriding {flashFee}. - * - * _Available since v4.1._ - */ -abstract contract ERC20FlashMint is ERC20, IERC3156FlashLender { - bytes32 private constant _RETURN_VALUE = keccak256("ERC3156FlashBorrower.onFlashLoan"); - - /** - * @dev Returns the maximum amount of tokens available for loan. - * @param token The address of the token that is requested. - * @return The amount of token that can be loaned. - */ - function maxFlashLoan(address token) public view virtual override returns (uint256) { - return token == address(this) ? type(uint256).max - ERC20.totalSupply() : 0; - } - - /** - * @dev Returns the fee applied when doing flash loans. By default this - * implementation has 0 fees. This function can be overloaded to make - * the flash loan mechanism deflationary. - * @param token The token to be flash loaned. - * @param amount The amount of tokens to be loaned. - * @return The fees applied to the corresponding flash loan. - */ - function flashFee(address token, uint256 amount) public view virtual override returns (uint256) { - require(token == address(this), "ERC20FlashMint: wrong token"); - // silence warning about unused variable without the addition of bytecode. - amount; - return 0; - } - - /** - * @dev Performs a flash loan. New tokens are minted and sent to the - * `receiver`, who is required to implement the {IERC3156FlashBorrower} - * interface. By the end of the flash loan, the receiver is expected to own - * amount + fee tokens and have them approved back to the token contract itself so - * they can be burned. - * @param receiver The receiver of the flash loan. Should implement the - * {IERC3156FlashBorrower.onFlashLoan} interface. - * @param token The token to be flash loaned. Only `address(this)` is - * supported. - * @param amount The amount of tokens to be loaned. - * @param data An arbitrary datafield that is passed to the receiver. - * @return `true` if the flash loan was successful. - */ - // This function can reenter, but it doesn't pose a risk because it always preserves the property that the amount - // minted at the beginning is always recovered and burned at the end, or else the entire function will revert. - // slither-disable-next-line reentrancy-no-eth - function flashLoan( - IERC3156FlashBorrower receiver, - address token, - uint256 amount, - bytes calldata data - ) public virtual override returns (bool) { - require(amount <= maxFlashLoan(token), "ERC20FlashMint: amount exceeds maxFlashLoan"); - uint256 fee = flashFee(token, amount); - _mint(address(receiver), amount); - require( - receiver.onFlashLoan(msg.sender, token, amount, fee, data) == _RETURN_VALUE, - "ERC20FlashMint: invalid return value" - ); - _spendAllowance(address(receiver), address(this), amount + fee); - _burn(address(receiver), amount + fee); - return true; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Pausable.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Pausable.sol deleted file mode 100644 index e448e96..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Pausable.sol +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/ERC20Pausable.sol) - -pragma solidity ^0.8.0; - -import "../ERC20.sol"; -import "../../../security/Pausable.sol"; - -/** - * @dev ERC20 token with pausable token transfers, minting and burning. - * - * Useful for scenarios such as preventing trades until the end of an evaluation - * period, or having an emergency switch for freezing all token transfers in the - * event of a large bug. - */ -abstract contract ERC20Pausable is ERC20, Pausable { - /** - * @dev See {ERC20-_beforeTokenTransfer}. - * - * Requirements: - * - * - the contract must not be paused. - */ - function _beforeTokenTransfer( - address from, - address to, - uint256 amount - ) internal virtual override { - super._beforeTokenTransfer(from, to, amount); - - require(!paused(), "ERC20Pausable: token transfer while paused"); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Snapshot.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Snapshot.sol deleted file mode 100644 index 6f59666..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Snapshot.sol +++ /dev/null @@ -1,195 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/ERC20Snapshot.sol) - -pragma solidity ^0.8.0; - -import "../ERC20.sol"; -import "../../../utils/Arrays.sol"; -import "../../../utils/Counters.sol"; - -/** - * @dev This contract extends an ERC20 token with a snapshot mechanism. When a snapshot is created, the balances and - * total supply at the time are recorded for later access. - * - * This can be used to safely create mechanisms based on token balances such as trustless dividends or weighted voting. - * In naive implementations it's possible to perform a "double spend" attack by reusing the same balance from different - * accounts. By using snapshots to calculate dividends or voting power, those attacks no longer apply. It can also be - * used to create an efficient ERC20 forking mechanism. - * - * Snapshots are created by the internal {_snapshot} function, which will emit the {Snapshot} event and return a - * snapshot id. To get the total supply at the time of a snapshot, call the function {totalSupplyAt} with the snapshot - * id. To get the balance of an account at the time of a snapshot, call the {balanceOfAt} function with the snapshot id - * and the account address. - * - * NOTE: Snapshot policy can be customized by overriding the {_getCurrentSnapshotId} method. For example, having it - * return `block.number` will trigger the creation of snapshot at the beginning of each new block. When overriding this - * function, be careful about the monotonicity of its result. Non-monotonic snapshot ids will break the contract. - * - * Implementing snapshots for every block using this method will incur significant gas costs. For a gas-efficient - * alternative consider {ERC20Votes}. - * - * ==== Gas Costs - * - * Snapshots are efficient. Snapshot creation is _O(1)_. Retrieval of balances or total supply from a snapshot is _O(log - * n)_ in the number of snapshots that have been created, although _n_ for a specific account will generally be much - * smaller since identical balances in subsequent snapshots are stored as a single entry. - * - * There is a constant overhead for normal ERC20 transfers due to the additional snapshot bookkeeping. This overhead is - * only significant for the first transfer that immediately follows a snapshot for a particular account. Subsequent - * transfers will have normal cost until the next snapshot, and so on. - */ - -abstract contract ERC20Snapshot is ERC20 { - // Inspired by Jordi Baylina's MiniMeToken to record historical balances: - // https://github.com/Giveth/minimd/blob/ea04d950eea153a04c51fa510b068b9dded390cb/contracts/MiniMeToken.sol - - using Arrays for uint256[]; - using Counters for Counters.Counter; - - // Snapshotted values have arrays of ids and the value corresponding to that id. These could be an array of a - // Snapshot struct, but that would impede usage of functions that work on an array. - struct Snapshots { - uint256[] ids; - uint256[] values; - } - - mapping(address => Snapshots) private _accountBalanceSnapshots; - Snapshots private _totalSupplySnapshots; - - // Snapshot ids increase monotonically, with the first value being 1. An id of 0 is invalid. - Counters.Counter private _currentSnapshotId; - - /** - * @dev Emitted by {_snapshot} when a snapshot identified by `id` is created. - */ - event Snapshot(uint256 id); - - /** - * @dev Creates a new snapshot and returns its snapshot id. - * - * Emits a {Snapshot} event that contains the same id. - * - * {_snapshot} is `internal` and you have to decide how to expose it externally. Its usage may be restricted to a - * set of accounts, for example using {AccessControl}, or it may be open to the public. - * - * [WARNING] - * ==== - * While an open way of calling {_snapshot} is required for certain trust minimization mechanisms such as forking, - * you must consider that it can potentially be used by attackers in two ways. - * - * First, it can be used to increase the cost of retrieval of values from snapshots, although it will grow - * logarithmically thus rendering this attack ineffective in the long term. Second, it can be used to target - * specific accounts and increase the cost of ERC20 transfers for them, in the ways specified in the Gas Costs - * section above. - * - * We haven't measured the actual numbers; if this is something you're interested in please reach out to us. - * ==== - */ - function _snapshot() internal virtual returns (uint256) { - _currentSnapshotId.increment(); - - uint256 currentId = _getCurrentSnapshotId(); - emit Snapshot(currentId); - return currentId; - } - - /** - * @dev Get the current snapshotId - */ - function _getCurrentSnapshotId() internal view virtual returns (uint256) { - return _currentSnapshotId.current(); - } - - /** - * @dev Retrieves the balance of `account` at the time `snapshotId` was created. - */ - function balanceOfAt(address account, uint256 snapshotId) public view virtual returns (uint256) { - (bool snapshotted, uint256 value) = _valueAt(snapshotId, _accountBalanceSnapshots[account]); - - return snapshotted ? value : balanceOf(account); - } - - /** - * @dev Retrieves the total supply at the time `snapshotId` was created. - */ - function totalSupplyAt(uint256 snapshotId) public view virtual returns (uint256) { - (bool snapshotted, uint256 value) = _valueAt(snapshotId, _totalSupplySnapshots); - - return snapshotted ? value : totalSupply(); - } - - // Update balance and/or total supply snapshots before the values are modified. This is implemented - // in the _beforeTokenTransfer hook, which is executed for _mint, _burn, and _transfer operations. - function _beforeTokenTransfer( - address from, - address to, - uint256 amount - ) internal virtual override { - super._beforeTokenTransfer(from, to, amount); - - if (from == address(0)) { - // mint - _updateAccountSnapshot(to); - _updateTotalSupplySnapshot(); - } else if (to == address(0)) { - // burn - _updateAccountSnapshot(from); - _updateTotalSupplySnapshot(); - } else { - // transfer - _updateAccountSnapshot(from); - _updateAccountSnapshot(to); - } - } - - function _valueAt(uint256 snapshotId, Snapshots storage snapshots) private view returns (bool, uint256) { - require(snapshotId > 0, "ERC20Snapshot: id is 0"); - require(snapshotId <= _getCurrentSnapshotId(), "ERC20Snapshot: nonexistent id"); - - // When a valid snapshot is queried, there are three possibilities: - // a) The queried value was not modified after the snapshot was taken. Therefore, a snapshot entry was never - // created for this id, and all stored snapshot ids are smaller than the requested one. The value that corresponds - // to this id is the current one. - // b) The queried value was modified after the snapshot was taken. Therefore, there will be an entry with the - // requested id, and its value is the one to return. - // c) More snapshots were created after the requested one, and the queried value was later modified. There will be - // no entry for the requested id: the value that corresponds to it is that of the smallest snapshot id that is - // larger than the requested one. - // - // In summary, we need to find an element in an array, returning the index of the smallest value that is larger if - // it is not found, unless said value doesn't exist (e.g. when all values are smaller). Arrays.findUpperBound does - // exactly this. - - uint256 index = snapshots.ids.findUpperBound(snapshotId); - - if (index == snapshots.ids.length) { - return (false, 0); - } else { - return (true, snapshots.values[index]); - } - } - - function _updateAccountSnapshot(address account) private { - _updateSnapshot(_accountBalanceSnapshots[account], balanceOf(account)); - } - - function _updateTotalSupplySnapshot() private { - _updateSnapshot(_totalSupplySnapshots, totalSupply()); - } - - function _updateSnapshot(Snapshots storage snapshots, uint256 currentValue) private { - uint256 currentId = _getCurrentSnapshotId(); - if (_lastSnapshotId(snapshots.ids) < currentId) { - snapshots.ids.push(currentId); - snapshots.values.push(currentValue); - } - } - - function _lastSnapshotId(uint256[] storage ids) private view returns (uint256) { - if (ids.length == 0) { - return 0; - } else { - return ids[ids.length - 1]; - } - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Votes.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Votes.sol deleted file mode 100644 index c0e88bc..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Votes.sol +++ /dev/null @@ -1,249 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Votes.sol) - -pragma solidity ^0.8.0; - -import "./draft-ERC20Permit.sol"; -import "../../../utils/math/Math.sol"; -import "../../../governance/utils/IVotes.sol"; -import "../../../utils/math/SafeCast.sol"; -import "../../../utils/cryptography/ECDSA.sol"; - -/** - * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's, - * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1. - * - * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module. - * - * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either - * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting - * power can be queried through the public accessors {getVotes} and {getPastVotes}. - * - * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it - * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked. - * - * _Available since v4.2._ - */ -abstract contract ERC20Votes is IVotes, ERC20Permit { - struct Checkpoint { - uint32 fromBlock; - uint224 votes; - } - - bytes32 private constant _DELEGATION_TYPEHASH = - keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); - - mapping(address => address) private _delegates; - mapping(address => Checkpoint[]) private _checkpoints; - Checkpoint[] private _totalSupplyCheckpoints; - - /** - * @dev Get the `pos`-th checkpoint for `account`. - */ - function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) { - return _checkpoints[account][pos]; - } - - /** - * @dev Get number of checkpoints for `account`. - */ - function numCheckpoints(address account) public view virtual returns (uint32) { - return SafeCast.toUint32(_checkpoints[account].length); - } - - /** - * @dev Get the address `account` is currently delegating to. - */ - function delegates(address account) public view virtual override returns (address) { - return _delegates[account]; - } - - /** - * @dev Gets the current votes balance for `account` - */ - function getVotes(address account) public view virtual override returns (uint256) { - uint256 pos = _checkpoints[account].length; - return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes; - } - - /** - * @dev Retrieve the number of votes for `account` at the end of `blockNumber`. - * - * Requirements: - * - * - `blockNumber` must have been already mined - */ - function getPastVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) { - require(blockNumber < block.number, "ERC20Votes: block not yet mined"); - return _checkpointsLookup(_checkpoints[account], blockNumber); - } - - /** - * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances. - * It is but NOT the sum of all the delegated votes! - * - * Requirements: - * - * - `blockNumber` must have been already mined - */ - function getPastTotalSupply(uint256 blockNumber) public view virtual override returns (uint256) { - require(blockNumber < block.number, "ERC20Votes: block not yet mined"); - return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber); - } - - /** - * @dev Lookup a value in a list of (sorted) checkpoints. - */ - function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) { - // We run a binary search to look for the earliest checkpoint taken after `blockNumber`. - // - // During the loop, the index of the wanted checkpoint remains in the range [low-1, high). - // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant. - // - If the middle checkpoint is after `blockNumber`, we look in [low, mid) - // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high) - // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not - // out of bounds (in which case we're looking too far in the past and the result is 0). - // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is - // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out - // the same. - uint256 high = ckpts.length; - uint256 low = 0; - while (low < high) { - uint256 mid = Math.average(low, high); - if (ckpts[mid].fromBlock > blockNumber) { - high = mid; - } else { - low = mid + 1; - } - } - - return high == 0 ? 0 : ckpts[high - 1].votes; - } - - /** - * @dev Delegate votes from the sender to `delegatee`. - */ - function delegate(address delegatee) public virtual override { - _delegate(_msgSender(), delegatee); - } - - /** - * @dev Delegates votes from signer to `delegatee` - */ - function delegateBySig( - address delegatee, - uint256 nonce, - uint256 expiry, - uint8 v, - bytes32 r, - bytes32 s - ) public virtual override { - require(block.timestamp <= expiry, "ERC20Votes: signature expired"); - address signer = ECDSA.recover( - _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))), - v, - r, - s - ); - require(nonce == _useNonce(signer), "ERC20Votes: invalid nonce"); - _delegate(signer, delegatee); - } - - /** - * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1). - */ - function _maxSupply() internal view virtual returns (uint224) { - return type(uint224).max; - } - - /** - * @dev Snapshots the totalSupply after it has been increased. - */ - function _mint(address account, uint256 amount) internal virtual override { - super._mint(account, amount); - require(totalSupply() <= _maxSupply(), "ERC20Votes: total supply risks overflowing votes"); - - _writeCheckpoint(_totalSupplyCheckpoints, _add, amount); - } - - /** - * @dev Snapshots the totalSupply after it has been decreased. - */ - function _burn(address account, uint256 amount) internal virtual override { - super._burn(account, amount); - - _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount); - } - - /** - * @dev Move voting power when tokens are transferred. - * - * Emits a {DelegateVotesChanged} event. - */ - function _afterTokenTransfer( - address from, - address to, - uint256 amount - ) internal virtual override { - super._afterTokenTransfer(from, to, amount); - - _moveVotingPower(delegates(from), delegates(to), amount); - } - - /** - * @dev Change delegation for `delegator` to `delegatee`. - * - * Emits events {DelegateChanged} and {DelegateVotesChanged}. - */ - function _delegate(address delegator, address delegatee) internal virtual { - address currentDelegate = delegates(delegator); - uint256 delegatorBalance = balanceOf(delegator); - _delegates[delegator] = delegatee; - - emit DelegateChanged(delegator, currentDelegate, delegatee); - - _moveVotingPower(currentDelegate, delegatee, delegatorBalance); - } - - function _moveVotingPower( - address src, - address dst, - uint256 amount - ) private { - if (src != dst && amount > 0) { - if (src != address(0)) { - (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount); - emit DelegateVotesChanged(src, oldWeight, newWeight); - } - - if (dst != address(0)) { - (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount); - emit DelegateVotesChanged(dst, oldWeight, newWeight); - } - } - } - - function _writeCheckpoint( - Checkpoint[] storage ckpts, - function(uint256, uint256) view returns (uint256) op, - uint256 delta - ) private returns (uint256 oldWeight, uint256 newWeight) { - uint256 pos = ckpts.length; - oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes; - newWeight = op(oldWeight, delta); - - if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) { - ckpts[pos - 1].votes = SafeCast.toUint224(newWeight); - } else { - ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)})); - } - } - - function _add(uint256 a, uint256 b) private pure returns (uint256) { - return a + b; - } - - function _subtract(uint256 a, uint256 b) private pure returns (uint256) { - return a - b; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20VotesComp.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20VotesComp.sol deleted file mode 100644 index 0461310..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20VotesComp.sol +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20VotesComp.sol) - -pragma solidity ^0.8.0; - -import "./ERC20Votes.sol"; - -/** - * @dev Extension of ERC20 to support Compound's voting and delegation. This version exactly matches Compound's - * interface, with the drawback of only supporting supply up to (2^96^ - 1). - * - * NOTE: You should use this contract if you need exact compatibility with COMP (for example in order to use your token - * with Governor Alpha or Bravo) and if you are sure the supply cap of 2^96^ is enough for you. Otherwise, use the - * {ERC20Votes} variant of this module. - * - * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either - * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting - * power can be queried through the public accessors {getCurrentVotes} and {getPriorVotes}. - * - * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it - * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked. - * - * _Available since v4.2._ - */ -abstract contract ERC20VotesComp is ERC20Votes { - /** - * @dev Comp version of the {getVotes} accessor, with `uint96` return type. - */ - function getCurrentVotes(address account) external view virtual returns (uint96) { - return SafeCast.toUint96(getVotes(account)); - } - - /** - * @dev Comp version of the {getPastVotes} accessor, with `uint96` return type. - */ - function getPriorVotes(address account, uint256 blockNumber) external view virtual returns (uint96) { - return SafeCast.toUint96(getPastVotes(account, blockNumber)); - } - - /** - * @dev Maximum token supply. Reduced to `type(uint96).max` (2^96^ - 1) to fit COMP interface. - */ - function _maxSupply() internal view virtual override returns (uint224) { - return type(uint96).max; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Wrapper.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Wrapper.sol deleted file mode 100644 index c6dd018..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Wrapper.sol +++ /dev/null @@ -1,63 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/ERC20Wrapper.sol) - -pragma solidity ^0.8.0; - -import "../ERC20.sol"; -import "../utils/SafeERC20.sol"; - -/** - * @dev Extension of the ERC20 token contract to support token wrapping. - * - * Users can deposit and withdraw "underlying tokens" and receive a matching number of "wrapped tokens". This is useful - * in conjunction with other modules. For example, combining this wrapping mechanism with {ERC20Votes} will allow the - * wrapping of an existing "basic" ERC20 into a governance token. - * - * _Available since v4.2._ - */ -abstract contract ERC20Wrapper is ERC20 { - IERC20 public immutable underlying; - - constructor(IERC20 underlyingToken) { - underlying = underlyingToken; - } - - /** - * @dev See {ERC20-decimals}. - */ - function decimals() public view virtual override returns (uint8) { - try IERC20Metadata(address(underlying)).decimals() returns (uint8 value) { - return value; - } catch { - return super.decimals(); - } - } - - /** - * @dev Allow a user to deposit underlying tokens and mint the corresponding number of wrapped tokens. - */ - function depositFor(address account, uint256 amount) public virtual returns (bool) { - SafeERC20.safeTransferFrom(underlying, _msgSender(), address(this), amount); - _mint(account, amount); - return true; - } - - /** - * @dev Allow a user to burn a number of wrapped tokens and withdraw the corresponding number of underlying tokens. - */ - function withdrawTo(address account, uint256 amount) public virtual returns (bool) { - _burn(_msgSender(), amount); - SafeERC20.safeTransfer(underlying, account, amount); - return true; - } - - /** - * @dev Mint wrapped token to cover any underlyingTokens that would have been transferred by mistake. Internal - * function that can be exposed with access control if desired. - */ - function _recover(address account) internal virtual returns (uint256) { - uint256 value = underlying.balanceOf(address(this)) - totalSupply(); - _mint(account, value); - return value; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol deleted file mode 100644 index 83ba6ac..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) - -pragma solidity ^0.8.0; - -import "../IERC20.sol"; - -/** - * @dev Interface for the optional metadata functions from the ERC20 standard. - * - * _Available since v4.1._ - */ -interface IERC20Metadata is IERC20 { - /** - * @dev Returns the name of the token. - */ - function name() external view returns (string memory); - - /** - * @dev Returns the symbol of the token. - */ - function symbol() external view returns (string memory); - - /** - * @dev Returns the decimals places of the token. - */ - function decimals() external view returns (uint8); -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/draft-ERC20Permit.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/draft-ERC20Permit.sol deleted file mode 100644 index 55172f6..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/draft-ERC20Permit.sol +++ /dev/null @@ -1,95 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-ERC20Permit.sol) - -pragma solidity ^0.8.0; - -import "./draft-IERC20Permit.sol"; -import "../ERC20.sol"; -import "../../../utils/cryptography/draft-EIP712.sol"; -import "../../../utils/cryptography/ECDSA.sol"; -import "../../../utils/Counters.sol"; - -/** - * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in - * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. - * - * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by - * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't - * need to send a transaction, and thus is not required to hold Ether at all. - * - * _Available since v3.4._ - */ -abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 { - using Counters for Counters.Counter; - - mapping(address => Counters.Counter) private _nonces; - - // solhint-disable-next-line var-name-mixedcase - bytes32 private constant _PERMIT_TYPEHASH = - keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); - /** - * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`. - * However, to ensure consistency with the upgradeable transpiler, we will continue - * to reserve a slot. - * @custom:oz-renamed-from _PERMIT_TYPEHASH - */ - // solhint-disable-next-line var-name-mixedcase - bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT; - - /** - * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`. - * - * It's a good idea to use the same `name` that is defined as the ERC20 token name. - */ - constructor(string memory name) EIP712(name, "1") {} - - /** - * @dev See {IERC20Permit-permit}. - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) public virtual override { - require(block.timestamp <= deadline, "ERC20Permit: expired deadline"); - - bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline)); - - bytes32 hash = _hashTypedDataV4(structHash); - - address signer = ECDSA.recover(hash, v, r, s); - require(signer == owner, "ERC20Permit: invalid signature"); - - _approve(owner, spender, value); - } - - /** - * @dev See {IERC20Permit-nonces}. - */ - function nonces(address owner) public view virtual override returns (uint256) { - return _nonces[owner].current(); - } - - /** - * @dev See {IERC20Permit-DOMAIN_SEPARATOR}. - */ - // solhint-disable-next-line func-name-mixedcase - function DOMAIN_SEPARATOR() external view override returns (bytes32) { - return _domainSeparatorV4(); - } - - /** - * @dev "Consume a nonce": return the current value and increment. - * - * _Available since v4.1._ - */ - function _useNonce(address owner) internal virtual returns (uint256 current) { - Counters.Counter storage nonce = _nonces[owner]; - current = nonce.current(); - nonce.increment(); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/draft-IERC20Permit.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/draft-IERC20Permit.sol deleted file mode 100644 index 6363b14..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/draft-IERC20Permit.sol +++ /dev/null @@ -1,60 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in - * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. - * - * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by - * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't - * need to send a transaction, and thus is not required to hold Ether at all. - */ -interface IERC20Permit { - /** - * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, - * given ``owner``'s signed approval. - * - * IMPORTANT: The same issues {IERC20-approve} has related to transaction - * ordering also apply here. - * - * Emits an {Approval} event. - * - * Requirements: - * - * - `spender` cannot be the zero address. - * - `deadline` must be a timestamp in the future. - * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` - * over the EIP712-formatted function arguments. - * - the signature must use ``owner``'s current nonce (see {nonces}). - * - * For more information on the signature format, see the - * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP - * section]. - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @dev Returns the current nonce for `owner`. This value must be - * included whenever a signature is generated for {permit}. - * - * Every successful call to {permit} increases ``owner``'s nonce by one. This - * prevents a signature from being used multiple times. - */ - function nonces(address owner) external view returns (uint256); - - /** - * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. - */ - // solhint-disable-next-line func-name-mixedcase - function DOMAIN_SEPARATOR() external view returns (bytes32); -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol deleted file mode 100644 index 52afef3..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol +++ /dev/null @@ -1,35 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/presets/ERC20PresetFixedSupply.sol) -pragma solidity ^0.8.0; - -import "../extensions/ERC20Burnable.sol"; - -/** - * @dev {ERC20} token, including: - * - * - Preminted initial supply - * - Ability for holders to burn (destroy) their tokens - * - No access control mechanism (for minting/pausing) and hence no governance - * - * This contract uses {ERC20Burnable} to include burn capabilities - head to - * its documentation for details. - * - * _Available since v3.4._ - * - * _Deprecated in favor of https://wizard.openzeppelin.com/[Contracts Wizard]._ - */ -contract ERC20PresetFixedSupply is ERC20Burnable { - /** - * @dev Mints `initialSupply` amount of token and transfers them to `owner`. - * - * See {ERC20-constructor}. - */ - constructor( - string memory name, - string memory symbol, - uint256 initialSupply, - address owner - ) ERC20(name, symbol) { - _mint(owner, initialSupply); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/presets/ERC20PresetMinterPauser.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/presets/ERC20PresetMinterPauser.sol deleted file mode 100644 index e711a89..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/presets/ERC20PresetMinterPauser.sol +++ /dev/null @@ -1,94 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/presets/ERC20PresetMinterPauser.sol) - -pragma solidity ^0.8.0; - -import "../ERC20.sol"; -import "../extensions/ERC20Burnable.sol"; -import "../extensions/ERC20Pausable.sol"; -import "../../../access/AccessControlEnumerable.sol"; -import "../../../utils/Context.sol"; - -/** - * @dev {ERC20} token, including: - * - * - ability for holders to burn (destroy) their tokens - * - a minter role that allows for token minting (creation) - * - a pauser role that allows to stop all token transfers - * - * This contract uses {AccessControl} to lock permissioned functions using the - * different roles - head to its documentation for details. - * - * The account that deploys the contract will be granted the minter and pauser - * roles, as well as the default admin role, which will let it grant both minter - * and pauser roles to other accounts. - * - * _Deprecated in favor of https://wizard.openzeppelin.com/[Contracts Wizard]._ - */ -contract ERC20PresetMinterPauser is Context, AccessControlEnumerable, ERC20Burnable, ERC20Pausable { - bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); - bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); - - /** - * @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE` and `PAUSER_ROLE` to the - * account that deploys the contract. - * - * See {ERC20-constructor}. - */ - constructor(string memory name, string memory symbol) ERC20(name, symbol) { - _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); - - _setupRole(MINTER_ROLE, _msgSender()); - _setupRole(PAUSER_ROLE, _msgSender()); - } - - /** - * @dev Creates `amount` new tokens for `to`. - * - * See {ERC20-_mint}. - * - * Requirements: - * - * - the caller must have the `MINTER_ROLE`. - */ - function mint(address to, uint256 amount) public virtual { - require(hasRole(MINTER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have minter role to mint"); - _mint(to, amount); - } - - /** - * @dev Pauses all token transfers. - * - * See {ERC20Pausable} and {Pausable-_pause}. - * - * Requirements: - * - * - the caller must have the `PAUSER_ROLE`. - */ - function pause() public virtual { - require(hasRole(PAUSER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have pauser role to pause"); - _pause(); - } - - /** - * @dev Unpauses all token transfers. - * - * See {ERC20Pausable} and {Pausable-_unpause}. - * - * Requirements: - * - * - the caller must have the `PAUSER_ROLE`. - */ - function unpause() public virtual { - require(hasRole(PAUSER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have pauser role to unpause"); - _unpause(); - } - - function _beforeTokenTransfer( - address from, - address to, - uint256 amount - ) internal virtual override(ERC20, ERC20Pausable) { - super._beforeTokenTransfer(from, to, amount); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/presets/README.md b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/presets/README.md deleted file mode 100644 index 468200b..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/presets/README.md +++ /dev/null @@ -1 +0,0 @@ -Contract presets are now deprecated in favor of [Contracts Wizard](https://wizard.openzeppelin.com/) as a more powerful alternative. diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol deleted file mode 100644 index 5752d93..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol +++ /dev/null @@ -1,99 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) - -pragma solidity ^0.8.0; - -import "../IERC20.sol"; -import "../../../utils/Address.sol"; - -/** - * @title SafeERC20 - * @dev Wrappers around ERC20 operations that throw on failure (when the token - * contract returns false). Tokens that return no value (and instead revert or - * throw on failure) are also supported, non-reverting calls are assumed to be - * successful. - * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, - * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. - */ -library SafeERC20 { - using Address for address; - - function safeTransfer( - IERC20 token, - address to, - uint256 value - ) internal { - _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); - } - - function safeTransferFrom( - IERC20 token, - address from, - address to, - uint256 value - ) internal { - _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); - } - - /** - * @dev Deprecated. This function has issues similar to the ones found in - * {IERC20-approve}, and its usage is discouraged. - * - * Whenever possible, use {safeIncreaseAllowance} and - * {safeDecreaseAllowance} instead. - */ - function safeApprove( - IERC20 token, - address spender, - uint256 value - ) internal { - // safeApprove should only be called when setting an initial allowance, - // or when resetting it to zero. To increase and decrease it, use - // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' - require( - (value == 0) || (token.allowance(address(this), spender) == 0), - "SafeERC20: approve from non-zero to non-zero allowance" - ); - _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); - } - - function safeIncreaseAllowance( - IERC20 token, - address spender, - uint256 value - ) internal { - uint256 newAllowance = token.allowance(address(this), spender) + value; - _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); - } - - function safeDecreaseAllowance( - IERC20 token, - address spender, - uint256 value - ) internal { - unchecked { - uint256 oldAllowance = token.allowance(address(this), spender); - require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); - uint256 newAllowance = oldAllowance - value; - _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); - } - } - - /** - * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement - * on the return value: the return value is optional (but if data is returned, it must not be false). - * @param token The token targeted by the call. - * @param data The call data (encoded using abi.encode or one of its variants). - */ - function _callOptionalReturn(IERC20 token, bytes memory data) private { - // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since - // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that - // the target address contains contract code and also asserts for success in the low-level call. - - bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); - if (returndata.length > 0) { - // Return data is optional - require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); - } - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/utils/TokenTimelock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/utils/TokenTimelock.sol deleted file mode 100644 index d879a7e..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC20/utils/TokenTimelock.sol +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/utils/TokenTimelock.sol) - -pragma solidity ^0.8.0; - -import "./SafeERC20.sol"; - -/** - * @dev A token holder contract that will allow a beneficiary to extract the - * tokens after a given release time. - * - * Useful for simple vesting schedules like "advisors get all of their tokens - * after 1 year". - */ -contract TokenTimelock { - using SafeERC20 for IERC20; - - // ERC20 basic token contract being held - IERC20 private immutable _token; - - // beneficiary of tokens after they are released - address private immutable _beneficiary; - - // timestamp when token release is enabled - uint256 private immutable _releaseTime; - - /** - * @dev Deploys a timelock instance that is able to hold the token specified, and will only release it to - * `beneficiary_` when {release} is invoked after `releaseTime_`. The release time is specified as a Unix timestamp - * (in seconds). - */ - constructor( - IERC20 token_, - address beneficiary_, - uint256 releaseTime_ - ) { - require(releaseTime_ > block.timestamp, "TokenTimelock: release time is before current time"); - _token = token_; - _beneficiary = beneficiary_; - _releaseTime = releaseTime_; - } - - /** - * @dev Returns the token being held. - */ - function token() public view virtual returns (IERC20) { - return _token; - } - - /** - * @dev Returns the beneficiary that will receive the tokens. - */ - function beneficiary() public view virtual returns (address) { - return _beneficiary; - } - - /** - * @dev Returns the time when the tokens are released in seconds since Unix epoch (i.e. Unix timestamp). - */ - function releaseTime() public view virtual returns (uint256) { - return _releaseTime; - } - - /** - * @dev Transfers tokens held by the timelock to the beneficiary. Will only succeed if invoked after the release - * time. - */ - function release() public virtual { - require(block.timestamp >= releaseTime(), "TokenTimelock: current time is before release time"); - - uint256 amount = token().balanceOf(address(this)); - require(amount > 0, "TokenTimelock: no tokens to release"); - - token().safeTransfer(beneficiary(), amount); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol deleted file mode 100644 index b6855f5..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol +++ /dev/null @@ -1,447 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol) - -pragma solidity ^0.8.0; - -import "./IERC721.sol"; -import "./IERC721Receiver.sol"; -import "./extensions/IERC721Metadata.sol"; -import "../../utils/Address.sol"; -import "../../utils/Context.sol"; -import "../../utils/Strings.sol"; -import "../../utils/introspection/ERC165.sol"; - -/** - * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including - * the Metadata extension, but not including the Enumerable extension, which is available separately as - * {ERC721Enumerable}. - */ -contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { - using Address for address; - using Strings for uint256; - - // Token name - string private _name; - - // Token symbol - string private _symbol; - - // Mapping from token ID to owner address - mapping(uint256 => address) private _owners; - - // Mapping owner address to token count - mapping(address => uint256) private _balances; - - // Mapping from token ID to approved address - mapping(uint256 => address) private _tokenApprovals; - - // Mapping from owner to operator approvals - mapping(address => mapping(address => bool)) private _operatorApprovals; - - /** - * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. - */ - constructor(string memory name_, string memory symbol_) { - _name = name_; - _symbol = symbol_; - } - - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { - return - interfaceId == type(IERC721).interfaceId || - interfaceId == type(IERC721Metadata).interfaceId || - super.supportsInterface(interfaceId); - } - - /** - * @dev See {IERC721-balanceOf}. - */ - function balanceOf(address owner) public view virtual override returns (uint256) { - require(owner != address(0), "ERC721: address zero is not a valid owner"); - return _balances[owner]; - } - - /** - * @dev See {IERC721-ownerOf}. - */ - function ownerOf(uint256 tokenId) public view virtual override returns (address) { - address owner = _owners[tokenId]; - require(owner != address(0), "ERC721: owner query for nonexistent token"); - return owner; - } - - /** - * @dev See {IERC721Metadata-name}. - */ - function name() public view virtual override returns (string memory) { - return _name; - } - - /** - * @dev See {IERC721Metadata-symbol}. - */ - function symbol() public view virtual override returns (string memory) { - return _symbol; - } - - /** - * @dev See {IERC721Metadata-tokenURI}. - */ - function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { - require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); - - string memory baseURI = _baseURI(); - return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; - } - - /** - * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each - * token will be the concatenation of the `baseURI` and the `tokenId`. Empty - * by default, can be overridden in child contracts. - */ - function _baseURI() internal view virtual returns (string memory) { - return ""; - } - - /** - * @dev See {IERC721-approve}. - */ - function approve(address to, uint256 tokenId) public virtual override { - address owner = ERC721.ownerOf(tokenId); - require(to != owner, "ERC721: approval to current owner"); - - require( - _msgSender() == owner || isApprovedForAll(owner, _msgSender()), - "ERC721: approve caller is not owner nor approved for all" - ); - - _approve(to, tokenId); - } - - /** - * @dev See {IERC721-getApproved}. - */ - function getApproved(uint256 tokenId) public view virtual override returns (address) { - require(_exists(tokenId), "ERC721: approved query for nonexistent token"); - - return _tokenApprovals[tokenId]; - } - - /** - * @dev See {IERC721-setApprovalForAll}. - */ - function setApprovalForAll(address operator, bool approved) public virtual override { - _setApprovalForAll(_msgSender(), operator, approved); - } - - /** - * @dev See {IERC721-isApprovedForAll}. - */ - function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { - return _operatorApprovals[owner][operator]; - } - - /** - * @dev See {IERC721-transferFrom}. - */ - function transferFrom( - address from, - address to, - uint256 tokenId - ) public virtual override { - //solhint-disable-next-line max-line-length - require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); - - _transfer(from, to, tokenId); - } - - /** - * @dev See {IERC721-safeTransferFrom}. - */ - function safeTransferFrom( - address from, - address to, - uint256 tokenId - ) public virtual override { - safeTransferFrom(from, to, tokenId, ""); - } - - /** - * @dev See {IERC721-safeTransferFrom}. - */ - function safeTransferFrom( - address from, - address to, - uint256 tokenId, - bytes memory _data - ) public virtual override { - require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); - _safeTransfer(from, to, tokenId, _data); - } - - /** - * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients - * are aware of the ERC721 protocol to prevent tokens from being forever locked. - * - * `_data` is additional data, it has no specified format and it is sent in call to `to`. - * - * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. - * implement alternative mechanisms to perform token transfer, such as signature-based. - * - * Requirements: - * - * - `from` cannot be the zero address. - * - `to` cannot be the zero address. - * - `tokenId` token must exist and be owned by `from`. - * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. - * - * Emits a {Transfer} event. - */ - function _safeTransfer( - address from, - address to, - uint256 tokenId, - bytes memory _data - ) internal virtual { - _transfer(from, to, tokenId); - require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); - } - - /** - * @dev Returns whether `tokenId` exists. - * - * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. - * - * Tokens start existing when they are minted (`_mint`), - * and stop existing when they are burned (`_burn`). - */ - function _exists(uint256 tokenId) internal view virtual returns (bool) { - return _owners[tokenId] != address(0); - } - - /** - * @dev Returns whether `spender` is allowed to manage `tokenId`. - * - * Requirements: - * - * - `tokenId` must exist. - */ - function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { - require(_exists(tokenId), "ERC721: operator query for nonexistent token"); - address owner = ERC721.ownerOf(tokenId); - return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); - } - - /** - * @dev Safely mints `tokenId` and transfers it to `to`. - * - * Requirements: - * - * - `tokenId` must not exist. - * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. - * - * Emits a {Transfer} event. - */ - function _safeMint(address to, uint256 tokenId) internal virtual { - _safeMint(to, tokenId, ""); - } - - /** - * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is - * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. - */ - function _safeMint( - address to, - uint256 tokenId, - bytes memory _data - ) internal virtual { - _mint(to, tokenId); - require( - _checkOnERC721Received(address(0), to, tokenId, _data), - "ERC721: transfer to non ERC721Receiver implementer" - ); - } - - /** - * @dev Mints `tokenId` and transfers it to `to`. - * - * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible - * - * Requirements: - * - * - `tokenId` must not exist. - * - `to` cannot be the zero address. - * - * Emits a {Transfer} event. - */ - function _mint(address to, uint256 tokenId) internal virtual { - require(to != address(0), "ERC721: mint to the zero address"); - require(!_exists(tokenId), "ERC721: token already minted"); - - _beforeTokenTransfer(address(0), to, tokenId); - - _balances[to] += 1; - _owners[tokenId] = to; - - emit Transfer(address(0), to, tokenId); - - _afterTokenTransfer(address(0), to, tokenId); - } - - /** - * @dev Destroys `tokenId`. - * The approval is cleared when the token is burned. - * - * Requirements: - * - * - `tokenId` must exist. - * - * Emits a {Transfer} event. - */ - function _burn(uint256 tokenId) internal virtual { - address owner = ERC721.ownerOf(tokenId); - - _beforeTokenTransfer(owner, address(0), tokenId); - - // Clear approvals - _approve(address(0), tokenId); - - _balances[owner] -= 1; - delete _owners[tokenId]; - - emit Transfer(owner, address(0), tokenId); - - _afterTokenTransfer(owner, address(0), tokenId); - } - - /** - * @dev Transfers `tokenId` from `from` to `to`. - * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. - * - * Requirements: - * - * - `to` cannot be the zero address. - * - `tokenId` token must be owned by `from`. - * - * Emits a {Transfer} event. - */ - function _transfer( - address from, - address to, - uint256 tokenId - ) internal virtual { - require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); - require(to != address(0), "ERC721: transfer to the zero address"); - - _beforeTokenTransfer(from, to, tokenId); - - // Clear approvals from the previous owner - _approve(address(0), tokenId); - - _balances[from] -= 1; - _balances[to] += 1; - _owners[tokenId] = to; - - emit Transfer(from, to, tokenId); - - _afterTokenTransfer(from, to, tokenId); - } - - /** - * @dev Approve `to` to operate on `tokenId` - * - * Emits a {Approval} event. - */ - function _approve(address to, uint256 tokenId) internal virtual { - _tokenApprovals[tokenId] = to; - emit Approval(ERC721.ownerOf(tokenId), to, tokenId); - } - - /** - * @dev Approve `operator` to operate on all of `owner` tokens - * - * Emits a {ApprovalForAll} event. - */ - function _setApprovalForAll( - address owner, - address operator, - bool approved - ) internal virtual { - require(owner != operator, "ERC721: approve to caller"); - _operatorApprovals[owner][operator] = approved; - emit ApprovalForAll(owner, operator, approved); - } - - /** - * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. - * The call is not executed if the target address is not a contract. - * - * @param from address representing the previous owner of the given token ID - * @param to target address that will receive the tokens - * @param tokenId uint256 ID of the token to be transferred - * @param _data bytes optional data to send along with the call - * @return bool whether the call correctly returned the expected magic value - */ - function _checkOnERC721Received( - address from, - address to, - uint256 tokenId, - bytes memory _data - ) private returns (bool) { - if (to.isContract()) { - try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { - return retval == IERC721Receiver.onERC721Received.selector; - } catch (bytes memory reason) { - if (reason.length == 0) { - revert("ERC721: transfer to non ERC721Receiver implementer"); - } else { - assembly { - revert(add(32, reason), mload(reason)) - } - } - } - } else { - return true; - } - } - - /** - * @dev Hook that is called before any token transfer. This includes minting - * and burning. - * - * Calling conditions: - * - * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be - * transferred to `to`. - * - When `from` is zero, `tokenId` will be minted for `to`. - * - When `to` is zero, ``from``'s `tokenId` will be burned. - * - `from` and `to` are never both zero. - * - * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. - */ - function _beforeTokenTransfer( - address from, - address to, - uint256 tokenId - ) internal virtual {} - - /** - * @dev Hook that is called after any transfer of tokens. This includes - * minting and burning. - * - * Calling conditions: - * - * - when `from` and `to` are both non-zero. - * - `from` and `to` are never both zero. - * - * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. - */ - function _afterTokenTransfer( - address from, - address to, - uint256 tokenId - ) internal virtual {} -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol deleted file mode 100644 index 9a31386..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol +++ /dev/null @@ -1,143 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) - -pragma solidity ^0.8.0; - -import "../../utils/introspection/IERC165.sol"; - -/** - * @dev Required interface of an ERC721 compliant contract. - */ -interface IERC721 is IERC165 { - /** - * @dev Emitted when `tokenId` token is transferred from `from` to `to`. - */ - event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); - - /** - * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. - */ - event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); - - /** - * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. - */ - event ApprovalForAll(address indexed owner, address indexed operator, bool approved); - - /** - * @dev Returns the number of tokens in ``owner``'s account. - */ - function balanceOf(address owner) external view returns (uint256 balance); - - /** - * @dev Returns the owner of the `tokenId` token. - * - * Requirements: - * - * - `tokenId` must exist. - */ - function ownerOf(uint256 tokenId) external view returns (address owner); - - /** - * @dev Safely transfers `tokenId` token from `from` to `to`. - * - * Requirements: - * - * - `from` cannot be the zero address. - * - `to` cannot be the zero address. - * - `tokenId` token must exist and be owned by `from`. - * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. - * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. - * - * Emits a {Transfer} event. - */ - function safeTransferFrom( - address from, - address to, - uint256 tokenId, - bytes calldata data - ) external; - - /** - * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients - * are aware of the ERC721 protocol to prevent tokens from being forever locked. - * - * Requirements: - * - * - `from` cannot be the zero address. - * - `to` cannot be the zero address. - * - `tokenId` token must exist and be owned by `from`. - * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. - * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. - * - * Emits a {Transfer} event. - */ - function safeTransferFrom( - address from, - address to, - uint256 tokenId - ) external; - - /** - * @dev Transfers `tokenId` token from `from` to `to`. - * - * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. - * - * Requirements: - * - * - `from` cannot be the zero address. - * - `to` cannot be the zero address. - * - `tokenId` token must be owned by `from`. - * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. - * - * Emits a {Transfer} event. - */ - function transferFrom( - address from, - address to, - uint256 tokenId - ) external; - - /** - * @dev Gives permission to `to` to transfer `tokenId` token to another account. - * The approval is cleared when the token is transferred. - * - * Only a single account can be approved at a time, so approving the zero address clears previous approvals. - * - * Requirements: - * - * - The caller must own the token or be an approved operator. - * - `tokenId` must exist. - * - * Emits an {Approval} event. - */ - function approve(address to, uint256 tokenId) external; - - /** - * @dev Approve or remove `operator` as an operator for the caller. - * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. - * - * Requirements: - * - * - The `operator` cannot be the caller. - * - * Emits an {ApprovalForAll} event. - */ - function setApprovalForAll(address operator, bool _approved) external; - - /** - * @dev Returns the account approved for `tokenId` token. - * - * Requirements: - * - * - `tokenId` must exist. - */ - function getApproved(uint256 tokenId) external view returns (address operator); - - /** - * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. - * - * See {setApprovalForAll} - */ - function isApprovedForAll(address owner, address operator) external view returns (bool); -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol deleted file mode 100644 index 298e356..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) - -pragma solidity ^0.8.0; - -/** - * @title ERC721 token receiver interface - * @dev Interface for any contract that wants to support safeTransfers - * from ERC721 asset contracts. - */ -interface IERC721Receiver { - /** - * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} - * by `operator` from `from`, this function is called. - * - * It must return its Solidity selector to confirm the token transfer. - * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. - * - * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. - */ - function onERC721Received( - address operator, - address from, - uint256 tokenId, - bytes calldata data - ) external returns (bytes4); -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/README.adoc b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/README.adoc deleted file mode 100644 index 9295957..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/README.adoc +++ /dev/null @@ -1,67 +0,0 @@ -= ERC 721 - -[.readme-notice] -NOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/token/erc721 - -This set of interfaces, contracts, and utilities are all related to the https://eips.ethereum.org/EIPS/eip-721[ERC721 Non-Fungible Token Standard]. - -TIP: For a walk through on how to create an ERC721 token read our xref:ROOT:erc721.adoc[ERC721 guide]. - -The EIP specifies four interfaces: - -* {IERC721}: Core functionality required in all compliant implementation. -* {IERC721Metadata}: Optional extension that adds name, symbol, and token URI, almost always included. -* {IERC721Enumerable}: Optional extension that allows enumerating the tokens on chain, often not included since it requires large gas overhead. -* {IERC721Receiver}: An interface that must be implemented by contracts if they want to accept tokens through `safeTransferFrom`. - -OpenZeppelin Contracts provides implementations of all four interfaces: - -* {ERC721}: The core and metadata extensions, with a base URI mechanism. -* {ERC721Enumerable}: The enumerable extension. -* {ERC721Holder}: A bare bones implementation of the receiver interface. - -Additionally there are a few of other extensions: - -* {ERC721URIStorage}: A more flexible but more expensive way of storing metadata. -* {ERC721Votes}: Support for voting and vote delegation. -* {ERC721Royalty}: A way to signal royalty information following ERC2981. -* {ERC721Pausable}: A primitive to pause contract operation. -* {ERC721Burnable}: A way for token holders to burn their own tokens. - -NOTE: This core set of contracts is designed to be unopinionated, allowing developers to access the internal functions in ERC721 (such as <>) and expose them as external functions in the way they prefer. On the other hand, xref:ROOT:erc721.adoc#Presets[ERC721 Presets] (such as {ERC721PresetMinterPauserAutoId}) are designed using opinionated patterns to provide developers with ready to use, deployable contracts. - -== Core - -{{IERC721}} - -{{IERC721Metadata}} - -{{IERC721Enumerable}} - -{{ERC721}} - -{{ERC721Enumerable}} - -{{IERC721Receiver}} - -== Extensions - -{{ERC721Pausable}} - -{{ERC721Burnable}} - -{{ERC721URIStorage}} - -{{ERC721Votes}} - -{{ERC721Royalty}} - -== Presets - -These contracts are preconfigured combinations of the above features. They can be used through inheritance or as models to copy and paste their source code. - -{{ERC721PresetMinterPauserAutoId}} - -== Utilities - -{{ERC721Holder}} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Burnable.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Burnable.sol deleted file mode 100644 index f8e15f6..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Burnable.sol +++ /dev/null @@ -1,26 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Burnable.sol) - -pragma solidity ^0.8.0; - -import "../ERC721.sol"; -import "../../../utils/Context.sol"; - -/** - * @title ERC721 Burnable Token - * @dev ERC721 Token that can be burned (destroyed). - */ -abstract contract ERC721Burnable is Context, ERC721 { - /** - * @dev Burns `tokenId`. See {ERC721-_burn}. - * - * Requirements: - * - * - The caller must own `tokenId` or be an approved operator. - */ - function burn(uint256 tokenId) public virtual { - //solhint-disable-next-line max-line-length - require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); - _burn(tokenId); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Enumerable.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Enumerable.sol deleted file mode 100644 index 46afd5d..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Enumerable.sol +++ /dev/null @@ -1,163 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) - -pragma solidity ^0.8.0; - -import "../ERC721.sol"; -import "./IERC721Enumerable.sol"; - -/** - * @dev This implements an optional extension of {ERC721} defined in the EIP that adds - * enumerability of all the token ids in the contract as well as all token ids owned by each - * account. - */ -abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { - // Mapping from owner to list of owned token IDs - mapping(address => mapping(uint256 => uint256)) private _ownedTokens; - - // Mapping from token ID to index of the owner tokens list - mapping(uint256 => uint256) private _ownedTokensIndex; - - // Array with all token ids, used for enumeration - uint256[] private _allTokens; - - // Mapping from token id to position in the allTokens array - mapping(uint256 => uint256) private _allTokensIndex; - - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { - return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); - } - - /** - * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. - */ - function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { - require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); - return _ownedTokens[owner][index]; - } - - /** - * @dev See {IERC721Enumerable-totalSupply}. - */ - function totalSupply() public view virtual override returns (uint256) { - return _allTokens.length; - } - - /** - * @dev See {IERC721Enumerable-tokenByIndex}. - */ - function tokenByIndex(uint256 index) public view virtual override returns (uint256) { - require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); - return _allTokens[index]; - } - - /** - * @dev Hook that is called before any token transfer. This includes minting - * and burning. - * - * Calling conditions: - * - * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be - * transferred to `to`. - * - When `from` is zero, `tokenId` will be minted for `to`. - * - When `to` is zero, ``from``'s `tokenId` will be burned. - * - `from` cannot be the zero address. - * - `to` cannot be the zero address. - * - * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. - */ - function _beforeTokenTransfer( - address from, - address to, - uint256 tokenId - ) internal virtual override { - super._beforeTokenTransfer(from, to, tokenId); - - if (from == address(0)) { - _addTokenToAllTokensEnumeration(tokenId); - } else if (from != to) { - _removeTokenFromOwnerEnumeration(from, tokenId); - } - if (to == address(0)) { - _removeTokenFromAllTokensEnumeration(tokenId); - } else if (to != from) { - _addTokenToOwnerEnumeration(to, tokenId); - } - } - - /** - * @dev Private function to add a token to this extension's ownership-tracking data structures. - * @param to address representing the new owner of the given token ID - * @param tokenId uint256 ID of the token to be added to the tokens list of the given address - */ - function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { - uint256 length = ERC721.balanceOf(to); - _ownedTokens[to][length] = tokenId; - _ownedTokensIndex[tokenId] = length; - } - - /** - * @dev Private function to add a token to this extension's token tracking data structures. - * @param tokenId uint256 ID of the token to be added to the tokens list - */ - function _addTokenToAllTokensEnumeration(uint256 tokenId) private { - _allTokensIndex[tokenId] = _allTokens.length; - _allTokens.push(tokenId); - } - - /** - * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that - * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for - * gas optimizations e.g. when performing a transfer operation (avoiding double writes). - * This has O(1) time complexity, but alters the order of the _ownedTokens array. - * @param from address representing the previous owner of the given token ID - * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address - */ - function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { - // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and - // then delete the last slot (swap and pop). - - uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; - uint256 tokenIndex = _ownedTokensIndex[tokenId]; - - // When the token to delete is the last token, the swap operation is unnecessary - if (tokenIndex != lastTokenIndex) { - uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; - - _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token - _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index - } - - // This also deletes the contents at the last position of the array - delete _ownedTokensIndex[tokenId]; - delete _ownedTokens[from][lastTokenIndex]; - } - - /** - * @dev Private function to remove a token from this extension's token tracking data structures. - * This has O(1) time complexity, but alters the order of the _allTokens array. - * @param tokenId uint256 ID of the token to be removed from the tokens list - */ - function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { - // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and - // then delete the last slot (swap and pop). - - uint256 lastTokenIndex = _allTokens.length - 1; - uint256 tokenIndex = _allTokensIndex[tokenId]; - - // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so - // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding - // an 'if' statement (like in _removeTokenFromOwnerEnumeration) - uint256 lastTokenId = _allTokens[lastTokenIndex]; - - _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token - _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index - - // This also deletes the contents at the last position of the array - delete _allTokensIndex[tokenId]; - _allTokens.pop(); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Pausable.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Pausable.sol deleted file mode 100644 index fbf8b63..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Pausable.sol +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Pausable.sol) - -pragma solidity ^0.8.0; - -import "../ERC721.sol"; -import "../../../security/Pausable.sol"; - -/** - * @dev ERC721 token with pausable token transfers, minting and burning. - * - * Useful for scenarios such as preventing trades until the end of an evaluation - * period, or having an emergency switch for freezing all token transfers in the - * event of a large bug. - */ -abstract contract ERC721Pausable is ERC721, Pausable { - /** - * @dev See {ERC721-_beforeTokenTransfer}. - * - * Requirements: - * - * - the contract must not be paused. - */ - function _beforeTokenTransfer( - address from, - address to, - uint256 tokenId - ) internal virtual override { - super._beforeTokenTransfer(from, to, tokenId); - - require(!paused(), "ERC721Pausable: token transfer while paused"); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Royalty.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Royalty.sol deleted file mode 100644 index f9414da..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Royalty.sol +++ /dev/null @@ -1,38 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/ERC721Royalty.sol) - -pragma solidity ^0.8.0; - -import "../ERC721.sol"; -import "../../common/ERC2981.sol"; -import "../../../utils/introspection/ERC165.sol"; - -/** - * @dev Extension of ERC721 with the ERC2981 NFT Royalty Standard, a standardized way to retrieve royalty payment - * information. - * - * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for - * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. - * - * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See - * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to - * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. - * - * _Available since v4.5._ - */ -abstract contract ERC721Royalty is ERC2981, ERC721 { - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC2981) returns (bool) { - return super.supportsInterface(interfaceId); - } - - /** - * @dev See {ERC721-_burn}. This override additionally clears the royalty information for the token. - */ - function _burn(uint256 tokenId) internal virtual override { - super._burn(tokenId); - _resetTokenRoyalty(tokenId); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721URIStorage.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721URIStorage.sol deleted file mode 100644 index f55fdb5..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721URIStorage.sol +++ /dev/null @@ -1,62 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721URIStorage.sol) - -pragma solidity ^0.8.0; - -import "../ERC721.sol"; - -/** - * @dev ERC721 token with storage based token URI management. - */ -abstract contract ERC721URIStorage is ERC721 { - using Strings for uint256; - - // Optional mapping for token URIs - mapping(uint256 => string) private _tokenURIs; - - /** - * @dev See {IERC721Metadata-tokenURI}. - */ - function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { - require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token"); - - string memory _tokenURI = _tokenURIs[tokenId]; - string memory base = _baseURI(); - - // If there is no base URI, return the token URI. - if (bytes(base).length == 0) { - return _tokenURI; - } - // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). - if (bytes(_tokenURI).length > 0) { - return string(abi.encodePacked(base, _tokenURI)); - } - - return super.tokenURI(tokenId); - } - - /** - * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. - * - * Requirements: - * - * - `tokenId` must exist. - */ - function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { - require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); - _tokenURIs[tokenId] = _tokenURI; - } - - /** - * @dev See {ERC721-_burn}. This override additionally checks to see if a - * token-specific URI was set for the token, and if so, it deletes the token URI from - * the storage mapping. - */ - function _burn(uint256 tokenId) internal virtual override { - super._burn(tokenId); - - if (bytes(_tokenURIs[tokenId]).length != 0) { - delete _tokenURIs[tokenId]; - } - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Enumerable.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Enumerable.sol deleted file mode 100644 index dfea427..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Enumerable.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) - -pragma solidity ^0.8.0; - -import "../IERC721.sol"; - -/** - * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension - * @dev See https://eips.ethereum.org/EIPS/eip-721 - */ -interface IERC721Enumerable is IERC721 { - /** - * @dev Returns the total amount of tokens stored by the contract. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns a token ID owned by `owner` at a given `index` of its token list. - * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. - */ - function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); - - /** - * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. - * Use along with {totalSupply} to enumerate all tokens. - */ - function tokenByIndex(uint256 index) external view returns (uint256); -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Metadata.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Metadata.sol deleted file mode 100644 index dca77ba..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Metadata.sol +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) - -pragma solidity ^0.8.0; - -import "../IERC721.sol"; - -/** - * @title ERC-721 Non-Fungible Token Standard, optional metadata extension - * @dev See https://eips.ethereum.org/EIPS/eip-721 - */ -interface IERC721Metadata is IERC721 { - /** - * @dev Returns the token collection name. - */ - function name() external view returns (string memory); - - /** - * @dev Returns the token collection symbol. - */ - function symbol() external view returns (string memory); - - /** - * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. - */ - function tokenURI(uint256 tokenId) external view returns (string memory); -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/draft-ERC721Votes.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/draft-ERC721Votes.sol deleted file mode 100644 index 4d9d0ad..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/extensions/draft-ERC721Votes.sol +++ /dev/null @@ -1,40 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/draft-ERC721Votes.sol) - -pragma solidity ^0.8.0; - -import "../ERC721.sol"; -import "../../../governance/utils/Votes.sol"; - -/** - * @dev Extension of ERC721 to support voting and delegation as implemented by {Votes}, where each individual NFT counts - * as 1 vote unit. - * - * Tokens do not count as votes until they are delegated, because votes must be tracked which incurs an additional cost - * on every transfer. Token holders can either delegate to a trusted representative who will decide how to make use of - * the votes in governance decisions, or they can delegate to themselves to be their own representative. - * - * _Available since v4.5._ - */ -abstract contract ERC721Votes is ERC721, Votes { - /** - * @dev Adjusts votes when tokens are transferred. - * - * Emits a {Votes-DelegateVotesChanged} event. - */ - function _afterTokenTransfer( - address from, - address to, - uint256 tokenId - ) internal virtual override { - _transferVotingUnits(from, to, 1); - super._afterTokenTransfer(from, to, tokenId); - } - - /** - * @dev Returns the balance of `account`. - */ - function _getVotingUnits(address account) internal view virtual override returns (uint256) { - return balanceOf(account); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol deleted file mode 100644 index 11b9787..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol +++ /dev/null @@ -1,139 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol) - -pragma solidity ^0.8.0; - -import "../ERC721.sol"; -import "../extensions/ERC721Enumerable.sol"; -import "../extensions/ERC721Burnable.sol"; -import "../extensions/ERC721Pausable.sol"; -import "../../../access/AccessControlEnumerable.sol"; -import "../../../utils/Context.sol"; -import "../../../utils/Counters.sol"; - -/** - * @dev {ERC721} token, including: - * - * - ability for holders to burn (destroy) their tokens - * - a minter role that allows for token minting (creation) - * - a pauser role that allows to stop all token transfers - * - token ID and URI autogeneration - * - * This contract uses {AccessControl} to lock permissioned functions using the - * different roles - head to its documentation for details. - * - * The account that deploys the contract will be granted the minter and pauser - * roles, as well as the default admin role, which will let it grant both minter - * and pauser roles to other accounts. - * - * _Deprecated in favor of https://wizard.openzeppelin.com/[Contracts Wizard]._ - */ -contract ERC721PresetMinterPauserAutoId is - Context, - AccessControlEnumerable, - ERC721Enumerable, - ERC721Burnable, - ERC721Pausable -{ - using Counters for Counters.Counter; - - bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); - bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); - - Counters.Counter private _tokenIdTracker; - - string private _baseTokenURI; - - /** - * @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE` and `PAUSER_ROLE` to the - * account that deploys the contract. - * - * Token URIs will be autogenerated based on `baseURI` and their token IDs. - * See {ERC721-tokenURI}. - */ - constructor( - string memory name, - string memory symbol, - string memory baseTokenURI - ) ERC721(name, symbol) { - _baseTokenURI = baseTokenURI; - - _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); - - _setupRole(MINTER_ROLE, _msgSender()); - _setupRole(PAUSER_ROLE, _msgSender()); - } - - function _baseURI() internal view virtual override returns (string memory) { - return _baseTokenURI; - } - - /** - * @dev Creates a new token for `to`. Its token ID will be automatically - * assigned (and available on the emitted {IERC721-Transfer} event), and the token - * URI autogenerated based on the base URI passed at construction. - * - * See {ERC721-_mint}. - * - * Requirements: - * - * - the caller must have the `MINTER_ROLE`. - */ - function mint(address to) public virtual { - require(hasRole(MINTER_ROLE, _msgSender()), "ERC721PresetMinterPauserAutoId: must have minter role to mint"); - - // We cannot just use balanceOf to create the new tokenId because tokens - // can be burned (destroyed), so we need a separate counter. - _mint(to, _tokenIdTracker.current()); - _tokenIdTracker.increment(); - } - - /** - * @dev Pauses all token transfers. - * - * See {ERC721Pausable} and {Pausable-_pause}. - * - * Requirements: - * - * - the caller must have the `PAUSER_ROLE`. - */ - function pause() public virtual { - require(hasRole(PAUSER_ROLE, _msgSender()), "ERC721PresetMinterPauserAutoId: must have pauser role to pause"); - _pause(); - } - - /** - * @dev Unpauses all token transfers. - * - * See {ERC721Pausable} and {Pausable-_unpause}. - * - * Requirements: - * - * - the caller must have the `PAUSER_ROLE`. - */ - function unpause() public virtual { - require(hasRole(PAUSER_ROLE, _msgSender()), "ERC721PresetMinterPauserAutoId: must have pauser role to unpause"); - _unpause(); - } - - function _beforeTokenTransfer( - address from, - address to, - uint256 tokenId - ) internal virtual override(ERC721, ERC721Enumerable, ERC721Pausable) { - super._beforeTokenTransfer(from, to, tokenId); - } - - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) - public - view - virtual - override(AccessControlEnumerable, ERC721, ERC721Enumerable) - returns (bool) - { - return super.supportsInterface(interfaceId); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/presets/README.md b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/presets/README.md deleted file mode 100644 index 468200b..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/presets/README.md +++ /dev/null @@ -1 +0,0 @@ -Contract presets are now deprecated in favor of [Contracts Wizard](https://wizard.openzeppelin.com/) as a more powerful alternative. diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/utils/ERC721Holder.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/utils/ERC721Holder.sol deleted file mode 100644 index 394926d..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC721/utils/ERC721Holder.sol +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC721/utils/ERC721Holder.sol) - -pragma solidity ^0.8.0; - -import "../IERC721Receiver.sol"; - -/** - * @dev Implementation of the {IERC721Receiver} interface. - * - * Accepts all token transfers. - * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}. - */ -contract ERC721Holder is IERC721Receiver { - /** - * @dev See {IERC721Receiver-onERC721Received}. - * - * Always returns `IERC721Receiver.onERC721Received.selector`. - */ - function onERC721Received( - address, - address, - uint256, - bytes memory - ) public virtual override returns (bytes4) { - return this.onERC721Received.selector; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC777/ERC777.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC777/ERC777.sol deleted file mode 100644 index e459d04..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC777/ERC777.sol +++ /dev/null @@ -1,546 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC777/ERC777.sol) - -pragma solidity ^0.8.0; - -import "./IERC777.sol"; -import "./IERC777Recipient.sol"; -import "./IERC777Sender.sol"; -import "../ERC20/IERC20.sol"; -import "../../utils/Address.sol"; -import "../../utils/Context.sol"; -import "../../utils/introspection/IERC1820Registry.sol"; - -/** - * @dev Implementation of the {IERC777} interface. - * - * This implementation is agnostic to the way tokens are created. This means - * that a supply mechanism has to be added in a derived contract using {_mint}. - * - * Support for ERC20 is included in this contract, as specified by the EIP: both - * the ERC777 and ERC20 interfaces can be safely used when interacting with it. - * Both {IERC777-Sent} and {IERC20-Transfer} events are emitted on token - * movements. - * - * Additionally, the {IERC777-granularity} value is hard-coded to `1`, meaning that there - * are no special restrictions in the amount of tokens that created, moved, or - * destroyed. This makes integration with ERC20 applications seamless. - */ -contract ERC777 is Context, IERC777, IERC20 { - using Address for address; - - IERC1820Registry internal constant _ERC1820_REGISTRY = IERC1820Registry(0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24); - - mapping(address => uint256) private _balances; - - uint256 private _totalSupply; - - string private _name; - string private _symbol; - - bytes32 private constant _TOKENS_SENDER_INTERFACE_HASH = keccak256("ERC777TokensSender"); - bytes32 private constant _TOKENS_RECIPIENT_INTERFACE_HASH = keccak256("ERC777TokensRecipient"); - - // This isn't ever read from - it's only used to respond to the defaultOperators query. - address[] private _defaultOperatorsArray; - - // Immutable, but accounts may revoke them (tracked in __revokedDefaultOperators). - mapping(address => bool) private _defaultOperators; - - // For each account, a mapping of its operators and revoked default operators. - mapping(address => mapping(address => bool)) private _operators; - mapping(address => mapping(address => bool)) private _revokedDefaultOperators; - - // ERC20-allowances - mapping(address => mapping(address => uint256)) private _allowances; - - /** - * @dev `defaultOperators` may be an empty array. - */ - constructor( - string memory name_, - string memory symbol_, - address[] memory defaultOperators_ - ) { - _name = name_; - _symbol = symbol_; - - _defaultOperatorsArray = defaultOperators_; - for (uint256 i = 0; i < defaultOperators_.length; i++) { - _defaultOperators[defaultOperators_[i]] = true; - } - - // register interfaces - _ERC1820_REGISTRY.setInterfaceImplementer(address(this), keccak256("ERC777Token"), address(this)); - _ERC1820_REGISTRY.setInterfaceImplementer(address(this), keccak256("ERC20Token"), address(this)); - } - - /** - * @dev See {IERC777-name}. - */ - function name() public view virtual override returns (string memory) { - return _name; - } - - /** - * @dev See {IERC777-symbol}. - */ - function symbol() public view virtual override returns (string memory) { - return _symbol; - } - - /** - * @dev See {ERC20-decimals}. - * - * Always returns 18, as per the - * [ERC777 EIP](https://eips.ethereum.org/EIPS/eip-777#backward-compatibility). - */ - function decimals() public pure virtual returns (uint8) { - return 18; - } - - /** - * @dev See {IERC777-granularity}. - * - * This implementation always returns `1`. - */ - function granularity() public view virtual override returns (uint256) { - return 1; - } - - /** - * @dev See {IERC777-totalSupply}. - */ - function totalSupply() public view virtual override(IERC20, IERC777) returns (uint256) { - return _totalSupply; - } - - /** - * @dev Returns the amount of tokens owned by an account (`tokenHolder`). - */ - function balanceOf(address tokenHolder) public view virtual override(IERC20, IERC777) returns (uint256) { - return _balances[tokenHolder]; - } - - /** - * @dev See {IERC777-send}. - * - * Also emits a {IERC20-Transfer} event for ERC20 compatibility. - */ - function send( - address recipient, - uint256 amount, - bytes memory data - ) public virtual override { - _send(_msgSender(), recipient, amount, data, "", true); - } - - /** - * @dev See {IERC20-transfer}. - * - * Unlike `send`, `recipient` is _not_ required to implement the {IERC777Recipient} - * interface if it is a contract. - * - * Also emits a {Sent} event. - */ - function transfer(address recipient, uint256 amount) public virtual override returns (bool) { - _send(_msgSender(), recipient, amount, "", "", false); - return true; - } - - /** - * @dev See {IERC777-burn}. - * - * Also emits a {IERC20-Transfer} event for ERC20 compatibility. - */ - function burn(uint256 amount, bytes memory data) public virtual override { - _burn(_msgSender(), amount, data, ""); - } - - /** - * @dev See {IERC777-isOperatorFor}. - */ - function isOperatorFor(address operator, address tokenHolder) public view virtual override returns (bool) { - return - operator == tokenHolder || - (_defaultOperators[operator] && !_revokedDefaultOperators[tokenHolder][operator]) || - _operators[tokenHolder][operator]; - } - - /** - * @dev See {IERC777-authorizeOperator}. - */ - function authorizeOperator(address operator) public virtual override { - require(_msgSender() != operator, "ERC777: authorizing self as operator"); - - if (_defaultOperators[operator]) { - delete _revokedDefaultOperators[_msgSender()][operator]; - } else { - _operators[_msgSender()][operator] = true; - } - - emit AuthorizedOperator(operator, _msgSender()); - } - - /** - * @dev See {IERC777-revokeOperator}. - */ - function revokeOperator(address operator) public virtual override { - require(operator != _msgSender(), "ERC777: revoking self as operator"); - - if (_defaultOperators[operator]) { - _revokedDefaultOperators[_msgSender()][operator] = true; - } else { - delete _operators[_msgSender()][operator]; - } - - emit RevokedOperator(operator, _msgSender()); - } - - /** - * @dev See {IERC777-defaultOperators}. - */ - function defaultOperators() public view virtual override returns (address[] memory) { - return _defaultOperatorsArray; - } - - /** - * @dev See {IERC777-operatorSend}. - * - * Emits {Sent} and {IERC20-Transfer} events. - */ - function operatorSend( - address sender, - address recipient, - uint256 amount, - bytes memory data, - bytes memory operatorData - ) public virtual override { - require(isOperatorFor(_msgSender(), sender), "ERC777: caller is not an operator for holder"); - _send(sender, recipient, amount, data, operatorData, true); - } - - /** - * @dev See {IERC777-operatorBurn}. - * - * Emits {Burned} and {IERC20-Transfer} events. - */ - function operatorBurn( - address account, - uint256 amount, - bytes memory data, - bytes memory operatorData - ) public virtual override { - require(isOperatorFor(_msgSender(), account), "ERC777: caller is not an operator for holder"); - _burn(account, amount, data, operatorData); - } - - /** - * @dev See {IERC20-allowance}. - * - * Note that operator and allowance concepts are orthogonal: operators may - * not have allowance, and accounts with allowance may not be operators - * themselves. - */ - function allowance(address holder, address spender) public view virtual override returns (uint256) { - return _allowances[holder][spender]; - } - - /** - * @dev See {IERC20-approve}. - * - * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on - * `transferFrom`. This is semantically equivalent to an infinite approval. - * - * Note that accounts cannot have allowance issued by their operators. - */ - function approve(address spender, uint256 value) public virtual override returns (bool) { - address holder = _msgSender(); - _approve(holder, spender, value); - return true; - } - - /** - * @dev See {IERC20-transferFrom}. - * - * NOTE: Does not update the allowance if the current allowance - * is the maximum `uint256`. - * - * Note that operator and allowance concepts are orthogonal: operators cannot - * call `transferFrom` (unless they have allowance), and accounts with - * allowance cannot call `operatorSend` (unless they are operators). - * - * Emits {Sent}, {IERC20-Transfer} and {IERC20-Approval} events. - */ - function transferFrom( - address holder, - address recipient, - uint256 amount - ) public virtual override returns (bool) { - address spender = _msgSender(); - _spendAllowance(holder, spender, amount); - _send(holder, recipient, amount, "", "", false); - return true; - } - - /** - * @dev Creates `amount` tokens and assigns them to `account`, increasing - * the total supply. - * - * If a send hook is registered for `account`, the corresponding function - * will be called with `operator`, `data` and `operatorData`. - * - * See {IERC777Sender} and {IERC777Recipient}. - * - * Emits {Minted} and {IERC20-Transfer} events. - * - * Requirements - * - * - `account` cannot be the zero address. - * - if `account` is a contract, it must implement the {IERC777Recipient} - * interface. - */ - function _mint( - address account, - uint256 amount, - bytes memory userData, - bytes memory operatorData - ) internal virtual { - _mint(account, amount, userData, operatorData, true); - } - - /** - * @dev Creates `amount` tokens and assigns them to `account`, increasing - * the total supply. - * - * If `requireReceptionAck` is set to true, and if a send hook is - * registered for `account`, the corresponding function will be called with - * `operator`, `data` and `operatorData`. - * - * See {IERC777Sender} and {IERC777Recipient}. - * - * Emits {Minted} and {IERC20-Transfer} events. - * - * Requirements - * - * - `account` cannot be the zero address. - * - if `account` is a contract, it must implement the {IERC777Recipient} - * interface. - */ - function _mint( - address account, - uint256 amount, - bytes memory userData, - bytes memory operatorData, - bool requireReceptionAck - ) internal virtual { - require(account != address(0), "ERC777: mint to the zero address"); - - address operator = _msgSender(); - - _beforeTokenTransfer(operator, address(0), account, amount); - - // Update state variables - _totalSupply += amount; - _balances[account] += amount; - - _callTokensReceived(operator, address(0), account, amount, userData, operatorData, requireReceptionAck); - - emit Minted(operator, account, amount, userData, operatorData); - emit Transfer(address(0), account, amount); - } - - /** - * @dev Send tokens - * @param from address token holder address - * @param to address recipient address - * @param amount uint256 amount of tokens to transfer - * @param userData bytes extra information provided by the token holder (if any) - * @param operatorData bytes extra information provided by the operator (if any) - * @param requireReceptionAck if true, contract recipients are required to implement ERC777TokensRecipient - */ - function _send( - address from, - address to, - uint256 amount, - bytes memory userData, - bytes memory operatorData, - bool requireReceptionAck - ) internal virtual { - require(from != address(0), "ERC777: transfer from the zero address"); - require(to != address(0), "ERC777: transfer to the zero address"); - - address operator = _msgSender(); - - _callTokensToSend(operator, from, to, amount, userData, operatorData); - - _move(operator, from, to, amount, userData, operatorData); - - _callTokensReceived(operator, from, to, amount, userData, operatorData, requireReceptionAck); - } - - /** - * @dev Burn tokens - * @param from address token holder address - * @param amount uint256 amount of tokens to burn - * @param data bytes extra information provided by the token holder - * @param operatorData bytes extra information provided by the operator (if any) - */ - function _burn( - address from, - uint256 amount, - bytes memory data, - bytes memory operatorData - ) internal virtual { - require(from != address(0), "ERC777: burn from the zero address"); - - address operator = _msgSender(); - - _callTokensToSend(operator, from, address(0), amount, data, operatorData); - - _beforeTokenTransfer(operator, from, address(0), amount); - - // Update state variables - uint256 fromBalance = _balances[from]; - require(fromBalance >= amount, "ERC777: burn amount exceeds balance"); - unchecked { - _balances[from] = fromBalance - amount; - } - _totalSupply -= amount; - - emit Burned(operator, from, amount, data, operatorData); - emit Transfer(from, address(0), amount); - } - - function _move( - address operator, - address from, - address to, - uint256 amount, - bytes memory userData, - bytes memory operatorData - ) private { - _beforeTokenTransfer(operator, from, to, amount); - - uint256 fromBalance = _balances[from]; - require(fromBalance >= amount, "ERC777: transfer amount exceeds balance"); - unchecked { - _balances[from] = fromBalance - amount; - } - _balances[to] += amount; - - emit Sent(operator, from, to, amount, userData, operatorData); - emit Transfer(from, to, amount); - } - - /** - * @dev See {ERC20-_approve}. - * - * Note that accounts cannot have allowance issued by their operators. - */ - function _approve( - address holder, - address spender, - uint256 value - ) internal virtual { - require(holder != address(0), "ERC777: approve from the zero address"); - require(spender != address(0), "ERC777: approve to the zero address"); - - _allowances[holder][spender] = value; - emit Approval(holder, spender, value); - } - - /** - * @dev Call from.tokensToSend() if the interface is registered - * @param operator address operator requesting the transfer - * @param from address token holder address - * @param to address recipient address - * @param amount uint256 amount of tokens to transfer - * @param userData bytes extra information provided by the token holder (if any) - * @param operatorData bytes extra information provided by the operator (if any) - */ - function _callTokensToSend( - address operator, - address from, - address to, - uint256 amount, - bytes memory userData, - bytes memory operatorData - ) private { - address implementer = _ERC1820_REGISTRY.getInterfaceImplementer(from, _TOKENS_SENDER_INTERFACE_HASH); - if (implementer != address(0)) { - IERC777Sender(implementer).tokensToSend(operator, from, to, amount, userData, operatorData); - } - } - - /** - * @dev Call to.tokensReceived() if the interface is registered. Reverts if the recipient is a contract but - * tokensReceived() was not registered for the recipient - * @param operator address operator requesting the transfer - * @param from address token holder address - * @param to address recipient address - * @param amount uint256 amount of tokens to transfer - * @param userData bytes extra information provided by the token holder (if any) - * @param operatorData bytes extra information provided by the operator (if any) - * @param requireReceptionAck if true, contract recipients are required to implement ERC777TokensRecipient - */ - function _callTokensReceived( - address operator, - address from, - address to, - uint256 amount, - bytes memory userData, - bytes memory operatorData, - bool requireReceptionAck - ) private { - address implementer = _ERC1820_REGISTRY.getInterfaceImplementer(to, _TOKENS_RECIPIENT_INTERFACE_HASH); - if (implementer != address(0)) { - IERC777Recipient(implementer).tokensReceived(operator, from, to, amount, userData, operatorData); - } else if (requireReceptionAck) { - require(!to.isContract(), "ERC777: token recipient contract has no implementer for ERC777TokensRecipient"); - } - } - - /** - * @dev Updates `owner` s allowance for `spender` based on spent `amount`. - * - * Does not update the allowance amount in case of infinite allowance. - * Revert if not enough allowance is available. - * - * Might emit an {Approval} event. - */ - function _spendAllowance( - address owner, - address spender, - uint256 amount - ) internal virtual { - uint256 currentAllowance = allowance(owner, spender); - if (currentAllowance != type(uint256).max) { - require(currentAllowance >= amount, "ERC777: insufficient allowance"); - unchecked { - _approve(owner, spender, currentAllowance - amount); - } - } - } - - /** - * @dev Hook that is called before any token transfer. This includes - * calls to {send}, {transfer}, {operatorSend}, minting and burning. - * - * Calling conditions: - * - * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens - * will be to transferred to `to`. - * - when `from` is zero, `amount` tokens will be minted for `to`. - * - when `to` is zero, `amount` of ``from``'s tokens will be burned. - * - `from` and `to` are never both zero. - * - * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. - */ - function _beforeTokenTransfer( - address operator, - address from, - address to, - uint256 amount - ) internal virtual {} -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC777/IERC777.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC777/IERC777.sol deleted file mode 100644 index 71bbf1a..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC777/IERC777.sol +++ /dev/null @@ -1,209 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC777/IERC777.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC777Token standard as defined in the EIP. - * - * This contract uses the - * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 registry standard] to let - * token holders and recipients react to token movements by using setting implementers - * for the associated interfaces in said registry. See {IERC1820Registry} and - * {ERC1820Implementer}. - */ -interface IERC777 { - /** - * @dev Emitted when `amount` tokens are created by `operator` and assigned to `to`. - * - * Note that some additional user `data` and `operatorData` can be logged in the event. - */ - event Minted(address indexed operator, address indexed to, uint256 amount, bytes data, bytes operatorData); - - /** - * @dev Emitted when `operator` destroys `amount` tokens from `account`. - * - * Note that some additional user `data` and `operatorData` can be logged in the event. - */ - event Burned(address indexed operator, address indexed from, uint256 amount, bytes data, bytes operatorData); - - /** - * @dev Emitted when `operator` is made operator for `tokenHolder` - */ - event AuthorizedOperator(address indexed operator, address indexed tokenHolder); - - /** - * @dev Emitted when `operator` is revoked its operator status for `tokenHolder` - */ - event RevokedOperator(address indexed operator, address indexed tokenHolder); - - /** - * @dev Returns the name of the token. - */ - function name() external view returns (string memory); - - /** - * @dev Returns the symbol of the token, usually a shorter version of the - * name. - */ - function symbol() external view returns (string memory); - - /** - * @dev Returns the smallest part of the token that is not divisible. This - * means all token operations (creation, movement and destruction) must have - * amounts that are a multiple of this number. - * - * For most token contracts, this value will equal 1. - */ - function granularity() external view returns (uint256); - - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by an account (`owner`). - */ - function balanceOf(address owner) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * If send or receive hooks are registered for the caller and `recipient`, - * the corresponding functions will be called with `data` and empty - * `operatorData`. See {IERC777Sender} and {IERC777Recipient}. - * - * Emits a {Sent} event. - * - * Requirements - * - * - the caller must have at least `amount` tokens. - * - `recipient` cannot be the zero address. - * - if `recipient` is a contract, it must implement the {IERC777Recipient} - * interface. - */ - function send( - address recipient, - uint256 amount, - bytes calldata data - ) external; - - /** - * @dev Destroys `amount` tokens from the caller's account, reducing the - * total supply. - * - * If a send hook is registered for the caller, the corresponding function - * will be called with `data` and empty `operatorData`. See {IERC777Sender}. - * - * Emits a {Burned} event. - * - * Requirements - * - * - the caller must have at least `amount` tokens. - */ - function burn(uint256 amount, bytes calldata data) external; - - /** - * @dev Returns true if an account is an operator of `tokenHolder`. - * Operators can send and burn tokens on behalf of their owners. All - * accounts are their own operator. - * - * See {operatorSend} and {operatorBurn}. - */ - function isOperatorFor(address operator, address tokenHolder) external view returns (bool); - - /** - * @dev Make an account an operator of the caller. - * - * See {isOperatorFor}. - * - * Emits an {AuthorizedOperator} event. - * - * Requirements - * - * - `operator` cannot be calling address. - */ - function authorizeOperator(address operator) external; - - /** - * @dev Revoke an account's operator status for the caller. - * - * See {isOperatorFor} and {defaultOperators}. - * - * Emits a {RevokedOperator} event. - * - * Requirements - * - * - `operator` cannot be calling address. - */ - function revokeOperator(address operator) external; - - /** - * @dev Returns the list of default operators. These accounts are operators - * for all token holders, even if {authorizeOperator} was never called on - * them. - * - * This list is immutable, but individual holders may revoke these via - * {revokeOperator}, in which case {isOperatorFor} will return false. - */ - function defaultOperators() external view returns (address[] memory); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient`. The caller must - * be an operator of `sender`. - * - * If send or receive hooks are registered for `sender` and `recipient`, - * the corresponding functions will be called with `data` and - * `operatorData`. See {IERC777Sender} and {IERC777Recipient}. - * - * Emits a {Sent} event. - * - * Requirements - * - * - `sender` cannot be the zero address. - * - `sender` must have at least `amount` tokens. - * - the caller must be an operator for `sender`. - * - `recipient` cannot be the zero address. - * - if `recipient` is a contract, it must implement the {IERC777Recipient} - * interface. - */ - function operatorSend( - address sender, - address recipient, - uint256 amount, - bytes calldata data, - bytes calldata operatorData - ) external; - - /** - * @dev Destroys `amount` tokens from `account`, reducing the total supply. - * The caller must be an operator of `account`. - * - * If a send hook is registered for `account`, the corresponding function - * will be called with `data` and `operatorData`. See {IERC777Sender}. - * - * Emits a {Burned} event. - * - * Requirements - * - * - `account` cannot be the zero address. - * - `account` must have at least `amount` tokens. - * - the caller must be an operator for `account`. - */ - function operatorBurn( - address account, - uint256 amount, - bytes calldata data, - bytes calldata operatorData - ) external; - - event Sent( - address indexed operator, - address indexed from, - address indexed to, - uint256 amount, - bytes data, - bytes operatorData - ); -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC777/IERC777Recipient.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC777/IERC777Recipient.sol deleted file mode 100644 index 717dd8f..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC777/IERC777Recipient.sol +++ /dev/null @@ -1,35 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC777/IERC777Recipient.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC777TokensRecipient standard as defined in the EIP. - * - * Accounts can be notified of {IERC777} tokens being sent to them by having a - * contract implement this interface (contract holders can be their own - * implementer) and registering it on the - * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry]. - * - * See {IERC1820Registry} and {ERC1820Implementer}. - */ -interface IERC777Recipient { - /** - * @dev Called by an {IERC777} token contract whenever tokens are being - * moved or created into a registered account (`to`). The type of operation - * is conveyed by `from` being the zero address or not. - * - * This call occurs _after_ the token contract's state is updated, so - * {IERC777-balanceOf}, etc., can be used to query the post-operation state. - * - * This function may revert to prevent the operation from being executed. - */ - function tokensReceived( - address operator, - address from, - address to, - uint256 amount, - bytes calldata userData, - bytes calldata operatorData - ) external; -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC777/IERC777Sender.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC777/IERC777Sender.sol deleted file mode 100644 index 969e3e3..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC777/IERC777Sender.sol +++ /dev/null @@ -1,35 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC777/IERC777Sender.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC777TokensSender standard as defined in the EIP. - * - * {IERC777} Token holders can be notified of operations performed on their - * tokens by having a contract implement this interface (contract holders can be - * their own implementer) and registering it on the - * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry]. - * - * See {IERC1820Registry} and {ERC1820Implementer}. - */ -interface IERC777Sender { - /** - * @dev Called by an {IERC777} token contract whenever a registered holder's - * (`from`) tokens are about to be moved or destroyed. The type of operation - * is conveyed by `to` being the zero address or not. - * - * This call occurs _before_ the token contract's state is updated, so - * {IERC777-balanceOf}, etc., can be used to query the pre-operation state. - * - * This function may revert to prevent the operation from being executed. - */ - function tokensToSend( - address operator, - address from, - address to, - uint256 amount, - bytes calldata userData, - bytes calldata operatorData - ) external; -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC777/README.adoc b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC777/README.adoc deleted file mode 100644 index d8f25f0..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC777/README.adoc +++ /dev/null @@ -1,30 +0,0 @@ -= ERC 777 - -[.readme-notice] -NOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/token/erc777 - -This set of interfaces and contracts are all related to the [ERC777 token standard](https://eips.ethereum.org/EIPS/eip-777). - -TIP: For an overview of ERC777 tokens and a walk through on how to create a token contract read our xref:ROOT:erc777.adoc[ERC777 guide]. - -The token behavior itself is implemented in the core contracts: {IERC777}, {ERC777}. - -Additionally there are interfaces used to develop contracts that react to token movements: {IERC777Sender}, {IERC777Recipient}. - -== Core - -{{IERC777}} - -{{ERC777}} - -== Hooks - -{{IERC777Sender}} - -{{IERC777Recipient}} - -== Presets - -These contracts are preconfigured combinations of features. They can be used through inheritance or as models to copy and paste their source code. - -{{ERC777PresetFixedSupply}} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC777/presets/ERC777PresetFixedSupply.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC777/presets/ERC777PresetFixedSupply.sol deleted file mode 100644 index 8bd4b79..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/ERC777/presets/ERC777PresetFixedSupply.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC777/presets/ERC777PresetFixedSupply.sol) -pragma solidity ^0.8.0; - -import "../ERC777.sol"; - -/** - * @dev {ERC777} token, including: - * - * - Preminted initial supply - * - No access control mechanism (for minting/pausing) and hence no governance - * - * _Available since v3.4._ - */ -contract ERC777PresetFixedSupply is ERC777 { - /** - * @dev Mints `initialSupply` amount of token and transfers them to `owner`. - * - * See {ERC777-constructor}. - */ - constructor( - string memory name, - string memory symbol, - address[] memory defaultOperators, - uint256 initialSupply, - address owner - ) ERC777(name, symbol, defaultOperators) { - _mint(owner, initialSupply, "", ""); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/common/ERC2981.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/common/ERC2981.sol deleted file mode 100644 index b8b0b63..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/common/ERC2981.sol +++ /dev/null @@ -1,111 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (token/common/ERC2981.sol) - -pragma solidity ^0.8.0; - -import "../../interfaces/IERC2981.sol"; -import "../../utils/introspection/ERC165.sol"; - -/** - * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. - * - * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for - * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. - * - * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the - * fee is specified in basis points by default. - * - * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See - * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to - * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. - * - * _Available since v4.5._ - */ -abstract contract ERC2981 is IERC2981, ERC165 { - struct RoyaltyInfo { - address receiver; - uint96 royaltyFraction; - } - - RoyaltyInfo private _defaultRoyaltyInfo; - mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; - - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { - return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); - } - - /** - * @inheritdoc IERC2981 - */ - function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) { - RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; - - if (royalty.receiver == address(0)) { - royalty = _defaultRoyaltyInfo; - } - - uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); - - return (royalty.receiver, royaltyAmount); - } - - /** - * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a - * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an - * override. - */ - function _feeDenominator() internal pure virtual returns (uint96) { - return 10000; - } - - /** - * @dev Sets the royalty information that all ids in this contract will default to. - * - * Requirements: - * - * - `receiver` cannot be the zero address. - * - `feeNumerator` cannot be greater than the fee denominator. - */ - function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { - require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); - require(receiver != address(0), "ERC2981: invalid receiver"); - - _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); - } - - /** - * @dev Removes default royalty information. - */ - function _deleteDefaultRoyalty() internal virtual { - delete _defaultRoyaltyInfo; - } - - /** - * @dev Sets the royalty information for a specific token id, overriding the global default. - * - * Requirements: - * - * - `receiver` cannot be the zero address. - * - `feeNumerator` cannot be greater than the fee denominator. - */ - function _setTokenRoyalty( - uint256 tokenId, - address receiver, - uint96 feeNumerator - ) internal virtual { - require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); - require(receiver != address(0), "ERC2981: Invalid parameters"); - - _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); - } - - /** - * @dev Resets royalty information for the token id back to the global default. - */ - function _resetTokenRoyalty(uint256 tokenId) internal virtual { - delete _tokenRoyaltyInfo[tokenId]; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/common/README.adoc b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/common/README.adoc deleted file mode 100644 index af61674..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/token/common/README.adoc +++ /dev/null @@ -1,10 +0,0 @@ -= Common (Tokens) - -Functionality that is common to multiple token standards. - -* {ERC2981}: NFT Royalties compatible with both ERC721 and ERC1155. -** For ERC721 consider {ERC721Royalty} which clears the royalty information from storage on burn. - -== Contracts - -{{ERC2981}} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/Address.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/Address.sol deleted file mode 100644 index daea7f3..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/Address.sol +++ /dev/null @@ -1,222 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) - -pragma solidity ^0.8.1; - -/** - * @dev Collection of functions related to the address type - */ -library Address { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - * - * [IMPORTANT] - * ==== - * You shouldn't rely on `isContract` to protect against flash loan attacks! - * - * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets - * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract - * constructor. - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize/address.code.length, which returns 0 - // for contracts in construction, since the code is only stored at the end - // of the constructor execution. - - return account.code.length > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, "Address: insufficient balance"); - - (bool success, ) = recipient.call{value: amount}(""); - require(success, "Address: unable to send value, recipient may have reverted"); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCall(target, data, "Address: low-level call failed"); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, "Address: insufficient balance for call"); - require(isContract(target), "Address: call to non-contract"); - - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { - return functionStaticCall(target, data, "Address: low-level static call failed"); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - require(isContract(target), "Address: static call to non-contract"); - - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { - return functionDelegateCall(target, data, "Address: low-level delegate call failed"); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function functionDelegateCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - require(isContract(target), "Address: delegate call to non-contract"); - - (bool success, bytes memory returndata) = target.delegatecall(data); - return verifyCallResult(success, returndata, errorMessage); - } - - /** - * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/Arrays.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/Arrays.sol deleted file mode 100644 index 0783614..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/Arrays.sol +++ /dev/null @@ -1,48 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/Arrays.sol) - -pragma solidity ^0.8.0; - -import "./math/Math.sol"; - -/** - * @dev Collection of functions related to array types. - */ -library Arrays { - /** - * @dev Searches a sorted `array` and returns the first index that contains - * a value greater or equal to `element`. If no such index exists (i.e. all - * values in the array are strictly less than `element`), the array length is - * returned. Time complexity O(log n). - * - * `array` is expected to be sorted in ascending order, and to contain no - * repeated elements. - */ - function findUpperBound(uint256[] storage array, uint256 element) internal view returns (uint256) { - if (array.length == 0) { - return 0; - } - - uint256 low = 0; - uint256 high = array.length; - - while (low < high) { - uint256 mid = Math.average(low, high); - - // Note that mid will always be strictly less than high (i.e. it will be a valid array index) - // because Math.average rounds down (it does integer division with truncation). - if (array[mid] > element) { - high = mid; - } else { - low = mid + 1; - } - } - - // At this point `low` is the exclusive upper bound. We will return the inclusive upper bound. - if (low > 0 && array[low - 1] == element) { - return low - 1; - } else { - return low; - } - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/Base64.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/Base64.sol deleted file mode 100644 index 2de471d..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/Base64.sol +++ /dev/null @@ -1,91 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (utils/Base64.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Provides a set of functions to operate with Base64 strings. - * - * _Available since v4.5._ - */ -library Base64 { - /** - * @dev Base64 Encoding/Decoding Table - */ - string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - - /** - * @dev Converts a `bytes` to its Bytes64 `string` representation. - */ - function encode(bytes memory data) internal pure returns (string memory) { - /** - * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence - * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol - */ - if (data.length == 0) return ""; - - // Loads the table into memory - string memory table = _TABLE; - - // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter - // and split into 4 numbers of 6 bits. - // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up - // - `data.length + 2` -> Round up - // - `/ 3` -> Number of 3-bytes chunks - // - `4 *` -> 4 characters for each chunk - string memory result = new string(4 * ((data.length + 2) / 3)); - - assembly { - // Prepare the lookup table (skip the first "length" byte) - let tablePtr := add(table, 1) - - // Prepare result pointer, jump over length - let resultPtr := add(result, 32) - - // Run over the input, 3 bytes at a time - for { - let dataPtr := data - let endPtr := add(data, mload(data)) - } lt(dataPtr, endPtr) { - - } { - // Advance 3 bytes - dataPtr := add(dataPtr, 3) - let input := mload(dataPtr) - - // To write each character, shift the 3 bytes (18 bits) chunk - // 4 times in blocks of 6 bits for each character (18, 12, 6, 0) - // and apply logical AND with 0x3F which is the number of - // the previous character in the ASCII table prior to the Base64 Table - // The result is then added to the table to get the character to write, - // and finally write it in the result pointer but with a left shift - // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits - - mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F)))) - resultPtr := add(resultPtr, 1) // Advance - - mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F)))) - resultPtr := add(resultPtr, 1) // Advance - - mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F)))) - resultPtr := add(resultPtr, 1) // Advance - - mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F)))) - resultPtr := add(resultPtr, 1) // Advance - } - - // When data `bytes` is not exactly 3 bytes long - // it is padded with `=` characters at the end - switch mod(mload(data), 3) - case 1 { - mstore8(sub(resultPtr, 1), 0x3d) - mstore8(sub(resultPtr, 2), 0x3d) - } - case 2 { - mstore8(sub(resultPtr, 1), 0x3d) - } - } - - return result; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/Checkpoints.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/Checkpoints.sol deleted file mode 100644 index 606098b..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/Checkpoints.sol +++ /dev/null @@ -1,86 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (utils/Checkpoints.sol) -pragma solidity ^0.8.0; - -import "./math/Math.sol"; -import "./math/SafeCast.sol"; - -/** - * @dev This library defines the `History` struct, for checkpointing values as they change at different points in - * time, and later looking up past values by block number. See {Votes} as an example. - * - * To create a history of checkpoints define a variable type `Checkpoints.History` in your contract, and store a new - * checkpoint for the current transaction block using the {push} function. - * - * _Available since v4.5._ - */ -library Checkpoints { - struct Checkpoint { - uint32 _blockNumber; - uint224 _value; - } - - struct History { - Checkpoint[] _checkpoints; - } - - /** - * @dev Returns the value in the latest checkpoint, or zero if there are no checkpoints. - */ - function latest(History storage self) internal view returns (uint256) { - uint256 pos = self._checkpoints.length; - return pos == 0 ? 0 : self._checkpoints[pos - 1]._value; - } - - /** - * @dev Returns the value at a given block number. If a checkpoint is not available at that block, the closest one - * before it is returned, or zero otherwise. - */ - function getAtBlock(History storage self, uint256 blockNumber) internal view returns (uint256) { - require(blockNumber < block.number, "Checkpoints: block not yet mined"); - - uint256 high = self._checkpoints.length; - uint256 low = 0; - while (low < high) { - uint256 mid = Math.average(low, high); - if (self._checkpoints[mid]._blockNumber > blockNumber) { - high = mid; - } else { - low = mid + 1; - } - } - return high == 0 ? 0 : self._checkpoints[high - 1]._value; - } - - /** - * @dev Pushes a value onto a History so that it is stored as the checkpoint for the current block. - * - * Returns previous value and new value. - */ - function push(History storage self, uint256 value) internal returns (uint256, uint256) { - uint256 pos = self._checkpoints.length; - uint256 old = latest(self); - if (pos > 0 && self._checkpoints[pos - 1]._blockNumber == block.number) { - self._checkpoints[pos - 1]._value = SafeCast.toUint224(value); - } else { - self._checkpoints.push( - Checkpoint({_blockNumber: SafeCast.toUint32(block.number), _value: SafeCast.toUint224(value)}) - ); - } - return (old, value); - } - - /** - * @dev Pushes a value onto a History, by updating the latest value using binary operation `op`. The new value will - * be set to `op(latest, delta)`. - * - * Returns previous value and new value. - */ - function push( - History storage self, - function(uint256, uint256) view returns (uint256) op, - uint256 delta - ) internal returns (uint256, uint256) { - return push(self, op(latest(self), delta)); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/Context.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/Context.sol deleted file mode 100644 index f304065..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/Context.sol +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/Context.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract Context { - function _msgSender() internal view virtual returns (address) { - return msg.sender; - } - - function _msgData() internal view virtual returns (bytes calldata) { - return msg.data; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/Counters.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/Counters.sol deleted file mode 100644 index 8a4f2a2..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/Counters.sol +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) - -pragma solidity ^0.8.0; - -/** - * @title Counters - * @author Matt Condon (@shrugs) - * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number - * of elements in a mapping, issuing ERC721 ids, or counting request ids. - * - * Include with `using Counters for Counters.Counter;` - */ -library Counters { - struct Counter { - // This variable should never be directly accessed by users of the library: interactions must be restricted to - // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add - // this feature: see https://github.com/ethereum/solidity/issues/4637 - uint256 _value; // default: 0 - } - - function current(Counter storage counter) internal view returns (uint256) { - return counter._value; - } - - function increment(Counter storage counter) internal { - unchecked { - counter._value += 1; - } - } - - function decrement(Counter storage counter) internal { - uint256 value = counter._value; - require(value > 0, "Counter: decrement overflow"); - unchecked { - counter._value = value - 1; - } - } - - function reset(Counter storage counter) internal { - counter._value = 0; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/Create2.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/Create2.sol deleted file mode 100644 index 40164c1..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/Create2.sol +++ /dev/null @@ -1,65 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/Create2.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer. - * `CREATE2` can be used to compute in advance the address where a smart - * contract will be deployed, which allows for interesting new mechanisms known - * as 'counterfactual interactions'. - * - * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more - * information. - */ -library Create2 { - /** - * @dev Deploys a contract using `CREATE2`. The address where the contract - * will be deployed can be known in advance via {computeAddress}. - * - * The bytecode for a contract can be obtained from Solidity with - * `type(contractName).creationCode`. - * - * Requirements: - * - * - `bytecode` must not be empty. - * - `salt` must have not been used for `bytecode` already. - * - the factory must have a balance of at least `amount`. - * - if `amount` is non-zero, `bytecode` must have a `payable` constructor. - */ - function deploy( - uint256 amount, - bytes32 salt, - bytes memory bytecode - ) internal returns (address) { - address addr; - require(address(this).balance >= amount, "Create2: insufficient balance"); - require(bytecode.length != 0, "Create2: bytecode length is zero"); - assembly { - addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt) - } - require(addr != address(0), "Create2: Failed on deploy"); - return addr; - } - - /** - * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the - * `bytecodeHash` or `salt` will result in a new destination address. - */ - function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) { - return computeAddress(salt, bytecodeHash, address(this)); - } - - /** - * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at - * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}. - */ - function computeAddress( - bytes32 salt, - bytes32 bytecodeHash, - address deployer - ) internal pure returns (address) { - bytes32 _data = keccak256(abi.encodePacked(bytes1(0xff), deployer, salt, bytecodeHash)); - return address(uint160(uint256(_data))); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/Multicall.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/Multicall.sol deleted file mode 100644 index bdb8201..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/Multicall.sol +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (utils/Multicall.sol) - -pragma solidity ^0.8.0; - -import "./Address.sol"; - -/** - * @dev Provides a function to batch together multiple calls in a single external call. - * - * _Available since v4.1._ - */ -abstract contract Multicall { - /** - * @dev Receives and executes a batch of function calls on this contract. - */ - function multicall(bytes[] calldata data) external virtual returns (bytes[] memory results) { - results = new bytes[](data.length); - for (uint256 i = 0; i < data.length; i++) { - results[i] = Address.functionDelegateCall(address(this), data[i]); - } - return results; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/README.adoc b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/README.adoc deleted file mode 100644 index 7fef825..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/README.adoc +++ /dev/null @@ -1,111 +0,0 @@ -= Utilities - -[.readme-notice] -NOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/utils - -Miscellaneous contracts and libraries containing utility functions you can use to improve security, work with new data types, or safely use low-level primitives. - -The {Address}, {Arrays}, {Base64} and {Strings} libraries provide more operations related to these native data types, while {SafeCast} adds ways to safely convert between the different signed and unsigned numeric types. -{Multicall} provides a function to batch together multiple calls in a single external call. - -For new data types: - - * {Counters}: a simple way to get a counter that can only be incremented, decremented or reset. Very useful for ID generation, counting contract activity, among others. - * {EnumerableMap}: like Solidity's https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`] type, but with key-value _enumeration_: this will let you know how many entries a mapping has, and iterate over them (which is not possible with `mapping`). - * {EnumerableSet}: like {EnumerableMap}, but for https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets]. Can be used to store privileged accounts, issued IDs, etc. - -[NOTE] -==== -Because Solidity does not support generic types, {EnumerableMap} and {EnumerableSet} are specialized to a limited number of key-value types. - -As of v3.0, {EnumerableMap} supports `uint256 -> address` (`UintToAddressMap`), and {EnumerableSet} supports `address` and `uint256` (`AddressSet` and `UintSet`). -==== - -Finally, {Create2} contains all necessary utilities to safely use the https://blog.openzeppelin.com/getting-the-most-out-of-create2/[`CREATE2` EVM opcode], without having to deal with low-level assembly. - -== Math - -{{Math}} - -{{SignedMath}} - -{{SafeCast}} - -{{SafeMath}} - -{{SignedSafeMath}} - -== Cryptography - -{{ECDSA}} - -{{SignatureChecker}} - -{{MerkleProof}} - -{{EIP712}} - -== Escrow - -{{ConditionalEscrow}} - -{{Escrow}} - -{{RefundEscrow}} - -== Introspection - -This set of interfaces and contracts deal with https://en.wikipedia.org/wiki/Type_introspection[type introspection] of contracts, that is, examining which functions can be called on them. This is usually referred to as a contract's _interface_. - -Ethereum contracts have no native concept of an interface, so applications must usually simply trust they are not making an incorrect call. For trusted setups this is a non-issue, but often unknown and untrusted third-party addresses need to be interacted with. There may even not be any direct calls to them! (e.g. `ERC20` tokens may be sent to a contract that lacks a way to transfer them out of it, locking them forever). In these cases, a contract _declaring_ its interface can be very helpful in preventing errors. - -There are two main ways to approach this. - -* Locally, where a contract implements `IERC165` and declares an interface, and a second one queries it directly via `ERC165Checker`. -* Globally, where a global and unique registry (`IERC1820Registry`) is used to register implementers of a certain interface (`IERC1820Implementer`). It is then the registry that is queried, which allows for more complex setups, like contracts implementing interfaces for externally-owned accounts. - -Note that, in all cases, accounts simply _declare_ their interfaces, but they are not required to actually implement them. This mechanism can therefore be used to both prevent errors and allow for complex interactions (see `ERC777`), but it must not be relied on for security. - -{{IERC165}} - -{{ERC165}} - -{{ERC165Storage}} - -{{ERC165Checker}} - -{{IERC1820Registry}} - -{{IERC1820Implementer}} - -{{ERC1820Implementer}} - -== Data Structures - -{{BitMaps}} - -{{EnumerableMap}} - -{{EnumerableSet}} - -{{DoubleEndedQueue}} - -{{Checkpoints}} - -== Libraries - -{{Create2}} - -{{Address}} - -{{Arrays}} - -{{Base64}} - -{{Counters}} - -{{Strings}} - -{{StorageSlot}} - -{{Multicall}} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol deleted file mode 100644 index 28239db..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol +++ /dev/null @@ -1,84 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Library for reading and writing primitive types to specific storage slots. - * - * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. - * This library helps with reading and writing to such slots without the need for inline assembly. - * - * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. - * - * Example usage to set ERC1967 implementation slot: - * ``` - * contract ERC1967 { - * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; - * - * function _getImplementation() internal view returns (address) { - * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; - * } - * - * function _setImplementation(address newImplementation) internal { - * require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); - * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; - * } - * } - * ``` - * - * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._ - */ -library StorageSlot { - struct AddressSlot { - address value; - } - - struct BooleanSlot { - bool value; - } - - struct Bytes32Slot { - bytes32 value; - } - - struct Uint256Slot { - uint256 value; - } - - /** - * @dev Returns an `AddressSlot` with member `value` located at `slot`. - */ - function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { - assembly { - r.slot := slot - } - } - - /** - * @dev Returns an `BooleanSlot` with member `value` located at `slot`. - */ - function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { - assembly { - r.slot := slot - } - } - - /** - * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. - */ - function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { - assembly { - r.slot := slot - } - } - - /** - * @dev Returns an `Uint256Slot` with member `value` located at `slot`. - */ - function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { - assembly { - r.slot := slot - } - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/Strings.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/Strings.sol deleted file mode 100644 index d38bbe8..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/Strings.sol +++ /dev/null @@ -1,67 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) - -pragma solidity ^0.8.0; - -/** - * @dev String operations. - */ -library Strings { - bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; - - /** - * @dev Converts a `uint256` to its ASCII `string` decimal representation. - */ - function toString(uint256 value) internal pure returns (string memory) { - // Inspired by OraclizeAPI's implementation - MIT licence - // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol - - if (value == 0) { - return "0"; - } - uint256 temp = value; - uint256 digits; - while (temp != 0) { - digits++; - temp /= 10; - } - bytes memory buffer = new bytes(digits); - while (value != 0) { - digits -= 1; - buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); - value /= 10; - } - return string(buffer); - } - - /** - * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. - */ - function toHexString(uint256 value) internal pure returns (string memory) { - if (value == 0) { - return "0x00"; - } - uint256 temp = value; - uint256 length = 0; - while (temp != 0) { - length++; - temp >>= 8; - } - return toHexString(value, length); - } - - /** - * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. - */ - function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { - bytes memory buffer = new bytes(2 * length + 2); - buffer[0] = "0"; - buffer[1] = "x"; - for (uint256 i = 2 * length + 1; i > 1; --i) { - buffer[i] = _HEX_SYMBOLS[value & 0xf]; - value >>= 4; - } - require(value == 0, "Strings: hex length insufficient"); - return string(buffer); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/Timers.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/Timers.sol deleted file mode 100644 index 4bc86f2..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/Timers.sol +++ /dev/null @@ -1,73 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/Timers.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Tooling for timepoints, timers and delays - */ -library Timers { - struct Timestamp { - uint64 _deadline; - } - - function getDeadline(Timestamp memory timer) internal pure returns (uint64) { - return timer._deadline; - } - - function setDeadline(Timestamp storage timer, uint64 timestamp) internal { - timer._deadline = timestamp; - } - - function reset(Timestamp storage timer) internal { - timer._deadline = 0; - } - - function isUnset(Timestamp memory timer) internal pure returns (bool) { - return timer._deadline == 0; - } - - function isStarted(Timestamp memory timer) internal pure returns (bool) { - return timer._deadline > 0; - } - - function isPending(Timestamp memory timer) internal view returns (bool) { - return timer._deadline > block.timestamp; - } - - function isExpired(Timestamp memory timer) internal view returns (bool) { - return isStarted(timer) && timer._deadline <= block.timestamp; - } - - struct BlockNumber { - uint64 _deadline; - } - - function getDeadline(BlockNumber memory timer) internal pure returns (uint64) { - return timer._deadline; - } - - function setDeadline(BlockNumber storage timer, uint64 timestamp) internal { - timer._deadline = timestamp; - } - - function reset(BlockNumber storage timer) internal { - timer._deadline = 0; - } - - function isUnset(BlockNumber memory timer) internal pure returns (bool) { - return timer._deadline == 0; - } - - function isStarted(BlockNumber memory timer) internal pure returns (bool) { - return timer._deadline > 0; - } - - function isPending(BlockNumber memory timer) internal view returns (bool) { - return timer._deadline > block.number; - } - - function isExpired(BlockNumber memory timer) internal view returns (bool) { - return isStarted(timer) && timer._deadline <= block.number; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol deleted file mode 100644 index b2db6bd..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol +++ /dev/null @@ -1,230 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol) - -pragma solidity ^0.8.0; - -import "../Strings.sol"; - -/** - * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. - * - * These functions can be used to verify that a message was signed by the holder - * of the private keys of a given address. - */ -library ECDSA { - enum RecoverError { - NoError, - InvalidSignature, - InvalidSignatureLength, - InvalidSignatureS, - InvalidSignatureV - } - - function _throwError(RecoverError error) private pure { - if (error == RecoverError.NoError) { - return; // no error: do nothing - } else if (error == RecoverError.InvalidSignature) { - revert("ECDSA: invalid signature"); - } else if (error == RecoverError.InvalidSignatureLength) { - revert("ECDSA: invalid signature length"); - } else if (error == RecoverError.InvalidSignatureS) { - revert("ECDSA: invalid signature 's' value"); - } else if (error == RecoverError.InvalidSignatureV) { - revert("ECDSA: invalid signature 'v' value"); - } - } - - /** - * @dev Returns the address that signed a hashed message (`hash`) with - * `signature` or error string. This address can then be used for verification purposes. - * - * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: - * this function rejects them by requiring the `s` value to be in the lower - * half order, and the `v` value to be either 27 or 28. - * - * IMPORTANT: `hash` _must_ be the result of a hash operation for the - * verification to be secure: it is possible to craft signatures that - * recover to arbitrary addresses for non-hashed data. A safe way to ensure - * this is by receiving a hash of the original message (which may otherwise - * be too long), and then calling {toEthSignedMessageHash} on it. - * - * Documentation for signature generation: - * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] - * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] - * - * _Available since v4.3._ - */ - function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { - // Check the signature length - // - case 65: r,s,v signature (standard) - // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ - if (signature.length == 65) { - bytes32 r; - bytes32 s; - uint8 v; - // ecrecover takes the signature parameters, and the only way to get them - // currently is to use assembly. - assembly { - r := mload(add(signature, 0x20)) - s := mload(add(signature, 0x40)) - v := byte(0, mload(add(signature, 0x60))) - } - return tryRecover(hash, v, r, s); - } else if (signature.length == 64) { - bytes32 r; - bytes32 vs; - // ecrecover takes the signature parameters, and the only way to get them - // currently is to use assembly. - assembly { - r := mload(add(signature, 0x20)) - vs := mload(add(signature, 0x40)) - } - return tryRecover(hash, r, vs); - } else { - return (address(0), RecoverError.InvalidSignatureLength); - } - } - - /** - * @dev Returns the address that signed a hashed message (`hash`) with - * `signature`. This address can then be used for verification purposes. - * - * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: - * this function rejects them by requiring the `s` value to be in the lower - * half order, and the `v` value to be either 27 or 28. - * - * IMPORTANT: `hash` _must_ be the result of a hash operation for the - * verification to be secure: it is possible to craft signatures that - * recover to arbitrary addresses for non-hashed data. A safe way to ensure - * this is by receiving a hash of the original message (which may otherwise - * be too long), and then calling {toEthSignedMessageHash} on it. - */ - function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { - (address recovered, RecoverError error) = tryRecover(hash, signature); - _throwError(error); - return recovered; - } - - /** - * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. - * - * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] - * - * _Available since v4.3._ - */ - function tryRecover( - bytes32 hash, - bytes32 r, - bytes32 vs - ) internal pure returns (address, RecoverError) { - bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); - uint8 v = uint8((uint256(vs) >> 255) + 27); - return tryRecover(hash, v, r, s); - } - - /** - * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. - * - * _Available since v4.2._ - */ - function recover( - bytes32 hash, - bytes32 r, - bytes32 vs - ) internal pure returns (address) { - (address recovered, RecoverError error) = tryRecover(hash, r, vs); - _throwError(error); - return recovered; - } - - /** - * @dev Overload of {ECDSA-tryRecover} that receives the `v`, - * `r` and `s` signature fields separately. - * - * _Available since v4.3._ - */ - function tryRecover( - bytes32 hash, - uint8 v, - bytes32 r, - bytes32 s - ) internal pure returns (address, RecoverError) { - // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature - // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines - // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most - // signatures from current libraries generate a unique signature with an s-value in the lower half order. - // - // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value - // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or - // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept - // these malleable signatures as well. - if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { - return (address(0), RecoverError.InvalidSignatureS); - } - if (v != 27 && v != 28) { - return (address(0), RecoverError.InvalidSignatureV); - } - - // If the signature is valid (and not malleable), return the signer address - address signer = ecrecover(hash, v, r, s); - if (signer == address(0)) { - return (address(0), RecoverError.InvalidSignature); - } - - return (signer, RecoverError.NoError); - } - - /** - * @dev Overload of {ECDSA-recover} that receives the `v`, - * `r` and `s` signature fields separately. - */ - function recover( - bytes32 hash, - uint8 v, - bytes32 r, - bytes32 s - ) internal pure returns (address) { - (address recovered, RecoverError error) = tryRecover(hash, v, r, s); - _throwError(error); - return recovered; - } - - /** - * @dev Returns an Ethereum Signed Message, created from a `hash`. This - * produces hash corresponding to the one signed with the - * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] - * JSON-RPC method as part of EIP-191. - * - * See {recover}. - */ - function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { - // 32 is the length in bytes of hash, - // enforced by the type signature above - return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); - } - - /** - * @dev Returns an Ethereum Signed Message, created from `s`. This - * produces hash corresponding to the one signed with the - * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] - * JSON-RPC method as part of EIP-191. - * - * See {recover}. - */ - function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { - return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); - } - - /** - * @dev Returns an Ethereum Signed Typed Data, created from a - * `domainSeparator` and a `structHash`. This produces hash corresponding - * to the one signed with the - * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] - * JSON-RPC method as part of EIP-712. - * - * See {recover}. - */ - function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { - return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol deleted file mode 100644 index 03244f4..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sol +++ /dev/null @@ -1,65 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol) - -pragma solidity ^0.8.0; - -/** - * @dev These functions deal with verification of Merkle Trees proofs. - * - * The proofs can be generated using the JavaScript library - * https://github.com/miguelmota/merkletreejs[merkletreejs]. - * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. - * - * See `test/utils/cryptography/MerkleProof.test.js` for some examples. - * - * WARNING: You should avoid using leaf values that are 64 bytes long prior to - * hashing, or use a hash function other than keccak256 for hashing leaves. - * This is because the concatenation of a sorted pair of internal nodes in - * the merkle tree could be reinterpreted as a leaf value. - */ -library MerkleProof { - /** - * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree - * defined by `root`. For this, a `proof` must be provided, containing - * sibling hashes on the branch from the leaf to the root of the tree. Each - * pair of leaves and each pair of pre-images are assumed to be sorted. - */ - function verify( - bytes32[] memory proof, - bytes32 root, - bytes32 leaf - ) internal pure returns (bool) { - return processProof(proof, leaf) == root; - } - - /** - * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up - * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt - * hash matches the root of the tree. When processing the proof, the pairs - * of leafs & pre-images are assumed to be sorted. - * - * _Available since v4.4._ - */ - function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { - bytes32 computedHash = leaf; - for (uint256 i = 0; i < proof.length; i++) { - bytes32 proofElement = proof[i]; - if (computedHash <= proofElement) { - // Hash(current computed hash + current element of the proof) - computedHash = _efficientHash(computedHash, proofElement); - } else { - // Hash(current element of the proof + current computed hash) - computedHash = _efficientHash(proofElement, computedHash); - } - } - return computedHash; - } - - function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { - assembly { - mstore(0x00, a) - mstore(0x20, b) - value := keccak256(0x00, 0x40) - } - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/cryptography/SignatureChecker.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/cryptography/SignatureChecker.sol deleted file mode 100644 index 3ed6e71..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/cryptography/SignatureChecker.sol +++ /dev/null @@ -1,40 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/SignatureChecker.sol) - -pragma solidity ^0.8.0; - -import "./ECDSA.sol"; -import "../Address.sol"; -import "../../interfaces/IERC1271.sol"; - -/** - * @dev Signature verification helper that can be used instead of `ECDSA.recover` to seamlessly support both ECDSA - * signatures from externally owned accounts (EOAs) as well as ERC1271 signatures from smart contract wallets like - * Argent and Gnosis Safe. - * - * _Available since v4.1._ - */ -library SignatureChecker { - /** - * @dev Checks if a signature is valid for a given signer and data hash. If the signer is a smart contract, the - * signature is validated against that smart contract using ERC1271, otherwise it's validated using `ECDSA.recover`. - * - * NOTE: Unlike ECDSA signatures, contract signatures are revocable, and the outcome of this function can thus - * change through time. It could return true at block N and false at block N+1 (or the opposite). - */ - function isValidSignatureNow( - address signer, - bytes32 hash, - bytes memory signature - ) internal view returns (bool) { - (address recovered, ECDSA.RecoverError error) = ECDSA.tryRecover(hash, signature); - if (error == ECDSA.RecoverError.NoError && recovered == signer) { - return true; - } - - (bool success, bytes memory result) = signer.staticcall( - abi.encodeWithSelector(IERC1271.isValidSignature.selector, hash, signature) - ); - return (success && result.length == 32 && abi.decode(result, (bytes4)) == IERC1271.isValidSignature.selector); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/cryptography/draft-EIP712.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/cryptography/draft-EIP712.sol deleted file mode 100644 index a32c25b..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/cryptography/draft-EIP712.sol +++ /dev/null @@ -1,104 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol) - -pragma solidity ^0.8.0; - -import "./ECDSA.sol"; - -/** - * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. - * - * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, - * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding - * they need in their contracts using a combination of `abi.encode` and `keccak256`. - * - * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding - * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA - * ({_hashTypedDataV4}). - * - * The implementation of the domain separator was designed to be as efficient as possible while still properly updating - * the chain id to protect against replay attacks on an eventual fork of the chain. - * - * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method - * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. - * - * _Available since v3.4._ - */ -abstract contract EIP712 { - /* solhint-disable var-name-mixedcase */ - // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to - // invalidate the cached domain separator if the chain id changes. - bytes32 private immutable _CACHED_DOMAIN_SEPARATOR; - uint256 private immutable _CACHED_CHAIN_ID; - address private immutable _CACHED_THIS; - - bytes32 private immutable _HASHED_NAME; - bytes32 private immutable _HASHED_VERSION; - bytes32 private immutable _TYPE_HASH; - - /* solhint-enable var-name-mixedcase */ - - /** - * @dev Initializes the domain separator and parameter caches. - * - * The meaning of `name` and `version` is specified in - * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: - * - * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. - * - `version`: the current major version of the signing domain. - * - * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart - * contract upgrade]. - */ - constructor(string memory name, string memory version) { - bytes32 hashedName = keccak256(bytes(name)); - bytes32 hashedVersion = keccak256(bytes(version)); - bytes32 typeHash = keccak256( - "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" - ); - _HASHED_NAME = hashedName; - _HASHED_VERSION = hashedVersion; - _CACHED_CHAIN_ID = block.chainid; - _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion); - _CACHED_THIS = address(this); - _TYPE_HASH = typeHash; - } - - /** - * @dev Returns the domain separator for the current chain. - */ - function _domainSeparatorV4() internal view returns (bytes32) { - if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) { - return _CACHED_DOMAIN_SEPARATOR; - } else { - return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION); - } - } - - function _buildDomainSeparator( - bytes32 typeHash, - bytes32 nameHash, - bytes32 versionHash - ) private view returns (bytes32) { - return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this))); - } - - /** - * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this - * function returns the hash of the fully encoded EIP712 message for this domain. - * - * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: - * - * ```solidity - * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( - * keccak256("Mail(address to,string contents)"), - * mailTo, - * keccak256(bytes(mailContents)) - * ))); - * address signer = ECDSA.recover(digest, signature); - * ``` - */ - function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { - return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/escrow/ConditionalEscrow.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/escrow/ConditionalEscrow.sol deleted file mode 100644 index 87f5381..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/escrow/ConditionalEscrow.sol +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/escrow/ConditionalEscrow.sol) - -pragma solidity ^0.8.0; - -import "./Escrow.sol"; - -/** - * @title ConditionalEscrow - * @dev Base abstract escrow to only allow withdrawal if a condition is met. - * @dev Intended usage: See {Escrow}. Same usage guidelines apply here. - */ -abstract contract ConditionalEscrow is Escrow { - /** - * @dev Returns whether an address is allowed to withdraw their funds. To be - * implemented by derived contracts. - * @param payee The destination address of the funds. - */ - function withdrawalAllowed(address payee) public view virtual returns (bool); - - function withdraw(address payable payee) public virtual override { - require(withdrawalAllowed(payee), "ConditionalEscrow: payee is not allowed to withdraw"); - super.withdraw(payee); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/escrow/Escrow.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/escrow/Escrow.sol deleted file mode 100644 index c90a746..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/escrow/Escrow.sol +++ /dev/null @@ -1,63 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/escrow/Escrow.sol) - -pragma solidity ^0.8.0; - -import "../../access/Ownable.sol"; -import "../Address.sol"; - -/** - * @title Escrow - * @dev Base escrow contract, holds funds designated for a payee until they - * withdraw them. - * - * Intended usage: This contract (and derived escrow contracts) should be a - * standalone contract, that only interacts with the contract that instantiated - * it. That way, it is guaranteed that all Ether will be handled according to - * the `Escrow` rules, and there is no need to check for payable functions or - * transfers in the inheritance tree. The contract that uses the escrow as its - * payment method should be its owner, and provide public methods redirecting - * to the escrow's deposit and withdraw. - */ -contract Escrow is Ownable { - using Address for address payable; - - event Deposited(address indexed payee, uint256 weiAmount); - event Withdrawn(address indexed payee, uint256 weiAmount); - - mapping(address => uint256) private _deposits; - - function depositsOf(address payee) public view returns (uint256) { - return _deposits[payee]; - } - - /** - * @dev Stores the sent amount as credit to be withdrawn. - * @param payee The destination address of the funds. - */ - function deposit(address payee) public payable virtual onlyOwner { - uint256 amount = msg.value; - _deposits[payee] += amount; - emit Deposited(payee, amount); - } - - /** - * @dev Withdraw accumulated balance for a payee, forwarding all gas to the - * recipient. - * - * WARNING: Forwarding all gas opens the door to reentrancy vulnerabilities. - * Make sure you trust the recipient, or are either following the - * checks-effects-interactions pattern or using {ReentrancyGuard}. - * - * @param payee The address whose funds will be withdrawn and transferred to. - */ - function withdraw(address payable payee) public virtual onlyOwner { - uint256 payment = _deposits[payee]; - - _deposits[payee] = 0; - - payee.sendValue(payment); - - emit Withdrawn(payee, payment); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/escrow/RefundEscrow.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/escrow/RefundEscrow.sol deleted file mode 100644 index 0e9621f..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/escrow/RefundEscrow.sol +++ /dev/null @@ -1,100 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/escrow/RefundEscrow.sol) - -pragma solidity ^0.8.0; - -import "./ConditionalEscrow.sol"; - -/** - * @title RefundEscrow - * @dev Escrow that holds funds for a beneficiary, deposited from multiple - * parties. - * @dev Intended usage: See {Escrow}. Same usage guidelines apply here. - * @dev The owner account (that is, the contract that instantiates this - * contract) may deposit, close the deposit period, and allow for either - * withdrawal by the beneficiary, or refunds to the depositors. All interactions - * with `RefundEscrow` will be made through the owner contract. - */ -contract RefundEscrow is ConditionalEscrow { - using Address for address payable; - - enum State { - Active, - Refunding, - Closed - } - - event RefundsClosed(); - event RefundsEnabled(); - - State private _state; - address payable private immutable _beneficiary; - - /** - * @dev Constructor. - * @param beneficiary_ The beneficiary of the deposits. - */ - constructor(address payable beneficiary_) { - require(beneficiary_ != address(0), "RefundEscrow: beneficiary is the zero address"); - _beneficiary = beneficiary_; - _state = State.Active; - } - - /** - * @return The current state of the escrow. - */ - function state() public view virtual returns (State) { - return _state; - } - - /** - * @return The beneficiary of the escrow. - */ - function beneficiary() public view virtual returns (address payable) { - return _beneficiary; - } - - /** - * @dev Stores funds that may later be refunded. - * @param refundee The address funds will be sent to if a refund occurs. - */ - function deposit(address refundee) public payable virtual override { - require(state() == State.Active, "RefundEscrow: can only deposit while active"); - super.deposit(refundee); - } - - /** - * @dev Allows for the beneficiary to withdraw their funds, rejecting - * further deposits. - */ - function close() public virtual onlyOwner { - require(state() == State.Active, "RefundEscrow: can only close while active"); - _state = State.Closed; - emit RefundsClosed(); - } - - /** - * @dev Allows for refunds to take place, rejecting further deposits. - */ - function enableRefunds() public virtual onlyOwner { - require(state() == State.Active, "RefundEscrow: can only enable refunds while active"); - _state = State.Refunding; - emit RefundsEnabled(); - } - - /** - * @dev Withdraws the beneficiary's funds. - */ - function beneficiaryWithdraw() public virtual { - require(state() == State.Closed, "RefundEscrow: beneficiary can only withdraw while closed"); - beneficiary().sendValue(address(this).balance); - } - - /** - * @dev Returns whether refundees can withdraw their deposits (be refunded). The overridden function receives a - * 'payee' argument, but we ignore it here since the condition is global, not per-payee. - */ - function withdrawalAllowed(address) public view override returns (bool) { - return state() == State.Refunding; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol deleted file mode 100644 index 3bf5613..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) - -pragma solidity ^0.8.0; - -import "./IERC165.sol"; - -/** - * @dev Implementation of the {IERC165} interface. - * - * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check - * for the additional interface id that will be supported. For example: - * - * ```solidity - * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { - * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); - * } - * ``` - * - * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. - */ -abstract contract ERC165 is IERC165 { - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { - return interfaceId == type(IERC165).interfaceId; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol deleted file mode 100644 index 6a240e1..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sol +++ /dev/null @@ -1,113 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165Checker.sol) - -pragma solidity ^0.8.0; - -import "./IERC165.sol"; - -/** - * @dev Library used to query support of an interface declared via {IERC165}. - * - * Note that these functions return the actual result of the query: they do not - * `revert` if an interface is not supported. It is up to the caller to decide - * what to do in these cases. - */ -library ERC165Checker { - // As per the EIP-165 spec, no interface should ever match 0xffffffff - bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff; - - /** - * @dev Returns true if `account` supports the {IERC165} interface, - */ - function supportsERC165(address account) internal view returns (bool) { - // Any contract that implements ERC165 must explicitly indicate support of - // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid - return - _supportsERC165Interface(account, type(IERC165).interfaceId) && - !_supportsERC165Interface(account, _INTERFACE_ID_INVALID); - } - - /** - * @dev Returns true if `account` supports the interface defined by - * `interfaceId`. Support for {IERC165} itself is queried automatically. - * - * See {IERC165-supportsInterface}. - */ - function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) { - // query support of both ERC165 as per the spec and support of _interfaceId - return supportsERC165(account) && _supportsERC165Interface(account, interfaceId); - } - - /** - * @dev Returns a boolean array where each value corresponds to the - * interfaces passed in and whether they're supported or not. This allows - * you to batch check interfaces for a contract where your expectation - * is that some interfaces may not be supported. - * - * See {IERC165-supportsInterface}. - * - * _Available since v3.4._ - */ - function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) - internal - view - returns (bool[] memory) - { - // an array of booleans corresponding to interfaceIds and whether they're supported or not - bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length); - - // query support of ERC165 itself - if (supportsERC165(account)) { - // query support of each interface in interfaceIds - for (uint256 i = 0; i < interfaceIds.length; i++) { - interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]); - } - } - - return interfaceIdsSupported; - } - - /** - * @dev Returns true if `account` supports all the interfaces defined in - * `interfaceIds`. Support for {IERC165} itself is queried automatically. - * - * Batch-querying can lead to gas savings by skipping repeated checks for - * {IERC165} support. - * - * See {IERC165-supportsInterface}. - */ - function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) { - // query support of ERC165 itself - if (!supportsERC165(account)) { - return false; - } - - // query support of each interface in _interfaceIds - for (uint256 i = 0; i < interfaceIds.length; i++) { - if (!_supportsERC165Interface(account, interfaceIds[i])) { - return false; - } - } - - // all interfaces supported - return true; - } - - /** - * @notice Query if a contract implements an interface, does not check ERC165 support - * @param account The address of the contract to query for support of an interface - * @param interfaceId The interface identifier, as specified in ERC-165 - * @return true if the contract at account indicates support of the interface with - * identifier interfaceId, false otherwise - * @dev Assumes that account contains a contract that supports ERC165, otherwise - * the behavior of this method is undefined. This precondition can be checked - * with {supportsERC165}. - * Interface identification is specified in ERC-165. - */ - function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) { - bytes memory encodedParams = abi.encodeWithSelector(IERC165.supportsInterface.selector, interfaceId); - (bool success, bytes memory result) = account.staticcall{gas: 30000}(encodedParams); - if (result.length < 32) return false; - return success && abi.decode(result, (bool)); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Storage.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Storage.sol deleted file mode 100644 index c99d9f3..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/introspection/ERC165Storage.sol +++ /dev/null @@ -1,42 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165Storage.sol) - -pragma solidity ^0.8.0; - -import "./ERC165.sol"; - -/** - * @dev Storage based implementation of the {IERC165} interface. - * - * Contracts may inherit from this and call {_registerInterface} to declare - * their support of an interface. - */ -abstract contract ERC165Storage is ERC165 { - /** - * @dev Mapping of interface ids to whether or not it's supported. - */ - mapping(bytes4 => bool) private _supportedInterfaces; - - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { - return super.supportsInterface(interfaceId) || _supportedInterfaces[interfaceId]; - } - - /** - * @dev Registers the contract as an implementer of the interface defined by - * `interfaceId`. Support of the actual ERC165 interface is automatic and - * registering its interface id is not required. - * - * See {IERC165-supportsInterface}. - * - * Requirements: - * - * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). - */ - function _registerInterface(bytes4 interfaceId) internal virtual { - require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); - _supportedInterfaces[interfaceId] = true; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/introspection/ERC1820Implementer.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/introspection/ERC1820Implementer.sol deleted file mode 100644 index 1b51396..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/introspection/ERC1820Implementer.sol +++ /dev/null @@ -1,44 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC1820Implementer.sol) - -pragma solidity ^0.8.0; - -import "./IERC1820Implementer.sol"; - -/** - * @dev Implementation of the {IERC1820Implementer} interface. - * - * Contracts may inherit from this and call {_registerInterfaceForAddress} to - * declare their willingness to be implementers. - * {IERC1820Registry-setInterfaceImplementer} should then be called for the - * registration to be complete. - */ -contract ERC1820Implementer is IERC1820Implementer { - bytes32 private constant _ERC1820_ACCEPT_MAGIC = keccak256("ERC1820_ACCEPT_MAGIC"); - - mapping(bytes32 => mapping(address => bool)) private _supportedInterfaces; - - /** - * @dev See {IERC1820Implementer-canImplementInterfaceForAddress}. - */ - function canImplementInterfaceForAddress(bytes32 interfaceHash, address account) - public - view - virtual - override - returns (bytes32) - { - return _supportedInterfaces[interfaceHash][account] ? _ERC1820_ACCEPT_MAGIC : bytes32(0x00); - } - - /** - * @dev Declares the contract as willing to be an implementer of - * `interfaceHash` for `account`. - * - * See {IERC1820Registry-setInterfaceImplementer} and - * {IERC1820Registry-interfaceHash}. - */ - function _registerInterfaceForAddress(bytes32 interfaceHash, address account) internal virtual { - _supportedInterfaces[interfaceHash][account] = true; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol deleted file mode 100644 index e8cdbdb..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC165 standard, as defined in the - * https://eips.ethereum.org/EIPS/eip-165[EIP]. - * - * Implementers can declare support of contract interfaces, which can then be - * queried by others ({ERC165Checker}). - * - * For an implementation, see {ERC165}. - */ -interface IERC165 { - /** - * @dev Returns true if this contract implements the interface defined by - * `interfaceId`. See the corresponding - * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] - * to learn more about how these ids are created. - * - * This function call must use less than 30 000 gas. - */ - function supportsInterface(bytes4 interfaceId) external view returns (bool); -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/introspection/IERC1820Implementer.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/introspection/IERC1820Implementer.sol deleted file mode 100644 index c4d0b30..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/introspection/IERC1820Implementer.sol +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC1820Implementer.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Interface for an ERC1820 implementer, as defined in the - * https://eips.ethereum.org/EIPS/eip-1820#interface-implementation-erc1820implementerinterface[EIP]. - * Used by contracts that will be registered as implementers in the - * {IERC1820Registry}. - */ -interface IERC1820Implementer { - /** - * @dev Returns a special value (`ERC1820_ACCEPT_MAGIC`) if this contract - * implements `interfaceHash` for `account`. - * - * See {IERC1820Registry-setInterfaceImplementer}. - */ - function canImplementInterfaceForAddress(bytes32 interfaceHash, address account) external view returns (bytes32); -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/introspection/IERC1820Registry.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/introspection/IERC1820Registry.sol deleted file mode 100644 index 5d688d4..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/introspection/IERC1820Registry.sol +++ /dev/null @@ -1,116 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC1820Registry.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Interface of the global ERC1820 Registry, as defined in the - * https://eips.ethereum.org/EIPS/eip-1820[EIP]. Accounts may register - * implementers for interfaces in this registry, as well as query support. - * - * Implementers may be shared by multiple accounts, and can also implement more - * than a single interface for each account. Contracts can implement interfaces - * for themselves, but externally-owned accounts (EOA) must delegate this to a - * contract. - * - * {IERC165} interfaces can also be queried via the registry. - * - * For an in-depth explanation and source code analysis, see the EIP text. - */ -interface IERC1820Registry { - event InterfaceImplementerSet(address indexed account, bytes32 indexed interfaceHash, address indexed implementer); - - event ManagerChanged(address indexed account, address indexed newManager); - - /** - * @dev Sets `newManager` as the manager for `account`. A manager of an - * account is able to set interface implementers for it. - * - * By default, each account is its own manager. Passing a value of `0x0` in - * `newManager` will reset the manager to this initial state. - * - * Emits a {ManagerChanged} event. - * - * Requirements: - * - * - the caller must be the current manager for `account`. - */ - function setManager(address account, address newManager) external; - - /** - * @dev Returns the manager for `account`. - * - * See {setManager}. - */ - function getManager(address account) external view returns (address); - - /** - * @dev Sets the `implementer` contract as ``account``'s implementer for - * `interfaceHash`. - * - * `account` being the zero address is an alias for the caller's address. - * The zero address can also be used in `implementer` to remove an old one. - * - * See {interfaceHash} to learn how these are created. - * - * Emits an {InterfaceImplementerSet} event. - * - * Requirements: - * - * - the caller must be the current manager for `account`. - * - `interfaceHash` must not be an {IERC165} interface id (i.e. it must not - * end in 28 zeroes). - * - `implementer` must implement {IERC1820Implementer} and return true when - * queried for support, unless `implementer` is the caller. See - * {IERC1820Implementer-canImplementInterfaceForAddress}. - */ - function setInterfaceImplementer( - address account, - bytes32 _interfaceHash, - address implementer - ) external; - - /** - * @dev Returns the implementer of `interfaceHash` for `account`. If no such - * implementer is registered, returns the zero address. - * - * If `interfaceHash` is an {IERC165} interface id (i.e. it ends with 28 - * zeroes), `account` will be queried for support of it. - * - * `account` being the zero address is an alias for the caller's address. - */ - function getInterfaceImplementer(address account, bytes32 _interfaceHash) external view returns (address); - - /** - * @dev Returns the interface hash for an `interfaceName`, as defined in the - * corresponding - * https://eips.ethereum.org/EIPS/eip-1820#interface-name[section of the EIP]. - */ - function interfaceHash(string calldata interfaceName) external pure returns (bytes32); - - /** - * @notice Updates the cache with whether the contract implements an ERC165 interface or not. - * @param account Address of the contract for which to update the cache. - * @param interfaceId ERC165 interface for which to update the cache. - */ - function updateERC165Cache(address account, bytes4 interfaceId) external; - - /** - * @notice Checks whether a contract implements an ERC165 interface or not. - * If the result is not cached a direct lookup on the contract address is performed. - * If the result is not cached or the cached value is out-of-date, the cache MUST be updated manually by calling - * {updateERC165Cache} with the contract address. - * @param account Address of the contract to check. - * @param interfaceId ERC165 interface to check. - * @return True if `account` implements `interfaceId`, false otherwise. - */ - function implementsERC165Interface(address account, bytes4 interfaceId) external view returns (bool); - - /** - * @notice Checks whether a contract implements an ERC165 interface or not without using nor updating the cache. - * @param account Address of the contract to check. - * @param interfaceId ERC165 interface to check. - * @return True if `account` implements `interfaceId`, false otherwise. - */ - function implementsERC165InterfaceNoCache(address account, bytes4 interfaceId) external view returns (bool); -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/math/Math.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/math/Math.sol deleted file mode 100644 index 291d257..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/math/Math.sol +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (utils/math/Math.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Standard math utilities missing in the Solidity language. - */ -library Math { - /** - * @dev Returns the largest of two numbers. - */ - function max(uint256 a, uint256 b) internal pure returns (uint256) { - return a >= b ? a : b; - } - - /** - * @dev Returns the smallest of two numbers. - */ - function min(uint256 a, uint256 b) internal pure returns (uint256) { - return a < b ? a : b; - } - - /** - * @dev Returns the average of two numbers. The result is rounded towards - * zero. - */ - function average(uint256 a, uint256 b) internal pure returns (uint256) { - // (a + b) / 2 can overflow. - return (a & b) + (a ^ b) / 2; - } - - /** - * @dev Returns the ceiling of the division of two numbers. - * - * This differs from standard division with `/` in that it rounds up instead - * of rounding down. - */ - function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { - // (a + b - 1) / b can overflow on addition, so we distribute. - return a / b + (a % b == 0 ? 0 : 1); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol deleted file mode 100644 index 3cd6473..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol +++ /dev/null @@ -1,241 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCast { - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, "SafeCast: value must be positive"); - return uint256(value); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128) { - require(value >= type(int128).min && value <= type(int128).max, "SafeCast: value doesn't fit in 128 bits"); - return int128(value); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64) { - require(value >= type(int64).min && value <= type(int64).max, "SafeCast: value doesn't fit in 64 bits"); - return int64(value); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32) { - require(value >= type(int32).min && value <= type(int32).max, "SafeCast: value doesn't fit in 32 bits"); - return int32(value); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16) { - require(value >= type(int16).min && value <= type(int16).max, "SafeCast: value doesn't fit in 16 bits"); - return int16(value); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits. - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8) { - require(value >= type(int8).min && value <= type(int8).max, "SafeCast: value doesn't fit in 8 bits"); - return int8(value); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/math/SafeMath.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/math/SafeMath.sol deleted file mode 100644 index 1e97d76..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/math/SafeMath.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) - -pragma solidity ^0.8.0; - -// CAUTION -// This version of SafeMath should only be used with Solidity 0.8 or later, -// because it relies on the compiler's built in overflow checks. - -/** - * @dev Wrappers over Solidity's arithmetic operations. - * - * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler - * now has built in overflow checking. - */ -library SafeMath { - /** - * @dev Returns the addition of two unsigned integers, with an overflow flag. - * - * _Available since v3.4._ - */ - function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { - unchecked { - uint256 c = a + b; - if (c < a) return (false, 0); - return (true, c); - } - } - - /** - * @dev Returns the subtraction of two unsigned integers, with an overflow flag. - * - * _Available since v3.4._ - */ - function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { - unchecked { - if (b > a) return (false, 0); - return (true, a - b); - } - } - - /** - * @dev Returns the multiplication of two unsigned integers, with an overflow flag. - * - * _Available since v3.4._ - */ - function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { - unchecked { - // Gas optimization: this is cheaper than requiring 'a' not being zero, but the - // benefit is lost if 'b' is also tested. - // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 - if (a == 0) return (true, 0); - uint256 c = a * b; - if (c / a != b) return (false, 0); - return (true, c); - } - } - - /** - * @dev Returns the division of two unsigned integers, with a division by zero flag. - * - * _Available since v3.4._ - */ - function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { - unchecked { - if (b == 0) return (false, 0); - return (true, a / b); - } - } - - /** - * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. - * - * _Available since v3.4._ - */ - function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { - unchecked { - if (b == 0) return (false, 0); - return (true, a % b); - } - } - - /** - * @dev Returns the addition of two unsigned integers, reverting on - * overflow. - * - * Counterpart to Solidity's `+` operator. - * - * Requirements: - * - * - Addition cannot overflow. - */ - function add(uint256 a, uint256 b) internal pure returns (uint256) { - return a + b; - } - - /** - * @dev Returns the subtraction of two unsigned integers, reverting on - * overflow (when the result is negative). - * - * Counterpart to Solidity's `-` operator. - * - * Requirements: - * - * - Subtraction cannot overflow. - */ - function sub(uint256 a, uint256 b) internal pure returns (uint256) { - return a - b; - } - - /** - * @dev Returns the multiplication of two unsigned integers, reverting on - * overflow. - * - * Counterpart to Solidity's `*` operator. - * - * Requirements: - * - * - Multiplication cannot overflow. - */ - function mul(uint256 a, uint256 b) internal pure returns (uint256) { - return a * b; - } - - /** - * @dev Returns the integer division of two unsigned integers, reverting on - * division by zero. The result is rounded towards zero. - * - * Counterpart to Solidity's `/` operator. - * - * Requirements: - * - * - The divisor cannot be zero. - */ - function div(uint256 a, uint256 b) internal pure returns (uint256) { - return a / b; - } - - /** - * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), - * reverting when dividing by zero. - * - * Counterpart to Solidity's `%` operator. This function uses a `revert` - * opcode (which leaves remaining gas untouched) while Solidity uses an - * invalid opcode to revert (consuming all remaining gas). - * - * Requirements: - * - * - The divisor cannot be zero. - */ - function mod(uint256 a, uint256 b) internal pure returns (uint256) { - return a % b; - } - - /** - * @dev Returns the subtraction of two unsigned integers, reverting with custom message on - * overflow (when the result is negative). - * - * CAUTION: This function is deprecated because it requires allocating memory for the error - * message unnecessarily. For custom revert reasons use {trySub}. - * - * Counterpart to Solidity's `-` operator. - * - * Requirements: - * - * - Subtraction cannot overflow. - */ - function sub( - uint256 a, - uint256 b, - string memory errorMessage - ) internal pure returns (uint256) { - unchecked { - require(b <= a, errorMessage); - return a - b; - } - } - - /** - * @dev Returns the integer division of two unsigned integers, reverting with custom message on - * division by zero. The result is rounded towards zero. - * - * Counterpart to Solidity's `/` operator. Note: this function uses a - * `revert` opcode (which leaves remaining gas untouched) while Solidity - * uses an invalid opcode to revert (consuming all remaining gas). - * - * Requirements: - * - * - The divisor cannot be zero. - */ - function div( - uint256 a, - uint256 b, - string memory errorMessage - ) internal pure returns (uint256) { - unchecked { - require(b > 0, errorMessage); - return a / b; - } - } - - /** - * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), - * reverting with custom message when dividing by zero. - * - * CAUTION: This function is deprecated because it requires allocating memory for the error - * message unnecessarily. For custom revert reasons use {tryMod}. - * - * Counterpart to Solidity's `%` operator. This function uses a `revert` - * opcode (which leaves remaining gas untouched) while Solidity uses an - * invalid opcode to revert (consuming all remaining gas). - * - * Requirements: - * - * - The divisor cannot be zero. - */ - function mod( - uint256 a, - uint256 b, - string memory errorMessage - ) internal pure returns (uint256) { - unchecked { - require(b > 0, errorMessage); - return a % b; - } - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol deleted file mode 100644 index 5a9d606..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/math/SignedMath.sol +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (utils/math/SignedMath.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Standard signed math utilities missing in the Solidity language. - */ -library SignedMath { - /** - * @dev Returns the largest of two signed numbers. - */ - function max(int256 a, int256 b) internal pure returns (int256) { - return a >= b ? a : b; - } - - /** - * @dev Returns the smallest of two signed numbers. - */ - function min(int256 a, int256 b) internal pure returns (int256) { - return a < b ? a : b; - } - - /** - * @dev Returns the average of two signed numbers without overflow. - * The result is rounded towards zero. - */ - function average(int256 a, int256 b) internal pure returns (int256) { - // Formula from the book "Hacker's Delight" - int256 x = (a & b) + ((a ^ b) >> 1); - return x + (int256(uint256(x) >> 255) & (a ^ b)); - } - - /** - * @dev Returns the absolute unsigned value of a signed value. - */ - function abs(int256 n) internal pure returns (uint256) { - unchecked { - // must be unchecked in order to support `n = type(int256).min` - return uint256(n >= 0 ? n : -n); - } - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/math/SignedSafeMath.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/math/SignedSafeMath.sol deleted file mode 100644 index 6704d4c..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/math/SignedSafeMath.sol +++ /dev/null @@ -1,68 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/math/SignedSafeMath.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Wrappers over Solidity's arithmetic operations. - * - * NOTE: `SignedSafeMath` is no longer needed starting with Solidity 0.8. The compiler - * now has built in overflow checking. - */ -library SignedSafeMath { - /** - * @dev Returns the multiplication of two signed integers, reverting on - * overflow. - * - * Counterpart to Solidity's `*` operator. - * - * Requirements: - * - * - Multiplication cannot overflow. - */ - function mul(int256 a, int256 b) internal pure returns (int256) { - return a * b; - } - - /** - * @dev Returns the integer division of two signed integers. Reverts on - * division by zero. The result is rounded towards zero. - * - * Counterpart to Solidity's `/` operator. - * - * Requirements: - * - * - The divisor cannot be zero. - */ - function div(int256 a, int256 b) internal pure returns (int256) { - return a / b; - } - - /** - * @dev Returns the subtraction of two signed integers, reverting on - * overflow. - * - * Counterpart to Solidity's `-` operator. - * - * Requirements: - * - * - Subtraction cannot overflow. - */ - function sub(int256 a, int256 b) internal pure returns (int256) { - return a - b; - } - - /** - * @dev Returns the addition of two signed integers, reverting on - * overflow. - * - * Counterpart to Solidity's `+` operator. - * - * Requirements: - * - * - Addition cannot overflow. - */ - function add(int256 a, int256 b) internal pure returns (int256) { - return a + b; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/structs/BitMaps.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/structs/BitMaps.sol deleted file mode 100644 index 9721b83..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/structs/BitMaps.sol +++ /dev/null @@ -1,55 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/structs/BitMaps.sol) -pragma solidity ^0.8.0; - -/** - * @dev Library for managing uint256 to bool mapping in a compact and efficient way, providing the keys are sequential. - * Largelly inspired by Uniswap's https://github.com/Uniswap/merkle-distributor/blob/master/contracts/MerkleDistributor.sol[merkle-distributor]. - */ -library BitMaps { - struct BitMap { - mapping(uint256 => uint256) _data; - } - - /** - * @dev Returns whether the bit at `index` is set. - */ - function get(BitMap storage bitmap, uint256 index) internal view returns (bool) { - uint256 bucket = index >> 8; - uint256 mask = 1 << (index & 0xff); - return bitmap._data[bucket] & mask != 0; - } - - /** - * @dev Sets the bit at `index` to the boolean `value`. - */ - function setTo( - BitMap storage bitmap, - uint256 index, - bool value - ) internal { - if (value) { - set(bitmap, index); - } else { - unset(bitmap, index); - } - } - - /** - * @dev Sets the bit at `index`. - */ - function set(BitMap storage bitmap, uint256 index) internal { - uint256 bucket = index >> 8; - uint256 mask = 1 << (index & 0xff); - bitmap._data[bucket] |= mask; - } - - /** - * @dev Unsets the bit at `index`. - */ - function unset(BitMap storage bitmap, uint256 index) internal { - uint256 bucket = index >> 8; - uint256 mask = 1 << (index & 0xff); - bitmap._data[bucket] &= ~mask; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/structs/DoubleEndedQueue.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/structs/DoubleEndedQueue.sol deleted file mode 100644 index d1d968e..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/structs/DoubleEndedQueue.sol +++ /dev/null @@ -1,169 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.4; - -import "../math/SafeCast.sol"; - -/** - * @dev A sequence of items with the ability to efficiently push and pop items (i.e. insert and remove) on both ends of - * the sequence (called front and back). Among other access patterns, it can be used to implement efficient LIFO and - * FIFO queues. Storage use is optimized, and all operations are O(1) constant time. This includes {clear}, given that - * the existing queue contents are left in storage. - * - * The struct is called `Bytes32Deque`. Other types can be cast to and from `bytes32`. This data structure can only be - * used in storage, and not in memory. - * ``` - * DoubleEndedQueue.Bytes32Deque queue; - * ``` - * - * _Available since v4.6._ - */ -library DoubleEndedQueue { - /** - * @dev An operation (e.g. {front}) couldn't be completed due to the queue being empty. - */ - error Empty(); - - /** - * @dev An operation (e.g. {at}) couldn't be completed due to an index being out of bounds. - */ - error OutOfBounds(); - - /** - * @dev Indices are signed integers because the queue can grow in any direction. They are 128 bits so begin and end - * are packed in a single storage slot for efficient access. Since the items are added one at a time we can safely - * assume that these 128-bit indices will not overflow, and use unchecked arithmetic. - * - * Struct members have an underscore prefix indicating that they are "private" and should not be read or written to - * directly. Use the functions provided below instead. Modifying the struct manually may violate assumptions and - * lead to unexpected behavior. - * - * Indices are in the range [begin, end) which means the first item is at data[begin] and the last item is at - * data[end - 1]. - */ - struct Bytes32Deque { - int128 _begin; - int128 _end; - mapping(int128 => bytes32) _data; - } - - /** - * @dev Inserts an item at the end of the queue. - */ - function pushBack(Bytes32Deque storage deque, bytes32 value) internal { - int128 backIndex = deque._end; - deque._data[backIndex] = value; - unchecked { - deque._end = backIndex + 1; - } - } - - /** - * @dev Removes the item at the end of the queue and returns it. - * - * Reverts with `Empty` if the queue is empty. - */ - function popBack(Bytes32Deque storage deque) internal returns (bytes32 value) { - if (empty(deque)) revert Empty(); - int128 backIndex; - unchecked { - backIndex = deque._end - 1; - } - value = deque._data[backIndex]; - delete deque._data[backIndex]; - deque._end = backIndex; - } - - /** - * @dev Inserts an item at the beginning of the queue. - */ - function pushFront(Bytes32Deque storage deque, bytes32 value) internal { - int128 frontIndex; - unchecked { - frontIndex = deque._begin - 1; - } - deque._data[frontIndex] = value; - deque._begin = frontIndex; - } - - /** - * @dev Removes the item at the beginning of the queue and returns it. - * - * Reverts with `Empty` if the queue is empty. - */ - function popFront(Bytes32Deque storage deque) internal returns (bytes32 value) { - if (empty(deque)) revert Empty(); - int128 frontIndex = deque._begin; - value = deque._data[frontIndex]; - delete deque._data[frontIndex]; - unchecked { - deque._begin = frontIndex + 1; - } - } - - /** - * @dev Returns the item at the beginning of the queue. - * - * Reverts with `Empty` if the queue is empty. - */ - function front(Bytes32Deque storage deque) internal view returns (bytes32 value) { - if (empty(deque)) revert Empty(); - int128 frontIndex = deque._begin; - return deque._data[frontIndex]; - } - - /** - * @dev Returns the item at the end of the queue. - * - * Reverts with `Empty` if the queue is empty. - */ - function back(Bytes32Deque storage deque) internal view returns (bytes32 value) { - if (empty(deque)) revert Empty(); - int128 backIndex; - unchecked { - backIndex = deque._end - 1; - } - return deque._data[backIndex]; - } - - /** - * @dev Return the item at a position in the queue given by `index`, with the first item at 0 and last item at - * `length(deque) - 1`. - * - * Reverts with `OutOfBounds` if the index is out of bounds. - */ - function at(Bytes32Deque storage deque, uint256 index) internal view returns (bytes32 value) { - // int256(deque._begin) is a safe upcast - int128 idx = SafeCast.toInt128(int256(deque._begin) + SafeCast.toInt256(index)); - if (idx >= deque._end) revert OutOfBounds(); - return deque._data[idx]; - } - - /** - * @dev Resets the queue back to being empty. - * - * NOTE: The current items are left behind in storage. This does not affect the functioning of the queue, but misses - * out on potential gas refunds. - */ - function clear(Bytes32Deque storage deque) internal { - deque._begin = 0; - deque._end = 0; - } - - /** - * @dev Returns the number of items in the queue. - */ - function length(Bytes32Deque storage deque) internal view returns (uint256) { - // The interface preserves the invariant that begin <= end so we assume this will not overflow. - // We also assume there are at most int256.max items in the queue. - unchecked { - return uint256(int256(deque._end) - int256(deque._begin)); - } - } - - /** - * @dev Returns true if the queue is empty. - */ - function empty(Bytes32Deque storage deque) internal view returns (bool) { - return deque._end <= deque._begin; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/structs/EnumerableMap.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/structs/EnumerableMap.sol deleted file mode 100644 index 8717c69..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/structs/EnumerableMap.sol +++ /dev/null @@ -1,337 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/structs/EnumerableMap.sol) - -pragma solidity ^0.8.0; - -import "./EnumerableSet.sol"; - -/** - * @dev Library for managing an enumerable variant of Solidity's - * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`] - * type. - * - * Maps have the following properties: - * - * - Entries are added, removed, and checked for existence in constant time - * (O(1)). - * - Entries are enumerated in O(n). No guarantees are made on the ordering. - * - * ``` - * contract Example { - * // Add the library methods - * using EnumerableMap for EnumerableMap.UintToAddressMap; - * - * // Declare a set state variable - * EnumerableMap.UintToAddressMap private myMap; - * } - * ``` - * - * The following map types are supported: - * - * - `uint256 -> address` (`UintToAddressMap`) since v3.0.0 - * - `address -> uint256` (`AddressToUintMap`) since v4.6.0 - * - `bytes32 -> bytes32` (`Bytes32ToBytes32`) since v4.6.0 - */ -library EnumerableMap { - using EnumerableSet for EnumerableSet.Bytes32Set; - - // To implement this library for multiple types with as little code - // repetition as possible, we write it in terms of a generic Map type with - // bytes32 keys and values. - // The Map implementation uses private functions, and user-facing - // implementations (such as Uint256ToAddressMap) are just wrappers around - // the underlying Map. - // This means that we can only create new EnumerableMaps for types that fit - // in bytes32. - - struct Bytes32ToBytes32Map { - // Storage of keys - EnumerableSet.Bytes32Set _keys; - mapping(bytes32 => bytes32) _values; - } - - /** - * @dev Adds a key-value pair to a map, or updates the value for an existing - * key. O(1). - * - * Returns true if the key was added to the map, that is if it was not - * already present. - */ - function set( - Bytes32ToBytes32Map storage map, - bytes32 key, - bytes32 value - ) internal returns (bool) { - map._values[key] = value; - return map._keys.add(key); - } - - /** - * @dev Removes a key-value pair from a map. O(1). - * - * Returns true if the key was removed from the map, that is if it was present. - */ - function remove(Bytes32ToBytes32Map storage map, bytes32 key) internal returns (bool) { - delete map._values[key]; - return map._keys.remove(key); - } - - /** - * @dev Returns true if the key is in the map. O(1). - */ - function contains(Bytes32ToBytes32Map storage map, bytes32 key) internal view returns (bool) { - return map._keys.contains(key); - } - - /** - * @dev Returns the number of key-value pairs in the map. O(1). - */ - function length(Bytes32ToBytes32Map storage map) internal view returns (uint256) { - return map._keys.length(); - } - - /** - * @dev Returns the key-value pair stored at position `index` in the map. O(1). - * - * Note that there are no guarantees on the ordering of entries inside the - * array, and it may change when more entries are added or removed. - * - * Requirements: - * - * - `index` must be strictly less than {length}. - */ - function at(Bytes32ToBytes32Map storage map, uint256 index) internal view returns (bytes32, bytes32) { - bytes32 key = map._keys.at(index); - return (key, map._values[key]); - } - - /** - * @dev Tries to returns the value associated with `key`. O(1). - * Does not revert if `key` is not in the map. - */ - function tryGet(Bytes32ToBytes32Map storage map, bytes32 key) internal view returns (bool, bytes32) { - bytes32 value = map._values[key]; - if (value == bytes32(0)) { - return (contains(map, key), bytes32(0)); - } else { - return (true, value); - } - } - - /** - * @dev Returns the value associated with `key`. O(1). - * - * Requirements: - * - * - `key` must be in the map. - */ - function get(Bytes32ToBytes32Map storage map, bytes32 key) internal view returns (bytes32) { - bytes32 value = map._values[key]; - require(value != 0 || contains(map, key), "EnumerableMap: nonexistent key"); - return value; - } - - /** - * @dev Same as {_get}, with a custom error message when `key` is not in the map. - * - * CAUTION: This function is deprecated because it requires allocating memory for the error - * message unnecessarily. For custom revert reasons use {_tryGet}. - */ - function get( - Bytes32ToBytes32Map storage map, - bytes32 key, - string memory errorMessage - ) internal view returns (bytes32) { - bytes32 value = map._values[key]; - require(value != 0 || contains(map, key), errorMessage); - return value; - } - - // UintToAddressMap - - struct UintToAddressMap { - Bytes32ToBytes32Map _inner; - } - - /** - * @dev Adds a key-value pair to a map, or updates the value for an existing - * key. O(1). - * - * Returns true if the key was added to the map, that is if it was not - * already present. - */ - function set( - UintToAddressMap storage map, - uint256 key, - address value - ) internal returns (bool) { - return set(map._inner, bytes32(key), bytes32(uint256(uint160(value)))); - } - - /** - * @dev Removes a value from a set. O(1). - * - * Returns true if the key was removed from the map, that is if it was present. - */ - function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) { - return remove(map._inner, bytes32(key)); - } - - /** - * @dev Returns true if the key is in the map. O(1). - */ - function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) { - return contains(map._inner, bytes32(key)); - } - - /** - * @dev Returns the number of elements in the map. O(1). - */ - function length(UintToAddressMap storage map) internal view returns (uint256) { - return length(map._inner); - } - - /** - * @dev Returns the element stored at position `index` in the set. O(1). - * Note that there are no guarantees on the ordering of values inside the - * array, and it may change when more values are added or removed. - * - * Requirements: - * - * - `index` must be strictly less than {length}. - */ - function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) { - (bytes32 key, bytes32 value) = at(map._inner, index); - return (uint256(key), address(uint160(uint256(value)))); - } - - /** - * @dev Tries to returns the value associated with `key`. O(1). - * Does not revert if `key` is not in the map. - * - * _Available since v3.4._ - */ - function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) { - (bool success, bytes32 value) = tryGet(map._inner, bytes32(key)); - return (success, address(uint160(uint256(value)))); - } - - /** - * @dev Returns the value associated with `key`. O(1). - * - * Requirements: - * - * - `key` must be in the map. - */ - function get(UintToAddressMap storage map, uint256 key) internal view returns (address) { - return address(uint160(uint256(get(map._inner, bytes32(key))))); - } - - /** - * @dev Same as {get}, with a custom error message when `key` is not in the map. - * - * CAUTION: This function is deprecated because it requires allocating memory for the error - * message unnecessarily. For custom revert reasons use {tryGet}. - */ - function get( - UintToAddressMap storage map, - uint256 key, - string memory errorMessage - ) internal view returns (address) { - return address(uint160(uint256(get(map._inner, bytes32(key), errorMessage)))); - } - - // AddressToUintMap - - struct AddressToUintMap { - Bytes32ToBytes32Map _inner; - } - - /** - * @dev Adds a key-value pair to a map, or updates the value for an existing - * key. O(1). - * - * Returns true if the key was added to the map, that is if it was not - * already present. - */ - function set( - AddressToUintMap storage map, - address key, - uint256 value - ) internal returns (bool) { - return set(map._inner, bytes32(uint256(uint160(key))), bytes32(value)); - } - - /** - * @dev Removes a value from a set. O(1). - * - * Returns true if the key was removed from the map, that is if it was present. - */ - function remove(AddressToUintMap storage map, address key) internal returns (bool) { - return remove(map._inner, bytes32(uint256(uint160(key)))); - } - - /** - * @dev Returns true if the key is in the map. O(1). - */ - function contains(AddressToUintMap storage map, address key) internal view returns (bool) { - return contains(map._inner, bytes32(uint256(uint160(key)))); - } - - /** - * @dev Returns the number of elements in the map. O(1). - */ - function length(AddressToUintMap storage map) internal view returns (uint256) { - return length(map._inner); - } - - /** - * @dev Returns the element stored at position `index` in the set. O(1). - * Note that there are no guarantees on the ordering of values inside the - * array, and it may change when more values are added or removed. - * - * Requirements: - * - * - `index` must be strictly less than {length}. - */ - function at(AddressToUintMap storage map, uint256 index) internal view returns (address, uint256) { - (bytes32 key, bytes32 value) = at(map._inner, index); - return (address(uint160(uint256(key))), uint256(value)); - } - - /** - * @dev Tries to returns the value associated with `key`. O(1). - * Does not revert if `key` is not in the map. - * - * _Available since v3.4._ - */ - function tryGet(AddressToUintMap storage map, address key) internal view returns (bool, uint256) { - (bool success, bytes32 value) = tryGet(map._inner, bytes32(uint256(uint160(key)))); - return (success, uint256(value)); - } - - /** - * @dev Returns the value associated with `key`. O(1). - * - * Requirements: - * - * - `key` must be in the map. - */ - function get(AddressToUintMap storage map, address key) internal view returns (uint256) { - return uint256(get(map._inner, bytes32(uint256(uint160(key))))); - } - - /** - * @dev Same as {get}, with a custom error message when `key` is not in the map. - * - * CAUTION: This function is deprecated because it requires allocating memory for the error - * message unnecessarily. For custom revert reasons use {tryGet}. - */ - function get( - AddressToUintMap storage map, - address key, - string memory errorMessage - ) internal view returns (uint256) { - return uint256(get(map._inner, bytes32(uint256(uint160(key))), errorMessage)); - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol deleted file mode 100644 index bd34a4b..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol +++ /dev/null @@ -1,357 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/structs/EnumerableSet.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Library for managing - * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive - * types. - * - * Sets have the following properties: - * - * - Elements are added, removed, and checked for existence in constant time - * (O(1)). - * - Elements are enumerated in O(n). No guarantees are made on the ordering. - * - * ``` - * contract Example { - * // Add the library methods - * using EnumerableSet for EnumerableSet.AddressSet; - * - * // Declare a set state variable - * EnumerableSet.AddressSet private mySet; - * } - * ``` - * - * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) - * and `uint256` (`UintSet`) are supported. - */ -library EnumerableSet { - // To implement this library for multiple types with as little code - // repetition as possible, we write it in terms of a generic Set type with - // bytes32 values. - // The Set implementation uses private functions, and user-facing - // implementations (such as AddressSet) are just wrappers around the - // underlying Set. - // This means that we can only create new EnumerableSets for types that fit - // in bytes32. - - struct Set { - // Storage of set values - bytes32[] _values; - // Position of the value in the `values` array, plus 1 because index 0 - // means a value is not in the set. - mapping(bytes32 => uint256) _indexes; - } - - /** - * @dev Add a value to a set. O(1). - * - * Returns true if the value was added to the set, that is if it was not - * already present. - */ - function _add(Set storage set, bytes32 value) private returns (bool) { - if (!_contains(set, value)) { - set._values.push(value); - // The value is stored at length-1, but we add 1 to all indexes - // and use 0 as a sentinel value - set._indexes[value] = set._values.length; - return true; - } else { - return false; - } - } - - /** - * @dev Removes a value from a set. O(1). - * - * Returns true if the value was removed from the set, that is if it was - * present. - */ - function _remove(Set storage set, bytes32 value) private returns (bool) { - // We read and store the value's index to prevent multiple reads from the same storage slot - uint256 valueIndex = set._indexes[value]; - - if (valueIndex != 0) { - // Equivalent to contains(set, value) - // To delete an element from the _values array in O(1), we swap the element to delete with the last one in - // the array, and then remove the last element (sometimes called as 'swap and pop'). - // This modifies the order of the array, as noted in {at}. - - uint256 toDeleteIndex = valueIndex - 1; - uint256 lastIndex = set._values.length - 1; - - if (lastIndex != toDeleteIndex) { - bytes32 lastValue = set._values[lastIndex]; - - // Move the last value to the index where the value to delete is - set._values[toDeleteIndex] = lastValue; - // Update the index for the moved value - set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex - } - - // Delete the slot where the moved value was stored - set._values.pop(); - - // Delete the index for the deleted slot - delete set._indexes[value]; - - return true; - } else { - return false; - } - } - - /** - * @dev Returns true if the value is in the set. O(1). - */ - function _contains(Set storage set, bytes32 value) private view returns (bool) { - return set._indexes[value] != 0; - } - - /** - * @dev Returns the number of values on the set. O(1). - */ - function _length(Set storage set) private view returns (uint256) { - return set._values.length; - } - - /** - * @dev Returns the value stored at position `index` in the set. O(1). - * - * Note that there are no guarantees on the ordering of values inside the - * array, and it may change when more values are added or removed. - * - * Requirements: - * - * - `index` must be strictly less than {length}. - */ - function _at(Set storage set, uint256 index) private view returns (bytes32) { - return set._values[index]; - } - - /** - * @dev Return the entire set in an array - * - * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed - * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that - * this function has an unbounded cost, and using it as part of a state-changing function may render the function - * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. - */ - function _values(Set storage set) private view returns (bytes32[] memory) { - return set._values; - } - - // Bytes32Set - - struct Bytes32Set { - Set _inner; - } - - /** - * @dev Add a value to a set. O(1). - * - * Returns true if the value was added to the set, that is if it was not - * already present. - */ - function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { - return _add(set._inner, value); - } - - /** - * @dev Removes a value from a set. O(1). - * - * Returns true if the value was removed from the set, that is if it was - * present. - */ - function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { - return _remove(set._inner, value); - } - - /** - * @dev Returns true if the value is in the set. O(1). - */ - function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { - return _contains(set._inner, value); - } - - /** - * @dev Returns the number of values in the set. O(1). - */ - function length(Bytes32Set storage set) internal view returns (uint256) { - return _length(set._inner); - } - - /** - * @dev Returns the value stored at position `index` in the set. O(1). - * - * Note that there are no guarantees on the ordering of values inside the - * array, and it may change when more values are added or removed. - * - * Requirements: - * - * - `index` must be strictly less than {length}. - */ - function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { - return _at(set._inner, index); - } - - /** - * @dev Return the entire set in an array - * - * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed - * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that - * this function has an unbounded cost, and using it as part of a state-changing function may render the function - * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. - */ - function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { - return _values(set._inner); - } - - // AddressSet - - struct AddressSet { - Set _inner; - } - - /** - * @dev Add a value to a set. O(1). - * - * Returns true if the value was added to the set, that is if it was not - * already present. - */ - function add(AddressSet storage set, address value) internal returns (bool) { - return _add(set._inner, bytes32(uint256(uint160(value)))); - } - - /** - * @dev Removes a value from a set. O(1). - * - * Returns true if the value was removed from the set, that is if it was - * present. - */ - function remove(AddressSet storage set, address value) internal returns (bool) { - return _remove(set._inner, bytes32(uint256(uint160(value)))); - } - - /** - * @dev Returns true if the value is in the set. O(1). - */ - function contains(AddressSet storage set, address value) internal view returns (bool) { - return _contains(set._inner, bytes32(uint256(uint160(value)))); - } - - /** - * @dev Returns the number of values in the set. O(1). - */ - function length(AddressSet storage set) internal view returns (uint256) { - return _length(set._inner); - } - - /** - * @dev Returns the value stored at position `index` in the set. O(1). - * - * Note that there are no guarantees on the ordering of values inside the - * array, and it may change when more values are added or removed. - * - * Requirements: - * - * - `index` must be strictly less than {length}. - */ - function at(AddressSet storage set, uint256 index) internal view returns (address) { - return address(uint160(uint256(_at(set._inner, index)))); - } - - /** - * @dev Return the entire set in an array - * - * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed - * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that - * this function has an unbounded cost, and using it as part of a state-changing function may render the function - * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. - */ - function values(AddressSet storage set) internal view returns (address[] memory) { - bytes32[] memory store = _values(set._inner); - address[] memory result; - - assembly { - result := store - } - - return result; - } - - // UintSet - - struct UintSet { - Set _inner; - } - - /** - * @dev Add a value to a set. O(1). - * - * Returns true if the value was added to the set, that is if it was not - * already present. - */ - function add(UintSet storage set, uint256 value) internal returns (bool) { - return _add(set._inner, bytes32(value)); - } - - /** - * @dev Removes a value from a set. O(1). - * - * Returns true if the value was removed from the set, that is if it was - * present. - */ - function remove(UintSet storage set, uint256 value) internal returns (bool) { - return _remove(set._inner, bytes32(value)); - } - - /** - * @dev Returns true if the value is in the set. O(1). - */ - function contains(UintSet storage set, uint256 value) internal view returns (bool) { - return _contains(set._inner, bytes32(value)); - } - - /** - * @dev Returns the number of values on the set. O(1). - */ - function length(UintSet storage set) internal view returns (uint256) { - return _length(set._inner); - } - - /** - * @dev Returns the value stored at position `index` in the set. O(1). - * - * Note that there are no guarantees on the ordering of values inside the - * array, and it may change when more values are added or removed. - * - * Requirements: - * - * - `index` must be strictly less than {length}. - */ - function at(UintSet storage set, uint256 index) internal view returns (uint256) { - return uint256(_at(set._inner, index)); - } - - /** - * @dev Return the entire set in an array - * - * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed - * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that - * this function has an unbounded cost, and using it as part of a state-changing function may render the function - * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. - */ - function values(UintSet storage set) internal view returns (uint256[] memory) { - bytes32[] memory store = _values(set._inner); - uint256[] memory result; - - assembly { - result := store - } - - return result; - } -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/vendor/amb/IAMB.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/vendor/amb/IAMB.sol deleted file mode 100644 index 529913f..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/vendor/amb/IAMB.sol +++ /dev/null @@ -1,48 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -interface IAMB { - event UserRequestForAffirmation(bytes32 indexed messageId, bytes encodedData); - event UserRequestForSignature(bytes32 indexed messageId, bytes encodedData); - event AffirmationCompleted( - address indexed sender, - address indexed executor, - bytes32 indexed messageId, - bool status - ); - event RelayedMessage(address indexed sender, address indexed executor, bytes32 indexed messageId, bool status); - - function messageSender() external view returns (address); - - function maxGasPerTx() external view returns (uint256); - - function transactionHash() external view returns (bytes32); - - function messageId() external view returns (bytes32); - - function messageSourceChainId() external view returns (bytes32); - - function messageCallStatus(bytes32 _messageId) external view returns (bool); - - function failedMessageDataHash(bytes32 _messageId) external view returns (bytes32); - - function failedMessageReceiver(bytes32 _messageId) external view returns (address); - - function failedMessageSender(bytes32 _messageId) external view returns (address); - - function requireToPassMessage( - address _contract, - bytes calldata _data, - uint256 _gas - ) external returns (bytes32); - - function requireToConfirmMessage( - address _contract, - bytes calldata _data, - uint256 _gas - ) external returns (bytes32); - - function sourceChainId() external view returns (uint256); - - function destinationChainId() external view returns (uint256); -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/vendor/arbitrum/IArbSys.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/vendor/arbitrum/IArbSys.sol deleted file mode 100644 index 3658e46..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/vendor/arbitrum/IArbSys.sol +++ /dev/null @@ -1,98 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >=0.4.21 <0.9.0; - -/** - * @title Precompiled contract that exists in every Arbitrum chain at address(100), 0x0000000000000000000000000000000000000064. Exposes a variety of system-level functionality. - */ -interface IArbSys { - /** - * @notice Get internal version number identifying an ArbOS build - * @return version number as int - */ - function arbOSVersion() external pure returns (uint256); - - function arbChainID() external view returns (uint256); - - /** - * @notice Get Arbitrum block number (distinct from L1 block number; Arbitrum genesis block has block number 0) - * @return block number as int - */ - function arbBlockNumber() external view returns (uint256); - - /** - * @notice Send given amount of Eth to dest from sender. - * This is a convenience function, which is equivalent to calling sendTxToL1 with empty calldataForL1. - * @param destination recipient address on L1 - * @return unique identifier for this L2-to-L1 transaction. - */ - function withdrawEth(address destination) external payable returns (uint256); - - /** - * @notice Send a transaction to L1 - * @param destination recipient address on L1 - * @param calldataForL1 (optional) calldata for L1 contract call - * @return a unique identifier for this L2-to-L1 transaction. - */ - function sendTxToL1(address destination, bytes calldata calldataForL1) external payable returns (uint256); - - /** - * @notice get the number of transactions issued by the given external account or the account sequence number of the given contract - * @param account target account - * @return the number of transactions issued by the given external account or the account sequence number of the given contract - */ - function getTransactionCount(address account) external view returns (uint256); - - /** - * @notice get the value of target L2 storage slot - * This function is only callable from address 0 to prevent contracts from being able to call it - * @param account target account - * @param index target index of storage slot - * @return stotage value for the given account at the given index - */ - function getStorageAt(address account, uint256 index) external view returns (uint256); - - /** - * @notice check if current call is coming from l1 - * @return true if the caller of this was called directly from L1 - */ - function isTopLevelCall() external view returns (bool); - - /** - * @notice check if the caller (of this caller of this) is an aliased L1 contract address - * @return true iff the caller's address is an alias for an L1 contract address - */ - function wasMyCallersAddressAliased() external view returns (bool); - - /** - * @notice return the address of the caller (of this caller of this), without applying L1 contract address aliasing - * @return address of the caller's caller, without applying L1 contract address aliasing - */ - function myCallersAddressWithoutAliasing() external view returns (address); - - /** - * @notice map L1 sender contract address to its L2 alias - * @param sender sender address - * @param dest destination address - * @return aliased sender address - */ - function mapL1SenderContractAddressToL2Alias(address sender, address dest) external pure returns (address); - - /** - * @notice get the caller's amount of available storage gas - * @return amount of storage gas available to the caller - */ - function getStorageGasAvailable() external view returns (uint256); - - event L2ToL1Transaction( - address caller, - address indexed destination, - uint256 indexed uniqueId, - uint256 indexed batchNumber, - uint256 indexInBatch, - uint256 arbBlockNum, - uint256 ethBlockNum, - uint256 timestamp, - uint256 callvalue, - bytes data - ); -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/vendor/arbitrum/IBridge.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/vendor/arbitrum/IBridge.sol deleted file mode 100644 index 631fce6..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/vendor/arbitrum/IBridge.sol +++ /dev/null @@ -1,65 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -/* - * Copyright 2021, Offchain Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -pragma solidity ^0.8.0; - -interface IBridge { - event MessageDelivered( - uint256 indexed messageIndex, - bytes32 indexed beforeInboxAcc, - address inbox, - uint8 kind, - address sender, - bytes32 messageDataHash - ); - - event BridgeCallTriggered(address indexed outbox, address indexed destAddr, uint256 amount, bytes data); - - event InboxToggle(address indexed inbox, bool enabled); - - event OutboxToggle(address indexed outbox, bool enabled); - - function deliverMessageToInbox( - uint8 kind, - address sender, - bytes32 messageDataHash - ) external payable returns (uint256); - - function executeCall( - address destAddr, - uint256 amount, - bytes calldata data - ) external returns (bool success, bytes memory returnData); - - // These are only callable by the admin - function setInbox(address inbox, bool enabled) external; - - function setOutbox(address inbox, bool enabled) external; - - // View functions - - function activeOutbox() external view returns (address); - - function allowedInboxes(address inbox) external view returns (bool); - - function allowedOutboxes(address outbox) external view returns (bool); - - function inboxAccs(uint256 index) external view returns (bytes32); - - function messageCount() external view returns (uint256); -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/vendor/arbitrum/IInbox.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/vendor/arbitrum/IInbox.sol deleted file mode 100644 index 462e247..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/vendor/arbitrum/IInbox.sol +++ /dev/null @@ -1,91 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -/* - * Copyright 2021, Offchain Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -pragma solidity ^0.8.0; - -import "./IMessageProvider.sol"; - -interface IInbox is IMessageProvider { - function sendL2Message(bytes calldata messageData) external returns (uint256); - - function sendUnsignedTransaction( - uint256 maxGas, - uint256 gasPriceBid, - uint256 nonce, - address destAddr, - uint256 amount, - bytes calldata data - ) external returns (uint256); - - function sendContractTransaction( - uint256 maxGas, - uint256 gasPriceBid, - address destAddr, - uint256 amount, - bytes calldata data - ) external returns (uint256); - - function sendL1FundedUnsignedTransaction( - uint256 maxGas, - uint256 gasPriceBid, - uint256 nonce, - address destAddr, - bytes calldata data - ) external payable returns (uint256); - - function sendL1FundedContractTransaction( - uint256 maxGas, - uint256 gasPriceBid, - address destAddr, - bytes calldata data - ) external payable returns (uint256); - - function createRetryableTicket( - address destAddr, - uint256 arbTxCallValue, - uint256 maxSubmissionCost, - address submissionRefundAddress, - address valueRefundAddress, - uint256 maxGas, - uint256 gasPriceBid, - bytes calldata data - ) external payable returns (uint256); - - function createRetryableTicketNoRefundAliasRewrite( - address destAddr, - uint256 arbTxCallValue, - uint256 maxSubmissionCost, - address submissionRefundAddress, - address valueRefundAddress, - uint256 maxGas, - uint256 gasPriceBid, - bytes calldata data - ) external payable returns (uint256); - - function depositEth(uint256 maxSubmissionCost) external payable returns (uint256); - - function bridge() external view returns (address); - - function pauseCreateRetryables() external; - - function unpauseCreateRetryables() external; - - function startRewriteAddress() external; - - function stopRewriteAddress() external; -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/vendor/arbitrum/IMessageProvider.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/vendor/arbitrum/IMessageProvider.sol deleted file mode 100644 index 76208e2..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/vendor/arbitrum/IMessageProvider.sol +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -/* - * Copyright 2021, Offchain Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -pragma solidity ^0.8.0; - -interface IMessageProvider { - event InboxMessageDelivered(uint256 indexed messageNum, bytes data); - - event InboxMessageDeliveredFromOrigin(uint256 indexed messageNum); -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/vendor/arbitrum/IOutbox.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/vendor/arbitrum/IOutbox.sol deleted file mode 100644 index 9128a20..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/vendor/arbitrum/IOutbox.sol +++ /dev/null @@ -1,50 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -/* - * Copyright 2021, Offchain Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -pragma solidity ^0.8.0; - -interface IOutbox { - event OutboxEntryCreated( - uint256 indexed batchNum, - uint256 outboxEntryIndex, - bytes32 outputRoot, - uint256 numInBatch - ); - event OutBoxTransactionExecuted( - address indexed destAddr, - address indexed l2Sender, - uint256 indexed outboxEntryIndex, - uint256 transactionIndex - ); - - function l2ToL1Sender() external view returns (address); - - function l2ToL1Block() external view returns (uint256); - - function l2ToL1EthBlock() external view returns (uint256); - - function l2ToL1Timestamp() external view returns (uint256); - - function l2ToL1BatchNum() external view returns (uint256); - - function l2ToL1OutputId() external view returns (bytes32); - - function processOutgoingMessages(bytes calldata sendsData, uint256[] calldata sendLengths) external; - - function outboxEntryExists(uint256 batchNum) external view returns (bool); -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/vendor/compound/ICompoundTimelock.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/vendor/compound/ICompoundTimelock.sol deleted file mode 100644 index 1581a8d..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/vendor/compound/ICompoundTimelock.sol +++ /dev/null @@ -1,85 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -/** - * https://github.com/compound-finance/compound-protocol/blob/master/contracts/Timelock.sol[Compound's timelock] interface - */ -interface ICompoundTimelock { - event NewAdmin(address indexed newAdmin); - event NewPendingAdmin(address indexed newPendingAdmin); - event NewDelay(uint256 indexed newDelay); - event CancelTransaction( - bytes32 indexed txHash, - address indexed target, - uint256 value, - string signature, - bytes data, - uint256 eta - ); - event ExecuteTransaction( - bytes32 indexed txHash, - address indexed target, - uint256 value, - string signature, - bytes data, - uint256 eta - ); - event QueueTransaction( - bytes32 indexed txHash, - address indexed target, - uint256 value, - string signature, - bytes data, - uint256 eta - ); - - receive() external payable; - - // solhint-disable-next-line func-name-mixedcase - function GRACE_PERIOD() external view returns (uint256); - - // solhint-disable-next-line func-name-mixedcase - function MINIMUM_DELAY() external view returns (uint256); - - // solhint-disable-next-line func-name-mixedcase - function MAXIMUM_DELAY() external view returns (uint256); - - function admin() external view returns (address); - - function pendingAdmin() external view returns (address); - - function delay() external view returns (uint256); - - function queuedTransactions(bytes32) external view returns (bool); - - function setDelay(uint256) external; - - function acceptAdmin() external; - - function setPendingAdmin(address) external; - - function queueTransaction( - address target, - uint256 value, - string memory signature, - bytes memory data, - uint256 eta - ) external returns (bytes32); - - function cancelTransaction( - address target, - uint256 value, - string memory signature, - bytes memory data, - uint256 eta - ) external; - - function executeTransaction( - address target, - uint256 value, - string memory signature, - bytes memory data, - uint256 eta - ) external payable returns (bytes memory); -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/vendor/compound/LICENSE b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/vendor/compound/LICENSE deleted file mode 100644 index 7da2324..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/vendor/compound/LICENSE +++ /dev/null @@ -1,11 +0,0 @@ -Copyright 2020 Compound Labs, Inc. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/vendor/optimism/ICrossDomainMessenger.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/vendor/optimism/ICrossDomainMessenger.sol deleted file mode 100644 index be09e85..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/vendor/optimism/ICrossDomainMessenger.sol +++ /dev/null @@ -1,37 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity >0.5.0 <0.9.0; - -/** - * @title ICrossDomainMessenger - */ -interface ICrossDomainMessenger { - /********** - * Events * - **********/ - - event SentMessage(address indexed target, address sender, bytes message, uint256 messageNonce, uint256 gasLimit); - event RelayedMessage(bytes32 indexed msgHash); - event FailedRelayedMessage(bytes32 indexed msgHash); - - /************* - * Variables * - *************/ - - function xDomainMessageSender() external view returns (address); - - /******************** - * Public Functions * - ********************/ - - /** - * Sends a cross domain message to the target messenger. - * @param _target Target contract address. - * @param _message Message to send to the target. - * @param _gasLimit Gas limit for the provided message. - */ - function sendMessage( - address _target, - bytes calldata _message, - uint32 _gasLimit - ) external; -} diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/vendor/optimism/LICENSE b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/vendor/optimism/LICENSE deleted file mode 100644 index 6a7da52..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/vendor/optimism/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright 2020-2021 Optimism - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/vendor/polygon/IFxMessageProcessor.sol b/contracts/lib/murky/lib/openzeppelin-contracts/contracts/vendor/polygon/IFxMessageProcessor.sol deleted file mode 100644 index cf346bc..0000000 --- a/contracts/lib/murky/lib/openzeppelin-contracts/contracts/vendor/polygon/IFxMessageProcessor.sol +++ /dev/null @@ -1,10 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -interface IFxMessageProcessor { - function processMessageFromRoot( - uint256 stateId, - address rootMessageSender, - bytes calldata data - ) external; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/access/AccessControlCrossChainUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/access/AccessControlCrossChainUpgradeable.sol deleted file mode 100644 index 714abdd..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/access/AccessControlCrossChainUpgradeable.sol +++ /dev/null @@ -1,58 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (access/AccessControlCrossChain.sol) - -pragma solidity ^0.8.4; - -import "./AccessControlUpgradeable.sol"; -import "../crosschain/CrossChainEnabledUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -/** - * @dev An extension to {AccessControl} with support for cross-chain access management. - * For each role, is extension implements an equivalent "aliased" role that is used for - * restricting calls originating from other chains. - * - * For example, if a function `myFunction` is protected by `onlyRole(SOME_ROLE)`, and - * if an address `x` has role `SOME_ROLE`, it would be able to call `myFunction` directly. - * A wallet or contract at the same address on another chain would however not be able - * to call this function. In order to do so, it would require to have the role - * `_crossChainRoleAlias(SOME_ROLE)`. - * - * This aliasing is required to protect against multiple contracts living at the same - * address on different chains but controlled by conflicting entities. - * - * _Available since v4.6._ - */ -abstract contract AccessControlCrossChainUpgradeable is Initializable, AccessControlUpgradeable, CrossChainEnabledUpgradeable { - function __AccessControlCrossChain_init() internal onlyInitializing { - } - - function __AccessControlCrossChain_init_unchained() internal onlyInitializing { - } - bytes32 public constant CROSSCHAIN_ALIAS = keccak256("CROSSCHAIN_ALIAS"); - - /** - * @dev See {AccessControl-_checkRole}. - */ - function _checkRole(bytes32 role) internal view virtual override { - if (_isCrossChain()) { - _checkRole(_crossChainRoleAlias(role), _crossChainSender()); - } else { - super._checkRole(role); - } - } - - /** - * @dev Returns the aliased role corresponding to `role`. - */ - function _crossChainRoleAlias(bytes32 role) internal pure virtual returns (bytes32) { - return role ^ CROSSCHAIN_ALIAS; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/access/AccessControlEnumerableUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/access/AccessControlEnumerableUpgradeable.sol deleted file mode 100644 index 944f3a2..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/access/AccessControlEnumerableUpgradeable.sol +++ /dev/null @@ -1,77 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControlEnumerable.sol) - -pragma solidity ^0.8.0; - -import "./IAccessControlEnumerableUpgradeable.sol"; -import "./AccessControlUpgradeable.sol"; -import "../utils/structs/EnumerableSetUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -/** - * @dev Extension of {AccessControl} that allows enumerating the members of each role. - */ -abstract contract AccessControlEnumerableUpgradeable is Initializable, IAccessControlEnumerableUpgradeable, AccessControlUpgradeable { - function __AccessControlEnumerable_init() internal onlyInitializing { - } - - function __AccessControlEnumerable_init_unchained() internal onlyInitializing { - } - using EnumerableSetUpgradeable for EnumerableSetUpgradeable.AddressSet; - - mapping(bytes32 => EnumerableSetUpgradeable.AddressSet) private _roleMembers; - - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { - return interfaceId == type(IAccessControlEnumerableUpgradeable).interfaceId || super.supportsInterface(interfaceId); - } - - /** - * @dev Returns one of the accounts that have `role`. `index` must be a - * value between 0 and {getRoleMemberCount}, non-inclusive. - * - * Role bearers are not sorted in any particular way, and their ordering may - * change at any point. - * - * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure - * you perform all queries on the same block. See the following - * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] - * for more information. - */ - function getRoleMember(bytes32 role, uint256 index) public view virtual override returns (address) { - return _roleMembers[role].at(index); - } - - /** - * @dev Returns the number of accounts that have `role`. Can be used - * together with {getRoleMember} to enumerate all bearers of a role. - */ - function getRoleMemberCount(bytes32 role) public view virtual override returns (uint256) { - return _roleMembers[role].length(); - } - - /** - * @dev Overload {_grantRole} to track enumerable memberships - */ - function _grantRole(bytes32 role, address account) internal virtual override { - super._grantRole(role, account); - _roleMembers[role].add(account); - } - - /** - * @dev Overload {_revokeRole} to track enumerable memberships - */ - function _revokeRole(bytes32 role, address account) internal virtual override { - super._revokeRole(role, account); - _roleMembers[role].remove(account); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/access/AccessControlUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/access/AccessControlUpgradeable.sol deleted file mode 100644 index d600995..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/access/AccessControlUpgradeable.sol +++ /dev/null @@ -1,260 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol) - -pragma solidity ^0.8.0; - -import "./IAccessControlUpgradeable.sol"; -import "../utils/ContextUpgradeable.sol"; -import "../utils/StringsUpgradeable.sol"; -import "../utils/introspection/ERC165Upgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -/** - * @dev Contract module that allows children to implement role-based access - * control mechanisms. This is a lightweight version that doesn't allow enumerating role - * members except through off-chain means by accessing the contract event logs. Some - * applications may benefit from on-chain enumerability, for those cases see - * {AccessControlEnumerable}. - * - * Roles are referred to by their `bytes32` identifier. These should be exposed - * in the external API and be unique. The best way to achieve this is by - * using `public constant` hash digests: - * - * ``` - * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); - * ``` - * - * Roles can be used to represent a set of permissions. To restrict access to a - * function call, use {hasRole}: - * - * ``` - * function foo() public { - * require(hasRole(MY_ROLE, msg.sender)); - * ... - * } - * ``` - * - * Roles can be granted and revoked dynamically via the {grantRole} and - * {revokeRole} functions. Each role has an associated admin role, and only - * accounts that have a role's admin role can call {grantRole} and {revokeRole}. - * - * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means - * that only accounts with this role will be able to grant or revoke other - * roles. More complex role relationships can be created by using - * {_setRoleAdmin}. - * - * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to - * grant and revoke this role. Extra precautions should be taken to secure - * accounts that have been granted it. - */ -abstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControlUpgradeable, ERC165Upgradeable { - function __AccessControl_init() internal onlyInitializing { - } - - function __AccessControl_init_unchained() internal onlyInitializing { - } - struct RoleData { - mapping(address => bool) members; - bytes32 adminRole; - } - - mapping(bytes32 => RoleData) private _roles; - - bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; - - /** - * @dev Modifier that checks that an account has a specific role. Reverts - * with a standardized message including the required role. - * - * The format of the revert reason is given by the following regular expression: - * - * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ - * - * _Available since v4.1._ - */ - modifier onlyRole(bytes32 role) { - _checkRole(role); - _; - } - - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { - return interfaceId == type(IAccessControlUpgradeable).interfaceId || super.supportsInterface(interfaceId); - } - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) public view virtual override returns (bool) { - return _roles[role].members[account]; - } - - /** - * @dev Revert with a standard message if `_msgSender()` is missing `role`. - * Overriding this function changes the behavior of the {onlyRole} modifier. - * - * Format of the revert message is described in {_checkRole}. - * - * _Available since v4.6._ - */ - function _checkRole(bytes32 role) internal view virtual { - _checkRole(role, _msgSender()); - } - - /** - * @dev Revert with a standard message if `account` is missing `role`. - * - * The format of the revert reason is given by the following regular expression: - * - * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ - */ - function _checkRole(bytes32 role, address account) internal view virtual { - if (!hasRole(role, account)) { - revert( - string( - abi.encodePacked( - "AccessControl: account ", - StringsUpgradeable.toHexString(account), - " is missing role ", - StringsUpgradeable.toHexString(uint256(role), 32) - ) - ) - ); - } - } - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { - return _roles[role].adminRole; - } - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - * - * May emit a {RoleGranted} event. - */ - function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { - _grantRole(role, account); - } - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - * - * May emit a {RoleRevoked} event. - */ - function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { - _revokeRole(role, account); - } - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been revoked `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - * - * May emit a {RoleRevoked} event. - */ - function renounceRole(bytes32 role, address account) public virtual override { - require(account == _msgSender(), "AccessControl: can only renounce roles for self"); - - _revokeRole(role, account); - } - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. Note that unlike {grantRole}, this function doesn't perform any - * checks on the calling account. - * - * May emit a {RoleGranted} event. - * - * [WARNING] - * ==== - * This function should only be called from the constructor when setting - * up the initial roles for the system. - * - * Using this function in any other way is effectively circumventing the admin - * system imposed by {AccessControl}. - * ==== - * - * NOTE: This function is deprecated in favor of {_grantRole}. - */ - function _setupRole(bytes32 role, address account) internal virtual { - _grantRole(role, account); - } - - /** - * @dev Sets `adminRole` as ``role``'s admin role. - * - * Emits a {RoleAdminChanged} event. - */ - function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { - bytes32 previousAdminRole = getRoleAdmin(role); - _roles[role].adminRole = adminRole; - emit RoleAdminChanged(role, previousAdminRole, adminRole); - } - - /** - * @dev Grants `role` to `account`. - * - * Internal function without access restriction. - * - * May emit a {RoleGranted} event. - */ - function _grantRole(bytes32 role, address account) internal virtual { - if (!hasRole(role, account)) { - _roles[role].members[account] = true; - emit RoleGranted(role, account, _msgSender()); - } - } - - /** - * @dev Revokes `role` from `account`. - * - * Internal function without access restriction. - * - * May emit a {RoleRevoked} event. - */ - function _revokeRole(bytes32 role, address account) internal virtual { - if (hasRole(role, account)) { - _roles[role].members[account] = false; - emit RoleRevoked(role, account, _msgSender()); - } - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/access/IAccessControlEnumerableUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/access/IAccessControlEnumerableUpgradeable.sol deleted file mode 100644 index d7f00e9..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/access/IAccessControlEnumerableUpgradeable.sol +++ /dev/null @@ -1,31 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (access/IAccessControlEnumerable.sol) - -pragma solidity ^0.8.0; - -import "./IAccessControlUpgradeable.sol"; - -/** - * @dev External interface of AccessControlEnumerable declared to support ERC165 detection. - */ -interface IAccessControlEnumerableUpgradeable is IAccessControlUpgradeable { - /** - * @dev Returns one of the accounts that have `role`. `index` must be a - * value between 0 and {getRoleMemberCount}, non-inclusive. - * - * Role bearers are not sorted in any particular way, and their ordering may - * change at any point. - * - * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure - * you perform all queries on the same block. See the following - * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] - * for more information. - */ - function getRoleMember(bytes32 role, uint256 index) external view returns (address); - - /** - * @dev Returns the number of accounts that have `role`. Can be used - * together with {getRoleMember} to enumerate all bearers of a role. - */ - function getRoleMemberCount(bytes32 role) external view returns (uint256); -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/access/IAccessControlUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/access/IAccessControlUpgradeable.sol deleted file mode 100644 index 963fdd1..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/access/IAccessControlUpgradeable.sol +++ /dev/null @@ -1,88 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) - -pragma solidity ^0.8.0; - -/** - * @dev External interface of AccessControl declared to support ERC165 detection. - */ -interface IAccessControlUpgradeable { - /** - * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` - * - * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite - * {RoleAdminChanged} not being emitted signaling this. - * - * _Available since v3.1._ - */ - event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); - - /** - * @dev Emitted when `account` is granted `role`. - * - * `sender` is the account that originated the contract call, an admin role - * bearer except when using {AccessControl-_setupRole}. - */ - event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Emitted when `account` is revoked `role`. - * - * `sender` is the account that originated the contract call: - * - if using `revokeRole`, it is the admin role bearer - * - if using `renounceRole`, it is the role bearer (i.e. `account`) - */ - event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); - - /** - * @dev Returns `true` if `account` has been granted `role`. - */ - function hasRole(bytes32 role, address account) external view returns (bool); - - /** - * @dev Returns the admin role that controls `role`. See {grantRole} and - * {revokeRole}. - * - * To change a role's admin, use {AccessControl-_setRoleAdmin}. - */ - function getRoleAdmin(bytes32 role) external view returns (bytes32); - - /** - * @dev Grants `role` to `account`. - * - * If `account` had not been already granted `role`, emits a {RoleGranted} - * event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function grantRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from `account`. - * - * If `account` had been granted `role`, emits a {RoleRevoked} event. - * - * Requirements: - * - * - the caller must have ``role``'s admin role. - */ - function revokeRole(bytes32 role, address account) external; - - /** - * @dev Revokes `role` from the calling account. - * - * Roles are often managed via {grantRole} and {revokeRole}: this function's - * purpose is to provide a mechanism for accounts to lose their privileges - * if they are compromised (such as when a trusted device is misplaced). - * - * If the calling account had been granted `role`, emits a {RoleRevoked} - * event. - * - * Requirements: - * - * - the caller must be `account`. - */ - function renounceRole(bytes32 role, address account) external; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/access/Ownable2StepUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/access/Ownable2StepUpgradeable.sol deleted file mode 100644 index 9bbb4e0..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/access/Ownable2StepUpgradeable.sol +++ /dev/null @@ -1,71 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) - -pragma solidity ^0.8.0; - -import "./OwnableUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -/** - * @dev Contract module which provides access control mechanism, where - * there is an account (an owner) that can be granted exclusive access to - * specific functions. - * - * By default, the owner account will be the one that deploys the contract. This - * can later be changed with {transferOwnership} and {acceptOwnership}. - * - * This module is used through inheritance. It will make available all functions - * from parent (Ownable). - */ -abstract contract Ownable2StepUpgradeable is Initializable, OwnableUpgradeable { - function __Ownable2Step_init() internal onlyInitializing { - __Ownable_init_unchained(); - } - - function __Ownable2Step_init_unchained() internal onlyInitializing { - } - address private _pendingOwner; - - event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner); - - /** - * @dev Returns the address of the pending owner. - */ - function pendingOwner() public view virtual returns (address) { - return _pendingOwner; - } - - /** - * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. - * Can only be called by the current owner. - */ - function transferOwnership(address newOwner) public virtual override onlyOwner { - _pendingOwner = newOwner; - emit OwnershipTransferStarted(owner(), newOwner); - } - - /** - * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner. - * Internal function without access restriction. - */ - function _transferOwnership(address newOwner) internal virtual override { - delete _pendingOwner; - super._transferOwnership(newOwner); - } - - /** - * @dev The new owner accepts the ownership transfer. - */ - function acceptOwnership() external { - address sender = _msgSender(); - require(pendingOwner() == sender, "Ownable2Step: caller is not the new owner"); - _transferOwnership(sender); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol deleted file mode 100644 index affb7cd..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol +++ /dev/null @@ -1,95 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) - -pragma solidity ^0.8.0; - -import "../utils/ContextUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -/** - * @dev Contract module which provides a basic access control mechanism, where - * there is an account (an owner) that can be granted exclusive access to - * specific functions. - * - * By default, the owner account will be the one that deploys the contract. This - * can later be changed with {transferOwnership}. - * - * This module is used through inheritance. It will make available the modifier - * `onlyOwner`, which can be applied to your functions to restrict their use to - * the owner. - */ -abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { - address private _owner; - - event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); - - /** - * @dev Initializes the contract setting the deployer as the initial owner. - */ - function __Ownable_init() internal onlyInitializing { - __Ownable_init_unchained(); - } - - function __Ownable_init_unchained() internal onlyInitializing { - _transferOwnership(_msgSender()); - } - - /** - * @dev Throws if called by any account other than the owner. - */ - modifier onlyOwner() { - _checkOwner(); - _; - } - - /** - * @dev Returns the address of the current owner. - */ - function owner() public view virtual returns (address) { - return _owner; - } - - /** - * @dev Throws if the sender is not the owner. - */ - function _checkOwner() internal view virtual { - require(owner() == _msgSender(), "Ownable: caller is not the owner"); - } - - /** - * @dev Leaves the contract without owner. It will not be possible to call - * `onlyOwner` functions anymore. Can only be called by the current owner. - * - * NOTE: Renouncing ownership will leave the contract without an owner, - * thereby removing any functionality that is only available to the owner. - */ - function renounceOwnership() public virtual onlyOwner { - _transferOwnership(address(0)); - } - - /** - * @dev Transfers ownership of the contract to a new account (`newOwner`). - * Can only be called by the current owner. - */ - function transferOwnership(address newOwner) public virtual onlyOwner { - require(newOwner != address(0), "Ownable: new owner is the zero address"); - _transferOwnership(newOwner); - } - - /** - * @dev Transfers ownership of the contract to a new account (`newOwner`). - * Internal function without access restriction. - */ - function _transferOwnership(address newOwner) internal virtual { - address oldOwner = _owner; - _owner = newOwner; - emit OwnershipTransferred(oldOwner, newOwner); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/access/README.adoc b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/access/README.adoc deleted file mode 100644 index 0959e1a..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/access/README.adoc +++ /dev/null @@ -1,23 +0,0 @@ -= Access Control - -[.readme-notice] -NOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/access - -This directory provides ways to restrict who can access the functions of a contract or when they can do it. - -- {AccessControl} provides a general role based access control mechanism. Multiple hierarchical roles can be created and assigned each to multiple accounts. -- {Ownable} is a simpler mechanism with a single owner "role" that can be assigned to a single account. This simpler mechanism can be useful for quick tests but projects with production concerns are likely to outgrow it. - -== Authorization - -{{Ownable}} - -{{IAccessControl}} - -{{AccessControl}} - -{{AccessControlCrossChain}} - -{{IAccessControlEnumerable}} - -{{AccessControlEnumerable}} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/crosschain/CrossChainEnabledUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/crosschain/CrossChainEnabledUpgradeable.sol deleted file mode 100644 index 8aab592..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/crosschain/CrossChainEnabledUpgradeable.sol +++ /dev/null @@ -1,67 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (crosschain/CrossChainEnabled.sol) - -pragma solidity ^0.8.4; - -import "./errorsUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -/** - * @dev Provides information for building cross-chain aware contracts. This - * abstract contract provides accessors and modifiers to control the execution - * flow when receiving cross-chain messages. - * - * Actual implementations of cross-chain aware contracts, which are based on - * this abstraction, will have to inherit from a bridge-specific - * specialization. Such specializations are provided under - * `crosschain//CrossChainEnabled.sol`. - * - * _Available since v4.6._ - */ -abstract contract CrossChainEnabledUpgradeable is Initializable { - function __CrossChainEnabled_init() internal onlyInitializing { - } - - function __CrossChainEnabled_init_unchained() internal onlyInitializing { - } - /** - * @dev Throws if the current function call is not the result of a - * cross-chain execution. - */ - modifier onlyCrossChain() { - if (!_isCrossChain()) revert NotCrossChainCall(); - _; - } - - /** - * @dev Throws if the current function call is not the result of a - * cross-chain execution initiated by `account`. - */ - modifier onlyCrossChainSender(address expected) { - address actual = _crossChainSender(); - if (expected != actual) revert InvalidCrossChainSender(actual, expected); - _; - } - - /** - * @dev Returns whether the current function call is the result of a - * cross-chain message. - */ - function _isCrossChain() internal view virtual returns (bool); - - /** - * @dev Returns the address of the sender of the cross-chain message that - * triggered the current function call. - * - * IMPORTANT: Should revert with `NotCrossChainCall` if the current function - * call is not the result of a cross-chain message. - */ - function _crossChainSender() internal view virtual returns (address); - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/crosschain/README.adoc b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/crosschain/README.adoc deleted file mode 100644 index 266b153..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/crosschain/README.adoc +++ /dev/null @@ -1,34 +0,0 @@ -= Cross Chain Awareness - -[.readme-notice] -NOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/crosschain - -This directory provides building blocks to improve cross-chain awareness of smart contracts. - -- {CrossChainEnabled} is an abstraction that contains accessors and modifiers to control the execution flow when receiving cross-chain messages. - -== CrossChainEnabled specializations - -The following specializations of {CrossChainEnabled} provide implementations of the {CrossChainEnabled} abstraction for specific bridges. This can be used to complex cross-chain aware components such as {AccessControlCrossChain}. - -{{CrossChainEnabledAMB}} - -{{CrossChainEnabledArbitrumL1}} - -{{CrossChainEnabledArbitrumL2}} - -{{CrossChainEnabledOptimism}} - -{{CrossChainEnabledPolygonChild}} - -== Libraries for cross-chain - -In addition to the {CrossChainEnabled} abstraction, cross-chain awareness is also available through libraries. These libraries can be used to build complex designs such as contracts with the ability to interact with multiple bridges. - -{{LibAMB}} - -{{LibArbitrumL1}} - -{{LibArbitrumL2}} - -{{LibOptimism}} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/crosschain/amb/CrossChainEnabledAMBUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/crosschain/amb/CrossChainEnabledAMBUpgradeable.sol deleted file mode 100644 index 687e212..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/crosschain/amb/CrossChainEnabledAMBUpgradeable.sol +++ /dev/null @@ -1,57 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (crosschain/amb/CrossChainEnabledAMB.sol) - -pragma solidity ^0.8.4; - -import "../CrossChainEnabledUpgradeable.sol"; -import "./LibAMBUpgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -/** - * @dev https://docs.tokenbridge.net/amb-bridge/about-amb-bridge[AMB] - * specialization or the {CrossChainEnabled} abstraction. - * - * As of february 2020, AMB bridges are available between the following chains: - * - * - https://docs.tokenbridge.net/eth-xdai-amb-bridge/about-the-eth-xdai-amb[ETH ⇌ xDai] - * - https://docs.tokenbridge.net/eth-qdai-bridge/about-the-eth-qdai-amb[ETH ⇌ qDai] - * - https://docs.tokenbridge.net/eth-etc-amb-bridge/about-the-eth-etc-amb[ETH ⇌ ETC] - * - https://docs.tokenbridge.net/eth-bsc-amb/about-the-eth-bsc-amb[ETH ⇌ BSC] - * - https://docs.tokenbridge.net/eth-poa-amb-bridge/about-the-eth-poa-amb[ETH ⇌ POA] - * - https://docs.tokenbridge.net/bsc-xdai-amb/about-the-bsc-xdai-amb[BSC ⇌ xDai] - * - https://docs.tokenbridge.net/poa-xdai-amb/about-the-poa-xdai-amb[POA ⇌ xDai] - * - https://docs.tokenbridge.net/rinkeby-xdai-amb-bridge/about-the-rinkeby-xdai-amb[Rinkeby ⇌ xDai] - * - https://docs.tokenbridge.net/kovan-sokol-amb-bridge/about-the-kovan-sokol-amb[Kovan ⇌ Sokol] - * - * _Available since v4.6._ - */ -contract CrossChainEnabledAMBUpgradeable is Initializable, CrossChainEnabledUpgradeable { - /// @custom:oz-upgrades-unsafe-allow state-variable-immutable - address private immutable _bridge; - - /// @custom:oz-upgrades-unsafe-allow constructor - constructor(address bridge) { - _bridge = bridge; - } - - /** - * @dev see {CrossChainEnabled-_isCrossChain} - */ - function _isCrossChain() internal view virtual override returns (bool) { - return LibAMBUpgradeable.isCrossChain(_bridge); - } - - /** - * @dev see {CrossChainEnabled-_crossChainSender} - */ - function _crossChainSender() internal view virtual override onlyCrossChain returns (address) { - return LibAMBUpgradeable.crossChainSender(_bridge); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/crosschain/amb/LibAMBUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/crosschain/amb/LibAMBUpgradeable.sol deleted file mode 100644 index b5f32d0..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/crosschain/amb/LibAMBUpgradeable.sol +++ /dev/null @@ -1,35 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (crosschain/amb/LibAMB.sol) - -pragma solidity ^0.8.4; - -import { IAMBUpgradeable as AMB_Bridge } from "../../vendor/amb/IAMBUpgradeable.sol"; -import "../errorsUpgradeable.sol"; - -/** - * @dev Primitives for cross-chain aware contracts using the - * https://docs.tokenbridge.net/amb-bridge/about-amb-bridge[AMB] - * family of bridges. - */ -library LibAMBUpgradeable { - /** - * @dev Returns whether the current function call is the result of a - * cross-chain message relayed by `bridge`. - */ - function isCrossChain(address bridge) internal view returns (bool) { - return msg.sender == bridge; - } - - /** - * @dev Returns the address of the sender that triggered the current - * cross-chain message through `bridge`. - * - * NOTE: {isCrossChain} should be checked before trying to recover the - * sender, as it will revert with `NotCrossChainCall` if the current - * function call is not the result of a cross-chain message. - */ - function crossChainSender(address bridge) internal view returns (address) { - if (!isCrossChain(bridge)) revert NotCrossChainCall(); - return AMB_Bridge(bridge).messageSender(); - } -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/crosschain/arbitrum/CrossChainEnabledArbitrumL1Upgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/crosschain/arbitrum/CrossChainEnabledArbitrumL1Upgradeable.sol deleted file mode 100644 index afbb030..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/crosschain/arbitrum/CrossChainEnabledArbitrumL1Upgradeable.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (crosschain/arbitrum/CrossChainEnabledArbitrumL1.sol) - -pragma solidity ^0.8.4; - -import "../CrossChainEnabledUpgradeable.sol"; -import "./LibArbitrumL1Upgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -/** - * @dev https://arbitrum.io/[Arbitrum] specialization or the - * {CrossChainEnabled} abstraction the L1 side (mainnet). - * - * This version should only be deployed on L1 to process cross-chain messages - * originating from L2. For the other side, use {CrossChainEnabledArbitrumL2}. - * - * The bridge contract is provided and maintained by the arbitrum team. You can - * find the address of this contract on the rinkeby testnet in - * https://developer.offchainlabs.com/docs/useful_addresses[Arbitrum's developer documentation]. - * - * _Available since v4.6._ - */ -abstract contract CrossChainEnabledArbitrumL1Upgradeable is Initializable, CrossChainEnabledUpgradeable { - /// @custom:oz-upgrades-unsafe-allow state-variable-immutable - address private immutable _bridge; - - /// @custom:oz-upgrades-unsafe-allow constructor - constructor(address bridge) { - _bridge = bridge; - } - - /** - * @dev see {CrossChainEnabled-_isCrossChain} - */ - function _isCrossChain() internal view virtual override returns (bool) { - return LibArbitrumL1Upgradeable.isCrossChain(_bridge); - } - - /** - * @dev see {CrossChainEnabled-_crossChainSender} - */ - function _crossChainSender() internal view virtual override onlyCrossChain returns (address) { - return LibArbitrumL1Upgradeable.crossChainSender(_bridge); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/crosschain/arbitrum/CrossChainEnabledArbitrumL2Upgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/crosschain/arbitrum/CrossChainEnabledArbitrumL2Upgradeable.sol deleted file mode 100644 index d54f0ec..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/crosschain/arbitrum/CrossChainEnabledArbitrumL2Upgradeable.sol +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (crosschain/arbitrum/CrossChainEnabledArbitrumL2.sol) - -pragma solidity ^0.8.4; - -import "../CrossChainEnabledUpgradeable.sol"; -import "./LibArbitrumL2Upgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -/** - * @dev https://arbitrum.io/[Arbitrum] specialization or the - * {CrossChainEnabled} abstraction the L2 side (arbitrum). - * - * This version should only be deployed on L2 to process cross-chain messages - * originating from L1. For the other side, use {CrossChainEnabledArbitrumL1}. - * - * Arbitrum L2 includes the `ArbSys` contract at a fixed address. Therefore, - * this specialization of {CrossChainEnabled} does not include a constructor. - * - * _Available since v4.6._ - * - * WARNING: There is currently a bug in Arbitrum that causes this contract to - * fail to detect cross-chain calls when deployed behind a proxy. This will be - * fixed when the network is upgraded to Arbitrum Nitro, currently scheduled for - * August 31st 2022. - */ -abstract contract CrossChainEnabledArbitrumL2Upgradeable is Initializable, CrossChainEnabledUpgradeable { - function __CrossChainEnabledArbitrumL2_init() internal onlyInitializing { - } - - function __CrossChainEnabledArbitrumL2_init_unchained() internal onlyInitializing { - } - /** - * @dev see {CrossChainEnabled-_isCrossChain} - */ - function _isCrossChain() internal view virtual override returns (bool) { - return LibArbitrumL2Upgradeable.isCrossChain(LibArbitrumL2Upgradeable.ARBSYS); - } - - /** - * @dev see {CrossChainEnabled-_crossChainSender} - */ - function _crossChainSender() internal view virtual override onlyCrossChain returns (address) { - return LibArbitrumL2Upgradeable.crossChainSender(LibArbitrumL2Upgradeable.ARBSYS); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/crosschain/arbitrum/LibArbitrumL1Upgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/crosschain/arbitrum/LibArbitrumL1Upgradeable.sol deleted file mode 100644 index 080f05d..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/crosschain/arbitrum/LibArbitrumL1Upgradeable.sol +++ /dev/null @@ -1,42 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (crosschain/arbitrum/LibArbitrumL1.sol) - -pragma solidity ^0.8.4; - -import { IBridgeUpgradeable as ArbitrumL1_Bridge } from "../../vendor/arbitrum/IBridgeUpgradeable.sol"; -import { IOutboxUpgradeable as ArbitrumL1_Outbox } from "../../vendor/arbitrum/IOutboxUpgradeable.sol"; -import "../errorsUpgradeable.sol"; - -/** - * @dev Primitives for cross-chain aware contracts for - * https://arbitrum.io/[Arbitrum]. - * - * This version should only be used on L1 to process cross-chain messages - * originating from L2. For the other side, use {LibArbitrumL2}. - */ -library LibArbitrumL1Upgradeable { - /** - * @dev Returns whether the current function call is the result of a - * cross-chain message relayed by the `bridge`. - */ - function isCrossChain(address bridge) internal view returns (bool) { - return msg.sender == bridge; - } - - /** - * @dev Returns the address of the sender that triggered the current - * cross-chain message through the `bridge`. - * - * NOTE: {isCrossChain} should be checked before trying to recover the - * sender, as it will revert with `NotCrossChainCall` if the current - * function call is not the result of a cross-chain message. - */ - function crossChainSender(address bridge) internal view returns (address) { - if (!isCrossChain(bridge)) revert NotCrossChainCall(); - - address sender = ArbitrumL1_Outbox(ArbitrumL1_Bridge(bridge).activeOutbox()).l2ToL1Sender(); - require(sender != address(0), "LibArbitrumL1: system messages without sender"); - - return sender; - } -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/crosschain/arbitrum/LibArbitrumL2Upgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/crosschain/arbitrum/LibArbitrumL2Upgradeable.sol deleted file mode 100644 index 1247910..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/crosschain/arbitrum/LibArbitrumL2Upgradeable.sol +++ /dev/null @@ -1,45 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (crosschain/arbitrum/LibArbitrumL2.sol) - -pragma solidity ^0.8.4; - -import { IArbSysUpgradeable as ArbitrumL2_Bridge } from "../../vendor/arbitrum/IArbSysUpgradeable.sol"; -import "../errorsUpgradeable.sol"; - -/** - * @dev Primitives for cross-chain aware contracts for - * https://arbitrum.io/[Arbitrum]. - * - * This version should only be used on L2 to process cross-chain messages - * originating from L1. For the other side, use {LibArbitrumL1}. - * - * WARNING: There is currently a bug in Arbitrum that causes this contract to - * fail to detect cross-chain calls when deployed behind a proxy. This will be - * fixed when the network is upgraded to Arbitrum Nitro, currently scheduled for - * August 31st 2022. - */ -library LibArbitrumL2Upgradeable { - /** - * @dev Returns whether the current function call is the result of a - * cross-chain message relayed by `arbsys`. - */ - address public constant ARBSYS = 0x0000000000000000000000000000000000000064; - - function isCrossChain(address arbsys) internal view returns (bool) { - return ArbitrumL2_Bridge(arbsys).wasMyCallersAddressAliased(); - } - - /** - * @dev Returns the address of the sender that triggered the current - * cross-chain message through `arbsys`. - * - * NOTE: {isCrossChain} should be checked before trying to recover the - * sender, as it will revert with `NotCrossChainCall` if the current - * function call is not the result of a cross-chain message. - */ - function crossChainSender(address arbsys) internal view returns (address) { - if (!isCrossChain(arbsys)) revert NotCrossChainCall(); - - return ArbitrumL2_Bridge(arbsys).myCallersAddressWithoutAliasing(); - } -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/crosschain/errorsUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/crosschain/errorsUpgradeable.sol deleted file mode 100644 index 004460e..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/crosschain/errorsUpgradeable.sol +++ /dev/null @@ -1,7 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (crosschain/errors.sol) - -pragma solidity ^0.8.4; - -error NotCrossChainCall(); -error InvalidCrossChainSender(address actual, address expected); diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/crosschain/optimism/CrossChainEnabledOptimismUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/crosschain/optimism/CrossChainEnabledOptimismUpgradeable.sol deleted file mode 100644 index f7fa973..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/crosschain/optimism/CrossChainEnabledOptimismUpgradeable.sol +++ /dev/null @@ -1,49 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (crosschain/optimism/CrossChainEnabledOptimism.sol) - -pragma solidity ^0.8.4; - -import "../CrossChainEnabledUpgradeable.sol"; -import "./LibOptimismUpgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -/** - * @dev https://www.optimism.io/[Optimism] specialization or the - * {CrossChainEnabled} abstraction. - * - * The messenger (`CrossDomainMessenger`) contract is provided and maintained by - * the optimism team. You can find the address of this contract on mainnet and - * kovan in the https://github.com/ethereum-optimism/optimism/tree/develop/packages/contracts/deployments[deployments section of Optimism monorepo]. - * - * _Available since v4.6._ - */ -abstract contract CrossChainEnabledOptimismUpgradeable is Initializable, CrossChainEnabledUpgradeable { - /// @custom:oz-upgrades-unsafe-allow state-variable-immutable - address private immutable _messenger; - - /// @custom:oz-upgrades-unsafe-allow constructor - constructor(address messenger) { - _messenger = messenger; - } - - /** - * @dev see {CrossChainEnabled-_isCrossChain} - */ - function _isCrossChain() internal view virtual override returns (bool) { - return LibOptimismUpgradeable.isCrossChain(_messenger); - } - - /** - * @dev see {CrossChainEnabled-_crossChainSender} - */ - function _crossChainSender() internal view virtual override onlyCrossChain returns (address) { - return LibOptimismUpgradeable.crossChainSender(_messenger); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/crosschain/optimism/LibOptimismUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/crosschain/optimism/LibOptimismUpgradeable.sol deleted file mode 100644 index b1260dd..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/crosschain/optimism/LibOptimismUpgradeable.sol +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (crosschain/optimism/LibOptimism.sol) - -pragma solidity ^0.8.4; - -import { ICrossDomainMessengerUpgradeable as Optimism_Bridge } from "../../vendor/optimism/ICrossDomainMessengerUpgradeable.sol"; -import "../errorsUpgradeable.sol"; - -/** - * @dev Primitives for cross-chain aware contracts for https://www.optimism.io/[Optimism]. - * See the https://community.optimism.io/docs/developers/bridge/messaging/#accessing-msg-sender[documentation] - * for the functionality used here. - */ -library LibOptimismUpgradeable { - /** - * @dev Returns whether the current function call is the result of a - * cross-chain message relayed by `messenger`. - */ - function isCrossChain(address messenger) internal view returns (bool) { - return msg.sender == messenger; - } - - /** - * @dev Returns the address of the sender that triggered the current - * cross-chain message through `messenger`. - * - * NOTE: {isCrossChain} should be checked before trying to recover the - * sender, as it will revert with `NotCrossChainCall` if the current - * function call is not the result of a cross-chain message. - */ - function crossChainSender(address messenger) internal view returns (address) { - if (!isCrossChain(messenger)) revert NotCrossChainCall(); - - return Optimism_Bridge(messenger).xDomainMessageSender(); - } -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/crosschain/polygon/CrossChainEnabledPolygonChildUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/crosschain/polygon/CrossChainEnabledPolygonChildUpgradeable.sol deleted file mode 100644 index 862e484..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/crosschain/polygon/CrossChainEnabledPolygonChildUpgradeable.sol +++ /dev/null @@ -1,90 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (crosschain/polygon/CrossChainEnabledPolygonChild.sol) - -pragma solidity ^0.8.4; - -import "../CrossChainEnabledUpgradeable.sol"; -import "../../security/ReentrancyGuardUpgradeable.sol"; -import "../../utils/AddressUpgradeable.sol"; -import "../../vendor/polygon/IFxMessageProcessorUpgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -address constant DEFAULT_SENDER = 0x000000000000000000000000000000000000dEaD; - -/** - * @dev https://polygon.technology/[Polygon] specialization or the - * {CrossChainEnabled} abstraction the child side (polygon/mumbai). - * - * This version should only be deployed on child chain to process cross-chain - * messages originating from the parent chain. - * - * The fxChild contract is provided and maintained by the polygon team. You can - * find the address of this contract polygon and mumbai in - * https://docs.polygon.technology/docs/develop/l1-l2-communication/fx-portal/#contract-addresses[Polygon's Fx-Portal documentation]. - * - * _Available since v4.6._ - */ -abstract contract CrossChainEnabledPolygonChildUpgradeable is Initializable, IFxMessageProcessorUpgradeable, CrossChainEnabledUpgradeable, ReentrancyGuardUpgradeable { - /// @custom:oz-upgrades-unsafe-allow state-variable-immutable - address private immutable _fxChild; - address private _sender = DEFAULT_SENDER; - - /// @custom:oz-upgrades-unsafe-allow constructor - constructor(address fxChild) { - _fxChild = fxChild; - } - - /** - * @dev see {CrossChainEnabled-_isCrossChain} - */ - function _isCrossChain() internal view virtual override returns (bool) { - return msg.sender == _fxChild; - } - - /** - * @dev see {CrossChainEnabled-_crossChainSender} - */ - function _crossChainSender() internal view virtual override onlyCrossChain returns (address) { - return _sender; - } - - /** - * @dev External entry point to receive and relay messages originating - * from the fxChild. - * - * Non-reentrancy is crucial to avoid a cross-chain call being able - * to impersonate anyone by just looping through this with user-defined - * arguments. - * - * Note: if _fxChild calls any other function that does a delegate-call, - * then security could be compromised. - */ - function processMessageFromRoot( - uint256, /* stateId */ - address rootMessageSender, - bytes calldata data - ) external override nonReentrant { - if (!_isCrossChain()) revert NotCrossChainCall(); - - _sender = rootMessageSender; - __functionDelegateCall(address(this), data); - _sender = DEFAULT_SENDER; - } - - // ERC1967Upgrade._functionDelegateCall is private so we reproduce it here. - // An extra underscore prevents a name clash error. - function __functionDelegateCall(address target, bytes memory data) private returns (bytes memory) { - require(AddressUpgradeable.isContract(target), "Address: delegate call to non-contract"); - - // solhint-disable-next-line avoid-low-level-calls - (bool success, bytes memory returndata) = target.delegatecall(data); - return AddressUpgradeable.verifyCallResult(success, returndata, "Address: low-level delegate call failed"); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/finance/PaymentSplitterUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/finance/PaymentSplitterUpgradeable.sol deleted file mode 100644 index 37a0f3d..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/finance/PaymentSplitterUpgradeable.sol +++ /dev/null @@ -1,226 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (finance/PaymentSplitter.sol) - -pragma solidity ^0.8.0; - -import "../token/ERC20/utils/SafeERC20Upgradeable.sol"; -import "../utils/AddressUpgradeable.sol"; -import "../utils/ContextUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -/** - * @title PaymentSplitter - * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware - * that the Ether will be split in this way, since it is handled transparently by the contract. - * - * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each - * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim - * an amount proportional to the percentage of total shares they were assigned. The distribution of shares is set at the - * time of contract deployment and can't be updated thereafter. - * - * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the - * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release} - * function. - * - * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and - * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you - * to run tests before sending real value to this contract. - */ -contract PaymentSplitterUpgradeable is Initializable, ContextUpgradeable { - event PayeeAdded(address account, uint256 shares); - event PaymentReleased(address to, uint256 amount); - event ERC20PaymentReleased(IERC20Upgradeable indexed token, address to, uint256 amount); - event PaymentReceived(address from, uint256 amount); - - uint256 private _totalShares; - uint256 private _totalReleased; - - mapping(address => uint256) private _shares; - mapping(address => uint256) private _released; - address[] private _payees; - - mapping(IERC20Upgradeable => uint256) private _erc20TotalReleased; - mapping(IERC20Upgradeable => mapping(address => uint256)) private _erc20Released; - - /** - * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at - * the matching position in the `shares` array. - * - * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no - * duplicates in `payees`. - */ - function __PaymentSplitter_init(address[] memory payees, uint256[] memory shares_) internal onlyInitializing { - __PaymentSplitter_init_unchained(payees, shares_); - } - - function __PaymentSplitter_init_unchained(address[] memory payees, uint256[] memory shares_) internal onlyInitializing { - require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch"); - require(payees.length > 0, "PaymentSplitter: no payees"); - - for (uint256 i = 0; i < payees.length; i++) { - _addPayee(payees[i], shares_[i]); - } - } - - /** - * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully - * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the - * reliability of the events, and not the actual splitting of Ether. - * - * To learn more about this see the Solidity documentation for - * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback - * functions]. - */ - receive() external payable virtual { - emit PaymentReceived(_msgSender(), msg.value); - } - - /** - * @dev Getter for the total shares held by payees. - */ - function totalShares() public view returns (uint256) { - return _totalShares; - } - - /** - * @dev Getter for the total amount of Ether already released. - */ - function totalReleased() public view returns (uint256) { - return _totalReleased; - } - - /** - * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20 - * contract. - */ - function totalReleased(IERC20Upgradeable token) public view returns (uint256) { - return _erc20TotalReleased[token]; - } - - /** - * @dev Getter for the amount of shares held by an account. - */ - function shares(address account) public view returns (uint256) { - return _shares[account]; - } - - /** - * @dev Getter for the amount of Ether already released to a payee. - */ - function released(address account) public view returns (uint256) { - return _released[account]; - } - - /** - * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an - * IERC20 contract. - */ - function released(IERC20Upgradeable token, address account) public view returns (uint256) { - return _erc20Released[token][account]; - } - - /** - * @dev Getter for the address of the payee number `index`. - */ - function payee(uint256 index) public view returns (address) { - return _payees[index]; - } - - /** - * @dev Getter for the amount of payee's releasable Ether. - */ - function releasable(address account) public view returns (uint256) { - uint256 totalReceived = address(this).balance + totalReleased(); - return _pendingPayment(account, totalReceived, released(account)); - } - - /** - * @dev Getter for the amount of payee's releasable `token` tokens. `token` should be the address of an - * IERC20 contract. - */ - function releasable(IERC20Upgradeable token, address account) public view returns (uint256) { - uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token); - return _pendingPayment(account, totalReceived, released(token, account)); - } - - /** - * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the - * total shares and their previous withdrawals. - */ - function release(address payable account) public virtual { - require(_shares[account] > 0, "PaymentSplitter: account has no shares"); - - uint256 payment = releasable(account); - - require(payment != 0, "PaymentSplitter: account is not due payment"); - - // _totalReleased is the sum of all values in _released. - // If "_totalReleased += payment" does not overflow, then "_released[account] += payment" cannot overflow. - _totalReleased += payment; - unchecked { - _released[account] += payment; - } - - AddressUpgradeable.sendValue(account, payment); - emit PaymentReleased(account, payment); - } - - /** - * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their - * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20 - * contract. - */ - function release(IERC20Upgradeable token, address account) public virtual { - require(_shares[account] > 0, "PaymentSplitter: account has no shares"); - - uint256 payment = releasable(token, account); - - require(payment != 0, "PaymentSplitter: account is not due payment"); - - // _erc20TotalReleased[token] is the sum of all values in _erc20Released[token]. - // If "_erc20TotalReleased[token] += payment" does not overflow, then "_erc20Released[token][account] += payment" - // cannot overflow. - _erc20TotalReleased[token] += payment; - unchecked { - _erc20Released[token][account] += payment; - } - - SafeERC20Upgradeable.safeTransfer(token, account, payment); - emit ERC20PaymentReleased(token, account, payment); - } - - /** - * @dev internal logic for computing the pending payment of an `account` given the token historical balances and - * already released amounts. - */ - function _pendingPayment( - address account, - uint256 totalReceived, - uint256 alreadyReleased - ) private view returns (uint256) { - return (totalReceived * _shares[account]) / _totalShares - alreadyReleased; - } - - /** - * @dev Add a new payee to the contract. - * @param account The address of the payee to add. - * @param shares_ The number of shares owned by the payee. - */ - function _addPayee(address account, uint256 shares_) private { - require(account != address(0), "PaymentSplitter: account is the zero address"); - require(shares_ > 0, "PaymentSplitter: shares are 0"); - require(_shares[account] == 0, "PaymentSplitter: account already has shares"); - - _payees.push(account); - _shares[account] = shares_; - _totalShares = _totalShares + shares_; - emit PayeeAdded(account, shares_); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[43] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/finance/README.adoc b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/finance/README.adoc deleted file mode 100644 index b64af31..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/finance/README.adoc +++ /dev/null @@ -1,20 +0,0 @@ -= Finance - -[.readme-notice] -NOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/finance - -This directory includes primitives for financial systems: - -- {PaymentSplitter} allows to split Ether and ERC20 payments among a group of accounts. The sender does not need to be - aware that the assets will be split in this way, since it is handled transparently by the contract. The split can be - in equal parts or in any other arbitrary proportion. - -- {VestingWallet} handles the vesting of Ether and ERC20 tokens for a given beneficiary. Custody of multiple tokens can - be given to this contract, which will release the token to the beneficiary following a given, customizable, vesting - schedule. - -== Contracts - -{{PaymentSplitter}} - -{{VestingWallet}} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/finance/VestingWalletUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/finance/VestingWalletUpgradeable.sol deleted file mode 100644 index 2764180..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/finance/VestingWalletUpgradeable.sol +++ /dev/null @@ -1,167 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (finance/VestingWallet.sol) -pragma solidity ^0.8.0; - -import "../token/ERC20/utils/SafeERC20Upgradeable.sol"; -import "../utils/AddressUpgradeable.sol"; -import "../utils/ContextUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -/** - * @title VestingWallet - * @dev This contract handles the vesting of Eth and ERC20 tokens for a given beneficiary. Custody of multiple tokens - * can be given to this contract, which will release the token to the beneficiary following a given vesting schedule. - * The vesting schedule is customizable through the {vestedAmount} function. - * - * Any token transferred to this contract will follow the vesting schedule as if they were locked from the beginning. - * Consequently, if the vesting has already started, any amount of tokens sent to this contract will (at least partly) - * be immediately releasable. - * - * @custom:storage-size 52 - */ -contract VestingWalletUpgradeable is Initializable, ContextUpgradeable { - event EtherReleased(uint256 amount); - event ERC20Released(address indexed token, uint256 amount); - - uint256 private _released; - mapping(address => uint256) private _erc20Released; - address private _beneficiary; - uint64 private _start; - uint64 private _duration; - - /** - * @dev Set the beneficiary, start timestamp and vesting duration of the vesting wallet. - */ - function __VestingWallet_init( - address beneficiaryAddress, - uint64 startTimestamp, - uint64 durationSeconds - ) internal onlyInitializing { - __VestingWallet_init_unchained(beneficiaryAddress, startTimestamp, durationSeconds); - } - - function __VestingWallet_init_unchained( - address beneficiaryAddress, - uint64 startTimestamp, - uint64 durationSeconds - ) internal onlyInitializing { - require(beneficiaryAddress != address(0), "VestingWallet: beneficiary is zero address"); - _beneficiary = beneficiaryAddress; - _start = startTimestamp; - _duration = durationSeconds; - } - - /** - * @dev The contract should be able to receive Eth. - */ - receive() external payable virtual {} - - /** - * @dev Getter for the beneficiary address. - */ - function beneficiary() public view virtual returns (address) { - return _beneficiary; - } - - /** - * @dev Getter for the start timestamp. - */ - function start() public view virtual returns (uint256) { - return _start; - } - - /** - * @dev Getter for the vesting duration. - */ - function duration() public view virtual returns (uint256) { - return _duration; - } - - /** - * @dev Amount of eth already released - */ - function released() public view virtual returns (uint256) { - return _released; - } - - /** - * @dev Amount of token already released - */ - function released(address token) public view virtual returns (uint256) { - return _erc20Released[token]; - } - - /** - * @dev Getter for the amount of releasable eth. - */ - function releasable() public view virtual returns (uint256) { - return vestedAmount(uint64(block.timestamp)) - released(); - } - - /** - * @dev Getter for the amount of releasable `token` tokens. `token` should be the address of an - * IERC20 contract. - */ - function releasable(address token) public view virtual returns (uint256) { - return vestedAmount(token, uint64(block.timestamp)) - released(token); - } - - /** - * @dev Release the native token (ether) that have already vested. - * - * Emits a {EtherReleased} event. - */ - function release() public virtual { - uint256 amount = releasable(); - _released += amount; - emit EtherReleased(amount); - AddressUpgradeable.sendValue(payable(beneficiary()), amount); - } - - /** - * @dev Release the tokens that have already vested. - * - * Emits a {ERC20Released} event. - */ - function release(address token) public virtual { - uint256 amount = releasable(token); - _erc20Released[token] += amount; - emit ERC20Released(token, amount); - SafeERC20Upgradeable.safeTransfer(IERC20Upgradeable(token), beneficiary(), amount); - } - - /** - * @dev Calculates the amount of ether that has already vested. Default implementation is a linear vesting curve. - */ - function vestedAmount(uint64 timestamp) public view virtual returns (uint256) { - return _vestingSchedule(address(this).balance + released(), timestamp); - } - - /** - * @dev Calculates the amount of tokens that has already vested. Default implementation is a linear vesting curve. - */ - function vestedAmount(address token, uint64 timestamp) public view virtual returns (uint256) { - return _vestingSchedule(IERC20Upgradeable(token).balanceOf(address(this)) + released(token), timestamp); - } - - /** - * @dev Virtual implementation of the vesting formula. This returns the amount vested, as a function of time, for - * an asset given its total historical allocation. - */ - function _vestingSchedule(uint256 totalAllocation, uint64 timestamp) internal view virtual returns (uint256) { - if (timestamp < start()) { - return 0; - } else if (timestamp > start() + duration()) { - return totalAllocation; - } else { - return (totalAllocation * (timestamp - start())) / duration(); - } - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[48] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/GovernorUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/GovernorUpgradeable.sol deleted file mode 100644 index 06c73fd..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/GovernorUpgradeable.sol +++ /dev/null @@ -1,610 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (governance/Governor.sol) - -pragma solidity ^0.8.0; - -import "../token/ERC721/IERC721ReceiverUpgradeable.sol"; -import "../token/ERC1155/IERC1155ReceiverUpgradeable.sol"; -import "../utils/cryptography/ECDSAUpgradeable.sol"; -import "../utils/cryptography/EIP712Upgradeable.sol"; -import "../utils/introspection/ERC165Upgradeable.sol"; -import "../utils/math/SafeCastUpgradeable.sol"; -import "../utils/structs/DoubleEndedQueueUpgradeable.sol"; -import "../utils/AddressUpgradeable.sol"; -import "../utils/ContextUpgradeable.sol"; -import "../utils/TimersUpgradeable.sol"; -import "./IGovernorUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -/** - * @dev Core of the governance system, designed to be extended though various modules. - * - * This contract is abstract and requires several function to be implemented in various modules: - * - * - A counting module must implement {quorum}, {_quorumReached}, {_voteSucceeded} and {_countVote} - * - A voting module must implement {_getVotes} - * - Additionally, the {votingPeriod} must also be implemented - * - * _Available since v4.3._ - */ -abstract contract GovernorUpgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, EIP712Upgradeable, IGovernorUpgradeable, IERC721ReceiverUpgradeable, IERC1155ReceiverUpgradeable { - using DoubleEndedQueueUpgradeable for DoubleEndedQueueUpgradeable.Bytes32Deque; - using SafeCastUpgradeable for uint256; - using TimersUpgradeable for TimersUpgradeable.BlockNumber; - - bytes32 public constant BALLOT_TYPEHASH = keccak256("Ballot(uint256 proposalId,uint8 support)"); - bytes32 public constant EXTENDED_BALLOT_TYPEHASH = - keccak256("ExtendedBallot(uint256 proposalId,uint8 support,string reason,bytes params)"); - - struct ProposalCore { - TimersUpgradeable.BlockNumber voteStart; - TimersUpgradeable.BlockNumber voteEnd; - bool executed; - bool canceled; - } - - string private _name; - - mapping(uint256 => ProposalCore) private _proposals; - - // This queue keeps track of the governor operating on itself. Calls to functions protected by the - // {onlyGovernance} modifier needs to be whitelisted in this queue. Whitelisting is set in {_beforeExecute}, - // consumed by the {onlyGovernance} modifier and eventually reset in {_afterExecute}. This ensures that the - // execution of {onlyGovernance} protected calls can only be achieved through successful proposals. - DoubleEndedQueueUpgradeable.Bytes32Deque private _governanceCall; - - /** - * @dev Restricts a function so it can only be executed through governance proposals. For example, governance - * parameter setters in {GovernorSettings} are protected using this modifier. - * - * The governance executing address may be different from the Governor's own address, for example it could be a - * timelock. This can be customized by modules by overriding {_executor}. The executor is only able to invoke these - * functions during the execution of the governor's {execute} function, and not under any other circumstances. Thus, - * for example, additional timelock proposers are not able to change governance parameters without going through the - * governance protocol (since v4.6). - */ - modifier onlyGovernance() { - require(_msgSender() == _executor(), "Governor: onlyGovernance"); - if (_executor() != address(this)) { - bytes32 msgDataHash = keccak256(_msgData()); - // loop until popping the expected operation - throw if deque is empty (operation not authorized) - while (_governanceCall.popFront() != msgDataHash) {} - } - _; - } - - /** - * @dev Sets the value for {name} and {version} - */ - function __Governor_init(string memory name_) internal onlyInitializing { - __EIP712_init_unchained(name_, version()); - __Governor_init_unchained(name_); - } - - function __Governor_init_unchained(string memory name_) internal onlyInitializing { - _name = name_; - } - - /** - * @dev Function to receive ETH that will be handled by the governor (disabled if executor is a third party contract) - */ - receive() external payable virtual { - require(_executor() == address(this)); - } - - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165Upgradeable, ERC165Upgradeable) returns (bool) { - // In addition to the current interfaceId, also support previous version of the interfaceId that did not - // include the castVoteWithReasonAndParams() function as standard - return - interfaceId == - (type(IGovernorUpgradeable).interfaceId ^ - this.castVoteWithReasonAndParams.selector ^ - this.castVoteWithReasonAndParamsBySig.selector ^ - this.getVotesWithParams.selector) || - interfaceId == type(IGovernorUpgradeable).interfaceId || - interfaceId == type(IERC1155ReceiverUpgradeable).interfaceId || - super.supportsInterface(interfaceId); - } - - /** - * @dev See {IGovernor-name}. - */ - function name() public view virtual override returns (string memory) { - return _name; - } - - /** - * @dev See {IGovernor-version}. - */ - function version() public view virtual override returns (string memory) { - return "1"; - } - - /** - * @dev See {IGovernor-hashProposal}. - * - * The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array - * and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id - * can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in - * advance, before the proposal is submitted. - * - * Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the - * same proposal (with same operation and same description) will have the same id if submitted on multiple governors - * across multiple networks. This also means that in order to execute the same operation twice (on the same - * governor) the proposer will have to change the description in order to avoid proposal id conflicts. - */ - function hashProposal( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) public pure virtual override returns (uint256) { - return uint256(keccak256(abi.encode(targets, values, calldatas, descriptionHash))); - } - - /** - * @dev See {IGovernor-state}. - */ - function state(uint256 proposalId) public view virtual override returns (ProposalState) { - ProposalCore storage proposal = _proposals[proposalId]; - - if (proposal.executed) { - return ProposalState.Executed; - } - - if (proposal.canceled) { - return ProposalState.Canceled; - } - - uint256 snapshot = proposalSnapshot(proposalId); - - if (snapshot == 0) { - revert("Governor: unknown proposal id"); - } - - if (snapshot >= block.number) { - return ProposalState.Pending; - } - - uint256 deadline = proposalDeadline(proposalId); - - if (deadline >= block.number) { - return ProposalState.Active; - } - - if (_quorumReached(proposalId) && _voteSucceeded(proposalId)) { - return ProposalState.Succeeded; - } else { - return ProposalState.Defeated; - } - } - - /** - * @dev See {IGovernor-proposalSnapshot}. - */ - function proposalSnapshot(uint256 proposalId) public view virtual override returns (uint256) { - return _proposals[proposalId].voteStart.getDeadline(); - } - - /** - * @dev See {IGovernor-proposalDeadline}. - */ - function proposalDeadline(uint256 proposalId) public view virtual override returns (uint256) { - return _proposals[proposalId].voteEnd.getDeadline(); - } - - /** - * @dev Part of the Governor Bravo's interface: _"The number of votes required in order for a voter to become a proposer"_. - */ - function proposalThreshold() public view virtual returns (uint256) { - return 0; - } - - /** - * @dev Amount of votes already cast passes the threshold limit. - */ - function _quorumReached(uint256 proposalId) internal view virtual returns (bool); - - /** - * @dev Is the proposal successful or not. - */ - function _voteSucceeded(uint256 proposalId) internal view virtual returns (bool); - - /** - * @dev Get the voting weight of `account` at a specific `blockNumber`, for a vote as described by `params`. - */ - function _getVotes( - address account, - uint256 blockNumber, - bytes memory params - ) internal view virtual returns (uint256); - - /** - * @dev Register a vote for `proposalId` by `account` with a given `support`, voting `weight` and voting `params`. - * - * Note: Support is generic and can represent various things depending on the voting system used. - */ - function _countVote( - uint256 proposalId, - address account, - uint8 support, - uint256 weight, - bytes memory params - ) internal virtual; - - /** - * @dev Default additional encoded parameters used by castVote methods that don't include them - * - * Note: Should be overridden by specific implementations to use an appropriate value, the - * meaning of the additional params, in the context of that implementation - */ - function _defaultParams() internal view virtual returns (bytes memory) { - return ""; - } - - /** - * @dev See {IGovernor-propose}. - */ - function propose( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - string memory description - ) public virtual override returns (uint256) { - require( - getVotes(_msgSender(), block.number - 1) >= proposalThreshold(), - "Governor: proposer votes below proposal threshold" - ); - - uint256 proposalId = hashProposal(targets, values, calldatas, keccak256(bytes(description))); - - require(targets.length == values.length, "Governor: invalid proposal length"); - require(targets.length == calldatas.length, "Governor: invalid proposal length"); - require(targets.length > 0, "Governor: empty proposal"); - - ProposalCore storage proposal = _proposals[proposalId]; - require(proposal.voteStart.isUnset(), "Governor: proposal already exists"); - - uint64 snapshot = block.number.toUint64() + votingDelay().toUint64(); - uint64 deadline = snapshot + votingPeriod().toUint64(); - - proposal.voteStart.setDeadline(snapshot); - proposal.voteEnd.setDeadline(deadline); - - emit ProposalCreated( - proposalId, - _msgSender(), - targets, - values, - new string[](targets.length), - calldatas, - snapshot, - deadline, - description - ); - - return proposalId; - } - - /** - * @dev See {IGovernor-execute}. - */ - function execute( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) public payable virtual override returns (uint256) { - uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash); - - ProposalState status = state(proposalId); - require( - status == ProposalState.Succeeded || status == ProposalState.Queued, - "Governor: proposal not successful" - ); - _proposals[proposalId].executed = true; - - emit ProposalExecuted(proposalId); - - _beforeExecute(proposalId, targets, values, calldatas, descriptionHash); - _execute(proposalId, targets, values, calldatas, descriptionHash); - _afterExecute(proposalId, targets, values, calldatas, descriptionHash); - - return proposalId; - } - - /** - * @dev Internal execution mechanism. Can be overridden to implement different execution mechanism - */ - function _execute( - uint256, /* proposalId */ - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 /*descriptionHash*/ - ) internal virtual { - string memory errorMessage = "Governor: call reverted without message"; - for (uint256 i = 0; i < targets.length; ++i) { - (bool success, bytes memory returndata) = targets[i].call{value: values[i]}(calldatas[i]); - AddressUpgradeable.verifyCallResult(success, returndata, errorMessage); - } - } - - /** - * @dev Hook before execution is triggered. - */ - function _beforeExecute( - uint256, /* proposalId */ - address[] memory targets, - uint256[] memory, /* values */ - bytes[] memory calldatas, - bytes32 /*descriptionHash*/ - ) internal virtual { - if (_executor() != address(this)) { - for (uint256 i = 0; i < targets.length; ++i) { - if (targets[i] == address(this)) { - _governanceCall.pushBack(keccak256(calldatas[i])); - } - } - } - } - - /** - * @dev Hook after execution is triggered. - */ - function _afterExecute( - uint256, /* proposalId */ - address[] memory, /* targets */ - uint256[] memory, /* values */ - bytes[] memory, /* calldatas */ - bytes32 /*descriptionHash*/ - ) internal virtual { - if (_executor() != address(this)) { - if (!_governanceCall.empty()) { - _governanceCall.clear(); - } - } - } - - /** - * @dev Internal cancel mechanism: locks up the proposal timer, preventing it from being re-submitted. Marks it as - * canceled to allow distinguishing it from executed proposals. - * - * Emits a {IGovernor-ProposalCanceled} event. - */ - function _cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) internal virtual returns (uint256) { - uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash); - ProposalState status = state(proposalId); - - require( - status != ProposalState.Canceled && status != ProposalState.Expired && status != ProposalState.Executed, - "Governor: proposal not active" - ); - _proposals[proposalId].canceled = true; - - emit ProposalCanceled(proposalId); - - return proposalId; - } - - /** - * @dev See {IGovernor-getVotes}. - */ - function getVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) { - return _getVotes(account, blockNumber, _defaultParams()); - } - - /** - * @dev See {IGovernor-getVotesWithParams}. - */ - function getVotesWithParams( - address account, - uint256 blockNumber, - bytes memory params - ) public view virtual override returns (uint256) { - return _getVotes(account, blockNumber, params); - } - - /** - * @dev See {IGovernor-castVote}. - */ - function castVote(uint256 proposalId, uint8 support) public virtual override returns (uint256) { - address voter = _msgSender(); - return _castVote(proposalId, voter, support, ""); - } - - /** - * @dev See {IGovernor-castVoteWithReason}. - */ - function castVoteWithReason( - uint256 proposalId, - uint8 support, - string calldata reason - ) public virtual override returns (uint256) { - address voter = _msgSender(); - return _castVote(proposalId, voter, support, reason); - } - - /** - * @dev See {IGovernor-castVoteWithReasonAndParams}. - */ - function castVoteWithReasonAndParams( - uint256 proposalId, - uint8 support, - string calldata reason, - bytes memory params - ) public virtual override returns (uint256) { - address voter = _msgSender(); - return _castVote(proposalId, voter, support, reason, params); - } - - /** - * @dev See {IGovernor-castVoteBySig}. - */ - function castVoteBySig( - uint256 proposalId, - uint8 support, - uint8 v, - bytes32 r, - bytes32 s - ) public virtual override returns (uint256) { - address voter = ECDSAUpgradeable.recover( - _hashTypedDataV4(keccak256(abi.encode(BALLOT_TYPEHASH, proposalId, support))), - v, - r, - s - ); - return _castVote(proposalId, voter, support, ""); - } - - /** - * @dev See {IGovernor-castVoteWithReasonAndParamsBySig}. - */ - function castVoteWithReasonAndParamsBySig( - uint256 proposalId, - uint8 support, - string calldata reason, - bytes memory params, - uint8 v, - bytes32 r, - bytes32 s - ) public virtual override returns (uint256) { - address voter = ECDSAUpgradeable.recover( - _hashTypedDataV4( - keccak256( - abi.encode( - EXTENDED_BALLOT_TYPEHASH, - proposalId, - support, - keccak256(bytes(reason)), - keccak256(params) - ) - ) - ), - v, - r, - s - ); - - return _castVote(proposalId, voter, support, reason, params); - } - - /** - * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve - * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function. Uses the _defaultParams(). - * - * Emits a {IGovernor-VoteCast} event. - */ - function _castVote( - uint256 proposalId, - address account, - uint8 support, - string memory reason - ) internal virtual returns (uint256) { - return _castVote(proposalId, account, support, reason, _defaultParams()); - } - - /** - * @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve - * voting weight using {IGovernor-getVotes} and call the {_countVote} internal function. - * - * Emits a {IGovernor-VoteCast} event. - */ - function _castVote( - uint256 proposalId, - address account, - uint8 support, - string memory reason, - bytes memory params - ) internal virtual returns (uint256) { - ProposalCore storage proposal = _proposals[proposalId]; - require(state(proposalId) == ProposalState.Active, "Governor: vote not currently active"); - - uint256 weight = _getVotes(account, proposal.voteStart.getDeadline(), params); - _countVote(proposalId, account, support, weight, params); - - if (params.length == 0) { - emit VoteCast(account, proposalId, support, weight, reason); - } else { - emit VoteCastWithParams(account, proposalId, support, weight, reason, params); - } - - return weight; - } - - /** - * @dev Relays a transaction or function call to an arbitrary target. In cases where the governance executor - * is some contract other than the governor itself, like when using a timelock, this function can be invoked - * in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake. - * Note that if the executor is simply the governor itself, use of `relay` is redundant. - */ - function relay( - address target, - uint256 value, - bytes calldata data - ) external payable virtual onlyGovernance { - (bool success, bytes memory returndata) = target.call{value: value}(data); - AddressUpgradeable.verifyCallResult(success, returndata, "Governor: relay reverted without message"); - } - - /** - * @dev Address through which the governor executes action. Will be overloaded by module that execute actions - * through another contract such as a timelock. - */ - function _executor() internal view virtual returns (address) { - return address(this); - } - - /** - * @dev See {IERC721Receiver-onERC721Received}. - */ - function onERC721Received( - address, - address, - uint256, - bytes memory - ) public virtual override returns (bytes4) { - return this.onERC721Received.selector; - } - - /** - * @dev See {IERC1155Receiver-onERC1155Received}. - */ - function onERC1155Received( - address, - address, - uint256, - uint256, - bytes memory - ) public virtual override returns (bytes4) { - return this.onERC1155Received.selector; - } - - /** - * @dev See {IERC1155Receiver-onERC1155BatchReceived}. - */ - function onERC1155BatchReceived( - address, - address, - uint256[] memory, - uint256[] memory, - bytes memory - ) public virtual override returns (bytes4) { - return this.onERC1155BatchReceived.selector; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[46] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/IGovernorUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/IGovernorUpgradeable.sol deleted file mode 100644 index 3986ee5..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/IGovernorUpgradeable.sol +++ /dev/null @@ -1,289 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (governance/IGovernor.sol) - -pragma solidity ^0.8.0; - -import "../utils/introspection/ERC165Upgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -/** - * @dev Interface of the {Governor} core. - * - * _Available since v4.3._ - */ -abstract contract IGovernorUpgradeable is Initializable, IERC165Upgradeable { - function __IGovernor_init() internal onlyInitializing { - } - - function __IGovernor_init_unchained() internal onlyInitializing { - } - enum ProposalState { - Pending, - Active, - Canceled, - Defeated, - Succeeded, - Queued, - Expired, - Executed - } - - /** - * @dev Emitted when a proposal is created. - */ - event ProposalCreated( - uint256 proposalId, - address proposer, - address[] targets, - uint256[] values, - string[] signatures, - bytes[] calldatas, - uint256 startBlock, - uint256 endBlock, - string description - ); - - /** - * @dev Emitted when a proposal is canceled. - */ - event ProposalCanceled(uint256 proposalId); - - /** - * @dev Emitted when a proposal is executed. - */ - event ProposalExecuted(uint256 proposalId); - - /** - * @dev Emitted when a vote is cast without params. - * - * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used. - */ - event VoteCast(address indexed voter, uint256 proposalId, uint8 support, uint256 weight, string reason); - - /** - * @dev Emitted when a vote is cast with params. - * - * Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used. - * `params` are additional encoded parameters. Their intepepretation also depends on the voting module used. - */ - event VoteCastWithParams( - address indexed voter, - uint256 proposalId, - uint8 support, - uint256 weight, - string reason, - bytes params - ); - - /** - * @notice module:core - * @dev Name of the governor instance (used in building the ERC712 domain separator). - */ - function name() public view virtual returns (string memory); - - /** - * @notice module:core - * @dev Version of the governor instance (used in building the ERC712 domain separator). Default: "1" - */ - function version() public view virtual returns (string memory); - - /** - * @notice module:voting - * @dev A description of the possible `support` values for {castVote} and the way these votes are counted, meant to - * be consumed by UIs to show correct vote options and interpret the results. The string is a URL-encoded sequence of - * key-value pairs that each describe one aspect, for example `support=bravo&quorum=for,abstain`. - * - * There are 2 standard keys: `support` and `quorum`. - * - * - `support=bravo` refers to the vote options 0 = Against, 1 = For, 2 = Abstain, as in `GovernorBravo`. - * - `quorum=bravo` means that only For votes are counted towards quorum. - * - `quorum=for,abstain` means that both For and Abstain votes are counted towards quorum. - * - * If a counting module makes use of encoded `params`, it should include this under a `params` key with a unique - * name that describes the behavior. For example: - * - * - `params=fractional` might refer to a scheme where votes are divided fractionally between for/against/abstain. - * - `params=erc721` might refer to a scheme where specific NFTs are delegated to vote. - * - * NOTE: The string can be decoded by the standard - * https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams[`URLSearchParams`] - * JavaScript class. - */ - // solhint-disable-next-line func-name-mixedcase - function COUNTING_MODE() public pure virtual returns (string memory); - - /** - * @notice module:core - * @dev Hashing function used to (re)build the proposal id from the proposal details.. - */ - function hashProposal( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) public pure virtual returns (uint256); - - /** - * @notice module:core - * @dev Current state of a proposal, following Compound's convention - */ - function state(uint256 proposalId) public view virtual returns (ProposalState); - - /** - * @notice module:core - * @dev Block number used to retrieve user's votes and quorum. As per Compound's Comp and OpenZeppelin's - * ERC20Votes, the snapshot is performed at the end of this block. Hence, voting for this proposal starts at the - * beginning of the following block. - */ - function proposalSnapshot(uint256 proposalId) public view virtual returns (uint256); - - /** - * @notice module:core - * @dev Block number at which votes close. Votes close at the end of this block, so it is possible to cast a vote - * during this block. - */ - function proposalDeadline(uint256 proposalId) public view virtual returns (uint256); - - /** - * @notice module:user-config - * @dev Delay, in number of block, between the proposal is created and the vote starts. This can be increassed to - * leave time for users to buy voting power, or delegate it, before the voting of a proposal starts. - */ - function votingDelay() public view virtual returns (uint256); - - /** - * @notice module:user-config - * @dev Delay, in number of blocks, between the vote start and vote ends. - * - * NOTE: The {votingDelay} can delay the start of the vote. This must be considered when setting the voting - * duration compared to the voting delay. - */ - function votingPeriod() public view virtual returns (uint256); - - /** - * @notice module:user-config - * @dev Minimum number of cast voted required for a proposal to be successful. - * - * Note: The `blockNumber` parameter corresponds to the snapshot used for counting vote. This allows to scale the - * quorum depending on values such as the totalSupply of a token at this block (see {ERC20Votes}). - */ - function quorum(uint256 blockNumber) public view virtual returns (uint256); - - /** - * @notice module:reputation - * @dev Voting power of an `account` at a specific `blockNumber`. - * - * Note: this can be implemented in a number of ways, for example by reading the delegated balance from one (or - * multiple), {ERC20Votes} tokens. - */ - function getVotes(address account, uint256 blockNumber) public view virtual returns (uint256); - - /** - * @notice module:reputation - * @dev Voting power of an `account` at a specific `blockNumber` given additional encoded parameters. - */ - function getVotesWithParams( - address account, - uint256 blockNumber, - bytes memory params - ) public view virtual returns (uint256); - - /** - * @notice module:voting - * @dev Returns whether `account` has cast a vote on `proposalId`. - */ - function hasVoted(uint256 proposalId, address account) public view virtual returns (bool); - - /** - * @dev Create a new proposal. Vote start {IGovernor-votingDelay} blocks after the proposal is created and ends - * {IGovernor-votingPeriod} blocks after the voting starts. - * - * Emits a {ProposalCreated} event. - */ - function propose( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - string memory description - ) public virtual returns (uint256 proposalId); - - /** - * @dev Execute a successful proposal. This requires the quorum to be reached, the vote to be successful, and the - * deadline to be reached. - * - * Emits a {ProposalExecuted} event. - * - * Note: some module can modify the requirements for execution, for example by adding an additional timelock. - */ - function execute( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) public payable virtual returns (uint256 proposalId); - - /** - * @dev Cast a vote - * - * Emits a {VoteCast} event. - */ - function castVote(uint256 proposalId, uint8 support) public virtual returns (uint256 balance); - - /** - * @dev Cast a vote with a reason - * - * Emits a {VoteCast} event. - */ - function castVoteWithReason( - uint256 proposalId, - uint8 support, - string calldata reason - ) public virtual returns (uint256 balance); - - /** - * @dev Cast a vote with a reason and additional encoded parameters - * - * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params. - */ - function castVoteWithReasonAndParams( - uint256 proposalId, - uint8 support, - string calldata reason, - bytes memory params - ) public virtual returns (uint256 balance); - - /** - * @dev Cast a vote using the user's cryptographic signature. - * - * Emits a {VoteCast} event. - */ - function castVoteBySig( - uint256 proposalId, - uint8 support, - uint8 v, - bytes32 r, - bytes32 s - ) public virtual returns (uint256 balance); - - /** - * @dev Cast a vote with a reason and additional encoded parameters using the user's cryptographic signature. - * - * Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params. - */ - function castVoteWithReasonAndParamsBySig( - uint256 proposalId, - uint8 support, - string calldata reason, - bytes memory params, - uint8 v, - bytes32 r, - bytes32 s - ) public virtual returns (uint256 balance); - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/README.adoc b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/README.adoc deleted file mode 100644 index f711c63..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/README.adoc +++ /dev/null @@ -1,176 +0,0 @@ -= Governance - -[.readme-notice] -NOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/governance - -This directory includes primitives for on-chain governance. - -== Governor - -This modular system of Governor contracts allows the deployment on-chain voting protocols similar to https://compound.finance/docs/governance[Compound's Governor Alpha & Bravo] and beyond, through the ability to easily customize multiple aspects of the protocol. - -[TIP] -==== -For a guided experience, set up your Governor contract using https://wizard.openzeppelin.com/#governor[Contracts Wizard]. - -For a written walkthrough, check out our guide on xref:ROOT:governance.adoc[How to set up on-chain governance]. -==== - -* {Governor}: The core contract that contains all the logic and primitives. It is abstract and requires choosing one of each of the modules below, or custom ones. - -Votes modules determine the source of voting power, and sometimes quorum number. - -* {GovernorVotes}: Extracts voting weight from an {ERC20Votes} token. - -* {GovernorVotesComp}: Extracts voting weight from a COMP-like or {ERC20VotesComp} token. - -* {GovernorVotesQuorumFraction}: Combines with `GovernorVotes` to set the quorum as a fraction of the total token supply. - -Counting modules determine valid voting options. - -* {GovernorCountingSimple}: Simple voting mechanism with 3 voting options: Against, For and Abstain. - -Timelock extensions add a delay for governance decisions to be executed. The workflow is extended to require a `queue` step before execution. With these modules, proposals are executed by the external timelock contract, thus it is the timelock that has to hold the assets that are being governed. - -* {GovernorTimelockControl}: Connects with an instance of {TimelockController}. Allows multiple proposers and executors, in addition to the Governor itself. - -* {GovernorTimelockCompound}: Connects with an instance of Compound's https://github.com/compound-finance/compound-protocol/blob/master/contracts/Timelock.sol[`Timelock`] contract. - -Other extensions can customize the behavior or interface in multiple ways. - -* {GovernorCompatibilityBravo}: Extends the interface to be fully `GovernorBravo`-compatible. Note that events are compatible regardless of whether this extension is included or not. - -* {GovernorSettings}: Manages some of the settings (voting delay, voting period duration, and proposal threshold) in a way that can be updated through a governance proposal, without requiring an upgrade. - -* {GovernorPreventLateQuorum}: Ensures there is a minimum voting period after quorum is reached as a security protection against large voters. - -In addition to modules and extensions, the core contract requires a few virtual functions to be implemented to your particular specifications: - -* <>: Delay (in number of blocks) since the proposal is submitted until voting power is fixed and voting starts. This can be used to enforce a delay after a proposal is published for users to buy tokens, or delegate their votes. -* <>: Delay (in number of blocks) since the proposal starts until voting ends. -* <>: Quorum required for a proposal to be successful. This function includes a `blockNumber` argument so the quorum can adapt through time, for example, to follow a token's `totalSupply`. - -NOTE: Functions of the `Governor` contract do not include access control. If you want to restrict access, you should add these checks by overloading the particular functions. Among these, {Governor-_cancel} is internal by default, and you will have to expose it (with the right access control mechanism) yourself if this function is needed. - -=== Core - -{{IGovernor}} - -{{Governor}} - -=== Modules - -{{GovernorCountingSimple}} - -{{GovernorVotes}} - -{{GovernorVotesQuorumFraction}} - -{{GovernorVotesComp}} - -=== Extensions - -{{GovernorTimelockControl}} - -{{GovernorTimelockCompound}} - -{{GovernorSettings}} - -{{GovernorPreventLateQuorum}} - -{{GovernorCompatibilityBravo}} - -=== Deprecated - -{{GovernorProposalThreshold}} - -== Utils - -{{Votes}} - -== Timelock - -In a governance system, the {TimelockController} contract is in charge of introducing a delay between a proposal and its execution. It can be used with or without a {Governor}. - -{{TimelockController}} - -[[timelock-terminology]] -==== Terminology - -* *Operation:* A transaction (or a set of transactions) that is the subject of the timelock. It has to be scheduled by a proposer and executed by an executor. The timelock enforces a minimum delay between the proposition and the execution (see xref:access-control.adoc#operation_lifecycle[operation lifecycle]). If the operation contains multiple transactions (batch mode), they are executed atomically. Operations are identified by the hash of their content. -* *Operation status:* -** *Unset:* An operation that is not part of the timelock mechanism. -** *Pending:* An operation that has been scheduled, before the timer expires. -** *Ready:* An operation that has been scheduled, after the timer expires. -** *Done:* An operation that has been executed. -* *Predecessor*: An (optional) dependency between operations. An operation can depend on another operation (its predecessor), forcing the execution order of these two operations. -* *Role*: -** *Admin:* An address (smart contract or EOA) that is in charge of granting the roles of Proposer and Executor. -** *Proposer:* An address (smart contract or EOA) that is in charge of scheduling (and cancelling) operations. -** *Executor:* An address (smart contract or EOA) that is in charge of executing operations once the timelock has expired. This role can be given to the zero address to allow anyone to execute operations. - -[[timelock-operation]] -==== Operation structure - -Operation executed by the xref:api:governance.adoc#TimelockController[`TimelockController`] can contain one or multiple subsequent calls. Depending on whether you need to multiple calls to be executed atomically, you can either use simple or batched operations. - -Both operations contain: - -* *Target*, the address of the smart contract that the timelock should operate on. -* *Value*, in wei, that should be sent with the transaction. Most of the time this will be 0. Ether can be deposited before-end or passed along when executing the transaction. -* *Data*, containing the encoded function selector and parameters of the call. This can be produced using a number of tools. For example, a maintenance operation granting role `ROLE` to `ACCOUNT` can be encoded using web3js as follows: - -```javascript -const data = timelock.contract.methods.grantRole(ROLE, ACCOUNT).encodeABI() -``` - -* *Predecessor*, that specifies a dependency between operations. This dependency is optional. Use `bytes32(0)` if the operation does not have any dependency. -* *Salt*, used to disambiguate two otherwise identical operations. This can be any random value. - -In the case of batched operations, `target`, `value` and `data` are specified as arrays, which must be of the same length. - -[[timelock-operation-lifecycle]] -==== Operation lifecycle - -Timelocked operations are identified by a unique id (their hash) and follow a specific lifecycle: - -`Unset` -> `Pending` -> `Pending` + `Ready` -> `Done` - -* By calling xref:api:governance.adoc#TimelockController-schedule-address-uint256-bytes-bytes32-bytes32-uint256-[`schedule`] (or xref:api:governance.adoc#TimelockController-scheduleBatch-address---uint256---bytes---bytes32-bytes32-uint256-[`scheduleBatch`]), a proposer moves the operation from the `Unset` to the `Pending` state. This starts a timer that must be longer than the minimum delay. The timer expires at a timestamp accessible through the xref:api:governance.adoc#TimelockController-getTimestamp-bytes32-[`getTimestamp`] method. -* Once the timer expires, the operation automatically gets the `Ready` state. At this point, it can be executed. -* By calling xref:api:governance.adoc#TimelockController-TimelockController-execute-address-uint256-bytes-bytes32-bytes32-[`execute`] (or xref:api:governance.adoc#TimelockController-executeBatch-address---uint256---bytes---bytes32-bytes32-[`executeBatch`]), an executor triggers the operation's underlying transactions and moves it to the `Done` state. If the operation has a predecessor, it has to be in the `Done` state for this transition to succeed. -* xref:api:governance.adoc#TimelockController-TimelockController-cancel-bytes32-[`cancel`] allows proposers to cancel any `Pending` operation. This resets the operation to the `Unset` state. It is thus possible for a proposer to re-schedule an operation that has been cancelled. In this case, the timer restarts when the operation is re-scheduled. - -Operations status can be queried using the functions: - -* xref:api:governance.adoc#TimelockController-isOperationPending-bytes32-[`isOperationPending(bytes32)`] -* xref:api:governance.adoc#TimelockController-isOperationReady-bytes32-[`isOperationReady(bytes32)`] -* xref:api:governance.adoc#TimelockController-isOperationDone-bytes32-[`isOperationDone(bytes32)`] - -[[timelock-roles]] -==== Roles - -[[timelock-admin]] -===== Admin - -The admins are in charge of managing proposers and executors. For the timelock to be self-governed, this role should only be given to the timelock itself. Upon deployment, the admin role can be granted to any address (in addition to the timelock itself). After further configuration and testing, this optional admin should renounce its role such that all further maintenance operations have to go through the timelock process. - -This role is identified by the *TIMELOCK_ADMIN_ROLE* value: `0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5` - -[[timelock-proposer]] -===== Proposer - -The proposers are in charge of scheduling (and cancelling) operations. This is a critical role, that should be given to governing entities. This could be an EOA, a multisig, or a DAO. - -WARNING: *Proposer fight:* Having multiple proposers, while providing redundancy in case one becomes unavailable, can be dangerous. As proposer have their say on all operations, they could cancel operations they disagree with, including operations to remove them for the proposers. - -This role is identified by the *PROPOSER_ROLE* value: `0xb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1` - -[[timelock-executor]] -===== Executor - -The executors are in charge of executing the operations scheduled by the proposers once the timelock expires. Logic dictates that multisig or DAO that are proposers should also be executors in order to guarantee operations that have been scheduled will eventually be executed. However, having additional executors can reduce the cost (the executing transaction does not require validation by the multisig or DAO that proposed it), while ensuring whoever is in charge of execution cannot trigger actions that have not been scheduled by the proposers. Alternatively, it is possible to allow _any_ address to execute a proposal once the timelock has expired by granting the executor role to the zero address. - -This role is identified by the *EXECUTOR_ROLE* value: `0xd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63` - -WARNING: A live contract without at least one proposer and one executor is locked. Make sure these roles are filled by reliable entities before the deployer renounces its administrative rights in favour of the timelock contract itself. See the {AccessControl} documentation to learn more about role management. diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/TimelockControllerUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/TimelockControllerUpgradeable.sol deleted file mode 100644 index 98935ed..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/TimelockControllerUpgradeable.sol +++ /dev/null @@ -1,440 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (governance/TimelockController.sol) - -pragma solidity ^0.8.0; - -import "../access/AccessControlUpgradeable.sol"; -import "../token/ERC721/IERC721ReceiverUpgradeable.sol"; -import "../token/ERC1155/IERC1155ReceiverUpgradeable.sol"; -import "../utils/AddressUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -/** - * @dev Contract module which acts as a timelocked controller. When set as the - * owner of an `Ownable` smart contract, it enforces a timelock on all - * `onlyOwner` maintenance operations. This gives time for users of the - * controlled contract to exit before a potentially dangerous maintenance - * operation is applied. - * - * By default, this contract is self administered, meaning administration tasks - * have to go through the timelock process. The proposer (resp executor) role - * is in charge of proposing (resp executing) operations. A common use case is - * to position this {TimelockController} as the owner of a smart contract, with - * a multisig or a DAO as the sole proposer. - * - * _Available since v3.3._ - */ -contract TimelockControllerUpgradeable is Initializable, AccessControlUpgradeable, IERC721ReceiverUpgradeable, IERC1155ReceiverUpgradeable { - bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256("TIMELOCK_ADMIN_ROLE"); - bytes32 public constant PROPOSER_ROLE = keccak256("PROPOSER_ROLE"); - bytes32 public constant EXECUTOR_ROLE = keccak256("EXECUTOR_ROLE"); - bytes32 public constant CANCELLER_ROLE = keccak256("CANCELLER_ROLE"); - uint256 internal constant _DONE_TIMESTAMP = uint256(1); - - mapping(bytes32 => uint256) private _timestamps; - uint256 private _minDelay; - - /** - * @dev Emitted when a call is scheduled as part of operation `id`. - */ - event CallScheduled( - bytes32 indexed id, - uint256 indexed index, - address target, - uint256 value, - bytes data, - bytes32 predecessor, - uint256 delay - ); - - /** - * @dev Emitted when a call is performed as part of operation `id`. - */ - event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data); - - /** - * @dev Emitted when operation `id` is cancelled. - */ - event Cancelled(bytes32 indexed id); - - /** - * @dev Emitted when the minimum delay for future operations is modified. - */ - event MinDelayChange(uint256 oldDuration, uint256 newDuration); - - /** - * @dev Initializes the contract with the following parameters: - * - * - `minDelay`: initial minimum delay for operations - * - `proposers`: accounts to be granted proposer and canceller roles - * - `executors`: accounts to be granted executor role - * - `admin`: optional account to be granted admin role; disable with zero address - * - * IMPORTANT: The optional admin can aid with initial configuration of roles after deployment - * without being subject to delay, but this role should be subsequently renounced in favor of - * administration through timelocked proposals. Previous versions of this contract would assign - * this admin to the deployer automatically and should be renounced as well. - */ - function __TimelockController_init( - uint256 minDelay, - address[] memory proposers, - address[] memory executors, - address admin - ) internal onlyInitializing { - __TimelockController_init_unchained(minDelay, proposers, executors, admin); - } - - function __TimelockController_init_unchained( - uint256 minDelay, - address[] memory proposers, - address[] memory executors, - address admin - ) internal onlyInitializing { - _setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE); - _setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE); - _setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE); - _setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE); - - // self administration - _setupRole(TIMELOCK_ADMIN_ROLE, address(this)); - - // optional admin - if (admin != address(0)) { - _setupRole(TIMELOCK_ADMIN_ROLE, admin); - } - - // register proposers and cancellers - for (uint256 i = 0; i < proposers.length; ++i) { - _setupRole(PROPOSER_ROLE, proposers[i]); - _setupRole(CANCELLER_ROLE, proposers[i]); - } - - // register executors - for (uint256 i = 0; i < executors.length; ++i) { - _setupRole(EXECUTOR_ROLE, executors[i]); - } - - _minDelay = minDelay; - emit MinDelayChange(0, minDelay); - } - - /** - * @dev Modifier to make a function callable only by a certain role. In - * addition to checking the sender's role, `address(0)` 's role is also - * considered. Granting a role to `address(0)` is equivalent to enabling - * this role for everyone. - */ - modifier onlyRoleOrOpenRole(bytes32 role) { - if (!hasRole(role, address(0))) { - _checkRole(role, _msgSender()); - } - _; - } - - /** - * @dev Contract might receive/hold ETH as part of the maintenance process. - */ - receive() external payable {} - - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165Upgradeable, AccessControlUpgradeable) returns (bool) { - return interfaceId == type(IERC1155ReceiverUpgradeable).interfaceId || super.supportsInterface(interfaceId); - } - - /** - * @dev Returns whether an id correspond to a registered operation. This - * includes both Pending, Ready and Done operations. - */ - function isOperation(bytes32 id) public view virtual returns (bool registered) { - return getTimestamp(id) > 0; - } - - /** - * @dev Returns whether an operation is pending or not. - */ - function isOperationPending(bytes32 id) public view virtual returns (bool pending) { - return getTimestamp(id) > _DONE_TIMESTAMP; - } - - /** - * @dev Returns whether an operation is ready or not. - */ - function isOperationReady(bytes32 id) public view virtual returns (bool ready) { - uint256 timestamp = getTimestamp(id); - return timestamp > _DONE_TIMESTAMP && timestamp <= block.timestamp; - } - - /** - * @dev Returns whether an operation is done or not. - */ - function isOperationDone(bytes32 id) public view virtual returns (bool done) { - return getTimestamp(id) == _DONE_TIMESTAMP; - } - - /** - * @dev Returns the timestamp at which an operation becomes ready (0 for - * unset operations, 1 for done operations). - */ - function getTimestamp(bytes32 id) public view virtual returns (uint256 timestamp) { - return _timestamps[id]; - } - - /** - * @dev Returns the minimum delay for an operation to become valid. - * - * This value can be changed by executing an operation that calls `updateDelay`. - */ - function getMinDelay() public view virtual returns (uint256 duration) { - return _minDelay; - } - - /** - * @dev Returns the identifier of an operation containing a single - * transaction. - */ - function hashOperation( - address target, - uint256 value, - bytes calldata data, - bytes32 predecessor, - bytes32 salt - ) public pure virtual returns (bytes32 hash) { - return keccak256(abi.encode(target, value, data, predecessor, salt)); - } - - /** - * @dev Returns the identifier of an operation containing a batch of - * transactions. - */ - function hashOperationBatch( - address[] calldata targets, - uint256[] calldata values, - bytes[] calldata payloads, - bytes32 predecessor, - bytes32 salt - ) public pure virtual returns (bytes32 hash) { - return keccak256(abi.encode(targets, values, payloads, predecessor, salt)); - } - - /** - * @dev Schedule an operation containing a single transaction. - * - * Emits a {CallScheduled} event. - * - * Requirements: - * - * - the caller must have the 'proposer' role. - */ - function schedule( - address target, - uint256 value, - bytes calldata data, - bytes32 predecessor, - bytes32 salt, - uint256 delay - ) public virtual onlyRole(PROPOSER_ROLE) { - bytes32 id = hashOperation(target, value, data, predecessor, salt); - _schedule(id, delay); - emit CallScheduled(id, 0, target, value, data, predecessor, delay); - } - - /** - * @dev Schedule an operation containing a batch of transactions. - * - * Emits one {CallScheduled} event per transaction in the batch. - * - * Requirements: - * - * - the caller must have the 'proposer' role. - */ - function scheduleBatch( - address[] calldata targets, - uint256[] calldata values, - bytes[] calldata payloads, - bytes32 predecessor, - bytes32 salt, - uint256 delay - ) public virtual onlyRole(PROPOSER_ROLE) { - require(targets.length == values.length, "TimelockController: length mismatch"); - require(targets.length == payloads.length, "TimelockController: length mismatch"); - - bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt); - _schedule(id, delay); - for (uint256 i = 0; i < targets.length; ++i) { - emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay); - } - } - - /** - * @dev Schedule an operation that is to become valid after a given delay. - */ - function _schedule(bytes32 id, uint256 delay) private { - require(!isOperation(id), "TimelockController: operation already scheduled"); - require(delay >= getMinDelay(), "TimelockController: insufficient delay"); - _timestamps[id] = block.timestamp + delay; - } - - /** - * @dev Cancel an operation. - * - * Requirements: - * - * - the caller must have the 'canceller' role. - */ - function cancel(bytes32 id) public virtual onlyRole(CANCELLER_ROLE) { - require(isOperationPending(id), "TimelockController: operation cannot be cancelled"); - delete _timestamps[id]; - - emit Cancelled(id); - } - - /** - * @dev Execute an (ready) operation containing a single transaction. - * - * Emits a {CallExecuted} event. - * - * Requirements: - * - * - the caller must have the 'executor' role. - */ - // This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending, - // thus any modifications to the operation during reentrancy should be caught. - // slither-disable-next-line reentrancy-eth - function execute( - address target, - uint256 value, - bytes calldata payload, - bytes32 predecessor, - bytes32 salt - ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) { - bytes32 id = hashOperation(target, value, payload, predecessor, salt); - - _beforeCall(id, predecessor); - _execute(target, value, payload); - emit CallExecuted(id, 0, target, value, payload); - _afterCall(id); - } - - /** - * @dev Execute an (ready) operation containing a batch of transactions. - * - * Emits one {CallExecuted} event per transaction in the batch. - * - * Requirements: - * - * - the caller must have the 'executor' role. - */ - function executeBatch( - address[] calldata targets, - uint256[] calldata values, - bytes[] calldata payloads, - bytes32 predecessor, - bytes32 salt - ) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) { - require(targets.length == values.length, "TimelockController: length mismatch"); - require(targets.length == payloads.length, "TimelockController: length mismatch"); - - bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt); - - _beforeCall(id, predecessor); - for (uint256 i = 0; i < targets.length; ++i) { - address target = targets[i]; - uint256 value = values[i]; - bytes calldata payload = payloads[i]; - _execute(target, value, payload); - emit CallExecuted(id, i, target, value, payload); - } - _afterCall(id); - } - - /** - * @dev Execute an operation's call. - */ - function _execute( - address target, - uint256 value, - bytes calldata data - ) internal virtual { - (bool success, ) = target.call{value: value}(data); - require(success, "TimelockController: underlying transaction reverted"); - } - - /** - * @dev Checks before execution of an operation's calls. - */ - function _beforeCall(bytes32 id, bytes32 predecessor) private view { - require(isOperationReady(id), "TimelockController: operation is not ready"); - require(predecessor == bytes32(0) || isOperationDone(predecessor), "TimelockController: missing dependency"); - } - - /** - * @dev Checks after execution of an operation's calls. - */ - function _afterCall(bytes32 id) private { - require(isOperationReady(id), "TimelockController: operation is not ready"); - _timestamps[id] = _DONE_TIMESTAMP; - } - - /** - * @dev Changes the minimum timelock duration for future operations. - * - * Emits a {MinDelayChange} event. - * - * Requirements: - * - * - the caller must be the timelock itself. This can only be achieved by scheduling and later executing - * an operation where the timelock is the target and the data is the ABI-encoded call to this function. - */ - function updateDelay(uint256 newDelay) external virtual { - require(msg.sender == address(this), "TimelockController: caller must be timelock"); - emit MinDelayChange(_minDelay, newDelay); - _minDelay = newDelay; - } - - /** - * @dev See {IERC721Receiver-onERC721Received}. - */ - function onERC721Received( - address, - address, - uint256, - bytes memory - ) public virtual override returns (bytes4) { - return this.onERC721Received.selector; - } - - /** - * @dev See {IERC1155Receiver-onERC1155Received}. - */ - function onERC1155Received( - address, - address, - uint256, - uint256, - bytes memory - ) public virtual override returns (bytes4) { - return this.onERC1155Received.selector; - } - - /** - * @dev See {IERC1155Receiver-onERC1155BatchReceived}. - */ - function onERC1155BatchReceived( - address, - address, - uint256[] memory, - uint256[] memory, - bytes memory - ) public virtual override returns (bytes4) { - return this.onERC1155BatchReceived.selector; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[48] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/TimelockControllerWith46MigrationUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/TimelockControllerWith46MigrationUpgradeable.sol deleted file mode 100644 index 954afc5..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/TimelockControllerWith46MigrationUpgradeable.sol +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.6.0 (governance/TimelockControllerWith46Migration.sol) - -pragma solidity ^0.8.0; - -import "./TimelockControllerUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -/** - * @dev Extension of the TimelockController that includes an additional - * function to migrate from OpenZeppelin Upgradeable Contracts <4.6 to >=4.6. - * - * This migration is necessary to setup administration rights over the new - * `CANCELLER_ROLE`. - * - * The migration is trustless and can be performed by anyone. - * - * _Available since v4.6._ - */ -contract TimelockControllerWith46MigrationUpgradeable is Initializable, TimelockControllerUpgradeable { - function __TimelockControllerWith46Migration_init( - uint256 minDelay, - address[] memory proposers, - address[] memory executors, - address admin - ) internal onlyInitializing { - __TimelockController_init_unchained(minDelay, proposers, executors, admin); - } - - function __TimelockControllerWith46Migration_init_unchained( - uint256, - address[] memory, - address[] memory, - address - ) internal onlyInitializing {} - - /** - * @dev Migration function. Running it is necessary for upgradeable - * instances that were initially setup with code <4.6 and that upgraded - * to >=4.6. - */ - function migrateTo46() public virtual { - require( - getRoleAdmin(PROPOSER_ROLE) == TIMELOCK_ADMIN_ROLE && getRoleAdmin(CANCELLER_ROLE) == DEFAULT_ADMIN_ROLE, - "TimelockController: already migrated" - ); - _setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/compatibility/GovernorCompatibilityBravoUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/compatibility/GovernorCompatibilityBravoUpgradeable.sol deleted file mode 100644 index 4b58812..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/compatibility/GovernorCompatibilityBravoUpgradeable.sol +++ /dev/null @@ -1,298 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (governance/compatibility/GovernorCompatibilityBravo.sol) - -pragma solidity ^0.8.0; - -import "../../utils/math/SafeCastUpgradeable.sol"; -import "../extensions/IGovernorTimelockUpgradeable.sol"; -import "../GovernorUpgradeable.sol"; -import "./IGovernorCompatibilityBravoUpgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -/** - * @dev Compatibility layer that implements GovernorBravo compatibility on top of {Governor}. - * - * This compatibility layer includes a voting system and requires a {IGovernorTimelock} compatible module to be added - * through inheritance. It does not include token bindings, nor does it include any variable upgrade patterns. - * - * NOTE: When using this module, you may need to enable the Solidity optimizer to avoid hitting the contract size limit. - * - * _Available since v4.3._ - */ -abstract contract GovernorCompatibilityBravoUpgradeable is Initializable, IGovernorTimelockUpgradeable, IGovernorCompatibilityBravoUpgradeable, GovernorUpgradeable { - function __GovernorCompatibilityBravo_init() internal onlyInitializing { - } - - function __GovernorCompatibilityBravo_init_unchained() internal onlyInitializing { - } - enum VoteType { - Against, - For, - Abstain - } - - struct ProposalDetails { - address proposer; - address[] targets; - uint256[] values; - string[] signatures; - bytes[] calldatas; - uint256 forVotes; - uint256 againstVotes; - uint256 abstainVotes; - mapping(address => Receipt) receipts; - bytes32 descriptionHash; - } - - mapping(uint256 => ProposalDetails) private _proposalDetails; - - // solhint-disable-next-line func-name-mixedcase - function COUNTING_MODE() public pure virtual override returns (string memory) { - return "support=bravo&quorum=bravo"; - } - - // ============================================== Proposal lifecycle ============================================== - /** - * @dev See {IGovernor-propose}. - */ - function propose( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - string memory description - ) public virtual override(IGovernorUpgradeable, GovernorUpgradeable) returns (uint256) { - _storeProposal(_msgSender(), targets, values, new string[](calldatas.length), calldatas, description); - return super.propose(targets, values, calldatas, description); - } - - /** - * @dev See {IGovernorCompatibilityBravo-propose}. - */ - function propose( - address[] memory targets, - uint256[] memory values, - string[] memory signatures, - bytes[] memory calldatas, - string memory description - ) public virtual override returns (uint256) { - _storeProposal(_msgSender(), targets, values, signatures, calldatas, description); - return propose(targets, values, _encodeCalldata(signatures, calldatas), description); - } - - /** - * @dev See {IGovernorCompatibilityBravo-queue}. - */ - function queue(uint256 proposalId) public virtual override { - ProposalDetails storage details = _proposalDetails[proposalId]; - queue( - details.targets, - details.values, - _encodeCalldata(details.signatures, details.calldatas), - details.descriptionHash - ); - } - - /** - * @dev See {IGovernorCompatibilityBravo-execute}. - */ - function execute(uint256 proposalId) public payable virtual override { - ProposalDetails storage details = _proposalDetails[proposalId]; - execute( - details.targets, - details.values, - _encodeCalldata(details.signatures, details.calldatas), - details.descriptionHash - ); - } - - function cancel(uint256 proposalId) public virtual override { - ProposalDetails storage details = _proposalDetails[proposalId]; - - require( - _msgSender() == details.proposer || getVotes(details.proposer, block.number - 1) < proposalThreshold(), - "GovernorBravo: proposer above threshold" - ); - - _cancel( - details.targets, - details.values, - _encodeCalldata(details.signatures, details.calldatas), - details.descriptionHash - ); - } - - /** - * @dev Encodes calldatas with optional function signature. - */ - function _encodeCalldata(string[] memory signatures, bytes[] memory calldatas) - private - pure - returns (bytes[] memory) - { - bytes[] memory fullcalldatas = new bytes[](calldatas.length); - - for (uint256 i = 0; i < signatures.length; ++i) { - fullcalldatas[i] = bytes(signatures[i]).length == 0 - ? calldatas[i] - : abi.encodePacked(bytes4(keccak256(bytes(signatures[i]))), calldatas[i]); - } - - return fullcalldatas; - } - - /** - * @dev Store proposal metadata for later lookup - */ - function _storeProposal( - address proposer, - address[] memory targets, - uint256[] memory values, - string[] memory signatures, - bytes[] memory calldatas, - string memory description - ) private { - bytes32 descriptionHash = keccak256(bytes(description)); - uint256 proposalId = hashProposal(targets, values, _encodeCalldata(signatures, calldatas), descriptionHash); - - ProposalDetails storage details = _proposalDetails[proposalId]; - if (details.descriptionHash == bytes32(0)) { - details.proposer = proposer; - details.targets = targets; - details.values = values; - details.signatures = signatures; - details.calldatas = calldatas; - details.descriptionHash = descriptionHash; - } - } - - // ==================================================== Views ===================================================== - /** - * @dev See {IGovernorCompatibilityBravo-proposals}. - */ - function proposals(uint256 proposalId) - public - view - virtual - override - returns ( - uint256 id, - address proposer, - uint256 eta, - uint256 startBlock, - uint256 endBlock, - uint256 forVotes, - uint256 againstVotes, - uint256 abstainVotes, - bool canceled, - bool executed - ) - { - id = proposalId; - eta = proposalEta(proposalId); - startBlock = proposalSnapshot(proposalId); - endBlock = proposalDeadline(proposalId); - - ProposalDetails storage details = _proposalDetails[proposalId]; - proposer = details.proposer; - forVotes = details.forVotes; - againstVotes = details.againstVotes; - abstainVotes = details.abstainVotes; - - ProposalState status = state(proposalId); - canceled = status == ProposalState.Canceled; - executed = status == ProposalState.Executed; - } - - /** - * @dev See {IGovernorCompatibilityBravo-getActions}. - */ - function getActions(uint256 proposalId) - public - view - virtual - override - returns ( - address[] memory targets, - uint256[] memory values, - string[] memory signatures, - bytes[] memory calldatas - ) - { - ProposalDetails storage details = _proposalDetails[proposalId]; - return (details.targets, details.values, details.signatures, details.calldatas); - } - - /** - * @dev See {IGovernorCompatibilityBravo-getReceipt}. - */ - function getReceipt(uint256 proposalId, address voter) public view virtual override returns (Receipt memory) { - return _proposalDetails[proposalId].receipts[voter]; - } - - /** - * @dev See {IGovernorCompatibilityBravo-quorumVotes}. - */ - function quorumVotes() public view virtual override returns (uint256) { - return quorum(block.number - 1); - } - - // ==================================================== Voting ==================================================== - /** - * @dev See {IGovernor-hasVoted}. - */ - function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) { - return _proposalDetails[proposalId].receipts[account].hasVoted; - } - - /** - * @dev See {Governor-_quorumReached}. In this module, only forVotes count toward the quorum. - */ - function _quorumReached(uint256 proposalId) internal view virtual override returns (bool) { - ProposalDetails storage details = _proposalDetails[proposalId]; - return quorum(proposalSnapshot(proposalId)) <= details.forVotes; - } - - /** - * @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be strictly over the againstVotes. - */ - function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) { - ProposalDetails storage details = _proposalDetails[proposalId]; - return details.forVotes > details.againstVotes; - } - - /** - * @dev See {Governor-_countVote}. In this module, the support follows Governor Bravo. - */ - function _countVote( - uint256 proposalId, - address account, - uint8 support, - uint256 weight, - bytes memory // params - ) internal virtual override { - ProposalDetails storage details = _proposalDetails[proposalId]; - Receipt storage receipt = details.receipts[account]; - - require(!receipt.hasVoted, "GovernorCompatibilityBravo: vote already cast"); - receipt.hasVoted = true; - receipt.support = support; - receipt.votes = SafeCastUpgradeable.toUint96(weight); - - if (support == uint8(VoteType.Against)) { - details.againstVotes += weight; - } else if (support == uint8(VoteType.For)) { - details.forVotes += weight; - } else if (support == uint8(VoteType.Abstain)) { - details.abstainVotes += weight; - } else { - revert("GovernorCompatibilityBravo: invalid vote type"); - } - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/compatibility/IGovernorCompatibilityBravoUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/compatibility/IGovernorCompatibilityBravoUpgradeable.sol deleted file mode 100644 index 2fe34e3..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/compatibility/IGovernorCompatibilityBravoUpgradeable.sol +++ /dev/null @@ -1,127 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (governance/compatibility/IGovernorCompatibilityBravo.sol) - -pragma solidity ^0.8.0; - -import "../IGovernorUpgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -/** - * @dev Interface extension that adds missing functions to the {Governor} core to provide `GovernorBravo` compatibility. - * - * _Available since v4.3._ - */ -abstract contract IGovernorCompatibilityBravoUpgradeable is Initializable, IGovernorUpgradeable { - function __IGovernorCompatibilityBravo_init() internal onlyInitializing { - } - - function __IGovernorCompatibilityBravo_init_unchained() internal onlyInitializing { - } - /** - * @dev Proposal structure from Compound Governor Bravo. Not actually used by the compatibility layer, as - * {{proposal}} returns a very different structure. - */ - struct Proposal { - uint256 id; - address proposer; - uint256 eta; - address[] targets; - uint256[] values; - string[] signatures; - bytes[] calldatas; - uint256 startBlock; - uint256 endBlock; - uint256 forVotes; - uint256 againstVotes; - uint256 abstainVotes; - bool canceled; - bool executed; - mapping(address => Receipt) receipts; - } - - /** - * @dev Receipt structure from Compound Governor Bravo - */ - struct Receipt { - bool hasVoted; - uint8 support; - uint96 votes; - } - - /** - * @dev Part of the Governor Bravo's interface. - */ - function quorumVotes() public view virtual returns (uint256); - - /** - * @dev Part of the Governor Bravo's interface: _"The official record of all proposals ever proposed"_. - */ - function proposals(uint256) - public - view - virtual - returns ( - uint256 id, - address proposer, - uint256 eta, - uint256 startBlock, - uint256 endBlock, - uint256 forVotes, - uint256 againstVotes, - uint256 abstainVotes, - bool canceled, - bool executed - ); - - /** - * @dev Part of the Governor Bravo's interface: _"Function used to propose a new proposal"_. - */ - function propose( - address[] memory targets, - uint256[] memory values, - string[] memory signatures, - bytes[] memory calldatas, - string memory description - ) public virtual returns (uint256); - - /** - * @dev Part of the Governor Bravo's interface: _"Queues a proposal of state succeeded"_. - */ - function queue(uint256 proposalId) public virtual; - - /** - * @dev Part of the Governor Bravo's interface: _"Executes a queued proposal if eta has passed"_. - */ - function execute(uint256 proposalId) public payable virtual; - - /** - * @dev Cancels a proposal only if sender is the proposer, or proposer delegates dropped below proposal threshold. - */ - function cancel(uint256 proposalId) public virtual; - - /** - * @dev Part of the Governor Bravo's interface: _"Gets actions of a proposal"_. - */ - function getActions(uint256 proposalId) - public - view - virtual - returns ( - address[] memory targets, - uint256[] memory values, - string[] memory signatures, - bytes[] memory calldatas - ); - - /** - * @dev Part of the Governor Bravo's interface: _"Gets the receipt for a voter on a given proposal"_. - */ - function getReceipt(uint256 proposalId, address voter) public view virtual returns (Receipt memory); - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/extensions/GovernorCountingSimpleUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/extensions/GovernorCountingSimpleUpgradeable.sol deleted file mode 100644 index 8a1c4ad..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/extensions/GovernorCountingSimpleUpgradeable.sol +++ /dev/null @@ -1,120 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorCountingSimple.sol) - -pragma solidity ^0.8.0; - -import "../GovernorUpgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -/** - * @dev Extension of {Governor} for simple, 3 options, vote counting. - * - * _Available since v4.3._ - */ -abstract contract GovernorCountingSimpleUpgradeable is Initializable, GovernorUpgradeable { - function __GovernorCountingSimple_init() internal onlyInitializing { - } - - function __GovernorCountingSimple_init_unchained() internal onlyInitializing { - } - /** - * @dev Supported vote types. Matches Governor Bravo ordering. - */ - enum VoteType { - Against, - For, - Abstain - } - - struct ProposalVote { - uint256 againstVotes; - uint256 forVotes; - uint256 abstainVotes; - mapping(address => bool) hasVoted; - } - - mapping(uint256 => ProposalVote) private _proposalVotes; - - /** - * @dev See {IGovernor-COUNTING_MODE}. - */ - // solhint-disable-next-line func-name-mixedcase - function COUNTING_MODE() public pure virtual override returns (string memory) { - return "support=bravo&quorum=for,abstain"; - } - - /** - * @dev See {IGovernor-hasVoted}. - */ - function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) { - return _proposalVotes[proposalId].hasVoted[account]; - } - - /** - * @dev Accessor to the internal vote counts. - */ - function proposalVotes(uint256 proposalId) - public - view - virtual - returns ( - uint256 againstVotes, - uint256 forVotes, - uint256 abstainVotes - ) - { - ProposalVote storage proposalVote = _proposalVotes[proposalId]; - return (proposalVote.againstVotes, proposalVote.forVotes, proposalVote.abstainVotes); - } - - /** - * @dev See {Governor-_quorumReached}. - */ - function _quorumReached(uint256 proposalId) internal view virtual override returns (bool) { - ProposalVote storage proposalVote = _proposalVotes[proposalId]; - - return quorum(proposalSnapshot(proposalId)) <= proposalVote.forVotes + proposalVote.abstainVotes; - } - - /** - * @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be strictly over the againstVotes. - */ - function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) { - ProposalVote storage proposalVote = _proposalVotes[proposalId]; - - return proposalVote.forVotes > proposalVote.againstVotes; - } - - /** - * @dev See {Governor-_countVote}. In this module, the support follows the `VoteType` enum (from Governor Bravo). - */ - function _countVote( - uint256 proposalId, - address account, - uint8 support, - uint256 weight, - bytes memory // params - ) internal virtual override { - ProposalVote storage proposalVote = _proposalVotes[proposalId]; - - require(!proposalVote.hasVoted[account], "GovernorVotingSimple: vote already cast"); - proposalVote.hasVoted[account] = true; - - if (support == uint8(VoteType.Against)) { - proposalVote.againstVotes += weight; - } else if (support == uint8(VoteType.For)) { - proposalVote.forVotes += weight; - } else if (support == uint8(VoteType.Abstain)) { - proposalVote.abstainVotes += weight; - } else { - revert("GovernorVotingSimple: invalid value for enum VoteType"); - } - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/extensions/GovernorPreventLateQuorumUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/extensions/GovernorPreventLateQuorumUpgradeable.sol deleted file mode 100644 index 97d8b54..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/extensions/GovernorPreventLateQuorumUpgradeable.sol +++ /dev/null @@ -1,120 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorPreventLateQuorum.sol) - -pragma solidity ^0.8.0; - -import "../GovernorUpgradeable.sol"; -import "../../utils/math/MathUpgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -/** - * @dev A module that ensures there is a minimum voting period after quorum is reached. This prevents a large voter from - * swaying a vote and triggering quorum at the last minute, by ensuring there is always time for other voters to react - * and try to oppose the decision. - * - * If a vote causes quorum to be reached, the proposal's voting period may be extended so that it does not end before at - * least a given number of blocks have passed (the "vote extension" parameter). This parameter can be set by the - * governance executor (e.g. through a governance proposal). - * - * _Available since v4.5._ - */ -abstract contract GovernorPreventLateQuorumUpgradeable is Initializable, GovernorUpgradeable { - using SafeCastUpgradeable for uint256; - using TimersUpgradeable for TimersUpgradeable.BlockNumber; - - uint64 private _voteExtension; - mapping(uint256 => TimersUpgradeable.BlockNumber) private _extendedDeadlines; - - /// @dev Emitted when a proposal deadline is pushed back due to reaching quorum late in its voting period. - event ProposalExtended(uint256 indexed proposalId, uint64 extendedDeadline); - - /// @dev Emitted when the {lateQuorumVoteExtension} parameter is changed. - event LateQuorumVoteExtensionSet(uint64 oldVoteExtension, uint64 newVoteExtension); - - /** - * @dev Initializes the vote extension parameter: the number of blocks that are required to pass since a proposal - * reaches quorum until its voting period ends. If necessary the voting period will be extended beyond the one set - * at proposal creation. - */ - function __GovernorPreventLateQuorum_init(uint64 initialVoteExtension) internal onlyInitializing { - __GovernorPreventLateQuorum_init_unchained(initialVoteExtension); - } - - function __GovernorPreventLateQuorum_init_unchained(uint64 initialVoteExtension) internal onlyInitializing { - _setLateQuorumVoteExtension(initialVoteExtension); - } - - /** - * @dev Returns the proposal deadline, which may have been extended beyond that set at proposal creation, if the - * proposal reached quorum late in the voting period. See {Governor-proposalDeadline}. - */ - function proposalDeadline(uint256 proposalId) public view virtual override returns (uint256) { - return MathUpgradeable.max(super.proposalDeadline(proposalId), _extendedDeadlines[proposalId].getDeadline()); - } - - /** - * @dev Casts a vote and detects if it caused quorum to be reached, potentially extending the voting period. See - * {Governor-_castVote}. - * - * May emit a {ProposalExtended} event. - */ - function _castVote( - uint256 proposalId, - address account, - uint8 support, - string memory reason, - bytes memory params - ) internal virtual override returns (uint256) { - uint256 result = super._castVote(proposalId, account, support, reason, params); - - TimersUpgradeable.BlockNumber storage extendedDeadline = _extendedDeadlines[proposalId]; - - if (extendedDeadline.isUnset() && _quorumReached(proposalId)) { - uint64 extendedDeadlineValue = block.number.toUint64() + lateQuorumVoteExtension(); - - if (extendedDeadlineValue > proposalDeadline(proposalId)) { - emit ProposalExtended(proposalId, extendedDeadlineValue); - } - - extendedDeadline.setDeadline(extendedDeadlineValue); - } - - return result; - } - - /** - * @dev Returns the current value of the vote extension parameter: the number of blocks that are required to pass - * from the time a proposal reaches quorum until its voting period ends. - */ - function lateQuorumVoteExtension() public view virtual returns (uint64) { - return _voteExtension; - } - - /** - * @dev Changes the {lateQuorumVoteExtension}. This operation can only be performed by the governance executor, - * generally through a governance proposal. - * - * Emits a {LateQuorumVoteExtensionSet} event. - */ - function setLateQuorumVoteExtension(uint64 newVoteExtension) public virtual onlyGovernance { - _setLateQuorumVoteExtension(newVoteExtension); - } - - /** - * @dev Changes the {lateQuorumVoteExtension}. This is an internal function that can be exposed in a public function - * like {setLateQuorumVoteExtension} if another access control mechanism is needed. - * - * Emits a {LateQuorumVoteExtensionSet} event. - */ - function _setLateQuorumVoteExtension(uint64 newVoteExtension) internal virtual { - emit LateQuorumVoteExtensionSet(_voteExtension, newVoteExtension); - _voteExtension = newVoteExtension; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[48] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/extensions/GovernorProposalThresholdUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/extensions/GovernorProposalThresholdUpgradeable.sol deleted file mode 100644 index a42caeb..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/extensions/GovernorProposalThresholdUpgradeable.sol +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (governance/extensions/GovernorProposalThreshold.sol) - -pragma solidity ^0.8.0; - -import "../GovernorUpgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -/** - * @dev Extension of {Governor} for proposal restriction to token holders with a minimum balance. - * - * _Available since v4.3._ - * _Deprecated since v4.4._ - */ -abstract contract GovernorProposalThresholdUpgradeable is Initializable, GovernorUpgradeable { - function __GovernorProposalThreshold_init() internal onlyInitializing { - } - - function __GovernorProposalThreshold_init_unchained() internal onlyInitializing { - } - function propose( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - string memory description - ) public virtual override returns (uint256) { - return super.propose(targets, values, calldatas, description); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/extensions/GovernorSettingsUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/extensions/GovernorSettingsUpgradeable.sol deleted file mode 100644 index a6acf49..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/extensions/GovernorSettingsUpgradeable.sol +++ /dev/null @@ -1,130 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (governance/extensions/GovernorSettings.sol) - -pragma solidity ^0.8.0; - -import "../GovernorUpgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -/** - * @dev Extension of {Governor} for settings updatable through governance. - * - * _Available since v4.4._ - */ -abstract contract GovernorSettingsUpgradeable is Initializable, GovernorUpgradeable { - uint256 private _votingDelay; - uint256 private _votingPeriod; - uint256 private _proposalThreshold; - - event VotingDelaySet(uint256 oldVotingDelay, uint256 newVotingDelay); - event VotingPeriodSet(uint256 oldVotingPeriod, uint256 newVotingPeriod); - event ProposalThresholdSet(uint256 oldProposalThreshold, uint256 newProposalThreshold); - - /** - * @dev Initialize the governance parameters. - */ - function __GovernorSettings_init( - uint256 initialVotingDelay, - uint256 initialVotingPeriod, - uint256 initialProposalThreshold - ) internal onlyInitializing { - __GovernorSettings_init_unchained(initialVotingDelay, initialVotingPeriod, initialProposalThreshold); - } - - function __GovernorSettings_init_unchained( - uint256 initialVotingDelay, - uint256 initialVotingPeriod, - uint256 initialProposalThreshold - ) internal onlyInitializing { - _setVotingDelay(initialVotingDelay); - _setVotingPeriod(initialVotingPeriod); - _setProposalThreshold(initialProposalThreshold); - } - - /** - * @dev See {IGovernor-votingDelay}. - */ - function votingDelay() public view virtual override returns (uint256) { - return _votingDelay; - } - - /** - * @dev See {IGovernor-votingPeriod}. - */ - function votingPeriod() public view virtual override returns (uint256) { - return _votingPeriod; - } - - /** - * @dev See {Governor-proposalThreshold}. - */ - function proposalThreshold() public view virtual override returns (uint256) { - return _proposalThreshold; - } - - /** - * @dev Update the voting delay. This operation can only be performed through a governance proposal. - * - * Emits a {VotingDelaySet} event. - */ - function setVotingDelay(uint256 newVotingDelay) public virtual onlyGovernance { - _setVotingDelay(newVotingDelay); - } - - /** - * @dev Update the voting period. This operation can only be performed through a governance proposal. - * - * Emits a {VotingPeriodSet} event. - */ - function setVotingPeriod(uint256 newVotingPeriod) public virtual onlyGovernance { - _setVotingPeriod(newVotingPeriod); - } - - /** - * @dev Update the proposal threshold. This operation can only be performed through a governance proposal. - * - * Emits a {ProposalThresholdSet} event. - */ - function setProposalThreshold(uint256 newProposalThreshold) public virtual onlyGovernance { - _setProposalThreshold(newProposalThreshold); - } - - /** - * @dev Internal setter for the voting delay. - * - * Emits a {VotingDelaySet} event. - */ - function _setVotingDelay(uint256 newVotingDelay) internal virtual { - emit VotingDelaySet(_votingDelay, newVotingDelay); - _votingDelay = newVotingDelay; - } - - /** - * @dev Internal setter for the voting period. - * - * Emits a {VotingPeriodSet} event. - */ - function _setVotingPeriod(uint256 newVotingPeriod) internal virtual { - // voting period must be at least one block long - require(newVotingPeriod > 0, "GovernorSettings: voting period too low"); - emit VotingPeriodSet(_votingPeriod, newVotingPeriod); - _votingPeriod = newVotingPeriod; - } - - /** - * @dev Internal setter for the proposal threshold. - * - * Emits a {ProposalThresholdSet} event. - */ - function _setProposalThreshold(uint256 newProposalThreshold) internal virtual { - emit ProposalThresholdSet(_proposalThreshold, newProposalThreshold); - _proposalThreshold = newProposalThreshold; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[47] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/extensions/GovernorTimelockCompoundUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/extensions/GovernorTimelockCompoundUpgradeable.sol deleted file mode 100644 index d130dcb..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/extensions/GovernorTimelockCompoundUpgradeable.sol +++ /dev/null @@ -1,205 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorTimelockCompound.sol) - -pragma solidity ^0.8.0; - -import "./IGovernorTimelockUpgradeable.sol"; -import "../GovernorUpgradeable.sol"; -import "../../utils/math/SafeCastUpgradeable.sol"; -import "../../vendor/compound/ICompoundTimelockUpgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -/** - * @dev Extension of {Governor} that binds the execution process to a Compound Timelock. This adds a delay, enforced by - * the external timelock to all successful proposal (in addition to the voting duration). The {Governor} needs to be - * the admin of the timelock for any operation to be performed. A public, unrestricted, - * {GovernorTimelockCompound-__acceptAdmin} is available to accept ownership of the timelock. - * - * Using this model means the proposal will be operated by the {TimelockController} and not by the {Governor}. Thus, - * the assets and permissions must be attached to the {TimelockController}. Any asset sent to the {Governor} will be - * inaccessible. - * - * _Available since v4.3._ - */ -abstract contract GovernorTimelockCompoundUpgradeable is Initializable, IGovernorTimelockUpgradeable, GovernorUpgradeable { - using SafeCastUpgradeable for uint256; - using TimersUpgradeable for TimersUpgradeable.Timestamp; - - struct ProposalTimelock { - TimersUpgradeable.Timestamp timer; - } - - ICompoundTimelockUpgradeable private _timelock; - - mapping(uint256 => ProposalTimelock) private _proposalTimelocks; - - /** - * @dev Emitted when the timelock controller used for proposal execution is modified. - */ - event TimelockChange(address oldTimelock, address newTimelock); - - /** - * @dev Set the timelock. - */ - function __GovernorTimelockCompound_init(ICompoundTimelockUpgradeable timelockAddress) internal onlyInitializing { - __GovernorTimelockCompound_init_unchained(timelockAddress); - } - - function __GovernorTimelockCompound_init_unchained(ICompoundTimelockUpgradeable timelockAddress) internal onlyInitializing { - _updateTimelock(timelockAddress); - } - - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165Upgradeable, GovernorUpgradeable) returns (bool) { - return interfaceId == type(IGovernorTimelockUpgradeable).interfaceId || super.supportsInterface(interfaceId); - } - - /** - * @dev Overridden version of the {Governor-state} function with added support for the `Queued` and `Expired` status. - */ - function state(uint256 proposalId) public view virtual override(IGovernorUpgradeable, GovernorUpgradeable) returns (ProposalState) { - ProposalState status = super.state(proposalId); - - if (status != ProposalState.Succeeded) { - return status; - } - - uint256 eta = proposalEta(proposalId); - if (eta == 0) { - return status; - } else if (block.timestamp >= eta + _timelock.GRACE_PERIOD()) { - return ProposalState.Expired; - } else { - return ProposalState.Queued; - } - } - - /** - * @dev Public accessor to check the address of the timelock - */ - function timelock() public view virtual override returns (address) { - return address(_timelock); - } - - /** - * @dev Public accessor to check the eta of a queued proposal - */ - function proposalEta(uint256 proposalId) public view virtual override returns (uint256) { - return _proposalTimelocks[proposalId].timer.getDeadline(); - } - - /** - * @dev Function to queue a proposal to the timelock. - */ - function queue( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) public virtual override returns (uint256) { - uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash); - - require(state(proposalId) == ProposalState.Succeeded, "Governor: proposal not successful"); - - uint256 eta = block.timestamp + _timelock.delay(); - _proposalTimelocks[proposalId].timer.setDeadline(eta.toUint64()); - for (uint256 i = 0; i < targets.length; ++i) { - require( - !_timelock.queuedTransactions(keccak256(abi.encode(targets[i], values[i], "", calldatas[i], eta))), - "GovernorTimelockCompound: identical proposal action already queued" - ); - _timelock.queueTransaction(targets[i], values[i], "", calldatas[i], eta); - } - - emit ProposalQueued(proposalId, eta); - - return proposalId; - } - - /** - * @dev Overridden execute function that run the already queued proposal through the timelock. - */ - function _execute( - uint256 proposalId, - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 /*descriptionHash*/ - ) internal virtual override { - uint256 eta = proposalEta(proposalId); - require(eta > 0, "GovernorTimelockCompound: proposal not yet queued"); - AddressUpgradeable.sendValue(payable(_timelock), msg.value); - for (uint256 i = 0; i < targets.length; ++i) { - _timelock.executeTransaction(targets[i], values[i], "", calldatas[i], eta); - } - } - - /** - * @dev Overridden version of the {Governor-_cancel} function to cancel the timelocked proposal if it as already - * been queued. - */ - function _cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) internal virtual override returns (uint256) { - uint256 proposalId = super._cancel(targets, values, calldatas, descriptionHash); - - uint256 eta = proposalEta(proposalId); - if (eta > 0) { - for (uint256 i = 0; i < targets.length; ++i) { - _timelock.cancelTransaction(targets[i], values[i], "", calldatas[i], eta); - } - _proposalTimelocks[proposalId].timer.reset(); - } - - return proposalId; - } - - /** - * @dev Address through which the governor executes action. In this case, the timelock. - */ - function _executor() internal view virtual override returns (address) { - return address(_timelock); - } - - /** - * @dev Accept admin right over the timelock. - */ - // solhint-disable-next-line private-vars-leading-underscore - function __acceptAdmin() public { - _timelock.acceptAdmin(); - } - - /** - * @dev Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates - * must be proposed, scheduled, and executed through governance proposals. - * - * For security reasons, the timelock must be handed over to another admin before setting up a new one. The two - * operations (hand over the timelock) and do the update can be batched in a single proposal. - * - * Note that if the timelock admin has been handed over in a previous operation, we refuse updates made through the - * timelock if admin of the timelock has already been accepted and the operation is executed outside the scope of - * governance. - - * CAUTION: It is not recommended to change the timelock while there are other queued governance proposals. - */ - function updateTimelock(ICompoundTimelockUpgradeable newTimelock) external virtual onlyGovernance { - _updateTimelock(newTimelock); - } - - function _updateTimelock(ICompoundTimelockUpgradeable newTimelock) private { - emit TimelockChange(address(_timelock), address(newTimelock)); - _timelock = newTimelock; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[48] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/extensions/GovernorTimelockControlUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/extensions/GovernorTimelockControlUpgradeable.sol deleted file mode 100644 index c12f624..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/extensions/GovernorTimelockControlUpgradeable.sol +++ /dev/null @@ -1,178 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorTimelockControl.sol) - -pragma solidity ^0.8.0; - -import "./IGovernorTimelockUpgradeable.sol"; -import "../GovernorUpgradeable.sol"; -import "../TimelockControllerUpgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -/** - * @dev Extension of {Governor} that binds the execution process to an instance of {TimelockController}. This adds a - * delay, enforced by the {TimelockController} to all successful proposal (in addition to the voting duration). The - * {Governor} needs the proposer (and ideally the executor) roles for the {Governor} to work properly. - * - * Using this model means the proposal will be operated by the {TimelockController} and not by the {Governor}. Thus, - * the assets and permissions must be attached to the {TimelockController}. Any asset sent to the {Governor} will be - * inaccessible. - * - * WARNING: Setting up the TimelockController to have additional proposers besides the governor is very risky, as it - * grants them powers that they must be trusted or known not to use: 1) {onlyGovernance} functions like {relay} are - * available to them through the timelock, and 2) approved governance proposals can be blocked by them, effectively - * executing a Denial of Service attack. This risk will be mitigated in a future release. - * - * _Available since v4.3._ - */ -abstract contract GovernorTimelockControlUpgradeable is Initializable, IGovernorTimelockUpgradeable, GovernorUpgradeable { - TimelockControllerUpgradeable private _timelock; - mapping(uint256 => bytes32) private _timelockIds; - - /** - * @dev Emitted when the timelock controller used for proposal execution is modified. - */ - event TimelockChange(address oldTimelock, address newTimelock); - - /** - * @dev Set the timelock. - */ - function __GovernorTimelockControl_init(TimelockControllerUpgradeable timelockAddress) internal onlyInitializing { - __GovernorTimelockControl_init_unchained(timelockAddress); - } - - function __GovernorTimelockControl_init_unchained(TimelockControllerUpgradeable timelockAddress) internal onlyInitializing { - _updateTimelock(timelockAddress); - } - - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165Upgradeable, GovernorUpgradeable) returns (bool) { - return interfaceId == type(IGovernorTimelockUpgradeable).interfaceId || super.supportsInterface(interfaceId); - } - - /** - * @dev Overridden version of the {Governor-state} function with added support for the `Queued` status. - */ - function state(uint256 proposalId) public view virtual override(IGovernorUpgradeable, GovernorUpgradeable) returns (ProposalState) { - ProposalState status = super.state(proposalId); - - if (status != ProposalState.Succeeded) { - return status; - } - - // core tracks execution, so we just have to check if successful proposal have been queued. - bytes32 queueid = _timelockIds[proposalId]; - if (queueid == bytes32(0)) { - return status; - } else if (_timelock.isOperationDone(queueid)) { - return ProposalState.Executed; - } else if (_timelock.isOperationPending(queueid)) { - return ProposalState.Queued; - } else { - return ProposalState.Canceled; - } - } - - /** - * @dev Public accessor to check the address of the timelock - */ - function timelock() public view virtual override returns (address) { - return address(_timelock); - } - - /** - * @dev Public accessor to check the eta of a queued proposal - */ - function proposalEta(uint256 proposalId) public view virtual override returns (uint256) { - uint256 eta = _timelock.getTimestamp(_timelockIds[proposalId]); - return eta == 1 ? 0 : eta; // _DONE_TIMESTAMP (1) should be replaced with a 0 value - } - - /** - * @dev Function to queue a proposal to the timelock. - */ - function queue( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) public virtual override returns (uint256) { - uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash); - - require(state(proposalId) == ProposalState.Succeeded, "Governor: proposal not successful"); - - uint256 delay = _timelock.getMinDelay(); - _timelockIds[proposalId] = _timelock.hashOperationBatch(targets, values, calldatas, 0, descriptionHash); - _timelock.scheduleBatch(targets, values, calldatas, 0, descriptionHash, delay); - - emit ProposalQueued(proposalId, block.timestamp + delay); - - return proposalId; - } - - /** - * @dev Overridden execute function that run the already queued proposal through the timelock. - */ - function _execute( - uint256, /* proposalId */ - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) internal virtual override { - _timelock.executeBatch{value: msg.value}(targets, values, calldatas, 0, descriptionHash); - } - - /** - * @dev Overridden version of the {Governor-_cancel} function to cancel the timelocked proposal if it as already - * been queued. - */ - // This function can reenter through the external call to the timelock, but we assume the timelock is trusted and - // well behaved (according to TimelockController) and this will not happen. - // slither-disable-next-line reentrancy-no-eth - function _cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) internal virtual override returns (uint256) { - uint256 proposalId = super._cancel(targets, values, calldatas, descriptionHash); - - if (_timelockIds[proposalId] != 0) { - _timelock.cancel(_timelockIds[proposalId]); - delete _timelockIds[proposalId]; - } - - return proposalId; - } - - /** - * @dev Address through which the governor executes action. In this case, the timelock. - */ - function _executor() internal view virtual override returns (address) { - return address(_timelock); - } - - /** - * @dev Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates - * must be proposed, scheduled, and executed through governance proposals. - * - * CAUTION: It is not recommended to change the timelock while there are other queued governance proposals. - */ - function updateTimelock(TimelockControllerUpgradeable newTimelock) external virtual onlyGovernance { - _updateTimelock(newTimelock); - } - - function _updateTimelock(TimelockControllerUpgradeable newTimelock) private { - emit TimelockChange(address(_timelock), address(newTimelock)); - _timelock = newTimelock; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[48] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/extensions/GovernorVotesCompUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/extensions/GovernorVotesCompUpgradeable.sol deleted file mode 100644 index 1db1410..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/extensions/GovernorVotesCompUpgradeable.sol +++ /dev/null @@ -1,45 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorVotesComp.sol) - -pragma solidity ^0.8.0; - -import "../GovernorUpgradeable.sol"; -import "../../token/ERC20/extensions/ERC20VotesCompUpgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -/** - * @dev Extension of {Governor} for voting weight extraction from a Comp token. - * - * _Available since v4.3._ - * - * @custom:storage-size 51 - */ -abstract contract GovernorVotesCompUpgradeable is Initializable, GovernorUpgradeable { - ERC20VotesCompUpgradeable public token; - - function __GovernorVotesComp_init(ERC20VotesCompUpgradeable token_) internal onlyInitializing { - __GovernorVotesComp_init_unchained(token_); - } - - function __GovernorVotesComp_init_unchained(ERC20VotesCompUpgradeable token_) internal onlyInitializing { - token = token_; - } - - /** - * Read the voting weight from the token's built in snapshot mechanism (see {Governor-_getVotes}). - */ - function _getVotes( - address account, - uint256 blockNumber, - bytes memory /*params*/ - ) internal view virtual override returns (uint256) { - return token.getPriorVotes(account, blockNumber); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/extensions/GovernorVotesQuorumFractionUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/extensions/GovernorVotesQuorumFractionUpgradeable.sol deleted file mode 100644 index bc81de1..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/extensions/GovernorVotesQuorumFractionUpgradeable.sol +++ /dev/null @@ -1,131 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (governance/extensions/GovernorVotesQuorumFraction.sol) - -pragma solidity ^0.8.0; - -import "./GovernorVotesUpgradeable.sol"; -import "../../utils/CheckpointsUpgradeable.sol"; -import "../../utils/math/SafeCastUpgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -/** - * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token and a quorum expressed as a - * fraction of the total supply. - * - * _Available since v4.3._ - */ -abstract contract GovernorVotesQuorumFractionUpgradeable is Initializable, GovernorVotesUpgradeable { - using CheckpointsUpgradeable for CheckpointsUpgradeable.History; - - uint256 private _quorumNumerator; // DEPRECATED - CheckpointsUpgradeable.History private _quorumNumeratorHistory; - - event QuorumNumeratorUpdated(uint256 oldQuorumNumerator, uint256 newQuorumNumerator); - - /** - * @dev Initialize quorum as a fraction of the token's total supply. - * - * The fraction is specified as `numerator / denominator`. By default the denominator is 100, so quorum is - * specified as a percent: a numerator of 10 corresponds to quorum being 10% of total supply. The denominator can be - * customized by overriding {quorumDenominator}. - */ - function __GovernorVotesQuorumFraction_init(uint256 quorumNumeratorValue) internal onlyInitializing { - __GovernorVotesQuorumFraction_init_unchained(quorumNumeratorValue); - } - - function __GovernorVotesQuorumFraction_init_unchained(uint256 quorumNumeratorValue) internal onlyInitializing { - _updateQuorumNumerator(quorumNumeratorValue); - } - - /** - * @dev Returns the current quorum numerator. See {quorumDenominator}. - */ - function quorumNumerator() public view virtual returns (uint256) { - return _quorumNumeratorHistory._checkpoints.length == 0 ? _quorumNumerator : _quorumNumeratorHistory.latest(); - } - - /** - * @dev Returns the quorum numerator at a specific block number. See {quorumDenominator}. - */ - function quorumNumerator(uint256 blockNumber) public view virtual returns (uint256) { - // If history is empty, fallback to old storage - uint256 length = _quorumNumeratorHistory._checkpoints.length; - if (length == 0) { - return _quorumNumerator; - } - - // Optimistic search, check the latest checkpoint - CheckpointsUpgradeable.Checkpoint memory latest = _quorumNumeratorHistory._checkpoints[length - 1]; - if (latest._blockNumber <= blockNumber) { - return latest._value; - } - - // Otherwise, do the binary search - return _quorumNumeratorHistory.getAtBlock(blockNumber); - } - - /** - * @dev Returns the quorum denominator. Defaults to 100, but may be overridden. - */ - function quorumDenominator() public view virtual returns (uint256) { - return 100; - } - - /** - * @dev Returns the quorum for a block number, in terms of number of votes: `supply * numerator / denominator`. - */ - function quorum(uint256 blockNumber) public view virtual override returns (uint256) { - return (token.getPastTotalSupply(blockNumber) * quorumNumerator(blockNumber)) / quorumDenominator(); - } - - /** - * @dev Changes the quorum numerator. - * - * Emits a {QuorumNumeratorUpdated} event. - * - * Requirements: - * - * - Must be called through a governance proposal. - * - New numerator must be smaller or equal to the denominator. - */ - function updateQuorumNumerator(uint256 newQuorumNumerator) external virtual onlyGovernance { - _updateQuorumNumerator(newQuorumNumerator); - } - - /** - * @dev Changes the quorum numerator. - * - * Emits a {QuorumNumeratorUpdated} event. - * - * Requirements: - * - * - New numerator must be smaller or equal to the denominator. - */ - function _updateQuorumNumerator(uint256 newQuorumNumerator) internal virtual { - require( - newQuorumNumerator <= quorumDenominator(), - "GovernorVotesQuorumFraction: quorumNumerator over quorumDenominator" - ); - - uint256 oldQuorumNumerator = quorumNumerator(); - - // Make sure we keep track of the original numerator in contracts upgraded from a version without checkpoints. - if (oldQuorumNumerator != 0 && _quorumNumeratorHistory._checkpoints.length == 0) { - _quorumNumeratorHistory._checkpoints.push( - CheckpointsUpgradeable.Checkpoint({_blockNumber: 0, _value: SafeCastUpgradeable.toUint224(oldQuorumNumerator)}) - ); - } - - // Set new quorum for future proposals - _quorumNumeratorHistory.push(newQuorumNumerator); - - emit QuorumNumeratorUpdated(oldQuorumNumerator, newQuorumNumerator); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[48] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/extensions/GovernorVotesUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/extensions/GovernorVotesUpgradeable.sol deleted file mode 100644 index 3c23608..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/extensions/GovernorVotesUpgradeable.sol +++ /dev/null @@ -1,45 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorVotes.sol) - -pragma solidity ^0.8.0; - -import "../GovernorUpgradeable.sol"; -import "../utils/IVotesUpgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -/** - * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token, or since v4.5 an {ERC721Votes} token. - * - * _Available since v4.3._ - * - * @custom:storage-size 51 - */ -abstract contract GovernorVotesUpgradeable is Initializable, GovernorUpgradeable { - IVotesUpgradeable public token; - - function __GovernorVotes_init(IVotesUpgradeable tokenAddress) internal onlyInitializing { - __GovernorVotes_init_unchained(tokenAddress); - } - - function __GovernorVotes_init_unchained(IVotesUpgradeable tokenAddress) internal onlyInitializing { - token = tokenAddress; - } - - /** - * Read the voting weight from the token's built in snapshot mechanism (see {Governor-_getVotes}). - */ - function _getVotes( - address account, - uint256 blockNumber, - bytes memory /*params*/ - ) internal view virtual override returns (uint256) { - return token.getPastVotes(account, blockNumber); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/extensions/IGovernorTimelockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/extensions/IGovernorTimelockUpgradeable.sol deleted file mode 100644 index 821c3a0..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/extensions/IGovernorTimelockUpgradeable.sol +++ /dev/null @@ -1,39 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (governance/extensions/IGovernorTimelock.sol) - -pragma solidity ^0.8.0; - -import "../IGovernorUpgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -/** - * @dev Extension of the {IGovernor} for timelock supporting modules. - * - * _Available since v4.3._ - */ -abstract contract IGovernorTimelockUpgradeable is Initializable, IGovernorUpgradeable { - function __IGovernorTimelock_init() internal onlyInitializing { - } - - function __IGovernorTimelock_init_unchained() internal onlyInitializing { - } - event ProposalQueued(uint256 proposalId, uint256 eta); - - function timelock() public view virtual returns (address); - - function proposalEta(uint256 proposalId) public view virtual returns (uint256); - - function queue( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) public virtual returns (uint256 proposalId); - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/utils/IVotesUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/utils/IVotesUpgradeable.sol deleted file mode 100644 index 3faedeb..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/utils/IVotesUpgradeable.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol) -pragma solidity ^0.8.0; - -/** - * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts. - * - * _Available since v4.5._ - */ -interface IVotesUpgradeable { - /** - * @dev Emitted when an account changes their delegate. - */ - event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); - - /** - * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes. - */ - event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance); - - /** - * @dev Returns the current amount of votes that `account` has. - */ - function getVotes(address account) external view returns (uint256); - - /** - * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`). - */ - function getPastVotes(address account, uint256 blockNumber) external view returns (uint256); - - /** - * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`). - * - * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes. - * Votes that have not been delegated are still part of total supply, even though they would not participate in a - * vote. - */ - function getPastTotalSupply(uint256 blockNumber) external view returns (uint256); - - /** - * @dev Returns the delegate that `account` has chosen. - */ - function delegates(address account) external view returns (address); - - /** - * @dev Delegates votes from the sender to `delegatee`. - */ - function delegate(address delegatee) external; - - /** - * @dev Delegates votes from signer to `delegatee`. - */ - function delegateBySig( - address delegatee, - uint256 nonce, - uint256 expiry, - uint8 v, - bytes32 r, - bytes32 s - ) external; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/utils/VotesUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/utils/VotesUpgradeable.sol deleted file mode 100644 index 4c2b003..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/governance/utils/VotesUpgradeable.sol +++ /dev/null @@ -1,224 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (governance/utils/Votes.sol) -pragma solidity ^0.8.0; - -import "../../utils/ContextUpgradeable.sol"; -import "../../utils/CountersUpgradeable.sol"; -import "../../utils/CheckpointsUpgradeable.sol"; -import "../../utils/cryptography/EIP712Upgradeable.sol"; -import "./IVotesUpgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -/** - * @dev This is a base abstract contract that tracks voting units, which are a measure of voting power that can be - * transferred, and provides a system of vote delegation, where an account can delegate its voting units to a sort of - * "representative" that will pool delegated voting units from different accounts and can then use it to vote in - * decisions. In fact, voting units _must_ be delegated in order to count as actual votes, and an account has to - * delegate those votes to itself if it wishes to participate in decisions and does not have a trusted representative. - * - * This contract is often combined with a token contract such that voting units correspond to token units. For an - * example, see {ERC721Votes}. - * - * The full history of delegate votes is tracked on-chain so that governance protocols can consider votes as distributed - * at a particular block number to protect against flash loans and double voting. The opt-in delegate system makes the - * cost of this history tracking optional. - * - * When using this module the derived contract must implement {_getVotingUnits} (for example, make it return - * {ERC721-balanceOf}), and can use {_transferVotingUnits} to track a change in the distribution of those units (in the - * previous example, it would be included in {ERC721-_beforeTokenTransfer}). - * - * _Available since v4.5._ - */ -abstract contract VotesUpgradeable is Initializable, IVotesUpgradeable, ContextUpgradeable, EIP712Upgradeable { - function __Votes_init() internal onlyInitializing { - } - - function __Votes_init_unchained() internal onlyInitializing { - } - using CheckpointsUpgradeable for CheckpointsUpgradeable.History; - using CountersUpgradeable for CountersUpgradeable.Counter; - - bytes32 private constant _DELEGATION_TYPEHASH = - keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); - - mapping(address => address) private _delegation; - mapping(address => CheckpointsUpgradeable.History) private _delegateCheckpoints; - CheckpointsUpgradeable.History private _totalCheckpoints; - - mapping(address => CountersUpgradeable.Counter) private _nonces; - - /** - * @dev Returns the current amount of votes that `account` has. - */ - function getVotes(address account) public view virtual override returns (uint256) { - return _delegateCheckpoints[account].latest(); - } - - /** - * @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`). - * - * Requirements: - * - * - `blockNumber` must have been already mined - */ - function getPastVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) { - return _delegateCheckpoints[account].getAtProbablyRecentBlock(blockNumber); - } - - /** - * @dev Returns the total supply of votes available at the end of a past block (`blockNumber`). - * - * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes. - * Votes that have not been delegated are still part of total supply, even though they would not participate in a - * vote. - * - * Requirements: - * - * - `blockNumber` must have been already mined - */ - function getPastTotalSupply(uint256 blockNumber) public view virtual override returns (uint256) { - require(blockNumber < block.number, "Votes: block not yet mined"); - return _totalCheckpoints.getAtProbablyRecentBlock(blockNumber); - } - - /** - * @dev Returns the current total supply of votes. - */ - function _getTotalSupply() internal view virtual returns (uint256) { - return _totalCheckpoints.latest(); - } - - /** - * @dev Returns the delegate that `account` has chosen. - */ - function delegates(address account) public view virtual override returns (address) { - return _delegation[account]; - } - - /** - * @dev Delegates votes from the sender to `delegatee`. - */ - function delegate(address delegatee) public virtual override { - address account = _msgSender(); - _delegate(account, delegatee); - } - - /** - * @dev Delegates votes from signer to `delegatee`. - */ - function delegateBySig( - address delegatee, - uint256 nonce, - uint256 expiry, - uint8 v, - bytes32 r, - bytes32 s - ) public virtual override { - require(block.timestamp <= expiry, "Votes: signature expired"); - address signer = ECDSAUpgradeable.recover( - _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))), - v, - r, - s - ); - require(nonce == _useNonce(signer), "Votes: invalid nonce"); - _delegate(signer, delegatee); - } - - /** - * @dev Delegate all of `account`'s voting units to `delegatee`. - * - * Emits events {IVotes-DelegateChanged} and {IVotes-DelegateVotesChanged}. - */ - function _delegate(address account, address delegatee) internal virtual { - address oldDelegate = delegates(account); - _delegation[account] = delegatee; - - emit DelegateChanged(account, oldDelegate, delegatee); - _moveDelegateVotes(oldDelegate, delegatee, _getVotingUnits(account)); - } - - /** - * @dev Transfers, mints, or burns voting units. To register a mint, `from` should be zero. To register a burn, `to` - * should be zero. Total supply of voting units will be adjusted with mints and burns. - */ - function _transferVotingUnits( - address from, - address to, - uint256 amount - ) internal virtual { - if (from == address(0)) { - _totalCheckpoints.push(_add, amount); - } - if (to == address(0)) { - _totalCheckpoints.push(_subtract, amount); - } - _moveDelegateVotes(delegates(from), delegates(to), amount); - } - - /** - * @dev Moves delegated votes from one delegate to another. - */ - function _moveDelegateVotes( - address from, - address to, - uint256 amount - ) private { - if (from != to && amount > 0) { - if (from != address(0)) { - (uint256 oldValue, uint256 newValue) = _delegateCheckpoints[from].push(_subtract, amount); - emit DelegateVotesChanged(from, oldValue, newValue); - } - if (to != address(0)) { - (uint256 oldValue, uint256 newValue) = _delegateCheckpoints[to].push(_add, amount); - emit DelegateVotesChanged(to, oldValue, newValue); - } - } - } - - function _add(uint256 a, uint256 b) private pure returns (uint256) { - return a + b; - } - - function _subtract(uint256 a, uint256 b) private pure returns (uint256) { - return a - b; - } - - /** - * @dev Consumes a nonce. - * - * Returns the current value and increments nonce. - */ - function _useNonce(address owner) internal virtual returns (uint256 current) { - CountersUpgradeable.Counter storage nonce = _nonces[owner]; - current = nonce.current(); - nonce.increment(); - } - - /** - * @dev Returns an address nonce. - */ - function nonces(address owner) public view virtual returns (uint256) { - return _nonces[owner].current(); - } - - /** - * @dev Returns the contract's {EIP712} domain separator. - */ - // solhint-disable-next-line func-name-mixedcase - function DOMAIN_SEPARATOR() external view returns (bytes32) { - return _domainSeparatorV4(); - } - - /** - * @dev Must return the voting units held by an account. - */ - function _getVotingUnits(address) internal view virtual returns (uint256); - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[46] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC1155MetadataURIUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC1155MetadataURIUpgradeable.sol deleted file mode 100644 index 35c3f85..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC1155MetadataURIUpgradeable.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC1155MetadataURI.sol) - -pragma solidity ^0.8.0; - -import "../token/ERC1155/extensions/IERC1155MetadataURIUpgradeable.sol"; diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC1155ReceiverUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC1155ReceiverUpgradeable.sol deleted file mode 100644 index 1e9e6e3..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC1155ReceiverUpgradeable.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC1155Receiver.sol) - -pragma solidity ^0.8.0; - -import "../token/ERC1155/IERC1155ReceiverUpgradeable.sol"; diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC1155Upgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC1155Upgradeable.sol deleted file mode 100644 index 3df26dc..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC1155Upgradeable.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC1155.sol) - -pragma solidity ^0.8.0; - -import "../token/ERC1155/IERC1155Upgradeable.sol"; diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC1271Upgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC1271Upgradeable.sol deleted file mode 100644 index 631d222..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC1271Upgradeable.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC1271.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC1271 standard signature validation method for - * contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271]. - * - * _Available since v4.1._ - */ -interface IERC1271Upgradeable { - /** - * @dev Should return whether the signature provided is valid for the provided data - * @param hash Hash of the data to be signed - * @param signature Signature byte array associated with _data - */ - function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue); -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC1363ReceiverUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC1363ReceiverUpgradeable.sol deleted file mode 100644 index 76cda4e..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC1363ReceiverUpgradeable.sol +++ /dev/null @@ -1,32 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC1363Receiver.sol) - -pragma solidity ^0.8.0; - -interface IERC1363ReceiverUpgradeable { - /* - * Note: the ERC-165 identifier for this interface is 0x88a7ca5c. - * 0x88a7ca5c === bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)")) - */ - - /** - * @notice Handle the receipt of ERC1363 tokens - * @dev Any ERC1363 smart contract calls this function on the recipient - * after a `transfer` or a `transferFrom`. This function MAY throw to revert and reject the - * transfer. Return of other than the magic value MUST result in the - * transaction being reverted. - * Note: the token contract address is always the message sender. - * @param operator address The address which called `transferAndCall` or `transferFromAndCall` function - * @param from address The address which are token transferred from - * @param value uint256 The amount of tokens transferred - * @param data bytes Additional data with no specified format - * @return `bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)"))` - * unless throwing - */ - function onTransferReceived( - address operator, - address from, - uint256 value, - bytes memory data - ) external returns (bytes4); -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC1363SpenderUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC1363SpenderUpgradeable.sol deleted file mode 100644 index 997c029..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC1363SpenderUpgradeable.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC1363Spender.sol) - -pragma solidity ^0.8.0; - -interface IERC1363SpenderUpgradeable { - /* - * Note: the ERC-165 identifier for this interface is 0x7b04a2d0. - * 0x7b04a2d0 === bytes4(keccak256("onApprovalReceived(address,uint256,bytes)")) - */ - - /** - * @notice Handle the approval of ERC1363 tokens - * @dev Any ERC1363 smart contract calls this function on the recipient - * after an `approve`. This function MAY throw to revert and reject the - * approval. Return of other than the magic value MUST result in the - * transaction being reverted. - * Note: the token contract address is always the message sender. - * @param owner address The address which called `approveAndCall` function - * @param value uint256 The amount of tokens to be spent - * @param data bytes Additional data with no specified format - * @return `bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))` - * unless throwing - */ - function onApprovalReceived( - address owner, - uint256 value, - bytes memory data - ) external returns (bytes4); -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC1363Upgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC1363Upgradeable.sol deleted file mode 100644 index fe47947..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC1363Upgradeable.sol +++ /dev/null @@ -1,95 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC1363.sol) - -pragma solidity ^0.8.0; - -import "./IERC20Upgradeable.sol"; -import "./IERC165Upgradeable.sol"; - -interface IERC1363Upgradeable is IERC165Upgradeable, IERC20Upgradeable { - /* - * Note: the ERC-165 identifier for this interface is 0x4bbee2df. - * 0x4bbee2df === - * bytes4(keccak256('transferAndCall(address,uint256)')) ^ - * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^ - * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^ - * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) - */ - - /* - * Note: the ERC-165 identifier for this interface is 0xfb9ec8ce. - * 0xfb9ec8ce === - * bytes4(keccak256('approveAndCall(address,uint256)')) ^ - * bytes4(keccak256('approveAndCall(address,uint256,bytes)')) - */ - - /** - * @dev Transfer tokens from `msg.sender` to another address and then call `onTransferReceived` on receiver - * @param to address The address which you want to transfer to - * @param value uint256 The amount of tokens to be transferred - * @return true unless throwing - */ - function transferAndCall(address to, uint256 value) external returns (bool); - - /** - * @dev Transfer tokens from `msg.sender` to another address and then call `onTransferReceived` on receiver - * @param to address The address which you want to transfer to - * @param value uint256 The amount of tokens to be transferred - * @param data bytes Additional data with no specified format, sent in call to `to` - * @return true unless throwing - */ - function transferAndCall( - address to, - uint256 value, - bytes memory data - ) external returns (bool); - - /** - * @dev Transfer tokens from one address to another and then call `onTransferReceived` on receiver - * @param from address The address which you want to send tokens from - * @param to address The address which you want to transfer to - * @param value uint256 The amount of tokens to be transferred - * @return true unless throwing - */ - function transferFromAndCall( - address from, - address to, - uint256 value - ) external returns (bool); - - /** - * @dev Transfer tokens from one address to another and then call `onTransferReceived` on receiver - * @param from address The address which you want to send tokens from - * @param to address The address which you want to transfer to - * @param value uint256 The amount of tokens to be transferred - * @param data bytes Additional data with no specified format, sent in call to `to` - * @return true unless throwing - */ - function transferFromAndCall( - address from, - address to, - uint256 value, - bytes memory data - ) external returns (bool); - - /** - * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender - * and then call `onApprovalReceived` on spender. - * @param spender address The address which will spend the funds - * @param value uint256 The amount of tokens to be spent - */ - function approveAndCall(address spender, uint256 value) external returns (bool); - - /** - * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender - * and then call `onApprovalReceived` on spender. - * @param spender address The address which will spend the funds - * @param value uint256 The amount of tokens to be spent - * @param data bytes Additional data with no specified format, sent in call to `spender` - */ - function approveAndCall( - address spender, - uint256 value, - bytes memory data - ) external returns (bool); -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC165Upgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC165Upgradeable.sol deleted file mode 100644 index 08eb433..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC165Upgradeable.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol) - -pragma solidity ^0.8.0; - -import "../utils/introspection/IERC165Upgradeable.sol"; diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC1820ImplementerUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC1820ImplementerUpgradeable.sol deleted file mode 100644 index 1f5aeba..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC1820ImplementerUpgradeable.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC1820Implementer.sol) - -pragma solidity ^0.8.0; - -import "../utils/introspection/IERC1820ImplementerUpgradeable.sol"; diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC1820RegistryUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC1820RegistryUpgradeable.sol deleted file mode 100644 index 088fbd6..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC1820RegistryUpgradeable.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC1820Registry.sol) - -pragma solidity ^0.8.0; - -import "../utils/introspection/IERC1820RegistryUpgradeable.sol"; diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC20MetadataUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC20MetadataUpgradeable.sol deleted file mode 100644 index c24417a..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC20MetadataUpgradeable.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC20Metadata.sol) - -pragma solidity ^0.8.0; - -import "../token/ERC20/extensions/IERC20MetadataUpgradeable.sol"; diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC20Upgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC20Upgradeable.sol deleted file mode 100644 index a0d5cdb..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC20Upgradeable.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol) - -pragma solidity ^0.8.0; - -import "../token/ERC20/IERC20Upgradeable.sol"; diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC2309Upgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC2309Upgradeable.sol deleted file mode 100644 index d02560e..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC2309Upgradeable.sol +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -/** - * @dev ERC-2309: ERC-721 Consecutive Transfer Extension. - * - * _Available since v4.8._ - */ -interface IERC2309Upgradeable { - /** - * @dev Emitted when the tokens from `fromTokenId` to `toTokenId` are transferred from `fromAddress` to `toAddress`. - */ - event ConsecutiveTransfer( - uint256 indexed fromTokenId, - uint256 toTokenId, - address indexed fromAddress, - address indexed toAddress - ); -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC2981Upgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC2981Upgradeable.sol deleted file mode 100644 index c798473..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC2981Upgradeable.sol +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) - -pragma solidity ^0.8.0; - -import "../utils/introspection/IERC165Upgradeable.sol"; - -/** - * @dev Interface for the NFT Royalty Standard. - * - * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal - * support for royalty payments across all NFT marketplaces and ecosystem participants. - * - * _Available since v4.5._ - */ -interface IERC2981Upgradeable is IERC165Upgradeable { - /** - * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of - * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. - */ - function royaltyInfo(uint256 tokenId, uint256 salePrice) - external - view - returns (address receiver, uint256 royaltyAmount); -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC3156FlashBorrowerUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC3156FlashBorrowerUpgradeable.sol deleted file mode 100644 index 3f75175..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC3156FlashBorrowerUpgradeable.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (interfaces/IERC3156FlashBorrower.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC3156 FlashBorrower, as defined in - * https://eips.ethereum.org/EIPS/eip-3156[ERC-3156]. - * - * _Available since v4.1._ - */ -interface IERC3156FlashBorrowerUpgradeable { - /** - * @dev Receive a flash loan. - * @param initiator The initiator of the loan. - * @param token The loan currency. - * @param amount The amount of tokens lent. - * @param fee The additional amount of tokens to repay. - * @param data Arbitrary data structure, intended to contain user-defined parameters. - * @return The keccak256 hash of "IERC3156FlashBorrower.onFlashLoan" - */ - function onFlashLoan( - address initiator, - address token, - uint256 amount, - uint256 fee, - bytes calldata data - ) external returns (bytes32); -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC3156FlashLenderUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC3156FlashLenderUpgradeable.sol deleted file mode 100644 index d2543d1..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC3156FlashLenderUpgradeable.sol +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC3156FlashLender.sol) - -pragma solidity ^0.8.0; - -import "./IERC3156FlashBorrowerUpgradeable.sol"; - -/** - * @dev Interface of the ERC3156 FlashLender, as defined in - * https://eips.ethereum.org/EIPS/eip-3156[ERC-3156]. - * - * _Available since v4.1._ - */ -interface IERC3156FlashLenderUpgradeable { - /** - * @dev The amount of currency available to be lended. - * @param token The loan currency. - * @return The amount of `token` that can be borrowed. - */ - function maxFlashLoan(address token) external view returns (uint256); - - /** - * @dev The fee to be charged for a given loan. - * @param token The loan currency. - * @param amount The amount of tokens lent. - * @return The amount of `token` to be charged for the loan, on top of the returned principal. - */ - function flashFee(address token, uint256 amount) external view returns (uint256); - - /** - * @dev Initiate a flash loan. - * @param receiver The receiver of the tokens in the loan, and the receiver of the callback. - * @param token The loan currency. - * @param amount The amount of tokens lent. - * @param data Arbitrary data structure, intended to contain user-defined parameters. - */ - function flashLoan( - IERC3156FlashBorrowerUpgradeable receiver, - address token, - uint256 amount, - bytes calldata data - ) external returns (bool); -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC3156Upgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC3156Upgradeable.sol deleted file mode 100644 index 1a9fd64..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC3156Upgradeable.sol +++ /dev/null @@ -1,7 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC3156.sol) - -pragma solidity ^0.8.0; - -import "./IERC3156FlashBorrowerUpgradeable.sol"; -import "./IERC3156FlashLenderUpgradeable.sol"; diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC4626Upgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC4626Upgradeable.sol deleted file mode 100644 index d7fbf65..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC4626Upgradeable.sol +++ /dev/null @@ -1,240 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (interfaces/IERC4626.sol) - -pragma solidity ^0.8.0; - -import "../token/ERC20/IERC20Upgradeable.sol"; -import "../token/ERC20/extensions/IERC20MetadataUpgradeable.sol"; - -/** - * @dev Interface of the ERC4626 "Tokenized Vault Standard", as defined in - * https://eips.ethereum.org/EIPS/eip-4626[ERC-4626]. - * - * _Available since v4.7._ - */ -interface IERC4626Upgradeable is IERC20Upgradeable, IERC20MetadataUpgradeable { - event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares); - - event Withdraw( - address indexed sender, - address indexed receiver, - address indexed owner, - uint256 assets, - uint256 shares - ); - - /** - * @dev Returns the address of the underlying token used for the Vault for accounting, depositing, and withdrawing. - * - * - MUST be an ERC-20 token contract. - * - MUST NOT revert. - */ - function asset() external view returns (address assetTokenAddress); - - /** - * @dev Returns the total amount of the underlying asset that is “managed” by Vault. - * - * - SHOULD include any compounding that occurs from yield. - * - MUST be inclusive of any fees that are charged against assets in the Vault. - * - MUST NOT revert. - */ - function totalAssets() external view returns (uint256 totalManagedAssets); - - /** - * @dev Returns the amount of shares that the Vault would exchange for the amount of assets provided, in an ideal - * scenario where all the conditions are met. - * - * - MUST NOT be inclusive of any fees that are charged against assets in the Vault. - * - MUST NOT show any variations depending on the caller. - * - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange. - * - MUST NOT revert. - * - * NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the - * “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and - * from. - */ - function convertToShares(uint256 assets) external view returns (uint256 shares); - - /** - * @dev Returns the amount of assets that the Vault would exchange for the amount of shares provided, in an ideal - * scenario where all the conditions are met. - * - * - MUST NOT be inclusive of any fees that are charged against assets in the Vault. - * - MUST NOT show any variations depending on the caller. - * - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange. - * - MUST NOT revert. - * - * NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the - * “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and - * from. - */ - function convertToAssets(uint256 shares) external view returns (uint256 assets); - - /** - * @dev Returns the maximum amount of the underlying asset that can be deposited into the Vault for the receiver, - * through a deposit call. - * - * - MUST return a limited value if receiver is subject to some deposit limit. - * - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of assets that may be deposited. - * - MUST NOT revert. - */ - function maxDeposit(address receiver) external view returns (uint256 maxAssets); - - /** - * @dev Allows an on-chain or off-chain user to simulate the effects of their deposit at the current block, given - * current on-chain conditions. - * - * - MUST return as close to and no more than the exact amount of Vault shares that would be minted in a deposit - * call in the same transaction. I.e. deposit should return the same or more shares as previewDeposit if called - * in the same transaction. - * - MUST NOT account for deposit limits like those returned from maxDeposit and should always act as though the - * deposit would be accepted, regardless if the user has enough tokens approved, etc. - * - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees. - * - MUST NOT revert. - * - * NOTE: any unfavorable discrepancy between convertToShares and previewDeposit SHOULD be considered slippage in - * share price or some other type of condition, meaning the depositor will lose assets by depositing. - */ - function previewDeposit(uint256 assets) external view returns (uint256 shares); - - /** - * @dev Mints shares Vault shares to receiver by depositing exactly amount of underlying tokens. - * - * - MUST emit the Deposit event. - * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the - * deposit execution, and are accounted for during deposit. - * - MUST revert if all of assets cannot be deposited (due to deposit limit being reached, slippage, the user not - * approving enough underlying tokens to the Vault contract, etc). - * - * NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token. - */ - function deposit(uint256 assets, address receiver) external returns (uint256 shares); - - /** - * @dev Returns the maximum amount of the Vault shares that can be minted for the receiver, through a mint call. - * - MUST return a limited value if receiver is subject to some mint limit. - * - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of shares that may be minted. - * - MUST NOT revert. - */ - function maxMint(address receiver) external view returns (uint256 maxShares); - - /** - * @dev Allows an on-chain or off-chain user to simulate the effects of their mint at the current block, given - * current on-chain conditions. - * - * - MUST return as close to and no fewer than the exact amount of assets that would be deposited in a mint call - * in the same transaction. I.e. mint should return the same or fewer assets as previewMint if called in the - * same transaction. - * - MUST NOT account for mint limits like those returned from maxMint and should always act as though the mint - * would be accepted, regardless if the user has enough tokens approved, etc. - * - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees. - * - MUST NOT revert. - * - * NOTE: any unfavorable discrepancy between convertToAssets and previewMint SHOULD be considered slippage in - * share price or some other type of condition, meaning the depositor will lose assets by minting. - */ - function previewMint(uint256 shares) external view returns (uint256 assets); - - /** - * @dev Mints exactly shares Vault shares to receiver by depositing amount of underlying tokens. - * - * - MUST emit the Deposit event. - * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the mint - * execution, and are accounted for during mint. - * - MUST revert if all of shares cannot be minted (due to deposit limit being reached, slippage, the user not - * approving enough underlying tokens to the Vault contract, etc). - * - * NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token. - */ - function mint(uint256 shares, address receiver) external returns (uint256 assets); - - /** - * @dev Returns the maximum amount of the underlying asset that can be withdrawn from the owner balance in the - * Vault, through a withdraw call. - * - * - MUST return a limited value if owner is subject to some withdrawal limit or timelock. - * - MUST NOT revert. - */ - function maxWithdraw(address owner) external view returns (uint256 maxAssets); - - /** - * @dev Allows an on-chain or off-chain user to simulate the effects of their withdrawal at the current block, - * given current on-chain conditions. - * - * - MUST return as close to and no fewer than the exact amount of Vault shares that would be burned in a withdraw - * call in the same transaction. I.e. withdraw should return the same or fewer shares as previewWithdraw if - * called - * in the same transaction. - * - MUST NOT account for withdrawal limits like those returned from maxWithdraw and should always act as though - * the withdrawal would be accepted, regardless if the user has enough shares, etc. - * - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees. - * - MUST NOT revert. - * - * NOTE: any unfavorable discrepancy between convertToShares and previewWithdraw SHOULD be considered slippage in - * share price or some other type of condition, meaning the depositor will lose assets by depositing. - */ - function previewWithdraw(uint256 assets) external view returns (uint256 shares); - - /** - * @dev Burns shares from owner and sends exactly assets of underlying tokens to receiver. - * - * - MUST emit the Withdraw event. - * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the - * withdraw execution, and are accounted for during withdraw. - * - MUST revert if all of assets cannot be withdrawn (due to withdrawal limit being reached, slippage, the owner - * not having enough shares, etc). - * - * Note that some implementations will require pre-requesting to the Vault before a withdrawal may be performed. - * Those methods should be performed separately. - */ - function withdraw( - uint256 assets, - address receiver, - address owner - ) external returns (uint256 shares); - - /** - * @dev Returns the maximum amount of Vault shares that can be redeemed from the owner balance in the Vault, - * through a redeem call. - * - * - MUST return a limited value if owner is subject to some withdrawal limit or timelock. - * - MUST return balanceOf(owner) if owner is not subject to any withdrawal limit or timelock. - * - MUST NOT revert. - */ - function maxRedeem(address owner) external view returns (uint256 maxShares); - - /** - * @dev Allows an on-chain or off-chain user to simulate the effects of their redeemption at the current block, - * given current on-chain conditions. - * - * - MUST return as close to and no more than the exact amount of assets that would be withdrawn in a redeem call - * in the same transaction. I.e. redeem should return the same or more assets as previewRedeem if called in the - * same transaction. - * - MUST NOT account for redemption limits like those returned from maxRedeem and should always act as though the - * redemption would be accepted, regardless if the user has enough shares, etc. - * - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees. - * - MUST NOT revert. - * - * NOTE: any unfavorable discrepancy between convertToAssets and previewRedeem SHOULD be considered slippage in - * share price or some other type of condition, meaning the depositor will lose assets by redeeming. - */ - function previewRedeem(uint256 shares) external view returns (uint256 assets); - - /** - * @dev Burns exactly shares from owner and sends assets of underlying tokens to receiver. - * - * - MUST emit the Withdraw event. - * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the - * redeem execution, and are accounted for during redeem. - * - MUST revert if all of shares cannot be redeemed (due to withdrawal limit being reached, slippage, the owner - * not having enough shares, etc). - * - * NOTE: some implementations will require pre-requesting to the Vault before a withdrawal may be performed. - * Those methods should be performed separately. - */ - function redeem( - uint256 shares, - address receiver, - address owner - ) external returns (uint256 assets); -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC721EnumerableUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC721EnumerableUpgradeable.sol deleted file mode 100644 index 06e732d..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC721EnumerableUpgradeable.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC721Enumerable.sol) - -pragma solidity ^0.8.0; - -import "../token/ERC721/extensions/IERC721EnumerableUpgradeable.sol"; diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC721MetadataUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC721MetadataUpgradeable.sol deleted file mode 100644 index 1ec3b80..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC721MetadataUpgradeable.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC721Metadata.sol) - -pragma solidity ^0.8.0; - -import "../token/ERC721/extensions/IERC721MetadataUpgradeable.sol"; diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC721ReceiverUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC721ReceiverUpgradeable.sol deleted file mode 100644 index bdbe94c..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC721ReceiverUpgradeable.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC721Receiver.sol) - -pragma solidity ^0.8.0; - -import "../token/ERC721/IERC721ReceiverUpgradeable.sol"; diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC721Upgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC721Upgradeable.sol deleted file mode 100644 index 414e630..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC721Upgradeable.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC721.sol) - -pragma solidity ^0.8.0; - -import "../token/ERC721/IERC721Upgradeable.sol"; diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC777RecipientUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC777RecipientUpgradeable.sol deleted file mode 100644 index 219b28d..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC777RecipientUpgradeable.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC777Recipient.sol) - -pragma solidity ^0.8.0; - -import "../token/ERC777/IERC777RecipientUpgradeable.sol"; diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC777SenderUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC777SenderUpgradeable.sol deleted file mode 100644 index 0e1440b..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC777SenderUpgradeable.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC777Sender.sol) - -pragma solidity ^0.8.0; - -import "../token/ERC777/IERC777SenderUpgradeable.sol"; diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC777Upgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC777Upgradeable.sol deleted file mode 100644 index 858d3f4..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/IERC777Upgradeable.sol +++ /dev/null @@ -1,6 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/IERC777.sol) - -pragma solidity ^0.8.0; - -import "../token/ERC777/IERC777Upgradeable.sol"; diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/README.adoc b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/README.adoc deleted file mode 100644 index 5b4cedf..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/README.adoc +++ /dev/null @@ -1,56 +0,0 @@ -= Interfaces - -[.readme-notice] -NOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/interfaces - -== List of standardized interfaces -These interfaces are available as `.sol` files, and also as compiler `.json` ABI files (through the npm package). These -are useful to interact with third party contracts that implement them. - -- {IERC20} -- {IERC20Metadata} -- {IERC165} -- {IERC721} -- {IERC721Receiver} -- {IERC721Enumerable} -- {IERC721Metadata} -- {IERC777} -- {IERC777Recipient} -- {IERC777Sender} -- {IERC1155} -- {IERC1155Receiver} -- {IERC1155MetadataURI} -- {IERC1271} -- {IERC1363} -- {IERC1820Implementer} -- {IERC1820Registry} -- {IERC1822Proxiable} -- {IERC2612} -- {IERC2981} -- {IERC3156FlashLender} -- {IERC3156FlashBorrower} -- {IERC4626} - -== Detailed ABI - -{{IERC1271}} - -{{IERC1363}} - -{{IERC1363Receiver}} - -{{IERC1820Implementer}} - -{{IERC1820Registry}} - -{{IERC1822Proxiable}} - -{{IERC2612}} - -{{IERC2981}} - -{{IERC3156FlashLender}} - -{{IERC3156FlashBorrower}} - -{{IERC4626}} \ No newline at end of file diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/draft-IERC1822Upgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/draft-IERC1822Upgradeable.sol deleted file mode 100644 index e14596a..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/draft-IERC1822Upgradeable.sol +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol) - -pragma solidity ^0.8.0; - -/** - * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified - * proxy whose upgrades are fully controlled by the current implementation. - */ -interface IERC1822ProxiableUpgradeable { - /** - * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation - * address. - * - * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks - * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this - * function revert if invoked through a proxy. - */ - function proxiableUUID() external view returns (bytes32); -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/draft-IERC2612Upgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/draft-IERC2612Upgradeable.sol deleted file mode 100644 index 0dda61e..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/draft-IERC2612Upgradeable.sol +++ /dev/null @@ -1,8 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (interfaces/draft-IERC2612.sol) - -pragma solidity ^0.8.0; - -import "../token/ERC20/extensions/draft-IERC20PermitUpgradeable.sol"; - -interface IERC2612Upgradeable is IERC20PermitUpgradeable {} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/metatx/ERC2771ContextUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/metatx/ERC2771ContextUpgradeable.sol deleted file mode 100644 index 3850112..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/metatx/ERC2771ContextUpgradeable.sol +++ /dev/null @@ -1,51 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (metatx/ERC2771Context.sol) - -pragma solidity ^0.8.9; - -import "../utils/ContextUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -/** - * @dev Context variant with ERC2771 support. - */ -abstract contract ERC2771ContextUpgradeable is Initializable, ContextUpgradeable { - /// @custom:oz-upgrades-unsafe-allow state-variable-immutable - address private immutable _trustedForwarder; - - /// @custom:oz-upgrades-unsafe-allow constructor - constructor(address trustedForwarder) { - _trustedForwarder = trustedForwarder; - } - - function isTrustedForwarder(address forwarder) public view virtual returns (bool) { - return forwarder == _trustedForwarder; - } - - function _msgSender() internal view virtual override returns (address sender) { - if (isTrustedForwarder(msg.sender)) { - // The assembly code is more direct than the Solidity version using `abi.decode`. - /// @solidity memory-safe-assembly - assembly { - sender := shr(96, calldataload(sub(calldatasize(), 20))) - } - } else { - return super._msgSender(); - } - } - - function _msgData() internal view virtual override returns (bytes calldata) { - if (isTrustedForwarder(msg.sender)) { - return msg.data[:msg.data.length - 20]; - } else { - return super._msgData(); - } - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/metatx/MinimalForwarderUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/metatx/MinimalForwarderUpgradeable.sol deleted file mode 100644 index 32cb63d..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/metatx/MinimalForwarderUpgradeable.sol +++ /dev/null @@ -1,85 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (metatx/MinimalForwarder.sol) - -pragma solidity ^0.8.0; - -import "../utils/cryptography/ECDSAUpgradeable.sol"; -import "../utils/cryptography/EIP712Upgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -/** - * @dev Simple minimal forwarder to be used together with an ERC2771 compatible contract. See {ERC2771Context}. - * - * MinimalForwarder is mainly meant for testing, as it is missing features to be a good production-ready forwarder. This - * contract does not intend to have all the properties that are needed for a sound forwarding system. A fully - * functioning forwarding system with good properties requires more complexity. We suggest you look at other projects - * such as the GSN which do have the goal of building a system like that. - */ -contract MinimalForwarderUpgradeable is Initializable, EIP712Upgradeable { - using ECDSAUpgradeable for bytes32; - - struct ForwardRequest { - address from; - address to; - uint256 value; - uint256 gas; - uint256 nonce; - bytes data; - } - - bytes32 private constant _TYPEHASH = - keccak256("ForwardRequest(address from,address to,uint256 value,uint256 gas,uint256 nonce,bytes data)"); - - mapping(address => uint256) private _nonces; - - function __MinimalForwarder_init() internal onlyInitializing { - __EIP712_init_unchained("MinimalForwarder", "0.0.1"); - } - - function __MinimalForwarder_init_unchained() internal onlyInitializing {} - - function getNonce(address from) public view returns (uint256) { - return _nonces[from]; - } - - function verify(ForwardRequest calldata req, bytes calldata signature) public view returns (bool) { - address signer = _hashTypedDataV4( - keccak256(abi.encode(_TYPEHASH, req.from, req.to, req.value, req.gas, req.nonce, keccak256(req.data))) - ).recover(signature); - return _nonces[req.from] == req.nonce && signer == req.from; - } - - function execute(ForwardRequest calldata req, bytes calldata signature) - public - payable - returns (bool, bytes memory) - { - require(verify(req, signature), "MinimalForwarder: signature does not match request"); - _nonces[req.from] = req.nonce + 1; - - (bool success, bytes memory returndata) = req.to.call{gas: req.gas, value: req.value}( - abi.encodePacked(req.data, req.from) - ); - - // Validate that the relayer has sent enough gas for the call. - // See https://ronan.eth.limo/blog/ethereum-gas-dangers/ - if (gasleft() <= req.gas / 63) { - // We explicitly trigger invalid opcode to consume all gas and bubble-up the effects, since - // neither revert or assert consume all gas since Solidity 0.8.0 - // https://docs.soliditylang.org/en/v0.8.0/control-structures.html#panic-via-assert-and-error-via-require - /// @solidity memory-safe-assembly - assembly { - invalid() - } - } - - return (success, returndata); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/metatx/README.adoc b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/metatx/README.adoc deleted file mode 100644 index eccdeaf..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/metatx/README.adoc +++ /dev/null @@ -1,12 +0,0 @@ -= Meta Transactions - -[.readme-notice] -NOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/metatx - -== Core - -{{ERC2771Context}} - -== Utils - -{{MinimalForwarder}} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/AccessControlCrossChainMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/AccessControlCrossChainMockUpgradeable.sol deleted file mode 100644 index 959b4af..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/AccessControlCrossChainMockUpgradeable.sol +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.4; - -import "../access/AccessControlCrossChainUpgradeable.sol"; -import "../crosschain/arbitrum/CrossChainEnabledArbitrumL2Upgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract AccessControlCrossChainMockUpgradeable is Initializable, AccessControlCrossChainUpgradeable, CrossChainEnabledArbitrumL2Upgradeable { - function __AccessControlCrossChainMock_init() internal onlyInitializing { - __AccessControlCrossChainMock_init_unchained(); - } - - function __AccessControlCrossChainMock_init_unchained() internal onlyInitializing { - _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); - } - - function setRoleAdmin(bytes32 roleId, bytes32 adminRoleId) public { - _setRoleAdmin(roleId, adminRoleId); - } - - function senderProtected(bytes32 roleId) public onlyRole(roleId) {} - - function crossChainRoleAlias(bytes32 role) public pure returns (bytes32) { - return _crossChainRoleAlias(role); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/AccessControlEnumerableMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/AccessControlEnumerableMockUpgradeable.sol deleted file mode 100644 index 7959eee..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/AccessControlEnumerableMockUpgradeable.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../access/AccessControlEnumerableUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract AccessControlEnumerableMockUpgradeable is Initializable, AccessControlEnumerableUpgradeable { - function __AccessControlEnumerableMock_init() internal onlyInitializing { - __AccessControlEnumerableMock_init_unchained(); - } - - function __AccessControlEnumerableMock_init_unchained() internal onlyInitializing { - _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); - } - - function setRoleAdmin(bytes32 roleId, bytes32 adminRoleId) public { - _setRoleAdmin(roleId, adminRoleId); - } - - function senderProtected(bytes32 roleId) public onlyRole(roleId) {} - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/AccessControlMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/AccessControlMockUpgradeable.sol deleted file mode 100644 index a770f5d..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/AccessControlMockUpgradeable.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../access/AccessControlUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract AccessControlMockUpgradeable is Initializable, AccessControlUpgradeable { - function __AccessControlMock_init() internal onlyInitializing { - __AccessControlMock_init_unchained(); - } - - function __AccessControlMock_init_unchained() internal onlyInitializing { - _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); - } - - function setRoleAdmin(bytes32 roleId, bytes32 adminRoleId) public { - _setRoleAdmin(roleId, adminRoleId); - } - - function senderProtected(bytes32 roleId) public onlyRole(roleId) {} - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/AddressImplUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/AddressImplUpgradeable.sol deleted file mode 100644 index 8013c2f..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/AddressImplUpgradeable.sol +++ /dev/null @@ -1,54 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/AddressUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract AddressImplUpgradeable is Initializable { - function __AddressImpl_init() internal onlyInitializing { - } - - function __AddressImpl_init_unchained() internal onlyInitializing { - } - string public sharedAnswer; - - event CallReturnValue(string data); - - function isContract(address account) external view returns (bool) { - return AddressUpgradeable.isContract(account); - } - - function sendValue(address payable receiver, uint256 amount) external { - AddressUpgradeable.sendValue(receiver, amount); - } - - function functionCall(address target, bytes calldata data) external { - bytes memory returnData = AddressUpgradeable.functionCall(target, data); - emit CallReturnValue(abi.decode(returnData, (string))); - } - - function functionCallWithValue( - address target, - bytes calldata data, - uint256 value - ) external payable { - bytes memory returnData = AddressUpgradeable.functionCallWithValue(target, data, value); - emit CallReturnValue(abi.decode(returnData, (string))); - } - - function functionStaticCall(address target, bytes calldata data) external { - bytes memory returnData = AddressUpgradeable.functionStaticCall(target, data); - emit CallReturnValue(abi.decode(returnData, (string))); - } - - // sendValue's tests require the contract to hold Ether - receive() external payable {} - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ArraysMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ArraysMockUpgradeable.sol deleted file mode 100644 index e4e7c99..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ArraysMockUpgradeable.sol +++ /dev/null @@ -1,85 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/ArraysUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract Uint256ArraysMockUpgradeable is Initializable { - using ArraysUpgradeable for uint256[]; - - uint256[] private _array; - - function __Uint256ArraysMock_init(uint256[] memory array) internal onlyInitializing { - __Uint256ArraysMock_init_unchained(array); - } - - function __Uint256ArraysMock_init_unchained(uint256[] memory array) internal onlyInitializing { - _array = array; - } - - function findUpperBound(uint256 element) external view returns (uint256) { - return _array.findUpperBound(element); - } - - function unsafeAccess(uint256 pos) external view returns (uint256) { - return _array.unsafeAccess(pos).value; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} - -contract AddressArraysMockUpgradeable is Initializable { - using ArraysUpgradeable for address[]; - - address[] private _array; - - function __AddressArraysMock_init(address[] memory array) internal onlyInitializing { - __AddressArraysMock_init_unchained(array); - } - - function __AddressArraysMock_init_unchained(address[] memory array) internal onlyInitializing { - _array = array; - } - - function unsafeAccess(uint256 pos) external view returns (address) { - return _array.unsafeAccess(pos).value; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} - -contract Bytes32ArraysMockUpgradeable is Initializable { - using ArraysUpgradeable for bytes32[]; - - bytes32[] private _array; - - function __Bytes32ArraysMock_init(bytes32[] memory array) internal onlyInitializing { - __Bytes32ArraysMock_init_unchained(array); - } - - function __Bytes32ArraysMock_init_unchained(bytes32[] memory array) internal onlyInitializing { - _array = array; - } - - function unsafeAccess(uint256 pos) external view returns (bytes32) { - return _array.unsafeAccess(pos).value; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/BadBeaconUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/BadBeaconUpgradeable.sol deleted file mode 100644 index f795145..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/BadBeaconUpgradeable.sol +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; -import "../proxy/utils/Initializable.sol"; - -contract BadBeaconNoImplUpgradeable is Initializable { function __BadBeaconNoImpl_init() internal onlyInitializing { - } - - function __BadBeaconNoImpl_init_unchained() internal onlyInitializing { - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} - -contract BadBeaconNotContractUpgradeable is Initializable { - function __BadBeaconNotContract_init() internal onlyInitializing { - } - - function __BadBeaconNotContract_init_unchained() internal onlyInitializing { - } - function implementation() external pure returns (address) { - return address(0x1); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/Base64MockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/Base64MockUpgradeable.sol deleted file mode 100644 index 5c7e6df..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/Base64MockUpgradeable.sol +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/Base64Upgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract Base64MockUpgradeable is Initializable { - function __Base64Mock_init() internal onlyInitializing { - } - - function __Base64Mock_init_unchained() internal onlyInitializing { - } - function encode(bytes memory value) external pure returns (string memory) { - return Base64Upgradeable.encode(value); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/BitmapMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/BitmapMockUpgradeable.sol deleted file mode 100644 index bf5bcb1..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/BitmapMockUpgradeable.sol +++ /dev/null @@ -1,40 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/structs/BitMapsUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract BitMapMockUpgradeable is Initializable { - function __BitMapMock_init() internal onlyInitializing { - } - - function __BitMapMock_init_unchained() internal onlyInitializing { - } - using BitMapsUpgradeable for BitMapsUpgradeable.BitMap; - - BitMapsUpgradeable.BitMap private _bitmap; - - function get(uint256 index) public view returns (bool) { - return _bitmap.get(index); - } - - function setTo(uint256 index, bool value) public { - _bitmap.setTo(index, value); - } - - function set(uint256 index) public { - _bitmap.set(index); - } - - function unset(uint256 index) public { - _bitmap.unset(index); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/CallReceiverMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/CallReceiverMockUpgradeable.sol deleted file mode 100644 index 724979c..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/CallReceiverMockUpgradeable.sol +++ /dev/null @@ -1,70 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; -import "../proxy/utils/Initializable.sol"; - -contract CallReceiverMockUpgradeable is Initializable { - function __CallReceiverMock_init() internal onlyInitializing { - } - - function __CallReceiverMock_init_unchained() internal onlyInitializing { - } - string public sharedAnswer; - - event MockFunctionCalled(); - event MockFunctionCalledWithArgs(uint256 a, uint256 b); - - uint256[] private _array; - - function mockFunction() public payable returns (string memory) { - emit MockFunctionCalled(); - - return "0x1234"; - } - - function mockFunctionWithArgs(uint256 a, uint256 b) public payable returns (string memory) { - emit MockFunctionCalledWithArgs(a, b); - - return "0x1234"; - } - - function mockFunctionNonPayable() public returns (string memory) { - emit MockFunctionCalled(); - - return "0x1234"; - } - - function mockStaticFunction() public pure returns (string memory) { - return "0x1234"; - } - - function mockFunctionRevertsNoReason() public payable { - revert(); - } - - function mockFunctionRevertsReason() public payable { - revert("CallReceiverMock: reverting"); - } - - function mockFunctionThrows() public payable { - assert(false); - } - - function mockFunctionOutOfGas() public payable { - for (uint256 i = 0; ; ++i) { - _array.push(i); - } - } - - function mockFunctionWritesStorage() public returns (string memory) { - sharedAnswer = "42"; - return "0x1234"; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[48] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/CheckpointsMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/CheckpointsMockUpgradeable.sol deleted file mode 100644 index e4b0e32..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/CheckpointsMockUpgradeable.sol +++ /dev/null @@ -1,157 +0,0 @@ -// SPDX-License-Identifier: MIT -// This file was procedurally generated from scripts/generate/templates/CheckpointsMock.js. - -pragma solidity ^0.8.0; - -import "../utils/CheckpointsUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract CheckpointsMockUpgradeable is Initializable { - function __CheckpointsMock_init() internal onlyInitializing { - } - - function __CheckpointsMock_init_unchained() internal onlyInitializing { - } - using CheckpointsUpgradeable for CheckpointsUpgradeable.History; - - CheckpointsUpgradeable.History private _totalCheckpoints; - - function latest() public view returns (uint256) { - return _totalCheckpoints.latest(); - } - - function latestCheckpoint() - public - view - returns ( - bool, - uint256, - uint256 - ) - { - return _totalCheckpoints.latestCheckpoint(); - } - - function length() public view returns (uint256) { - return _totalCheckpoints.length(); - } - - function push(uint256 value) public returns (uint256, uint256) { - return _totalCheckpoints.push(value); - } - - function getAtBlock(uint256 blockNumber) public view returns (uint256) { - return _totalCheckpoints.getAtBlock(blockNumber); - } - - function getAtProbablyRecentBlock(uint256 blockNumber) public view returns (uint256) { - return _totalCheckpoints.getAtProbablyRecentBlock(blockNumber); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} - -contract Checkpoints224MockUpgradeable is Initializable { - function __Checkpoints224Mock_init() internal onlyInitializing { - } - - function __Checkpoints224Mock_init_unchained() internal onlyInitializing { - } - using CheckpointsUpgradeable for CheckpointsUpgradeable.Trace224; - - CheckpointsUpgradeable.Trace224 private _totalCheckpoints; - - function latest() public view returns (uint224) { - return _totalCheckpoints.latest(); - } - - function latestCheckpoint() - public - view - returns ( - bool, - uint32, - uint224 - ) - { - return _totalCheckpoints.latestCheckpoint(); - } - - function length() public view returns (uint256) { - return _totalCheckpoints.length(); - } - - function push(uint32 key, uint224 value) public returns (uint224, uint224) { - return _totalCheckpoints.push(key, value); - } - - function lowerLookup(uint32 key) public view returns (uint224) { - return _totalCheckpoints.lowerLookup(key); - } - - function upperLookup(uint32 key) public view returns (uint224) { - return _totalCheckpoints.upperLookup(key); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} - -contract Checkpoints160MockUpgradeable is Initializable { - function __Checkpoints160Mock_init() internal onlyInitializing { - } - - function __Checkpoints160Mock_init_unchained() internal onlyInitializing { - } - using CheckpointsUpgradeable for CheckpointsUpgradeable.Trace160; - - CheckpointsUpgradeable.Trace160 private _totalCheckpoints; - - function latest() public view returns (uint160) { - return _totalCheckpoints.latest(); - } - - function latestCheckpoint() - public - view - returns ( - bool, - uint96, - uint160 - ) - { - return _totalCheckpoints.latestCheckpoint(); - } - - function length() public view returns (uint256) { - return _totalCheckpoints.length(); - } - - function push(uint96 key, uint160 value) public returns (uint160, uint160) { - return _totalCheckpoints.push(key, value); - } - - function lowerLookup(uint96 key) public view returns (uint160) { - return _totalCheckpoints.lowerLookup(key); - } - - function upperLookup(uint96 key) public view returns (uint160) { - return _totalCheckpoints.upperLookup(key); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ClashingImplementationUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ClashingImplementationUpgradeable.sol deleted file mode 100644 index 7662551..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ClashingImplementationUpgradeable.sol +++ /dev/null @@ -1,31 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; -import "../proxy/utils/Initializable.sol"; - -/** - * @dev Implementation contract with an admin() function made to clash with - * @dev TransparentUpgradeableProxy's to test correct functioning of the - * @dev Transparent Proxy feature. - */ -contract ClashingImplementationUpgradeable is Initializable { - function __ClashingImplementation_init() internal onlyInitializing { - } - - function __ClashingImplementation_init_unchained() internal onlyInitializing { - } - function admin() external pure returns (address) { - return 0x0000000000000000000000000000000011111142; - } - - function delegatedFunction() external pure returns (bool) { - return true; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ClonesMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ClonesMockUpgradeable.sol deleted file mode 100644 index d51f606..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ClonesMockUpgradeable.sol +++ /dev/null @@ -1,49 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../proxy/ClonesUpgradeable.sol"; -import "../utils/AddressUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract ClonesMockUpgradeable is Initializable { - function __ClonesMock_init() internal onlyInitializing { - } - - function __ClonesMock_init_unchained() internal onlyInitializing { - } - using AddressUpgradeable for address; - using ClonesUpgradeable for address; - - event NewInstance(address instance); - - function clone(address implementation, bytes calldata initdata) public payable { - _initAndEmit(implementation.clone(), initdata); - } - - function cloneDeterministic( - address implementation, - bytes32 salt, - bytes calldata initdata - ) public payable { - _initAndEmit(implementation.cloneDeterministic(salt), initdata); - } - - function predictDeterministicAddress(address implementation, bytes32 salt) public view returns (address predicted) { - return implementation.predictDeterministicAddress(salt); - } - - function _initAndEmit(address instance, bytes memory initdata) private { - if (initdata.length > 0) { - instance.functionCallWithValue(initdata, msg.value); - } - emit NewInstance(instance); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ConditionalEscrowMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ConditionalEscrowMockUpgradeable.sol deleted file mode 100644 index 4cf9ac7..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ConditionalEscrowMockUpgradeable.sol +++ /dev/null @@ -1,32 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/escrow/ConditionalEscrowUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -// mock class using ConditionalEscrow -contract ConditionalEscrowMockUpgradeable is Initializable, ConditionalEscrowUpgradeable { - function __ConditionalEscrowMock_init() internal onlyInitializing { - __Ownable_init_unchained(); - } - - function __ConditionalEscrowMock_init_unchained() internal onlyInitializing { - } - mapping(address => bool) private _allowed; - - function setAllowed(address payee, bool allowed) public { - _allowed[payee] = allowed; - } - - function withdrawalAllowed(address payee) public view override returns (bool) { - return _allowed[payee]; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ContextMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ContextMockUpgradeable.sol deleted file mode 100644 index 6ec35c8..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ContextMockUpgradeable.sol +++ /dev/null @@ -1,58 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/ContextUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract ContextMockUpgradeable is Initializable, ContextUpgradeable { - function __ContextMock_init() internal onlyInitializing { - } - - function __ContextMock_init_unchained() internal onlyInitializing { - } - event Sender(address sender); - - function msgSender() public { - emit Sender(_msgSender()); - } - - event Data(bytes data, uint256 integerValue, string stringValue); - - function msgData(uint256 integerValue, string memory stringValue) public { - emit Data(_msgData(), integerValue, stringValue); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} - -contract ContextMockCallerUpgradeable is Initializable { - function __ContextMockCaller_init() internal onlyInitializing { - } - - function __ContextMockCaller_init_unchained() internal onlyInitializing { - } - function callSender(ContextMockUpgradeable context) public { - context.msgSender(); - } - - function callData( - ContextMockUpgradeable context, - uint256 integerValue, - string memory stringValue - ) public { - context.msgData(integerValue, stringValue); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/CountersImplUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/CountersImplUpgradeable.sol deleted file mode 100644 index 5575308..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/CountersImplUpgradeable.sol +++ /dev/null @@ -1,40 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/CountersUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract CountersImplUpgradeable is Initializable { - function __CountersImpl_init() internal onlyInitializing { - } - - function __CountersImpl_init_unchained() internal onlyInitializing { - } - using CountersUpgradeable for CountersUpgradeable.Counter; - - CountersUpgradeable.Counter private _counter; - - function current() public view returns (uint256) { - return _counter.current(); - } - - function increment() public { - _counter.increment(); - } - - function decrement() public { - _counter.decrement(); - } - - function reset() public { - _counter.reset(); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/Create2ImplUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/Create2ImplUpgradeable.sol deleted file mode 100644 index 4d7f5d9..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/Create2ImplUpgradeable.sol +++ /dev/null @@ -1,47 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/Create2Upgradeable.sol"; -import "../utils/introspection/ERC1820ImplementerUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract Create2ImplUpgradeable is Initializable { - function __Create2Impl_init() internal onlyInitializing { - } - - function __Create2Impl_init_unchained() internal onlyInitializing { - } - function deploy( - uint256 value, - bytes32 salt, - bytes memory code - ) public { - Create2Upgradeable.deploy(value, salt, code); - } - - function deployERC1820Implementer(uint256 value, bytes32 salt) public { - Create2Upgradeable.deploy(value, salt, type(ERC1820ImplementerUpgradeable).creationCode); - } - - function computeAddress(bytes32 salt, bytes32 codeHash) public view returns (address) { - return Create2Upgradeable.computeAddress(salt, codeHash); - } - - function computeAddressWithDeployer( - bytes32 salt, - bytes32 codeHash, - address deployer - ) public pure returns (address) { - return Create2Upgradeable.computeAddress(salt, codeHash, deployer); - } - - receive() external payable {} - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/DoubleEndedQueueMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/DoubleEndedQueueMockUpgradeable.sol deleted file mode 100644 index f0ca4c5..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/DoubleEndedQueueMockUpgradeable.sol +++ /dev/null @@ -1,71 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/structs/DoubleEndedQueueUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -// Bytes32Deque -contract Bytes32DequeMockUpgradeable is Initializable { - function __Bytes32DequeMock_init() internal onlyInitializing { - } - - function __Bytes32DequeMock_init_unchained() internal onlyInitializing { - } - using DoubleEndedQueueUpgradeable for DoubleEndedQueueUpgradeable.Bytes32Deque; - - event OperationResult(bytes32 value); - - DoubleEndedQueueUpgradeable.Bytes32Deque private _vector; - - function pushBack(bytes32 value) public { - _vector.pushBack(value); - } - - function pushFront(bytes32 value) public { - _vector.pushFront(value); - } - - function popFront() public returns (bytes32) { - bytes32 value = _vector.popFront(); - emit OperationResult(value); - return value; - } - - function popBack() public returns (bytes32) { - bytes32 value = _vector.popBack(); - emit OperationResult(value); - return value; - } - - function front() public view returns (bytes32) { - return _vector.front(); - } - - function back() public view returns (bytes32) { - return _vector.back(); - } - - function at(uint256 i) public view returns (bytes32) { - return _vector.at(i); - } - - function clear() public { - _vector.clear(); - } - - function length() public view returns (uint256) { - return _vector.length(); - } - - function empty() public view returns (bool) { - return _vector.empty(); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[48] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/DummyImplementationUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/DummyImplementationUpgradeable.sol deleted file mode 100644 index 8d8aceb..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/DummyImplementationUpgradeable.sol +++ /dev/null @@ -1,98 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; -import "../proxy/utils/Initializable.sol"; - -abstract contract ImplUpgradeable is Initializable { - function __Impl_init() internal onlyInitializing { - } - - function __Impl_init_unchained() internal onlyInitializing { - } - function version() public pure virtual returns (string memory); - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} - -contract DummyImplementationUpgradeable is Initializable { - function __DummyImplementation_init() internal onlyInitializing { - } - - function __DummyImplementation_init_unchained() internal onlyInitializing { - } - uint256 public value; - string public text; - uint256[] public values; - - function initializeNonPayable() public { - value = 10; - } - - function initializePayable() public payable { - value = 100; - } - - function initializeNonPayableWithValue(uint256 _value) public { - value = _value; - } - - function initializePayableWithValue(uint256 _value) public payable { - value = _value; - } - - function initialize( - uint256 _value, - string memory _text, - uint256[] memory _values - ) public { - value = _value; - text = _text; - values = _values; - } - - function get() public pure returns (bool) { - return true; - } - - function version() public pure virtual returns (string memory) { - return "V1"; - } - - function reverts() public pure { - require(false, "DummyImplementation reverted"); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[47] private __gap; -} - -contract DummyImplementationV2Upgradeable is Initializable, DummyImplementationUpgradeable { - function __DummyImplementationV2_init() internal onlyInitializing { - } - - function __DummyImplementationV2_init_unchained() internal onlyInitializing { - } - function migrate(uint256 newVal) public payable { - value = newVal; - } - - function version() public pure override returns (string memory) { - return "V2"; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ECDSAMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ECDSAMockUpgradeable.sol deleted file mode 100644 index 63db89c..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ECDSAMockUpgradeable.sol +++ /dev/null @@ -1,54 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/cryptography/ECDSAUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract ECDSAMockUpgradeable is Initializable { - function __ECDSAMock_init() internal onlyInitializing { - } - - function __ECDSAMock_init_unchained() internal onlyInitializing { - } - using ECDSAUpgradeable for bytes32; - using ECDSAUpgradeable for bytes; - - function recover(bytes32 hash, bytes memory signature) public pure returns (address) { - return hash.recover(signature); - } - - // solhint-disable-next-line func-name-mixedcase - function recover_v_r_s( - bytes32 hash, - uint8 v, - bytes32 r, - bytes32 s - ) public pure returns (address) { - return hash.recover(v, r, s); - } - - // solhint-disable-next-line func-name-mixedcase - function recover_r_vs( - bytes32 hash, - bytes32 r, - bytes32 vs - ) public pure returns (address) { - return hash.recover(r, vs); - } - - function toEthSignedMessageHash(bytes32 hash) public pure returns (bytes32) { - return hash.toEthSignedMessageHash(); - } - - function toEthSignedMessageHash(bytes memory s) public pure returns (bytes32) { - return s.toEthSignedMessageHash(); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/EIP712ExternalUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/EIP712ExternalUpgradeable.sol deleted file mode 100644 index 0172b86..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/EIP712ExternalUpgradeable.sol +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/cryptography/ECDSAUpgradeable.sol"; -import "../utils/cryptography/EIP712Upgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract EIP712ExternalUpgradeable is Initializable, EIP712Upgradeable { - function __EIP712External_init(string memory name, string memory version) internal onlyInitializing { - __EIP712_init_unchained(name, version); - } - - function __EIP712External_init_unchained(string memory, string memory) internal onlyInitializing {} - - function domainSeparator() external view returns (bytes32) { - return _domainSeparatorV4(); - } - - function verify( - bytes memory signature, - address signer, - address mailTo, - string memory mailContents - ) external view { - bytes32 digest = _hashTypedDataV4( - keccak256(abi.encode(keccak256("Mail(address to,string contents)"), mailTo, keccak256(bytes(mailContents)))) - ); - address recoveredSigner = ECDSAUpgradeable.recover(digest, signature); - require(recoveredSigner == signer); - } - - function getChainId() external view returns (uint256) { - return block.chainid; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC1155BurnableMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC1155BurnableMockUpgradeable.sol deleted file mode 100644 index d6f4d48..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC1155BurnableMockUpgradeable.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC1155/extensions/ERC1155BurnableUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract ERC1155BurnableMockUpgradeable is Initializable, ERC1155BurnableUpgradeable { - function __ERC1155BurnableMock_init(string memory uri) internal onlyInitializing { - __ERC1155_init_unchained(uri); - } - - function __ERC1155BurnableMock_init_unchained(string memory) internal onlyInitializing {} - - function mint( - address to, - uint256 id, - uint256 value, - bytes memory data - ) public { - _mint(to, id, value, data); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC1155MockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC1155MockUpgradeable.sol deleted file mode 100644 index 773cf78..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC1155MockUpgradeable.sol +++ /dev/null @@ -1,63 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC1155/ERC1155Upgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -/** - * @title ERC1155Mock - * This mock just publicizes internal functions for testing purposes - */ -contract ERC1155MockUpgradeable is Initializable, ERC1155Upgradeable { - function __ERC1155Mock_init(string memory uri) internal onlyInitializing { - __ERC1155_init_unchained(uri); - } - - function __ERC1155Mock_init_unchained(string memory) internal onlyInitializing {} - - function setURI(string memory newuri) public { - _setURI(newuri); - } - - function mint( - address to, - uint256 id, - uint256 value, - bytes memory data - ) public { - _mint(to, id, value, data); - } - - function mintBatch( - address to, - uint256[] memory ids, - uint256[] memory values, - bytes memory data - ) public { - _mintBatch(to, ids, values, data); - } - - function burn( - address owner, - uint256 id, - uint256 value - ) public { - _burn(owner, id, value); - } - - function burnBatch( - address owner, - uint256[] memory ids, - uint256[] memory values - ) public { - _burnBatch(owner, ids, values); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC1155PausableMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC1155PausableMockUpgradeable.sol deleted file mode 100644 index 7d7bcde..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC1155PausableMockUpgradeable.sol +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "./ERC1155MockUpgradeable.sol"; -import "../token/ERC1155/extensions/ERC1155PausableUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract ERC1155PausableMockUpgradeable is Initializable, ERC1155MockUpgradeable, ERC1155PausableUpgradeable { - function __ERC1155PausableMock_init(string memory uri) internal onlyInitializing { - __ERC1155_init_unchained(uri); - __ERC1155Mock_init_unchained(uri); - __Pausable_init_unchained(); - } - - function __ERC1155PausableMock_init_unchained(string memory) internal onlyInitializing {} - - function pause() external { - _pause(); - } - - function unpause() external { - _unpause(); - } - - function _beforeTokenTransfer( - address operator, - address from, - address to, - uint256[] memory ids, - uint256[] memory amounts, - bytes memory data - ) internal override(ERC1155Upgradeable, ERC1155PausableUpgradeable) { - super._beforeTokenTransfer(operator, from, to, ids, amounts, data); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC1155ReceiverMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC1155ReceiverMockUpgradeable.sol deleted file mode 100644 index bb639e7..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC1155ReceiverMockUpgradeable.sol +++ /dev/null @@ -1,69 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC1155/IERC1155ReceiverUpgradeable.sol"; -import "../utils/introspection/ERC165Upgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract ERC1155ReceiverMockUpgradeable is Initializable, ERC165Upgradeable, IERC1155ReceiverUpgradeable { - bytes4 private _recRetval; - bool private _recReverts; - bytes4 private _batRetval; - bool private _batReverts; - - event Received(address operator, address from, uint256 id, uint256 value, bytes data, uint256 gas); - event BatchReceived(address operator, address from, uint256[] ids, uint256[] values, bytes data, uint256 gas); - - function __ERC1155ReceiverMock_init( - bytes4 recRetval, - bool recReverts, - bytes4 batRetval, - bool batReverts - ) internal onlyInitializing { - __ERC1155ReceiverMock_init_unchained(recRetval, recReverts, batRetval, batReverts); - } - - function __ERC1155ReceiverMock_init_unchained( - bytes4 recRetval, - bool recReverts, - bytes4 batRetval, - bool batReverts - ) internal onlyInitializing { - _recRetval = recRetval; - _recReverts = recReverts; - _batRetval = batRetval; - _batReverts = batReverts; - } - - function onERC1155Received( - address operator, - address from, - uint256 id, - uint256 value, - bytes calldata data - ) external override returns (bytes4) { - require(!_recReverts, "ERC1155ReceiverMock: reverting on receive"); - emit Received(operator, from, id, value, data, gasleft()); - return _recRetval; - } - - function onERC1155BatchReceived( - address operator, - address from, - uint256[] calldata ids, - uint256[] calldata values, - bytes calldata data - ) external override returns (bytes4) { - require(!_batReverts, "ERC1155ReceiverMock: reverting on batch receive"); - emit BatchReceived(operator, from, ids, values, data, gasleft()); - return _batRetval; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC1155SupplyMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC1155SupplyMockUpgradeable.sol deleted file mode 100644 index 6684b5c..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC1155SupplyMockUpgradeable.sol +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "./ERC1155MockUpgradeable.sol"; -import "../token/ERC1155/extensions/ERC1155SupplyUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract ERC1155SupplyMockUpgradeable is Initializable, ERC1155MockUpgradeable, ERC1155SupplyUpgradeable { - function __ERC1155SupplyMock_init(string memory uri) internal onlyInitializing { - __ERC1155_init_unchained(uri); - __ERC1155Mock_init_unchained(uri); - } - - function __ERC1155SupplyMock_init_unchained(string memory) internal onlyInitializing {} - - function _beforeTokenTransfer( - address operator, - address from, - address to, - uint256[] memory ids, - uint256[] memory amounts, - bytes memory data - ) internal override(ERC1155Upgradeable, ERC1155SupplyUpgradeable) { - super._beforeTokenTransfer(operator, from, to, ids, amounts, data); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC1155URIStorageMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC1155URIStorageMockUpgradeable.sol deleted file mode 100644 index e12d9c0..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC1155URIStorageMockUpgradeable.sol +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "./ERC1155MockUpgradeable.sol"; -import "../token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract ERC1155URIStorageMockUpgradeable is Initializable, ERC1155MockUpgradeable, ERC1155URIStorageUpgradeable { - function __ERC1155URIStorageMock_init(string memory _uri) internal onlyInitializing { - __ERC1155_init_unchained(_uri); - __ERC1155Mock_init_unchained(_uri); - __ERC1155URIStorage_init_unchained(); - } - - function __ERC1155URIStorageMock_init_unchained(string memory) internal onlyInitializing {} - - function uri(uint256 tokenId) public view override(ERC1155Upgradeable, ERC1155URIStorageUpgradeable) returns (string memory) { - return ERC1155URIStorageUpgradeable.uri(tokenId); - } - - function setURI(uint256 tokenId, string memory _tokenURI) public { - _setURI(tokenId, _tokenURI); - } - - function setBaseURI(string memory baseURI) public { - _setBaseURI(baseURI); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC1271WalletMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC1271WalletMockUpgradeable.sol deleted file mode 100644 index d37d5c1..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC1271WalletMockUpgradeable.sol +++ /dev/null @@ -1,51 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../access/OwnableUpgradeable.sol"; -import "../interfaces/IERC1271Upgradeable.sol"; -import "../utils/cryptography/ECDSAUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract ERC1271WalletMockUpgradeable is Initializable, OwnableUpgradeable, IERC1271Upgradeable { - function __ERC1271WalletMock_init(address originalOwner) internal onlyInitializing { - __Ownable_init_unchained(); - __ERC1271WalletMock_init_unchained(originalOwner); - } - - function __ERC1271WalletMock_init_unchained(address originalOwner) internal onlyInitializing { - transferOwnership(originalOwner); - } - - function isValidSignature(bytes32 hash, bytes memory signature) public view override returns (bytes4 magicValue) { - return ECDSAUpgradeable.recover(hash, signature) == owner() ? this.isValidSignature.selector : bytes4(0); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} - -contract ERC1271MaliciousMockUpgradeable is Initializable, IERC1271Upgradeable { - function __ERC1271MaliciousMock_init() internal onlyInitializing { - } - - function __ERC1271MaliciousMock_init_unchained() internal onlyInitializing { - } - function isValidSignature(bytes32, bytes memory) public pure override returns (bytes4) { - assembly { - mstore(0, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) - return(0, 32) - } - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC165/ERC165InterfacesSupportedUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC165/ERC165InterfacesSupportedUpgradeable.sol deleted file mode 100644 index 34a0954..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC165/ERC165InterfacesSupportedUpgradeable.sol +++ /dev/null @@ -1,82 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../../utils/introspection/IERC165Upgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -/** - * https://eips.ethereum.org/EIPS/eip-214#specification - * From the specification: - * > Any attempts to make state-changing operations inside an execution instance with STATIC set to true will instead - * throw an exception. - * > These operations include [...], LOG0, LOG1, LOG2, [...] - * - * therefore, because this contract is staticcall'd we need to not emit events (which is how solidity-coverage works) - * solidity-coverage ignores the /mocks folder, so we duplicate its implementation here to avoid instrumenting it - */ -contract SupportsInterfaceWithLookupMockUpgradeable is Initializable, IERC165Upgradeable { - /* - * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 - */ - bytes4 public constant INTERFACE_ID_ERC165 = 0x01ffc9a7; - - /** - * @dev A mapping of interface id to whether or not it's supported. - */ - mapping(bytes4 => bool) private _supportedInterfaces; - - /** - * @dev A contract implementing SupportsInterfaceWithLookup - * implement ERC165 itself. - */ - function __SupportsInterfaceWithLookupMock_init() internal onlyInitializing { - __SupportsInterfaceWithLookupMock_init_unchained(); - } - - function __SupportsInterfaceWithLookupMock_init_unchained() internal onlyInitializing { - _registerInterface(INTERFACE_ID_ERC165); - } - - /** - * @dev Implement supportsInterface(bytes4) using a lookup table. - */ - function supportsInterface(bytes4 interfaceId) public view override returns (bool) { - return _supportedInterfaces[interfaceId]; - } - - /** - * @dev Private method for registering an interface. - */ - function _registerInterface(bytes4 interfaceId) internal { - require(interfaceId != 0xffffffff, "ERC165InterfacesSupported: invalid interface id"); - _supportedInterfaces[interfaceId] = true; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} - -contract ERC165InterfacesSupportedUpgradeable is Initializable, SupportsInterfaceWithLookupMockUpgradeable { - function __ERC165InterfacesSupported_init(bytes4[] memory interfaceIds) internal onlyInitializing { - __SupportsInterfaceWithLookupMock_init_unchained(); - __ERC165InterfacesSupported_init_unchained(interfaceIds); - } - - function __ERC165InterfacesSupported_init_unchained(bytes4[] memory interfaceIds) internal onlyInitializing { - for (uint256 i = 0; i < interfaceIds.length; i++) { - _registerInterface(interfaceIds[i]); - } - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC165/ERC165MaliciousDataUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC165/ERC165MaliciousDataUpgradeable.sol deleted file mode 100644 index 781cc46..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC165/ERC165MaliciousDataUpgradeable.sol +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; -import "../../proxy/utils/Initializable.sol"; - -contract ERC165MaliciousDataUpgradeable is Initializable { - function __ERC165MaliciousData_init() internal onlyInitializing { - } - - function __ERC165MaliciousData_init_unchained() internal onlyInitializing { - } - function supportsInterface(bytes4) public pure returns (bool) { - assembly { - mstore(0, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) - return(0, 32) - } - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC165/ERC165MissingDataUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC165/ERC165MissingDataUpgradeable.sol deleted file mode 100644 index 4f5cc99..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC165/ERC165MissingDataUpgradeable.sol +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; -import "../../proxy/utils/Initializable.sol"; - -contract ERC165MissingDataUpgradeable is Initializable { - function __ERC165MissingData_init() internal onlyInitializing { - } - - function __ERC165MissingData_init_unchained() internal onlyInitializing { - } - function supportsInterface(bytes4 interfaceId) public view {} // missing return - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC165/ERC165NotSupportedUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC165/ERC165NotSupportedUpgradeable.sol deleted file mode 100644 index 8aca64b..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC165/ERC165NotSupportedUpgradeable.sol +++ /dev/null @@ -1,18 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; -import "../../proxy/utils/Initializable.sol"; - -contract ERC165NotSupportedUpgradeable is Initializable { function __ERC165NotSupported_init() internal onlyInitializing { - } - - function __ERC165NotSupported_init_unchained() internal onlyInitializing { - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC165/ERC165ReturnBombUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC165/ERC165ReturnBombUpgradeable.sol deleted file mode 100644 index d97e3ea..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC165/ERC165ReturnBombUpgradeable.sol +++ /dev/null @@ -1,31 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../../utils/introspection/IERC165Upgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -contract ERC165ReturnBombMockUpgradeable is Initializable, IERC165Upgradeable { - function __ERC165ReturnBombMock_init() internal onlyInitializing { - } - - function __ERC165ReturnBombMock_init_unchained() internal onlyInitializing { - } - function supportsInterface(bytes4 interfaceId) public pure override returns (bool) { - if (interfaceId == type(IERC165Upgradeable).interfaceId) { - assembly { - mstore(0, 1) - } - } - assembly { - return(0, 101500) - } - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC165CheckerMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC165CheckerMockUpgradeable.sol deleted file mode 100644 index 5a90cf3..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC165CheckerMockUpgradeable.sol +++ /dev/null @@ -1,42 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/introspection/ERC165CheckerUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract ERC165CheckerMockUpgradeable is Initializable { - function __ERC165CheckerMock_init() internal onlyInitializing { - } - - function __ERC165CheckerMock_init_unchained() internal onlyInitializing { - } - using ERC165CheckerUpgradeable for address; - - function supportsERC165(address account) public view returns (bool) { - return account.supportsERC165(); - } - - function supportsInterface(address account, bytes4 interfaceId) public view returns (bool) { - return account.supportsInterface(interfaceId); - } - - function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) public view returns (bool) { - return account.supportsAllInterfaces(interfaceIds); - } - - function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) public view returns (bool[] memory) { - return account.getSupportedInterfaces(interfaceIds); - } - - function supportsERC165InterfaceUnchecked(address account, bytes4 interfaceId) public view returns (bool) { - return account.supportsERC165InterfaceUnchecked(interfaceId); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC165MockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC165MockUpgradeable.sol deleted file mode 100644 index 56618a2..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC165MockUpgradeable.sol +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/introspection/ERC165Upgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract ERC165MockUpgradeable is Initializable, ERC165Upgradeable { function __ERC165Mock_init() internal onlyInitializing { - } - - function __ERC165Mock_init_unchained() internal onlyInitializing { - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC165StorageMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC165StorageMockUpgradeable.sol deleted file mode 100644 index c59fdf5..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC165StorageMockUpgradeable.sol +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/introspection/ERC165StorageUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract ERC165StorageMockUpgradeable is Initializable, ERC165StorageUpgradeable { - function __ERC165StorageMock_init() internal onlyInitializing { - } - - function __ERC165StorageMock_init_unchained() internal onlyInitializing { - } - function registerInterface(bytes4 interfaceId) public { - _registerInterface(interfaceId); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC1820ImplementerMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC1820ImplementerMockUpgradeable.sol deleted file mode 100644 index e0d529d..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC1820ImplementerMockUpgradeable.sol +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/introspection/ERC1820ImplementerUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract ERC1820ImplementerMockUpgradeable is Initializable, ERC1820ImplementerUpgradeable { - function __ERC1820ImplementerMock_init() internal onlyInitializing { - } - - function __ERC1820ImplementerMock_init_unchained() internal onlyInitializing { - } - function registerInterfaceForAddress(bytes32 interfaceHash, address account) public { - _registerInterfaceForAddress(interfaceHash, account); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC20BurnableMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC20BurnableMockUpgradeable.sol deleted file mode 100644 index 2245185..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC20BurnableMockUpgradeable.sol +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC20/extensions/ERC20BurnableUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract ERC20BurnableMockUpgradeable is Initializable, ERC20BurnableUpgradeable { - function __ERC20BurnableMock_init( - string memory name, - string memory symbol, - address initialAccount, - uint256 initialBalance - ) internal onlyInitializing { - __ERC20_init_unchained(name, symbol); - __ERC20BurnableMock_init_unchained(name, symbol, initialAccount, initialBalance); - } - - function __ERC20BurnableMock_init_unchained( - string memory, - string memory, - address initialAccount, - uint256 initialBalance - ) internal onlyInitializing { - _mint(initialAccount, initialBalance); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC20CappedMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC20CappedMockUpgradeable.sol deleted file mode 100644 index e3945b2..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC20CappedMockUpgradeable.sol +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC20/extensions/ERC20CappedUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract ERC20CappedMockUpgradeable is Initializable, ERC20CappedUpgradeable { - function __ERC20CappedMock_init( - string memory name, - string memory symbol, - uint256 cap - ) internal onlyInitializing { - __ERC20_init_unchained(name, symbol); - __ERC20Capped_init_unchained(cap); - } - - function __ERC20CappedMock_init_unchained( - string memory, - string memory, - uint256 - ) internal onlyInitializing {} - - function mint(address to, uint256 tokenId) public { - _mint(to, tokenId); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC20DecimalsMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC20DecimalsMockUpgradeable.sol deleted file mode 100644 index 32b6702..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC20DecimalsMockUpgradeable.sol +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC20/ERC20Upgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract ERC20DecimalsMockUpgradeable is Initializable, ERC20Upgradeable { - uint8 private _decimals; - - function __ERC20DecimalsMock_init( - string memory name_, - string memory symbol_, - uint8 decimals_ - ) internal onlyInitializing { - __ERC20_init_unchained(name_, symbol_); - __ERC20DecimalsMock_init_unchained(name_, symbol_, decimals_); - } - - function __ERC20DecimalsMock_init_unchained( - string memory, - string memory, - uint8 decimals_ - ) internal onlyInitializing { - _decimals = decimals_; - } - - function decimals() public view override returns (uint8) { - return _decimals; - } - - function mint(address account, uint256 amount) public { - _mint(account, amount); - } - - function burn(address account, uint256 amount) public { - _burn(account, amount); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC20FlashMintMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC20FlashMintMockUpgradeable.sol deleted file mode 100644 index 75e120d..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC20FlashMintMockUpgradeable.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC20/extensions/ERC20FlashMintUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract ERC20FlashMintMockUpgradeable is Initializable, ERC20FlashMintUpgradeable { - uint256 _flashFeeAmount; - address _flashFeeReceiverAddress; - - function __ERC20FlashMintMock_init( - string memory name, - string memory symbol, - address initialAccount, - uint256 initialBalance - ) internal onlyInitializing { - __ERC20_init_unchained(name, symbol); - __ERC20FlashMintMock_init_unchained(name, symbol, initialAccount, initialBalance); - } - - function __ERC20FlashMintMock_init_unchained( - string memory, - string memory, - address initialAccount, - uint256 initialBalance - ) internal onlyInitializing { - _mint(initialAccount, initialBalance); - } - - function mint(address account, uint256 amount) public { - _mint(account, amount); - } - - function setFlashFee(uint256 amount) public { - _flashFeeAmount = amount; - } - - function _flashFee(address, uint256) internal view override returns (uint256) { - return _flashFeeAmount; - } - - function setFlashFeeReceiver(address receiver) public { - _flashFeeReceiverAddress = receiver; - } - - function flashFeeReceiver() public view returns (address) { - return _flashFeeReceiver(); - } - - function _flashFeeReceiver() internal view override returns (address) { - return _flashFeeReceiverAddress; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[48] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC20MockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC20MockUpgradeable.sol deleted file mode 100644 index ec5247f..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC20MockUpgradeable.sol +++ /dev/null @@ -1,59 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC20/ERC20Upgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -// mock class using ERC20 -contract ERC20MockUpgradeable is Initializable, ERC20Upgradeable { - function __ERC20Mock_init( - string memory name, - string memory symbol, - address initialAccount, - uint256 initialBalance - ) internal onlyInitializing { - __ERC20_init_unchained(name, symbol); - __ERC20Mock_init_unchained(name, symbol, initialAccount, initialBalance); - } - - function __ERC20Mock_init_unchained( - string memory, - string memory, - address initialAccount, - uint256 initialBalance - ) internal onlyInitializing { - _mint(initialAccount, initialBalance); - } - - function mint(address account, uint256 amount) public { - _mint(account, amount); - } - - function burn(address account, uint256 amount) public { - _burn(account, amount); - } - - function transferInternal( - address from, - address to, - uint256 value - ) public { - _transfer(from, to, value); - } - - function approveInternal( - address owner, - address spender, - uint256 value - ) public { - _approve(owner, spender, value); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC20PausableMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC20PausableMockUpgradeable.sol deleted file mode 100644 index 78aeeba..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC20PausableMockUpgradeable.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC20/extensions/ERC20PausableUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -// mock class using ERC20Pausable -contract ERC20PausableMockUpgradeable is Initializable, ERC20PausableUpgradeable { - function __ERC20PausableMock_init( - string memory name, - string memory symbol, - address initialAccount, - uint256 initialBalance - ) internal onlyInitializing { - __ERC20_init_unchained(name, symbol); - __Pausable_init_unchained(); - __ERC20PausableMock_init_unchained(name, symbol, initialAccount, initialBalance); - } - - function __ERC20PausableMock_init_unchained( - string memory, - string memory, - address initialAccount, - uint256 initialBalance - ) internal onlyInitializing { - _mint(initialAccount, initialBalance); - } - - function pause() external { - _pause(); - } - - function unpause() external { - _unpause(); - } - - function mint(address to, uint256 amount) public { - _mint(to, amount); - } - - function burn(address from, uint256 amount) public { - _burn(from, amount); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC20PermitMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC20PermitMockUpgradeable.sol deleted file mode 100644 index 9a80668..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC20PermitMockUpgradeable.sol +++ /dev/null @@ -1,40 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC20/extensions/draft-ERC20PermitUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract ERC20PermitMockUpgradeable is Initializable, ERC20PermitUpgradeable { - function __ERC20PermitMock_init( - string memory name, - string memory symbol, - address initialAccount, - uint256 initialBalance - ) internal onlyInitializing { - __ERC20_init_unchained(name, symbol); - __EIP712_init_unchained(name, "1"); - __ERC20Permit_init_unchained(name); - __ERC20PermitMock_init_unchained(name, symbol, initialAccount, initialBalance); - } - - function __ERC20PermitMock_init_unchained( - string memory, - string memory, - address initialAccount, - uint256 initialBalance - ) internal onlyInitializing { - _mint(initialAccount, initialBalance); - } - - function getChainId() external view returns (uint256) { - return block.chainid; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC20SnapshotMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC20SnapshotMockUpgradeable.sol deleted file mode 100644 index 40fba6c..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC20SnapshotMockUpgradeable.sol +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC20/extensions/ERC20SnapshotUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract ERC20SnapshotMockUpgradeable is Initializable, ERC20SnapshotUpgradeable { - function __ERC20SnapshotMock_init( - string memory name, - string memory symbol, - address initialAccount, - uint256 initialBalance - ) internal onlyInitializing { - __ERC20_init_unchained(name, symbol); - __ERC20SnapshotMock_init_unchained(name, symbol, initialAccount, initialBalance); - } - - function __ERC20SnapshotMock_init_unchained( - string memory, - string memory, - address initialAccount, - uint256 initialBalance - ) internal onlyInitializing { - _mint(initialAccount, initialBalance); - } - - function snapshot() public { - _snapshot(); - } - - function mint(address account, uint256 amount) public { - _mint(account, amount); - } - - function burn(address account, uint256 amount) public { - _burn(account, amount); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC20VotesCompMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC20VotesCompMockUpgradeable.sol deleted file mode 100644 index 7e6e5c8..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC20VotesCompMockUpgradeable.sol +++ /dev/null @@ -1,35 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC20/extensions/ERC20VotesCompUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract ERC20VotesCompMockUpgradeable is Initializable, ERC20VotesCompUpgradeable { - function __ERC20VotesCompMock_init(string memory name, string memory symbol) internal onlyInitializing { - __ERC20_init_unchained(name, symbol); - __EIP712_init_unchained(name, "1"); - __ERC20Permit_init_unchained(name); - } - - function __ERC20VotesCompMock_init_unchained(string memory, string memory) internal onlyInitializing {} - - function mint(address account, uint256 amount) public { - _mint(account, amount); - } - - function burn(address account, uint256 amount) public { - _burn(account, amount); - } - - function getChainId() external view returns (uint256) { - return block.chainid; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC20VotesMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC20VotesMockUpgradeable.sol deleted file mode 100644 index 2edea9d..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC20VotesMockUpgradeable.sol +++ /dev/null @@ -1,35 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC20/extensions/ERC20VotesUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract ERC20VotesMockUpgradeable is Initializable, ERC20VotesUpgradeable { - function __ERC20VotesMock_init(string memory name, string memory symbol) internal onlyInitializing { - __ERC20_init_unchained(name, symbol); - __EIP712_init_unchained(name, "1"); - __ERC20Permit_init_unchained(name); - } - - function __ERC20VotesMock_init_unchained(string memory, string memory) internal onlyInitializing {} - - function mint(address account, uint256 amount) public { - _mint(account, amount); - } - - function burn(address account, uint256 amount) public { - _burn(account, amount); - } - - function getChainId() external view returns (uint256) { - return block.chainid; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC20WrapperMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC20WrapperMockUpgradeable.sol deleted file mode 100644 index f2cdf4d..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC20WrapperMockUpgradeable.sol +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC20/extensions/ERC20WrapperUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract ERC20WrapperMockUpgradeable is Initializable, ERC20WrapperUpgradeable { - function __ERC20WrapperMock_init( - IERC20Upgradeable _underlyingToken, - string memory name, - string memory symbol - ) internal onlyInitializing { - __ERC20_init_unchained(name, symbol); - __ERC20Wrapper_init_unchained(_underlyingToken); - } - - function __ERC20WrapperMock_init_unchained( - IERC20Upgradeable, - string memory, - string memory - ) internal onlyInitializing {} - - function recover(address account) public returns (uint256) { - return _recover(account); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC2771ContextMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC2771ContextMockUpgradeable.sol deleted file mode 100644 index 7df5c31..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC2771ContextMockUpgradeable.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.9; - -import "./ContextMockUpgradeable.sol"; -import "../metatx/ERC2771ContextUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -// By inheriting from ERC2771Context, Context's internal functions are overridden automatically -contract ERC2771ContextMockUpgradeable is Initializable, ContextMockUpgradeable, ERC2771ContextUpgradeable { - /// @custom:oz-upgrades-unsafe-allow constructor - constructor(address trustedForwarder) ERC2771ContextUpgradeable(trustedForwarder) { - emit Sender(_msgSender()); // _msgSender() should be accessible during construction - } - - function _msgSender() internal view override(ContextUpgradeable, ERC2771ContextUpgradeable) returns (address) { - return ERC2771ContextUpgradeable._msgSender(); - } - - function _msgData() internal view override(ContextUpgradeable, ERC2771ContextUpgradeable) returns (bytes calldata) { - return ERC2771ContextUpgradeable._msgData(); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC3156FlashBorrowerMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC3156FlashBorrowerMockUpgradeable.sol deleted file mode 100644 index 6e8e883..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC3156FlashBorrowerMockUpgradeable.sol +++ /dev/null @@ -1,65 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC20/IERC20Upgradeable.sol"; -import "../interfaces/IERC3156Upgradeable.sol"; -import "../utils/AddressUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -/** - * @dev WARNING: this IERC3156FlashBorrower mock implementation is for testing purposes ONLY. - * Writing a secure flash lock borrower is not an easy task, and should be done with the utmost care. - * This is not an example of how it should be done, and no pattern present in this mock should be considered secure. - * Following best practices, always have your contract properly audited before using them to manipulate important funds on - * live networks. - */ -contract ERC3156FlashBorrowerMockUpgradeable is Initializable, IERC3156FlashBorrowerUpgradeable { - bytes32 internal constant _RETURN_VALUE = keccak256("ERC3156FlashBorrower.onFlashLoan"); - - bool _enableApprove; - bool _enableReturn; - - event BalanceOf(address token, address account, uint256 value); - event TotalSupply(address token, uint256 value); - - function __ERC3156FlashBorrowerMock_init(bool enableReturn, bool enableApprove) internal onlyInitializing { - __ERC3156FlashBorrowerMock_init_unchained(enableReturn, enableApprove); - } - - function __ERC3156FlashBorrowerMock_init_unchained(bool enableReturn, bool enableApprove) internal onlyInitializing { - _enableApprove = enableApprove; - _enableReturn = enableReturn; - } - - function onFlashLoan( - address, /*initiator*/ - address token, - uint256 amount, - uint256 fee, - bytes calldata data - ) public override returns (bytes32) { - require(msg.sender == token); - - emit BalanceOf(token, address(this), IERC20Upgradeable(token).balanceOf(address(this))); - emit TotalSupply(token, IERC20Upgradeable(token).totalSupply()); - - if (data.length > 0) { - // WARNING: This code is for testing purposes only! Do not use. - AddressUpgradeable.functionCall(token, data); - } - - if (_enableApprove) { - IERC20Upgradeable(token).approve(token, amount + fee); - } - - return _enableReturn ? _RETURN_VALUE : bytes32(0); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC4626MockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC4626MockUpgradeable.sol deleted file mode 100644 index 1afe4ee..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC4626MockUpgradeable.sol +++ /dev/null @@ -1,96 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC20/extensions/ERC4626Upgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract ERC4626MockUpgradeable is Initializable, ERC4626Upgradeable { - function __ERC4626Mock_init( - IERC20MetadataUpgradeable asset, - string memory name, - string memory symbol - ) internal onlyInitializing { - __ERC20_init_unchained(name, symbol); - __ERC4626_init_unchained(asset); - } - - function __ERC4626Mock_init_unchained( - IERC20MetadataUpgradeable, - string memory, - string memory - ) internal onlyInitializing {} - - function mockMint(address account, uint256 amount) public { - _mint(account, amount); - } - - function mockBurn(address account, uint256 amount) public { - _burn(account, amount); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} - -contract ERC4626DecimalMockUpgradeable is Initializable, ERC4626MockUpgradeable { - using MathUpgradeable for uint256; - - uint8 private _decimals; - - function __ERC4626DecimalMock_init( - IERC20MetadataUpgradeable asset, - string memory name, - string memory symbol, - uint8 decimalsOverride - ) internal onlyInitializing { - __ERC20_init_unchained(name, symbol); - __ERC4626_init_unchained(asset); - __ERC4626Mock_init_unchained(asset, name, symbol); - __ERC4626DecimalMock_init_unchained(asset, name, symbol, decimalsOverride); - } - - function __ERC4626DecimalMock_init_unchained( - IERC20MetadataUpgradeable, - string memory, - string memory, - uint8 decimalsOverride - ) internal onlyInitializing { - _decimals = decimalsOverride; - } - - function decimals() public view virtual override returns (uint8) { - return _decimals; - } - - function _initialConvertToShares(uint256 assets, MathUpgradeable.Rounding rounding) - internal - view - virtual - override - returns (uint256 shares) - { - return assets.mulDiv(10**decimals(), 10**super.decimals(), rounding); - } - - function _initialConvertToAssets(uint256 shares, MathUpgradeable.Rounding rounding) - internal - view - virtual - override - returns (uint256 assets) - { - return shares.mulDiv(10**super.decimals(), 10**decimals(), rounding); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC721BurnableMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC721BurnableMockUpgradeable.sol deleted file mode 100644 index cfeca43..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC721BurnableMockUpgradeable.sol +++ /dev/null @@ -1,41 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC721/extensions/ERC721BurnableUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract ERC721BurnableMockUpgradeable is Initializable, ERC721BurnableUpgradeable { - function __ERC721BurnableMock_init(string memory name, string memory symbol) internal onlyInitializing { - __ERC721_init_unchained(name, symbol); - } - - function __ERC721BurnableMock_init_unchained(string memory, string memory) internal onlyInitializing {} - - function exists(uint256 tokenId) public view returns (bool) { - return _exists(tokenId); - } - - function mint(address to, uint256 tokenId) public { - _mint(to, tokenId); - } - - function safeMint(address to, uint256 tokenId) public { - _safeMint(to, tokenId); - } - - function safeMint( - address to, - uint256 tokenId, - bytes memory _data - ) public { - _safeMint(to, tokenId, _data); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC721ConsecutiveEnumerableMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC721ConsecutiveEnumerableMockUpgradeable.sol deleted file mode 100644 index c2a165e..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC721ConsecutiveEnumerableMockUpgradeable.sol +++ /dev/null @@ -1,73 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC721/extensions/ERC721ConsecutiveUpgradeable.sol"; -import "../token/ERC721/extensions/ERC721EnumerableUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract ERC721ConsecutiveEnumerableMockUpgradeable is Initializable, ERC721ConsecutiveUpgradeable, ERC721EnumerableUpgradeable { - function __ERC721ConsecutiveEnumerableMock_init( - string memory name, - string memory symbol, - address[] memory receivers, - uint96[] memory amounts - ) internal onlyInitializing { - __ERC721_init_unchained(name, symbol); - __ERC721ConsecutiveEnumerableMock_init_unchained(name, symbol, receivers, amounts); - } - - function __ERC721ConsecutiveEnumerableMock_init_unchained( - string memory, - string memory, - address[] memory receivers, - uint96[] memory amounts - ) internal onlyInitializing { - for (uint256 i = 0; i < receivers.length; ++i) { - _mintConsecutive(receivers[i], amounts[i]); - } - } - - function supportsInterface(bytes4 interfaceId) - public - view - virtual - override(ERC721Upgradeable, ERC721EnumerableUpgradeable) - returns (bool) - { - return super.supportsInterface(interfaceId); - } - - function _ownerOf(uint256 tokenId) internal view virtual override(ERC721Upgradeable, ERC721ConsecutiveUpgradeable) returns (address) { - return super._ownerOf(tokenId); - } - - function _mint(address to, uint256 tokenId) internal virtual override(ERC721Upgradeable, ERC721ConsecutiveUpgradeable) { - super._mint(to, tokenId); - } - - function _beforeTokenTransfer( - address from, - address to, - uint256 firstTokenId, - uint256 batchSize - ) internal virtual override(ERC721Upgradeable, ERC721EnumerableUpgradeable) { - super._beforeTokenTransfer(from, to, firstTokenId, batchSize); - } - - function _afterTokenTransfer( - address from, - address to, - uint256 firstTokenId, - uint256 batchSize - ) internal virtual override(ERC721Upgradeable, ERC721ConsecutiveUpgradeable) { - super._afterTokenTransfer(from, to, firstTokenId, batchSize); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC721ConsecutiveMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC721ConsecutiveMockUpgradeable.sol deleted file mode 100644 index 32931f8..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC721ConsecutiveMockUpgradeable.sol +++ /dev/null @@ -1,119 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC721/extensions/ERC721BurnableUpgradeable.sol"; -import "../token/ERC721/extensions/ERC721ConsecutiveUpgradeable.sol"; -import "../token/ERC721/extensions/ERC721EnumerableUpgradeable.sol"; -import "../token/ERC721/extensions/ERC721PausableUpgradeable.sol"; -import "../token/ERC721/extensions/ERC721VotesUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -/** - * @title ERC721ConsecutiveMock - */ -contract ERC721ConsecutiveMockUpgradeable is Initializable, ERC721BurnableUpgradeable, ERC721ConsecutiveUpgradeable, ERC721PausableUpgradeable, ERC721VotesUpgradeable { - function __ERC721ConsecutiveMock_init( - string memory name, - string memory symbol, - address[] memory delegates, - address[] memory receivers, - uint96[] memory amounts - ) internal onlyInitializing { - __ERC721_init_unchained(name, symbol); - __Pausable_init_unchained(); - __EIP712_init_unchained(name, "1"); - __ERC721ConsecutiveMock_init_unchained(name, symbol, delegates, receivers, amounts); - } - - function __ERC721ConsecutiveMock_init_unchained( - string memory, - string memory, - address[] memory delegates, - address[] memory receivers, - uint96[] memory amounts - ) internal onlyInitializing { - for (uint256 i = 0; i < delegates.length; ++i) { - _delegate(delegates[i], delegates[i]); - } - - for (uint256 i = 0; i < receivers.length; ++i) { - _mintConsecutive(receivers[i], amounts[i]); - } - } - - function pause() external { - _pause(); - } - - function unpause() external { - _unpause(); - } - - function exists(uint256 tokenId) public view returns (bool) { - return _exists(tokenId); - } - - function mint(address to, uint256 tokenId) public { - _mint(to, tokenId); - } - - function mintConsecutive(address to, uint96 amount) public { - _mintConsecutive(to, amount); - } - - function safeMint(address to, uint256 tokenId) public { - _safeMint(to, tokenId); - } - - function _ownerOf(uint256 tokenId) internal view virtual override(ERC721Upgradeable, ERC721ConsecutiveUpgradeable) returns (address) { - return super._ownerOf(tokenId); - } - - function _mint(address to, uint256 tokenId) internal virtual override(ERC721Upgradeable, ERC721ConsecutiveUpgradeable) { - super._mint(to, tokenId); - } - - function _beforeTokenTransfer( - address from, - address to, - uint256 firstTokenId, - uint256 batchSize - ) internal virtual override(ERC721Upgradeable, ERC721PausableUpgradeable) { - super._beforeTokenTransfer(from, to, firstTokenId, batchSize); - } - - function _afterTokenTransfer( - address from, - address to, - uint256 firstTokenId, - uint256 batchSize - ) internal virtual override(ERC721Upgradeable, ERC721VotesUpgradeable, ERC721ConsecutiveUpgradeable) { - super._afterTokenTransfer(from, to, firstTokenId, batchSize); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} - -contract ERC721ConsecutiveNoConstructorMintMockUpgradeable is Initializable, ERC721ConsecutiveUpgradeable { - function __ERC721ConsecutiveNoConstructorMintMock_init(string memory name, string memory symbol) internal onlyInitializing { - __ERC721_init_unchained(name, symbol); - __ERC721ConsecutiveNoConstructorMintMock_init_unchained(name, symbol); - } - - function __ERC721ConsecutiveNoConstructorMintMock_init_unchained(string memory, string memory) internal onlyInitializing { - _mint(msg.sender, 0); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC721EnumerableMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC721EnumerableMockUpgradeable.sol deleted file mode 100644 index a1e8e18..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC721EnumerableMockUpgradeable.sol +++ /dev/null @@ -1,63 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC721/extensions/ERC721EnumerableUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -/** - * @title ERC721Mock - * This mock just provides a public safeMint, mint, and burn functions for testing purposes - */ -contract ERC721EnumerableMockUpgradeable is Initializable, ERC721EnumerableUpgradeable { - string private _baseTokenURI; - - function __ERC721EnumerableMock_init(string memory name, string memory symbol) internal onlyInitializing { - __ERC721_init_unchained(name, symbol); - } - - function __ERC721EnumerableMock_init_unchained(string memory, string memory) internal onlyInitializing {} - - function _baseURI() internal view override returns (string memory) { - return _baseTokenURI; - } - - function setBaseURI(string calldata newBaseTokenURI) public { - _baseTokenURI = newBaseTokenURI; - } - - function baseURI() public view returns (string memory) { - return _baseURI(); - } - - function exists(uint256 tokenId) public view returns (bool) { - return _exists(tokenId); - } - - function mint(address to, uint256 tokenId) public { - _mint(to, tokenId); - } - - function safeMint(address to, uint256 tokenId) public { - _safeMint(to, tokenId); - } - - function safeMint( - address to, - uint256 tokenId, - bytes memory _data - ) public { - _safeMint(to, tokenId, _data); - } - - function burn(uint256 tokenId) public { - _burn(tokenId); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC721MockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC721MockUpgradeable.sol deleted file mode 100644 index 94c90ee..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC721MockUpgradeable.sol +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC721/ERC721Upgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -/** - * @title ERC721Mock - * This mock just provides a public safeMint, mint, and burn functions for testing purposes - */ -contract ERC721MockUpgradeable is Initializable, ERC721Upgradeable { - function __ERC721Mock_init(string memory name, string memory symbol) internal onlyInitializing { - __ERC721_init_unchained(name, symbol); - } - - function __ERC721Mock_init_unchained(string memory, string memory) internal onlyInitializing {} - - function baseURI() public view returns (string memory) { - return _baseURI(); - } - - function exists(uint256 tokenId) public view returns (bool) { - return _exists(tokenId); - } - - function mint(address to, uint256 tokenId) public { - _mint(to, tokenId); - } - - function safeMint(address to, uint256 tokenId) public { - _safeMint(to, tokenId); - } - - function safeMint( - address to, - uint256 tokenId, - bytes memory _data - ) public { - _safeMint(to, tokenId, _data); - } - - function burn(uint256 tokenId) public { - _burn(tokenId); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC721PausableMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC721PausableMockUpgradeable.sol deleted file mode 100644 index 2ecd621..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC721PausableMockUpgradeable.sol +++ /dev/null @@ -1,58 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC721/extensions/ERC721PausableUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -/** - * @title ERC721PausableMock - * This mock just provides a public mint, burn and exists functions for testing purposes - */ -contract ERC721PausableMockUpgradeable is Initializable, ERC721PausableUpgradeable { - function __ERC721PausableMock_init(string memory name, string memory symbol) internal onlyInitializing { - __ERC721_init_unchained(name, symbol); - __Pausable_init_unchained(); - } - - function __ERC721PausableMock_init_unchained(string memory, string memory) internal onlyInitializing {} - - function pause() external { - _pause(); - } - - function unpause() external { - _unpause(); - } - - function exists(uint256 tokenId) public view returns (bool) { - return _exists(tokenId); - } - - function mint(address to, uint256 tokenId) public { - _mint(to, tokenId); - } - - function safeMint(address to, uint256 tokenId) public { - _safeMint(to, tokenId); - } - - function safeMint( - address to, - uint256 tokenId, - bytes memory _data - ) public { - _safeMint(to, tokenId, _data); - } - - function burn(uint256 tokenId) public { - _burn(tokenId); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC721ReceiverMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC721ReceiverMockUpgradeable.sol deleted file mode 100644 index 4696d5d..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC721ReceiverMockUpgradeable.sol +++ /dev/null @@ -1,54 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC721/IERC721ReceiverUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract ERC721ReceiverMockUpgradeable is Initializable, IERC721ReceiverUpgradeable { - enum Error { - None, - RevertWithMessage, - RevertWithoutMessage, - Panic - } - - bytes4 private _retval; - Error private _error; - - event Received(address operator, address from, uint256 tokenId, bytes data, uint256 gas); - - function __ERC721ReceiverMock_init(bytes4 retval, Error error) internal onlyInitializing { - __ERC721ReceiverMock_init_unchained(retval, error); - } - - function __ERC721ReceiverMock_init_unchained(bytes4 retval, Error error) internal onlyInitializing { - _retval = retval; - _error = error; - } - - function onERC721Received( - address operator, - address from, - uint256 tokenId, - bytes memory data - ) public override returns (bytes4) { - if (_error == Error.RevertWithMessage) { - revert("ERC721ReceiverMock: reverting"); - } else if (_error == Error.RevertWithoutMessage) { - revert(); - } else if (_error == Error.Panic) { - uint256 a = uint256(0) / uint256(0); - a; - } - emit Received(operator, from, tokenId, data, gasleft()); - return _retval; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC721RoyaltyMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC721RoyaltyMockUpgradeable.sol deleted file mode 100644 index 9fb7133..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC721RoyaltyMockUpgradeable.sol +++ /dev/null @@ -1,45 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC721/extensions/ERC721RoyaltyUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract ERC721RoyaltyMockUpgradeable is Initializable, ERC721RoyaltyUpgradeable { - function __ERC721RoyaltyMock_init(string memory name, string memory symbol) internal onlyInitializing { - __ERC721_init_unchained(name, symbol); - } - - function __ERC721RoyaltyMock_init_unchained(string memory, string memory) internal onlyInitializing {} - - function setTokenRoyalty( - uint256 tokenId, - address recipient, - uint96 fraction - ) public { - _setTokenRoyalty(tokenId, recipient, fraction); - } - - function setDefaultRoyalty(address recipient, uint96 fraction) public { - _setDefaultRoyalty(recipient, fraction); - } - - function mint(address to, uint256 tokenId) public { - _mint(to, tokenId); - } - - function burn(uint256 tokenId) public { - _burn(tokenId); - } - - function deleteDefaultRoyalty() public { - _deleteDefaultRoyalty(); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC721URIStorageMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC721URIStorageMockUpgradeable.sol deleted file mode 100644 index 753f22f..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC721URIStorageMockUpgradeable.sol +++ /dev/null @@ -1,67 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC721/extensions/ERC721URIStorageUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -/** - * @title ERC721Mock - * This mock just provides a public safeMint, mint, and burn functions for testing purposes - */ -contract ERC721URIStorageMockUpgradeable is Initializable, ERC721URIStorageUpgradeable { - string private _baseTokenURI; - - function __ERC721URIStorageMock_init(string memory name, string memory symbol) internal onlyInitializing { - __ERC721_init_unchained(name, symbol); - } - - function __ERC721URIStorageMock_init_unchained(string memory, string memory) internal onlyInitializing {} - - function _baseURI() internal view override returns (string memory) { - return _baseTokenURI; - } - - function setBaseURI(string calldata newBaseTokenURI) public { - _baseTokenURI = newBaseTokenURI; - } - - function baseURI() public view returns (string memory) { - return _baseURI(); - } - - function setTokenURI(uint256 tokenId, string memory _tokenURI) public { - _setTokenURI(tokenId, _tokenURI); - } - - function exists(uint256 tokenId) public view returns (bool) { - return _exists(tokenId); - } - - function mint(address to, uint256 tokenId) public { - _mint(to, tokenId); - } - - function safeMint(address to, uint256 tokenId) public { - _safeMint(to, tokenId); - } - - function safeMint( - address to, - uint256 tokenId, - bytes memory _data - ) public { - _safeMint(to, tokenId, _data); - } - - function burn(uint256 tokenId) public { - _burn(tokenId); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC721VotesMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC721VotesMockUpgradeable.sol deleted file mode 100644 index 6cfa7e8..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC721VotesMockUpgradeable.sol +++ /dev/null @@ -1,38 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC721/extensions/ERC721VotesUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract ERC721VotesMockUpgradeable is Initializable, ERC721VotesUpgradeable { - function __ERC721VotesMock_init(string memory name, string memory symbol) internal onlyInitializing { - __ERC721_init_unchained(name, symbol); - __EIP712_init_unchained(name, "1"); - } - - function __ERC721VotesMock_init_unchained(string memory, string memory) internal onlyInitializing {} - - function getTotalSupply() public view returns (uint256) { - return _getTotalSupply(); - } - - function mint(address account, uint256 tokenId) public { - _mint(account, tokenId); - } - - function burn(uint256 tokenId) public { - _burn(tokenId); - } - - function getChainId() external view returns (uint256) { - return block.chainid; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC777MockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC777MockUpgradeable.sol deleted file mode 100644 index d437571..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC777MockUpgradeable.sol +++ /dev/null @@ -1,75 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/ContextUpgradeable.sol"; -import "../token/ERC777/ERC777Upgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract ERC777MockUpgradeable is Initializable, ContextUpgradeable, ERC777Upgradeable { - event BeforeTokenTransfer(); - - function __ERC777Mock_init( - address initialHolder, - uint256 initialBalance, - string memory name, - string memory symbol, - address[] memory defaultOperators - ) internal onlyInitializing { - __ERC777_init_unchained(name, symbol, defaultOperators); - __ERC777Mock_init_unchained(initialHolder, initialBalance, name, symbol, defaultOperators); - } - - function __ERC777Mock_init_unchained( - address initialHolder, - uint256 initialBalance, - string memory, - string memory, - address[] memory - ) internal onlyInitializing { - _mint(initialHolder, initialBalance, "", ""); - } - - function mintInternal( - address to, - uint256 amount, - bytes memory userData, - bytes memory operatorData - ) public { - _mint(to, amount, userData, operatorData); - } - - function mintInternalExtended( - address to, - uint256 amount, - bytes memory userData, - bytes memory operatorData, - bool requireReceptionAck - ) public { - _mint(to, amount, userData, operatorData, requireReceptionAck); - } - - function approveInternal( - address holder, - address spender, - uint256 value - ) public { - _approve(holder, spender, value); - } - - function _beforeTokenTransfer( - address, - address, - address, - uint256 - ) internal override { - emit BeforeTokenTransfer(); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC777SenderRecipientMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC777SenderRecipientMockUpgradeable.sol deleted file mode 100644 index a79dd12..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ERC777SenderRecipientMockUpgradeable.sol +++ /dev/null @@ -1,176 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../token/ERC777/IERC777Upgradeable.sol"; -import "../token/ERC777/IERC777SenderUpgradeable.sol"; -import "../token/ERC777/IERC777RecipientUpgradeable.sol"; -import "../utils/ContextUpgradeable.sol"; -import "../utils/introspection/IERC1820RegistryUpgradeable.sol"; -import "../utils/introspection/ERC1820ImplementerUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract ERC777SenderRecipientMockUpgradeable is Initializable, ContextUpgradeable, IERC777SenderUpgradeable, IERC777RecipientUpgradeable, ERC1820ImplementerUpgradeable { - function __ERC777SenderRecipientMock_init() internal onlyInitializing { - __ERC777SenderRecipientMock_init_unchained(); - } - - function __ERC777SenderRecipientMock_init_unchained() internal onlyInitializing { - _erc1820 = IERC1820RegistryUpgradeable(0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24); - } - event TokensToSendCalled( - address operator, - address from, - address to, - uint256 amount, - bytes data, - bytes operatorData, - address token, - uint256 fromBalance, - uint256 toBalance - ); - - event TokensReceivedCalled( - address operator, - address from, - address to, - uint256 amount, - bytes data, - bytes operatorData, - address token, - uint256 fromBalance, - uint256 toBalance - ); - - // Emitted in ERC777Mock. Here for easier decoding - event BeforeTokenTransfer(); - - bool private _shouldRevertSend; - bool private _shouldRevertReceive; - - IERC1820RegistryUpgradeable private _erc1820; - - bytes32 private constant _TOKENS_SENDER_INTERFACE_HASH = keccak256("ERC777TokensSender"); - bytes32 private constant _TOKENS_RECIPIENT_INTERFACE_HASH = keccak256("ERC777TokensRecipient"); - - function tokensToSend( - address operator, - address from, - address to, - uint256 amount, - bytes calldata userData, - bytes calldata operatorData - ) external override { - if (_shouldRevertSend) { - revert(); - } - - IERC777Upgradeable token = IERC777Upgradeable(_msgSender()); - - uint256 fromBalance = token.balanceOf(from); - // when called due to burn, to will be the zero address, which will have a balance of 0 - uint256 toBalance = token.balanceOf(to); - - emit TokensToSendCalled( - operator, - from, - to, - amount, - userData, - operatorData, - address(token), - fromBalance, - toBalance - ); - } - - function tokensReceived( - address operator, - address from, - address to, - uint256 amount, - bytes calldata userData, - bytes calldata operatorData - ) external override { - if (_shouldRevertReceive) { - revert(); - } - - IERC777Upgradeable token = IERC777Upgradeable(_msgSender()); - - uint256 fromBalance = token.balanceOf(from); - // when called due to burn, to will be the zero address, which will have a balance of 0 - uint256 toBalance = token.balanceOf(to); - - emit TokensReceivedCalled( - operator, - from, - to, - amount, - userData, - operatorData, - address(token), - fromBalance, - toBalance - ); - } - - function senderFor(address account) public { - _registerInterfaceForAddress(_TOKENS_SENDER_INTERFACE_HASH, account); - - address self = address(this); - if (account == self) { - registerSender(self); - } - } - - function registerSender(address sender) public { - _erc1820.setInterfaceImplementer(address(this), _TOKENS_SENDER_INTERFACE_HASH, sender); - } - - function recipientFor(address account) public { - _registerInterfaceForAddress(_TOKENS_RECIPIENT_INTERFACE_HASH, account); - - address self = address(this); - if (account == self) { - registerRecipient(self); - } - } - - function registerRecipient(address recipient) public { - _erc1820.setInterfaceImplementer(address(this), _TOKENS_RECIPIENT_INTERFACE_HASH, recipient); - } - - function setShouldRevertSend(bool shouldRevert) public { - _shouldRevertSend = shouldRevert; - } - - function setShouldRevertReceive(bool shouldRevert) public { - _shouldRevertReceive = shouldRevert; - } - - function send( - IERC777Upgradeable token, - address to, - uint256 amount, - bytes memory data - ) public { - // This is 777's send function, not the Solidity send function - token.send(to, amount, data); // solhint-disable-line check-send-result - } - - function burn( - IERC777Upgradeable token, - uint256 amount, - bytes memory data - ) public { - token.burn(amount, data); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/EnumerableMapMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/EnumerableMapMockUpgradeable.sol deleted file mode 100644 index 8f41925..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/EnumerableMapMockUpgradeable.sol +++ /dev/null @@ -1,282 +0,0 @@ -// SPDX-License-Identifier: MIT -// This file was procedurally generated from scripts/generate/templates/EnumerableMapMock.js. - -pragma solidity ^0.8.0; - -import "../utils/structs/EnumerableMapUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -// UintToAddressMap -contract UintToAddressMapMockUpgradeable is Initializable { - function __UintToAddressMapMock_init() internal onlyInitializing { - } - - function __UintToAddressMapMock_init_unchained() internal onlyInitializing { - } - using EnumerableMapUpgradeable for EnumerableMapUpgradeable.UintToAddressMap; - - event OperationResult(bool result); - - EnumerableMapUpgradeable.UintToAddressMap private _map; - - function contains(uint256 key) public view returns (bool) { - return _map.contains(key); - } - - function set(uint256 key, address value) public { - bool result = _map.set(key, value); - emit OperationResult(result); - } - - function remove(uint256 key) public { - bool result = _map.remove(key); - emit OperationResult(result); - } - - function length() public view returns (uint256) { - return _map.length(); - } - - function at(uint256 index) public view returns (uint256 key, address value) { - return _map.at(index); - } - - function tryGet(uint256 key) public view returns (bool, address) { - return _map.tryGet(key); - } - - function get(uint256 key) public view returns (address) { - return _map.get(key); - } - - function getWithMessage(uint256 key, string calldata errorMessage) public view returns (address) { - return _map.get(key, errorMessage); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[47] private __gap; -} - -// AddressToUintMap -contract AddressToUintMapMockUpgradeable is Initializable { - function __AddressToUintMapMock_init() internal onlyInitializing { - } - - function __AddressToUintMapMock_init_unchained() internal onlyInitializing { - } - using EnumerableMapUpgradeable for EnumerableMapUpgradeable.AddressToUintMap; - - event OperationResult(bool result); - - EnumerableMapUpgradeable.AddressToUintMap private _map; - - function contains(address key) public view returns (bool) { - return _map.contains(key); - } - - function set(address key, uint256 value) public { - bool result = _map.set(key, value); - emit OperationResult(result); - } - - function remove(address key) public { - bool result = _map.remove(key); - emit OperationResult(result); - } - - function length() public view returns (uint256) { - return _map.length(); - } - - function at(uint256 index) public view returns (address key, uint256 value) { - return _map.at(index); - } - - function tryGet(address key) public view returns (bool, uint256) { - return _map.tryGet(key); - } - - function get(address key) public view returns (uint256) { - return _map.get(key); - } - - function getWithMessage(address key, string calldata errorMessage) public view returns (uint256) { - return _map.get(key, errorMessage); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[47] private __gap; -} - -// Bytes32ToBytes32Map -contract Bytes32ToBytes32MapMockUpgradeable is Initializable { - function __Bytes32ToBytes32MapMock_init() internal onlyInitializing { - } - - function __Bytes32ToBytes32MapMock_init_unchained() internal onlyInitializing { - } - using EnumerableMapUpgradeable for EnumerableMapUpgradeable.Bytes32ToBytes32Map; - - event OperationResult(bool result); - - EnumerableMapUpgradeable.Bytes32ToBytes32Map private _map; - - function contains(bytes32 key) public view returns (bool) { - return _map.contains(key); - } - - function set(bytes32 key, bytes32 value) public { - bool result = _map.set(key, value); - emit OperationResult(result); - } - - function remove(bytes32 key) public { - bool result = _map.remove(key); - emit OperationResult(result); - } - - function length() public view returns (uint256) { - return _map.length(); - } - - function at(uint256 index) public view returns (bytes32 key, bytes32 value) { - return _map.at(index); - } - - function tryGet(bytes32 key) public view returns (bool, bytes32) { - return _map.tryGet(key); - } - - function get(bytes32 key) public view returns (bytes32) { - return _map.get(key); - } - - function getWithMessage(bytes32 key, string calldata errorMessage) public view returns (bytes32) { - return _map.get(key, errorMessage); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[47] private __gap; -} - -// UintToUintMap -contract UintToUintMapMockUpgradeable is Initializable { - function __UintToUintMapMock_init() internal onlyInitializing { - } - - function __UintToUintMapMock_init_unchained() internal onlyInitializing { - } - using EnumerableMapUpgradeable for EnumerableMapUpgradeable.UintToUintMap; - - event OperationResult(bool result); - - EnumerableMapUpgradeable.UintToUintMap private _map; - - function contains(uint256 key) public view returns (bool) { - return _map.contains(key); - } - - function set(uint256 key, uint256 value) public { - bool result = _map.set(key, value); - emit OperationResult(result); - } - - function remove(uint256 key) public { - bool result = _map.remove(key); - emit OperationResult(result); - } - - function length() public view returns (uint256) { - return _map.length(); - } - - function at(uint256 index) public view returns (uint256 key, uint256 value) { - return _map.at(index); - } - - function tryGet(uint256 key) public view returns (bool, uint256) { - return _map.tryGet(key); - } - - function get(uint256 key) public view returns (uint256) { - return _map.get(key); - } - - function getWithMessage(uint256 key, string calldata errorMessage) public view returns (uint256) { - return _map.get(key, errorMessage); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[47] private __gap; -} - -// Bytes32ToUintMap -contract Bytes32ToUintMapMockUpgradeable is Initializable { - function __Bytes32ToUintMapMock_init() internal onlyInitializing { - } - - function __Bytes32ToUintMapMock_init_unchained() internal onlyInitializing { - } - using EnumerableMapUpgradeable for EnumerableMapUpgradeable.Bytes32ToUintMap; - - event OperationResult(bool result); - - EnumerableMapUpgradeable.Bytes32ToUintMap private _map; - - function contains(bytes32 key) public view returns (bool) { - return _map.contains(key); - } - - function set(bytes32 key, uint256 value) public { - bool result = _map.set(key, value); - emit OperationResult(result); - } - - function remove(bytes32 key) public { - bool result = _map.remove(key); - emit OperationResult(result); - } - - function length() public view returns (uint256) { - return _map.length(); - } - - function at(uint256 index) public view returns (bytes32 key, uint256 value) { - return _map.at(index); - } - - function tryGet(bytes32 key) public view returns (bool, uint256) { - return _map.tryGet(key); - } - - function get(bytes32 key) public view returns (uint256) { - return _map.get(key); - } - - function getWithMessage(bytes32 key, string calldata errorMessage) public view returns (uint256) { - return _map.get(key, errorMessage); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[47] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/EnumerableSetMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/EnumerableSetMockUpgradeable.sol deleted file mode 100644 index 06f2816..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/EnumerableSetMockUpgradeable.sol +++ /dev/null @@ -1,148 +0,0 @@ -// SPDX-License-Identifier: MIT -// This file was procedurally generated from scripts/generate/templates/EnumerableSetMock.js. - -pragma solidity ^0.8.0; - -import "../utils/structs/EnumerableSetUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -// Bytes32Set -contract EnumerableBytes32SetMockUpgradeable is Initializable { - function __EnumerableBytes32SetMock_init() internal onlyInitializing { - } - - function __EnumerableBytes32SetMock_init_unchained() internal onlyInitializing { - } - using EnumerableSetUpgradeable for EnumerableSetUpgradeable.Bytes32Set; - - event OperationResult(bool result); - - EnumerableSetUpgradeable.Bytes32Set private _set; - - function contains(bytes32 value) public view returns (bool) { - return _set.contains(value); - } - - function add(bytes32 value) public { - bool result = _set.add(value); - emit OperationResult(result); - } - - function remove(bytes32 value) public { - bool result = _set.remove(value); - emit OperationResult(result); - } - - function length() public view returns (uint256) { - return _set.length(); - } - - function at(uint256 index) public view returns (bytes32) { - return _set.at(index); - } - - function values() public view returns (bytes32[] memory) { - return _set.values(); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[48] private __gap; -} - -// AddressSet -contract EnumerableAddressSetMockUpgradeable is Initializable { - function __EnumerableAddressSetMock_init() internal onlyInitializing { - } - - function __EnumerableAddressSetMock_init_unchained() internal onlyInitializing { - } - using EnumerableSetUpgradeable for EnumerableSetUpgradeable.AddressSet; - - event OperationResult(bool result); - - EnumerableSetUpgradeable.AddressSet private _set; - - function contains(address value) public view returns (bool) { - return _set.contains(value); - } - - function add(address value) public { - bool result = _set.add(value); - emit OperationResult(result); - } - - function remove(address value) public { - bool result = _set.remove(value); - emit OperationResult(result); - } - - function length() public view returns (uint256) { - return _set.length(); - } - - function at(uint256 index) public view returns (address) { - return _set.at(index); - } - - function values() public view returns (address[] memory) { - return _set.values(); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[48] private __gap; -} - -// UintSet -contract EnumerableUintSetMockUpgradeable is Initializable { - function __EnumerableUintSetMock_init() internal onlyInitializing { - } - - function __EnumerableUintSetMock_init_unchained() internal onlyInitializing { - } - using EnumerableSetUpgradeable for EnumerableSetUpgradeable.UintSet; - - event OperationResult(bool result); - - EnumerableSetUpgradeable.UintSet private _set; - - function contains(uint256 value) public view returns (bool) { - return _set.contains(value); - } - - function add(uint256 value) public { - bool result = _set.add(value); - emit OperationResult(result); - } - - function remove(uint256 value) public { - bool result = _set.remove(value); - emit OperationResult(result); - } - - function length() public view returns (uint256) { - return _set.length(); - } - - function at(uint256 index) public view returns (uint256) { - return _set.at(index); - } - - function values() public view returns (uint256[] memory) { - return _set.values(); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[48] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/EtherReceiverMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/EtherReceiverMockUpgradeable.sol deleted file mode 100644 index c52be5d..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/EtherReceiverMockUpgradeable.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; -import "../proxy/utils/Initializable.sol"; - -contract EtherReceiverMockUpgradeable is Initializable { - function __EtherReceiverMock_init() internal onlyInitializing { - } - - function __EtherReceiverMock_init_unchained() internal onlyInitializing { - } - bool private _acceptEther; - - function setAcceptEther(bool acceptEther) public { - _acceptEther = acceptEther; - } - - receive() external payable { - if (!_acceptEther) { - revert(); - } - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/GovernorCompMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/GovernorCompMockUpgradeable.sol deleted file mode 100644 index 5a8e3f7..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/GovernorCompMockUpgradeable.sol +++ /dev/null @@ -1,45 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../governance/extensions/GovernorCountingSimpleUpgradeable.sol"; -import "../governance/extensions/GovernorVotesCompUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract GovernorCompMockUpgradeable is Initializable, GovernorVotesCompUpgradeable, GovernorCountingSimpleUpgradeable { - function __GovernorCompMock_init(string memory name_, ERC20VotesCompUpgradeable token_) internal onlyInitializing { - __EIP712_init_unchained(name_, version()); - __Governor_init_unchained(name_); - __GovernorVotesComp_init_unchained(token_); - } - - function __GovernorCompMock_init_unchained(string memory, ERC20VotesCompUpgradeable) internal onlyInitializing {} - - function quorum(uint256) public pure override returns (uint256) { - return 0; - } - - function votingDelay() public pure override returns (uint256) { - return 4; - } - - function votingPeriod() public pure override returns (uint256) { - return 16; - } - - function cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 salt - ) public returns (uint256 proposalId) { - return _cancel(targets, values, calldatas, salt); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/GovernorCompatibilityBravoMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/GovernorCompatibilityBravoMockUpgradeable.sol deleted file mode 100644 index b9b91fc..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/GovernorCompatibilityBravoMockUpgradeable.sol +++ /dev/null @@ -1,145 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../governance/compatibility/GovernorCompatibilityBravoUpgradeable.sol"; -import "../governance/extensions/GovernorTimelockCompoundUpgradeable.sol"; -import "../governance/extensions/GovernorSettingsUpgradeable.sol"; -import "../governance/extensions/GovernorVotesCompUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract GovernorCompatibilityBravoMockUpgradeable is - Initializable, GovernorCompatibilityBravoUpgradeable, - GovernorSettingsUpgradeable, - GovernorTimelockCompoundUpgradeable, - GovernorVotesCompUpgradeable -{ - function __GovernorCompatibilityBravoMock_init( - string memory name_, - ERC20VotesCompUpgradeable token_, - uint256 votingDelay_, - uint256 votingPeriod_, - uint256 proposalThreshold_, - ICompoundTimelockUpgradeable timelock_ - ) internal onlyInitializing { - __EIP712_init_unchained(name_, version()); - __Governor_init_unchained(name_); - __GovernorSettings_init_unchained(votingDelay_, votingPeriod_, proposalThreshold_); - __GovernorTimelockCompound_init_unchained(timelock_); - __GovernorVotesComp_init_unchained(token_); - } - - function __GovernorCompatibilityBravoMock_init_unchained( - string memory, - ERC20VotesCompUpgradeable, - uint256, - uint256, - uint256, - ICompoundTimelockUpgradeable - ) internal onlyInitializing {} - - function supportsInterface(bytes4 interfaceId) - public - view - override(IERC165Upgradeable, GovernorUpgradeable, GovernorTimelockCompoundUpgradeable) - returns (bool) - { - return super.supportsInterface(interfaceId); - } - - function quorum(uint256) public pure override returns (uint256) { - return 0; - } - - function state(uint256 proposalId) - public - view - override(IGovernorUpgradeable, GovernorUpgradeable, GovernorTimelockCompoundUpgradeable) - returns (ProposalState) - { - return super.state(proposalId); - } - - function proposalEta(uint256 proposalId) - public - view - override(IGovernorTimelockUpgradeable, GovernorTimelockCompoundUpgradeable) - returns (uint256) - { - return super.proposalEta(proposalId); - } - - function proposalThreshold() public view override(GovernorUpgradeable, GovernorSettingsUpgradeable) returns (uint256) { - return super.proposalThreshold(); - } - - function propose( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - string memory description - ) public override(IGovernorUpgradeable, GovernorUpgradeable, GovernorCompatibilityBravoUpgradeable) returns (uint256) { - return super.propose(targets, values, calldatas, description); - } - - function queue( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 salt - ) public override(IGovernorTimelockUpgradeable, GovernorTimelockCompoundUpgradeable) returns (uint256) { - return super.queue(targets, values, calldatas, salt); - } - - function execute( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 salt - ) public payable override(IGovernorUpgradeable, GovernorUpgradeable) returns (uint256) { - return super.execute(targets, values, calldatas, salt); - } - - function _execute( - uint256 proposalId, - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) internal override(GovernorUpgradeable, GovernorTimelockCompoundUpgradeable) { - super._execute(proposalId, targets, values, calldatas, descriptionHash); - } - - /** - * @notice WARNING: this is for mock purposes only. Ability to the _cancel function should be restricted for live - * deployments. - */ - function cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 salt - ) public returns (uint256 proposalId) { - return _cancel(targets, values, calldatas, salt); - } - - function _cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 salt - ) internal override(GovernorUpgradeable, GovernorTimelockCompoundUpgradeable) returns (uint256 proposalId) { - return super._cancel(targets, values, calldatas, salt); - } - - function _executor() internal view override(GovernorUpgradeable, GovernorTimelockCompoundUpgradeable) returns (address) { - return super._executor(); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/GovernorMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/GovernorMockUpgradeable.sol deleted file mode 100644 index 5cc5b23..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/GovernorMockUpgradeable.sol +++ /dev/null @@ -1,67 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../governance/extensions/GovernorProposalThresholdUpgradeable.sol"; -import "../governance/extensions/GovernorSettingsUpgradeable.sol"; -import "../governance/extensions/GovernorCountingSimpleUpgradeable.sol"; -import "../governance/extensions/GovernorVotesQuorumFractionUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract GovernorMockUpgradeable is - Initializable, GovernorProposalThresholdUpgradeable, - GovernorSettingsUpgradeable, - GovernorVotesQuorumFractionUpgradeable, - GovernorCountingSimpleUpgradeable -{ - function __GovernorMock_init( - string memory name_, - IVotesUpgradeable token_, - uint256 votingDelay_, - uint256 votingPeriod_, - uint256 quorumNumerator_ - ) internal onlyInitializing { - __EIP712_init_unchained(name_, version()); - __Governor_init_unchained(name_); - __GovernorSettings_init_unchained(votingDelay_, votingPeriod_, 0); - __GovernorVotes_init_unchained(token_); - __GovernorVotesQuorumFraction_init_unchained(quorumNumerator_); - } - - function __GovernorMock_init_unchained( - string memory, - IVotesUpgradeable, - uint256, - uint256, - uint256 - ) internal onlyInitializing {} - - function cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 salt - ) public returns (uint256 proposalId) { - return _cancel(targets, values, calldatas, salt); - } - - function proposalThreshold() public view override(GovernorUpgradeable, GovernorSettingsUpgradeable) returns (uint256) { - return super.proposalThreshold(); - } - - function propose( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - string memory description - ) public override(GovernorUpgradeable, GovernorProposalThresholdUpgradeable) returns (uint256) { - return super.propose(targets, values, calldatas, description); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/GovernorPreventLateQuorumMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/GovernorPreventLateQuorumMockUpgradeable.sol deleted file mode 100644 index c612352..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/GovernorPreventLateQuorumMockUpgradeable.sol +++ /dev/null @@ -1,79 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../governance/extensions/GovernorPreventLateQuorumUpgradeable.sol"; -import "../governance/extensions/GovernorSettingsUpgradeable.sol"; -import "../governance/extensions/GovernorCountingSimpleUpgradeable.sol"; -import "../governance/extensions/GovernorVotesUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract GovernorPreventLateQuorumMockUpgradeable is - Initializable, GovernorSettingsUpgradeable, - GovernorVotesUpgradeable, - GovernorCountingSimpleUpgradeable, - GovernorPreventLateQuorumUpgradeable -{ - uint256 private _quorum; - - function __GovernorPreventLateQuorumMock_init( - string memory name_, - IVotesUpgradeable token_, - uint256 votingDelay_, - uint256 votingPeriod_, - uint256 quorum_, - uint64 voteExtension_ - ) internal onlyInitializing { - __EIP712_init_unchained(name_, version()); - __Governor_init_unchained(name_); - __GovernorSettings_init_unchained(votingDelay_, votingPeriod_, 0); - __GovernorVotes_init_unchained(token_); - __GovernorPreventLateQuorum_init_unchained(voteExtension_); - __GovernorPreventLateQuorumMock_init_unchained(name_, token_, votingDelay_, votingPeriod_, quorum_, voteExtension_); - } - - function __GovernorPreventLateQuorumMock_init_unchained( - string memory, - IVotesUpgradeable, - uint256, - uint256, - uint256 quorum_, - uint64 - ) internal onlyInitializing { - _quorum = quorum_; - } - - function quorum(uint256) public view override returns (uint256) { - return _quorum; - } - - function proposalDeadline(uint256 proposalId) - public - view - override(GovernorUpgradeable, GovernorPreventLateQuorumUpgradeable) - returns (uint256) - { - return super.proposalDeadline(proposalId); - } - - function proposalThreshold() public view override(GovernorUpgradeable, GovernorSettingsUpgradeable) returns (uint256) { - return super.proposalThreshold(); - } - - function _castVote( - uint256 proposalId, - address account, - uint8 support, - string memory reason, - bytes memory params - ) internal override(GovernorUpgradeable, GovernorPreventLateQuorumUpgradeable) returns (uint256) { - return super._castVote(proposalId, account, support, reason, params); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/GovernorTimelockCompoundMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/GovernorTimelockCompoundMockUpgradeable.sol deleted file mode 100644 index f7c51f1..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/GovernorTimelockCompoundMockUpgradeable.sol +++ /dev/null @@ -1,114 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../governance/extensions/GovernorTimelockCompoundUpgradeable.sol"; -import "../governance/extensions/GovernorSettingsUpgradeable.sol"; -import "../governance/extensions/GovernorCountingSimpleUpgradeable.sol"; -import "../governance/extensions/GovernorVotesQuorumFractionUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract GovernorTimelockCompoundMockUpgradeable is - Initializable, GovernorSettingsUpgradeable, - GovernorTimelockCompoundUpgradeable, - GovernorVotesQuorumFractionUpgradeable, - GovernorCountingSimpleUpgradeable -{ - function __GovernorTimelockCompoundMock_init( - string memory name_, - IVotesUpgradeable token_, - uint256 votingDelay_, - uint256 votingPeriod_, - ICompoundTimelockUpgradeable timelock_, - uint256 quorumNumerator_ - ) internal onlyInitializing { - __EIP712_init_unchained(name_, version()); - __Governor_init_unchained(name_); - __GovernorSettings_init_unchained(votingDelay_, votingPeriod_, 0); - __GovernorTimelockCompound_init_unchained(timelock_); - __GovernorVotes_init_unchained(token_); - __GovernorVotesQuorumFraction_init_unchained(quorumNumerator_); - } - - function __GovernorTimelockCompoundMock_init_unchained( - string memory, - IVotesUpgradeable, - uint256, - uint256, - ICompoundTimelockUpgradeable, - uint256 - ) internal onlyInitializing {} - - function supportsInterface(bytes4 interfaceId) - public - view - override(GovernorUpgradeable, GovernorTimelockCompoundUpgradeable) - returns (bool) - { - return super.supportsInterface(interfaceId); - } - - function quorum(uint256 blockNumber) - public - view - override(IGovernorUpgradeable, GovernorVotesQuorumFractionUpgradeable) - returns (uint256) - { - return super.quorum(blockNumber); - } - - function cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 salt - ) public returns (uint256 proposalId) { - return _cancel(targets, values, calldatas, salt); - } - - /** - * Overriding nightmare - */ - function state(uint256 proposalId) - public - view - override(GovernorUpgradeable, GovernorTimelockCompoundUpgradeable) - returns (ProposalState) - { - return super.state(proposalId); - } - - function proposalThreshold() public view override(GovernorUpgradeable, GovernorSettingsUpgradeable) returns (uint256) { - return super.proposalThreshold(); - } - - function _execute( - uint256 proposalId, - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) internal override(GovernorUpgradeable, GovernorTimelockCompoundUpgradeable) { - super._execute(proposalId, targets, values, calldatas, descriptionHash); - } - - function _cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 salt - ) internal override(GovernorUpgradeable, GovernorTimelockCompoundUpgradeable) returns (uint256 proposalId) { - return super._cancel(targets, values, calldatas, salt); - } - - function _executor() internal view override(GovernorUpgradeable, GovernorTimelockCompoundUpgradeable) returns (address) { - return super._executor(); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/GovernorTimelockControlMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/GovernorTimelockControlMockUpgradeable.sol deleted file mode 100644 index df55802..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/GovernorTimelockControlMockUpgradeable.sol +++ /dev/null @@ -1,111 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../governance/extensions/GovernorTimelockControlUpgradeable.sol"; -import "../governance/extensions/GovernorSettingsUpgradeable.sol"; -import "../governance/extensions/GovernorCountingSimpleUpgradeable.sol"; -import "../governance/extensions/GovernorVotesQuorumFractionUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract GovernorTimelockControlMockUpgradeable is - Initializable, GovernorSettingsUpgradeable, - GovernorTimelockControlUpgradeable, - GovernorVotesQuorumFractionUpgradeable, - GovernorCountingSimpleUpgradeable -{ - function __GovernorTimelockControlMock_init( - string memory name_, - IVotesUpgradeable token_, - uint256 votingDelay_, - uint256 votingPeriod_, - TimelockControllerUpgradeable timelock_, - uint256 quorumNumerator_ - ) internal onlyInitializing { - __EIP712_init_unchained(name_, version()); - __Governor_init_unchained(name_); - __GovernorSettings_init_unchained(votingDelay_, votingPeriod_, 0); - __GovernorTimelockControl_init_unchained(timelock_); - __GovernorVotes_init_unchained(token_); - __GovernorVotesQuorumFraction_init_unchained(quorumNumerator_); - } - - function __GovernorTimelockControlMock_init_unchained( - string memory, - IVotesUpgradeable, - uint256, - uint256, - TimelockControllerUpgradeable, - uint256 - ) internal onlyInitializing {} - - function supportsInterface(bytes4 interfaceId) - public - view - override(GovernorUpgradeable, GovernorTimelockControlUpgradeable) - returns (bool) - { - return super.supportsInterface(interfaceId); - } - - function quorum(uint256 blockNumber) - public - view - override(IGovernorUpgradeable, GovernorVotesQuorumFractionUpgradeable) - returns (uint256) - { - return super.quorum(blockNumber); - } - - function cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) public returns (uint256 proposalId) { - return _cancel(targets, values, calldatas, descriptionHash); - } - - /** - * Overriding nightmare - */ - function state(uint256 proposalId) public view override(GovernorUpgradeable, GovernorTimelockControlUpgradeable) returns (ProposalState) { - return super.state(proposalId); - } - - function proposalThreshold() public view override(GovernorUpgradeable, GovernorSettingsUpgradeable) returns (uint256) { - return super.proposalThreshold(); - } - - function _execute( - uint256 proposalId, - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) internal override(GovernorUpgradeable, GovernorTimelockControlUpgradeable) { - super._execute(proposalId, targets, values, calldatas, descriptionHash); - } - - function _cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) internal override(GovernorUpgradeable, GovernorTimelockControlUpgradeable) returns (uint256 proposalId) { - return super._cancel(targets, values, calldatas, descriptionHash); - } - - function _executor() internal view override(GovernorUpgradeable, GovernorTimelockControlUpgradeable) returns (address) { - return super._executor(); - } - - function nonGovernanceFunction() external {} - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/GovernorVoteMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/GovernorVoteMockUpgradeable.sol deleted file mode 100644 index eac277a..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/GovernorVoteMockUpgradeable.sol +++ /dev/null @@ -1,45 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../governance/extensions/GovernorCountingSimpleUpgradeable.sol"; -import "../governance/extensions/GovernorVotesUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract GovernorVoteMocksUpgradeable is Initializable, GovernorVotesUpgradeable, GovernorCountingSimpleUpgradeable { - function __GovernorVoteMocks_init(string memory name_, IVotesUpgradeable token_) internal onlyInitializing { - __EIP712_init_unchained(name_, version()); - __Governor_init_unchained(name_); - __GovernorVotes_init_unchained(token_); - } - - function __GovernorVoteMocks_init_unchained(string memory, IVotesUpgradeable) internal onlyInitializing {} - - function quorum(uint256) public pure override returns (uint256) { - return 0; - } - - function votingDelay() public pure override returns (uint256) { - return 4; - } - - function votingPeriod() public pure override returns (uint256) { - return 16; - } - - function cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 salt - ) public returns (uint256 proposalId) { - return _cancel(targets, values, calldatas, salt); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/GovernorWithParamsMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/GovernorWithParamsMockUpgradeable.sol deleted file mode 100644 index 479326c..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/GovernorWithParamsMockUpgradeable.sol +++ /dev/null @@ -1,75 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../governance/extensions/GovernorCountingSimpleUpgradeable.sol"; -import "../governance/extensions/GovernorVotesUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract GovernorWithParamsMockUpgradeable is Initializable, GovernorVotesUpgradeable, GovernorCountingSimpleUpgradeable { - event CountParams(uint256 uintParam, string strParam); - - function __GovernorWithParamsMock_init(string memory name_, IVotesUpgradeable token_) internal onlyInitializing { - __EIP712_init_unchained(name_, version()); - __Governor_init_unchained(name_); - __GovernorVotes_init_unchained(token_); - } - - function __GovernorWithParamsMock_init_unchained(string memory, IVotesUpgradeable) internal onlyInitializing {} - - function quorum(uint256) public pure override returns (uint256) { - return 0; - } - - function votingDelay() public pure override returns (uint256) { - return 4; - } - - function votingPeriod() public pure override returns (uint256) { - return 16; - } - - function _getVotes( - address account, - uint256 blockNumber, - bytes memory params - ) internal view override(GovernorUpgradeable, GovernorVotesUpgradeable) returns (uint256) { - uint256 reduction = 0; - // If the user provides parameters, we reduce the voting weight by the amount of the integer param - if (params.length > 0) { - (reduction, ) = abi.decode(params, (uint256, string)); - } - // reverts on overflow - return super._getVotes(account, blockNumber, params) - reduction; - } - - function _countVote( - uint256 proposalId, - address account, - uint8 support, - uint256 weight, - bytes memory params - ) internal override(GovernorUpgradeable, GovernorCountingSimpleUpgradeable) { - if (params.length > 0) { - (uint256 _uintParam, string memory _strParam) = abi.decode(params, (uint256, string)); - emit CountParams(_uintParam, _strParam); - } - return super._countVote(proposalId, account, support, weight, params); - } - - function cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 salt - ) public returns (uint256 proposalId) { - return _cancel(targets, values, calldatas, salt); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/InitializableMock.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/InitializableMock.sol deleted file mode 100644 index 34040b6..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/InitializableMock.sol +++ /dev/null @@ -1,130 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../proxy/utils/Initializable.sol"; - -/** - * @title InitializableMock - * @dev This contract is a mock to test initializable functionality - */ -contract InitializableMock is Initializable { - bool public initializerRan; - bool public onlyInitializingRan; - uint256 public x; - - function isInitializing() public view returns (bool) { - return _isInitializing(); - } - - function initialize() public initializer { - initializerRan = true; - } - - function initializeOnlyInitializing() public onlyInitializing { - onlyInitializingRan = true; - } - - function initializerNested() public initializer { - initialize(); - } - - function onlyInitializingNested() public initializer { - initializeOnlyInitializing(); - } - - function initializeWithX(uint256 _x) public payable initializer { - x = _x; - } - - function nonInitializable(uint256 _x) public payable { - x = _x; - } - - function fail() public pure { - require(false, "InitializableMock forced failure"); - } -} - -contract ConstructorInitializableMock is Initializable { - bool public initializerRan; - bool public onlyInitializingRan; - - constructor() initializer { - initialize(); - initializeOnlyInitializing(); - } - - function initialize() public initializer { - initializerRan = true; - } - - function initializeOnlyInitializing() public onlyInitializing { - onlyInitializingRan = true; - } -} - -contract ChildConstructorInitializableMock is ConstructorInitializableMock { - bool public childInitializerRan; - - constructor() initializer { - childInitialize(); - } - - function childInitialize() public initializer { - childInitializerRan = true; - } -} - -contract ReinitializerMock is Initializable { - uint256 public counter; - - function getInitializedVersion() public view returns (uint8) { - return _getInitializedVersion(); - } - - function initialize() public initializer { - doStuff(); - } - - function reinitialize(uint8 i) public reinitializer(i) { - doStuff(); - } - - function nestedReinitialize(uint8 i, uint8 j) public reinitializer(i) { - reinitialize(j); - } - - function chainReinitialize(uint8 i, uint8 j) public { - reinitialize(i); - reinitialize(j); - } - - function disableInitializers() public { - _disableInitializers(); - } - - function doStuff() public onlyInitializing { - counter++; - } -} - -contract DisableNew is Initializable { - constructor() { - _disableInitializers(); - } -} - -contract DisableOld is Initializable { - constructor() initializer {} -} - -contract DisableBad1 is DisableNew, DisableOld {} - -contract DisableBad2 is Initializable { - constructor() initializer { - _disableInitializers(); - } -} - -contract DisableOk is DisableOld, DisableNew {} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/MathMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/MathMockUpgradeable.sol deleted file mode 100644 index 526ebc9..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/MathMockUpgradeable.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/math/MathUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract MathMockUpgradeable is Initializable { - function __MathMock_init() internal onlyInitializing { - } - - function __MathMock_init_unchained() internal onlyInitializing { - } - function max(uint256 a, uint256 b) public pure returns (uint256) { - return MathUpgradeable.max(a, b); - } - - function min(uint256 a, uint256 b) public pure returns (uint256) { - return MathUpgradeable.min(a, b); - } - - function average(uint256 a, uint256 b) public pure returns (uint256) { - return MathUpgradeable.average(a, b); - } - - function ceilDiv(uint256 a, uint256 b) public pure returns (uint256) { - return MathUpgradeable.ceilDiv(a, b); - } - - function mulDiv( - uint256 a, - uint256 b, - uint256 denominator, - MathUpgradeable.Rounding direction - ) public pure returns (uint256) { - return MathUpgradeable.mulDiv(a, b, denominator, direction); - } - - function sqrt(uint256 a, MathUpgradeable.Rounding direction) public pure returns (uint256) { - return MathUpgradeable.sqrt(a, direction); - } - - function log2(uint256 a, MathUpgradeable.Rounding direction) public pure returns (uint256) { - return MathUpgradeable.log2(a, direction); - } - - function log10(uint256 a, MathUpgradeable.Rounding direction) public pure returns (uint256) { - return MathUpgradeable.log10(a, direction); - } - - function log256(uint256 a, MathUpgradeable.Rounding direction) public pure returns (uint256) { - return MathUpgradeable.log256(a, direction); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/MerkleProofWrapperUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/MerkleProofWrapperUpgradeable.sol deleted file mode 100644 index c45120a..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/MerkleProofWrapperUpgradeable.sol +++ /dev/null @@ -1,78 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/cryptography/MerkleProofUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract MerkleProofWrapperUpgradeable is Initializable { - function __MerkleProofWrapper_init() internal onlyInitializing { - } - - function __MerkleProofWrapper_init_unchained() internal onlyInitializing { - } - function verify( - bytes32[] memory proof, - bytes32 root, - bytes32 leaf - ) public pure returns (bool) { - return MerkleProofUpgradeable.verify(proof, root, leaf); - } - - function verifyCalldata( - bytes32[] calldata proof, - bytes32 root, - bytes32 leaf - ) public pure returns (bool) { - return MerkleProofUpgradeable.verifyCalldata(proof, root, leaf); - } - - function processProof(bytes32[] memory proof, bytes32 leaf) public pure returns (bytes32) { - return MerkleProofUpgradeable.processProof(proof, leaf); - } - - function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) public pure returns (bytes32) { - return MerkleProofUpgradeable.processProofCalldata(proof, leaf); - } - - function multiProofVerify( - bytes32[] memory proofs, - bool[] memory proofFlag, - bytes32 root, - bytes32[] memory leaves - ) public pure returns (bool) { - return MerkleProofUpgradeable.multiProofVerify(proofs, proofFlag, root, leaves); - } - - function multiProofVerifyCalldata( - bytes32[] calldata proofs, - bool[] calldata proofFlag, - bytes32 root, - bytes32[] memory leaves - ) public pure returns (bool) { - return MerkleProofUpgradeable.multiProofVerifyCalldata(proofs, proofFlag, root, leaves); - } - - function processMultiProof( - bytes32[] memory proofs, - bool[] memory proofFlag, - bytes32[] memory leaves - ) public pure returns (bytes32) { - return MerkleProofUpgradeable.processMultiProof(proofs, proofFlag, leaves); - } - - function processMultiProofCalldata( - bytes32[] calldata proofs, - bool[] calldata proofFlag, - bytes32[] memory leaves - ) public pure returns (bytes32) { - return MerkleProofUpgradeable.processMultiProofCalldata(proofs, proofFlag, leaves); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/MulticallTestUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/MulticallTestUpgradeable.sol deleted file mode 100644 index 440bcfd..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/MulticallTestUpgradeable.sol +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "./MulticallTokenMockUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract MulticallTestUpgradeable is Initializable { - function __MulticallTest_init() internal onlyInitializing { - } - - function __MulticallTest_init_unchained() internal onlyInitializing { - } - function checkReturnValues( - MulticallTokenMockUpgradeable multicallToken, - address[] calldata recipients, - uint256[] calldata amounts - ) external { - bytes[] memory calls = new bytes[](recipients.length); - for (uint256 i = 0; i < recipients.length; i++) { - calls[i] = abi.encodeWithSignature("transfer(address,uint256)", recipients[i], amounts[i]); - } - - bytes[] memory results = multicallToken.multicall(calls); - for (uint256 i = 0; i < results.length; i++) { - require(abi.decode(results[i], (bool))); - } - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/MulticallTokenMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/MulticallTokenMockUpgradeable.sol deleted file mode 100644 index fc12597..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/MulticallTokenMockUpgradeable.sol +++ /dev/null @@ -1,23 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/MulticallUpgradeable.sol"; -import "./ERC20MockUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract MulticallTokenMockUpgradeable is Initializable, ERC20MockUpgradeable, MulticallUpgradeable { - function __MulticallTokenMock_init(uint256 initialBalance) internal onlyInitializing { - __ERC20_init_unchained("MulticallToken", "BCT"); - __ERC20Mock_init_unchained("MulticallToken", "BCT", msg.sender, initialBalance); - } - - function __MulticallTokenMock_init_unchained(uint256) internal onlyInitializing {} - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/MultipleInheritanceInitializableMocks.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/MultipleInheritanceInitializableMocks.sol deleted file mode 100644 index f6d6440..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/MultipleInheritanceInitializableMocks.sol +++ /dev/null @@ -1,136 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../proxy/utils/Initializable.sol"; - -// Sample contracts showing upgradeability with multiple inheritance. -// Child contract inherits from Father and Mother contracts, and Father extends from Gramps. -// -// Human -// / \ -// | Gramps -// | | -// Mother Father -// | | -// -- Child -- - -/** - * Sample base intializable contract that is a human - */ -contract SampleHuman is Initializable { - bool public isHuman; - - function initialize() public initializer { - __SampleHuman_init(); - } - - // solhint-disable-next-line func-name-mixedcase - function __SampleHuman_init() internal onlyInitializing { - __SampleHuman_init_unchained(); - } - - // solhint-disable-next-line func-name-mixedcase - function __SampleHuman_init_unchained() internal onlyInitializing { - isHuman = true; - } -} - -/** - * Sample base intializable contract that defines a field mother - */ -contract SampleMother is Initializable, SampleHuman { - uint256 public mother; - - function initialize(uint256 value) public initializer { - __SampleMother_init(value); - } - - // solhint-disable-next-line func-name-mixedcase - function __SampleMother_init(uint256 value) internal onlyInitializing { - __SampleHuman_init(); - __SampleMother_init_unchained(value); - } - - // solhint-disable-next-line func-name-mixedcase - function __SampleMother_init_unchained(uint256 value) internal onlyInitializing { - mother = value; - } -} - -/** - * Sample base intializable contract that defines a field gramps - */ -contract SampleGramps is Initializable, SampleHuman { - string public gramps; - - function initialize(string memory value) public initializer { - __SampleGramps_init(value); - } - - // solhint-disable-next-line func-name-mixedcase - function __SampleGramps_init(string memory value) internal onlyInitializing { - __SampleHuman_init(); - __SampleGramps_init_unchained(value); - } - - // solhint-disable-next-line func-name-mixedcase - function __SampleGramps_init_unchained(string memory value) internal onlyInitializing { - gramps = value; - } -} - -/** - * Sample base intializable contract that defines a field father and extends from gramps - */ -contract SampleFather is Initializable, SampleGramps { - uint256 public father; - - function initialize(string memory _gramps, uint256 _father) public initializer { - __SampleFather_init(_gramps, _father); - } - - // solhint-disable-next-line func-name-mixedcase - function __SampleFather_init(string memory _gramps, uint256 _father) internal onlyInitializing { - __SampleGramps_init(_gramps); - __SampleFather_init_unchained(_father); - } - - // solhint-disable-next-line func-name-mixedcase - function __SampleFather_init_unchained(uint256 _father) internal onlyInitializing { - father = _father; - } -} - -/** - * Child extends from mother, father (gramps) - */ -contract SampleChild is Initializable, SampleMother, SampleFather { - uint256 public child; - - function initialize( - uint256 _mother, - string memory _gramps, - uint256 _father, - uint256 _child - ) public initializer { - __SampleChild_init(_mother, _gramps, _father, _child); - } - - // solhint-disable-next-line func-name-mixedcase - function __SampleChild_init( - uint256 _mother, - string memory _gramps, - uint256 _father, - uint256 _child - ) internal onlyInitializing { - __SampleMother_init(_mother); - __SampleFather_init(_gramps, _father); - __SampleChild_init_unchained(_child); - } - - // solhint-disable-next-line func-name-mixedcase - function __SampleChild_init_unchained(uint256 _child) internal onlyInitializing { - child = _child; - } -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/Ownable2StepMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/Ownable2StepMockUpgradeable.sol deleted file mode 100644 index 89d4181..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/Ownable2StepMockUpgradeable.sol +++ /dev/null @@ -1,21 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../access/Ownable2StepUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract Ownable2StepMockUpgradeable is Initializable, Ownable2StepUpgradeable { function __Ownable2StepMock_init() internal onlyInitializing { - __Ownable_init_unchained(); - } - - function __Ownable2StepMock_init_unchained() internal onlyInitializing { - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/OwnableMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/OwnableMockUpgradeable.sol deleted file mode 100644 index 8bcf45d..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/OwnableMockUpgradeable.sol +++ /dev/null @@ -1,21 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../access/OwnableUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract OwnableMockUpgradeable is Initializable, OwnableUpgradeable { function __OwnableMock_init() internal onlyInitializing { - __Ownable_init_unchained(); - } - - function __OwnableMock_init_unchained() internal onlyInitializing { - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/PausableMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/PausableMockUpgradeable.sol deleted file mode 100644 index 2937ec2..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/PausableMockUpgradeable.sol +++ /dev/null @@ -1,44 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../security/PausableUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract PausableMockUpgradeable is Initializable, PausableUpgradeable { - bool public drasticMeasureTaken; - uint256 public count; - - function __PausableMock_init() internal onlyInitializing { - __Pausable_init_unchained(); - __PausableMock_init_unchained(); - } - - function __PausableMock_init_unchained() internal onlyInitializing { - drasticMeasureTaken = false; - count = 0; - } - - function normalProcess() external whenNotPaused { - count++; - } - - function drasticMeasure() external whenPaused { - drasticMeasureTaken = true; - } - - function pause() external { - _pause(); - } - - function unpause() external { - _unpause(); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[48] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/PullPaymentMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/PullPaymentMockUpgradeable.sol deleted file mode 100644 index 637c164..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/PullPaymentMockUpgradeable.sol +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../security/PullPaymentUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -// mock class using PullPayment -contract PullPaymentMockUpgradeable is Initializable, PullPaymentUpgradeable { - function __PullPaymentMock_init() internal onlyInitializing { - __PullPayment_init_unchained(); - } - - function __PullPaymentMock_init_unchained() internal onlyInitializing {} - - // test helper function to call asyncTransfer - function callTransfer(address dest, uint256 amount) public { - _asyncTransfer(dest, amount); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ReentrancyAttackUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ReentrancyAttackUpgradeable.sol deleted file mode 100644 index fb8141b..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ReentrancyAttackUpgradeable.sol +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/ContextUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract ReentrancyAttackUpgradeable is Initializable, ContextUpgradeable { - function __ReentrancyAttack_init() internal onlyInitializing { - } - - function __ReentrancyAttack_init_unchained() internal onlyInitializing { - } - function callSender(bytes4 data) public { - (bool success, ) = _msgSender().call(abi.encodeWithSelector(data)); - require(success, "ReentrancyAttack: failed call"); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ReentrancyMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ReentrancyMockUpgradeable.sol deleted file mode 100644 index fdc157d..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/ReentrancyMockUpgradeable.sol +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../security/ReentrancyGuardUpgradeable.sol"; -import "./ReentrancyAttackUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract ReentrancyMockUpgradeable is Initializable, ReentrancyGuardUpgradeable { - uint256 public counter; - - function __ReentrancyMock_init() internal onlyInitializing { - __ReentrancyGuard_init_unchained(); - __ReentrancyMock_init_unchained(); - } - - function __ReentrancyMock_init_unchained() internal onlyInitializing { - counter = 0; - } - - function callback() external nonReentrant { - _count(); - } - - function countLocalRecursive(uint256 n) public nonReentrant { - if (n > 0) { - _count(); - countLocalRecursive(n - 1); - } - } - - function countThisRecursive(uint256 n) public nonReentrant { - if (n > 0) { - _count(); - (bool success, ) = address(this).call(abi.encodeWithSignature("countThisRecursive(uint256)", n - 1)); - require(success, "ReentrancyMock: failed call"); - } - } - - function countAndCall(ReentrancyAttackUpgradeable attacker) public nonReentrant { - _count(); - bytes4 func = bytes4(keccak256("callback()")); - attacker.callSender(func); - } - - function _count() private { - counter += 1; - } - - function guardedCheckEntered() public nonReentrant { - require(_reentrancyGuardEntered()); - } - - function unguardedCheckNotEntered() public view { - require(!_reentrancyGuardEntered()); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/RegressionImplementation.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/RegressionImplementation.sol deleted file mode 100644 index be6b501..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/RegressionImplementation.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../proxy/utils/Initializable.sol"; - -contract Implementation1 is Initializable { - uint256 internal _value; - - function initialize() public initializer {} - - function setValue(uint256 _number) public { - _value = _number; - } -} - -contract Implementation2 is Initializable { - uint256 internal _value; - - function initialize() public initializer {} - - function setValue(uint256 _number) public { - _value = _number; - } - - function getValue() public view returns (uint256) { - return _value; - } -} - -contract Implementation3 is Initializable { - uint256 internal _value; - - function initialize() public initializer {} - - function setValue(uint256 _number) public { - _value = _number; - } - - function getValue(uint256 _number) public view returns (uint256) { - return _value + _number; - } -} - -contract Implementation4 is Initializable { - uint256 internal _value; - - function initialize() public initializer {} - - function setValue(uint256 _number) public { - _value = _number; - } - - function getValue() public view returns (uint256) { - return _value; - } - - fallback() external { - _value = 1; - } -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/SafeCastMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/SafeCastMockUpgradeable.sol deleted file mode 100644 index 0421331..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/SafeCastMockUpgradeable.sol +++ /dev/null @@ -1,280 +0,0 @@ -// SPDX-License-Identifier: MIT -// This file was procedurally generated from scripts/generate/templates/SafeCastMock.js. - -pragma solidity ^0.8.0; - -import "../utils/math/SafeCastUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract SafeCastMockUpgradeable is Initializable { - function __SafeCastMock_init() internal onlyInitializing { - } - - function __SafeCastMock_init_unchained() internal onlyInitializing { - } - using SafeCastUpgradeable for uint256; - using SafeCastUpgradeable for int256; - - function toUint256(int256 a) public pure returns (uint256) { - return a.toUint256(); - } - - function toUint248(uint256 a) public pure returns (uint248) { - return a.toUint248(); - } - - function toUint240(uint256 a) public pure returns (uint240) { - return a.toUint240(); - } - - function toUint232(uint256 a) public pure returns (uint232) { - return a.toUint232(); - } - - function toUint224(uint256 a) public pure returns (uint224) { - return a.toUint224(); - } - - function toUint216(uint256 a) public pure returns (uint216) { - return a.toUint216(); - } - - function toUint208(uint256 a) public pure returns (uint208) { - return a.toUint208(); - } - - function toUint200(uint256 a) public pure returns (uint200) { - return a.toUint200(); - } - - function toUint192(uint256 a) public pure returns (uint192) { - return a.toUint192(); - } - - function toUint184(uint256 a) public pure returns (uint184) { - return a.toUint184(); - } - - function toUint176(uint256 a) public pure returns (uint176) { - return a.toUint176(); - } - - function toUint168(uint256 a) public pure returns (uint168) { - return a.toUint168(); - } - - function toUint160(uint256 a) public pure returns (uint160) { - return a.toUint160(); - } - - function toUint152(uint256 a) public pure returns (uint152) { - return a.toUint152(); - } - - function toUint144(uint256 a) public pure returns (uint144) { - return a.toUint144(); - } - - function toUint136(uint256 a) public pure returns (uint136) { - return a.toUint136(); - } - - function toUint128(uint256 a) public pure returns (uint128) { - return a.toUint128(); - } - - function toUint120(uint256 a) public pure returns (uint120) { - return a.toUint120(); - } - - function toUint112(uint256 a) public pure returns (uint112) { - return a.toUint112(); - } - - function toUint104(uint256 a) public pure returns (uint104) { - return a.toUint104(); - } - - function toUint96(uint256 a) public pure returns (uint96) { - return a.toUint96(); - } - - function toUint88(uint256 a) public pure returns (uint88) { - return a.toUint88(); - } - - function toUint80(uint256 a) public pure returns (uint80) { - return a.toUint80(); - } - - function toUint72(uint256 a) public pure returns (uint72) { - return a.toUint72(); - } - - function toUint64(uint256 a) public pure returns (uint64) { - return a.toUint64(); - } - - function toUint56(uint256 a) public pure returns (uint56) { - return a.toUint56(); - } - - function toUint48(uint256 a) public pure returns (uint48) { - return a.toUint48(); - } - - function toUint40(uint256 a) public pure returns (uint40) { - return a.toUint40(); - } - - function toUint32(uint256 a) public pure returns (uint32) { - return a.toUint32(); - } - - function toUint24(uint256 a) public pure returns (uint24) { - return a.toUint24(); - } - - function toUint16(uint256 a) public pure returns (uint16) { - return a.toUint16(); - } - - function toUint8(uint256 a) public pure returns (uint8) { - return a.toUint8(); - } - - function toInt256(uint256 a) public pure returns (int256) { - return a.toInt256(); - } - - function toInt248(int256 a) public pure returns (int248) { - return a.toInt248(); - } - - function toInt240(int256 a) public pure returns (int240) { - return a.toInt240(); - } - - function toInt232(int256 a) public pure returns (int232) { - return a.toInt232(); - } - - function toInt224(int256 a) public pure returns (int224) { - return a.toInt224(); - } - - function toInt216(int256 a) public pure returns (int216) { - return a.toInt216(); - } - - function toInt208(int256 a) public pure returns (int208) { - return a.toInt208(); - } - - function toInt200(int256 a) public pure returns (int200) { - return a.toInt200(); - } - - function toInt192(int256 a) public pure returns (int192) { - return a.toInt192(); - } - - function toInt184(int256 a) public pure returns (int184) { - return a.toInt184(); - } - - function toInt176(int256 a) public pure returns (int176) { - return a.toInt176(); - } - - function toInt168(int256 a) public pure returns (int168) { - return a.toInt168(); - } - - function toInt160(int256 a) public pure returns (int160) { - return a.toInt160(); - } - - function toInt152(int256 a) public pure returns (int152) { - return a.toInt152(); - } - - function toInt144(int256 a) public pure returns (int144) { - return a.toInt144(); - } - - function toInt136(int256 a) public pure returns (int136) { - return a.toInt136(); - } - - function toInt128(int256 a) public pure returns (int128) { - return a.toInt128(); - } - - function toInt120(int256 a) public pure returns (int120) { - return a.toInt120(); - } - - function toInt112(int256 a) public pure returns (int112) { - return a.toInt112(); - } - - function toInt104(int256 a) public pure returns (int104) { - return a.toInt104(); - } - - function toInt96(int256 a) public pure returns (int96) { - return a.toInt96(); - } - - function toInt88(int256 a) public pure returns (int88) { - return a.toInt88(); - } - - function toInt80(int256 a) public pure returns (int80) { - return a.toInt80(); - } - - function toInt72(int256 a) public pure returns (int72) { - return a.toInt72(); - } - - function toInt64(int256 a) public pure returns (int64) { - return a.toInt64(); - } - - function toInt56(int256 a) public pure returns (int56) { - return a.toInt56(); - } - - function toInt48(int256 a) public pure returns (int48) { - return a.toInt48(); - } - - function toInt40(int256 a) public pure returns (int40) { - return a.toInt40(); - } - - function toInt32(int256 a) public pure returns (int32) { - return a.toInt32(); - } - - function toInt24(int256 a) public pure returns (int24) { - return a.toInt24(); - } - - function toInt16(int256 a) public pure returns (int16) { - return a.toInt16(); - } - - function toInt8(int256 a) public pure returns (int8) { - return a.toInt8(); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/SafeERC20HelperUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/SafeERC20HelperUpgradeable.sol deleted file mode 100644 index b70d7bf..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/SafeERC20HelperUpgradeable.sol +++ /dev/null @@ -1,257 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/ContextUpgradeable.sol"; -import "../token/ERC20/IERC20Upgradeable.sol"; -import "../token/ERC20/extensions/draft-ERC20PermitUpgradeable.sol"; -import "../token/ERC20/utils/SafeERC20Upgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract ERC20ReturnFalseMockUpgradeable is Initializable, ContextUpgradeable { - function __ERC20ReturnFalseMock_init() internal onlyInitializing { - } - - function __ERC20ReturnFalseMock_init_unchained() internal onlyInitializing { - } - uint256 private _allowance; - - // IERC20's functions are not pure, but these mock implementations are: to prevent Solidity from issuing warnings, - // we write to a dummy state variable. - uint256 private _dummy; - - function transfer(address, uint256) public returns (bool) { - _dummy = 0; - return false; - } - - function transferFrom( - address, - address, - uint256 - ) public returns (bool) { - _dummy = 0; - return false; - } - - function approve(address, uint256) public returns (bool) { - _dummy = 0; - return false; - } - - function allowance(address, address) public view returns (uint256) { - require(_dummy == 0); // Dummy read from a state variable so that the function is view - return 0; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[48] private __gap; -} - -contract ERC20ReturnTrueMockUpgradeable is Initializable, ContextUpgradeable { - function __ERC20ReturnTrueMock_init() internal onlyInitializing { - } - - function __ERC20ReturnTrueMock_init_unchained() internal onlyInitializing { - } - mapping(address => uint256) private _allowances; - - // IERC20's functions are not pure, but these mock implementations are: to prevent Solidity from issuing warnings, - // we write to a dummy state variable. - uint256 private _dummy; - - function transfer(address, uint256) public returns (bool) { - _dummy = 0; - return true; - } - - function transferFrom( - address, - address, - uint256 - ) public returns (bool) { - _dummy = 0; - return true; - } - - function approve(address, uint256) public returns (bool) { - _dummy = 0; - return true; - } - - function setAllowance(uint256 allowance_) public { - _allowances[_msgSender()] = allowance_; - } - - function allowance(address owner, address) public view returns (uint256) { - return _allowances[owner]; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[48] private __gap; -} - -contract ERC20NoReturnMockUpgradeable is Initializable, ContextUpgradeable { - function __ERC20NoReturnMock_init() internal onlyInitializing { - } - - function __ERC20NoReturnMock_init_unchained() internal onlyInitializing { - } - mapping(address => uint256) private _allowances; - - // IERC20's functions are not pure, but these mock implementations are: to prevent Solidity from issuing warnings, - // we write to a dummy state variable. - uint256 private _dummy; - - function transfer(address, uint256) public { - _dummy = 0; - } - - function transferFrom( - address, - address, - uint256 - ) public { - _dummy = 0; - } - - function approve(address, uint256) public { - _dummy = 0; - } - - function setAllowance(uint256 allowance_) public { - _allowances[_msgSender()] = allowance_; - } - - function allowance(address owner, address) public view returns (uint256) { - return _allowances[owner]; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[48] private __gap; -} - -contract ERC20PermitNoRevertMockUpgradeable is - Initializable, ERC20Upgradeable, - ERC20PermitUpgradeable -{ - function __ERC20PermitNoRevertMock_init() internal onlyInitializing { - __ERC20_init_unchained("ERC20PermitNoRevertMock", "ERC20PermitNoRevertMock"); - __EIP712_init_unchained("ERC20PermitNoRevertMock", "1"); - __ERC20Permit_init_unchained("ERC20PermitNoRevertMock"); - } - - function __ERC20PermitNoRevertMock_init_unchained() internal onlyInitializing { - } - function getChainId() external view returns (uint256) { - return block.chainid; - } - - function permitThatMayRevert( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) public { - super.permit(owner, spender, value, deadline, v, r, s); - } - - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) public override { - try this.permitThatMayRevert(owner, spender, value, deadline, v, r, s) { - // do nothing - } catch { - // do nothing - } - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} - -contract SafeERC20WrapperUpgradeable is Initializable, ContextUpgradeable { - using SafeERC20Upgradeable for IERC20Upgradeable; - - IERC20Upgradeable private _token; - - function __SafeERC20Wrapper_init(IERC20Upgradeable token) internal onlyInitializing { - __SafeERC20Wrapper_init_unchained(token); - } - - function __SafeERC20Wrapper_init_unchained(IERC20Upgradeable token) internal onlyInitializing { - _token = token; - } - - function transfer() public { - _token.safeTransfer(address(0), 0); - } - - function transferFrom() public { - _token.safeTransferFrom(address(0), address(0), 0); - } - - function approve(uint256 amount) public { - _token.safeApprove(address(0), amount); - } - - function increaseAllowance(uint256 amount) public { - _token.safeIncreaseAllowance(address(0), amount); - } - - function decreaseAllowance(uint256 amount) public { - _token.safeDecreaseAllowance(address(0), amount); - } - - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) public { - SafeERC20Upgradeable.safePermit(IERC20PermitUpgradeable(address(_token)), owner, spender, value, deadline, v, r, s); - } - - function setAllowance(uint256 allowance_) public { - ERC20ReturnTrueMockUpgradeable(address(_token)).setAllowance(allowance_); - } - - function allowance() public view returns (uint256) { - return _token.allowance(address(0), address(0)); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/SafeMathMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/SafeMathMockUpgradeable.sol deleted file mode 100644 index ab62bd8..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/SafeMathMockUpgradeable.sol +++ /dev/null @@ -1,151 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/math/SafeMathUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract SafeMathMockUpgradeable is Initializable { - function __SafeMathMock_init() internal onlyInitializing { - } - - function __SafeMathMock_init_unchained() internal onlyInitializing { - } - function tryAdd(uint256 a, uint256 b) public pure returns (bool flag, uint256 value) { - return SafeMathUpgradeable.tryAdd(a, b); - } - - function trySub(uint256 a, uint256 b) public pure returns (bool flag, uint256 value) { - return SafeMathUpgradeable.trySub(a, b); - } - - function tryMul(uint256 a, uint256 b) public pure returns (bool flag, uint256 value) { - return SafeMathUpgradeable.tryMul(a, b); - } - - function tryDiv(uint256 a, uint256 b) public pure returns (bool flag, uint256 value) { - return SafeMathUpgradeable.tryDiv(a, b); - } - - function tryMod(uint256 a, uint256 b) public pure returns (bool flag, uint256 value) { - return SafeMathUpgradeable.tryMod(a, b); - } - - // using the do* naming convention to avoid warnings due to clashing opcode names - - function doAdd(uint256 a, uint256 b) public pure returns (uint256) { - return SafeMathUpgradeable.add(a, b); - } - - function doSub(uint256 a, uint256 b) public pure returns (uint256) { - return SafeMathUpgradeable.sub(a, b); - } - - function doMul(uint256 a, uint256 b) public pure returns (uint256) { - return SafeMathUpgradeable.mul(a, b); - } - - function doDiv(uint256 a, uint256 b) public pure returns (uint256) { - return SafeMathUpgradeable.div(a, b); - } - - function doMod(uint256 a, uint256 b) public pure returns (uint256) { - return SafeMathUpgradeable.mod(a, b); - } - - function subWithMessage( - uint256 a, - uint256 b, - string memory errorMessage - ) public pure returns (uint256) { - return SafeMathUpgradeable.sub(a, b, errorMessage); - } - - function divWithMessage( - uint256 a, - uint256 b, - string memory errorMessage - ) public pure returns (uint256) { - return SafeMathUpgradeable.div(a, b, errorMessage); - } - - function modWithMessage( - uint256 a, - uint256 b, - string memory errorMessage - ) public pure returns (uint256) { - return SafeMathUpgradeable.mod(a, b, errorMessage); - } - - function addMemoryCheck() public pure returns (uint256 mem) { - uint256 length = 32; - assembly { - mem := mload(0x40) - } - for (uint256 i = 0; i < length; ++i) { - SafeMathUpgradeable.add(1, 1); - } - assembly { - mem := sub(mload(0x40), mem) - } - } - - function subMemoryCheck() public pure returns (uint256 mem) { - uint256 length = 32; - assembly { - mem := mload(0x40) - } - for (uint256 i = 0; i < length; ++i) { - SafeMathUpgradeable.sub(1, 1); - } - assembly { - mem := sub(mload(0x40), mem) - } - } - - function mulMemoryCheck() public pure returns (uint256 mem) { - uint256 length = 32; - assembly { - mem := mload(0x40) - } - for (uint256 i = 0; i < length; ++i) { - SafeMathUpgradeable.mul(1, 1); - } - assembly { - mem := sub(mload(0x40), mem) - } - } - - function divMemoryCheck() public pure returns (uint256 mem) { - uint256 length = 32; - assembly { - mem := mload(0x40) - } - for (uint256 i = 0; i < length; ++i) { - SafeMathUpgradeable.div(1, 1); - } - assembly { - mem := sub(mload(0x40), mem) - } - } - - function modMemoryCheck() public pure returns (uint256 mem) { - uint256 length = 32; - assembly { - mem := mload(0x40) - } - for (uint256 i = 0; i < length; ++i) { - SafeMathUpgradeable.mod(1, 1); - } - assembly { - mem := sub(mload(0x40), mem) - } - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/SignatureCheckerMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/SignatureCheckerMockUpgradeable.sol deleted file mode 100644 index ba7ceeb..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/SignatureCheckerMockUpgradeable.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/cryptography/SignatureCheckerUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract SignatureCheckerMockUpgradeable is Initializable { - function __SignatureCheckerMock_init() internal onlyInitializing { - } - - function __SignatureCheckerMock_init_unchained() internal onlyInitializing { - } - using SignatureCheckerUpgradeable for address; - - function isValidSignatureNow( - address signer, - bytes32 hash, - bytes memory signature - ) public view returns (bool) { - return signer.isValidSignatureNow(hash, signature); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/SignedMathMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/SignedMathMockUpgradeable.sol deleted file mode 100644 index 318cf2b..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/SignedMathMockUpgradeable.sol +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/math/SignedMathUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract SignedMathMockUpgradeable is Initializable { - function __SignedMathMock_init() internal onlyInitializing { - } - - function __SignedMathMock_init_unchained() internal onlyInitializing { - } - function max(int256 a, int256 b) public pure returns (int256) { - return SignedMathUpgradeable.max(a, b); - } - - function min(int256 a, int256 b) public pure returns (int256) { - return SignedMathUpgradeable.min(a, b); - } - - function average(int256 a, int256 b) public pure returns (int256) { - return SignedMathUpgradeable.average(a, b); - } - - function abs(int256 n) public pure returns (uint256) { - return SignedMathUpgradeable.abs(n); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/SignedSafeMathMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/SignedSafeMathMockUpgradeable.sol deleted file mode 100644 index 85d7bf4..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/SignedSafeMathMockUpgradeable.sol +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/math/SignedSafeMathUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract SignedSafeMathMockUpgradeable is Initializable { - function __SignedSafeMathMock_init() internal onlyInitializing { - } - - function __SignedSafeMathMock_init_unchained() internal onlyInitializing { - } - function mul(int256 a, int256 b) public pure returns (int256) { - return SignedSafeMathUpgradeable.mul(a, b); - } - - function div(int256 a, int256 b) public pure returns (int256) { - return SignedSafeMathUpgradeable.div(a, b); - } - - function sub(int256 a, int256 b) public pure returns (int256) { - return SignedSafeMathUpgradeable.sub(a, b); - } - - function add(int256 a, int256 b) public pure returns (int256) { - return SignedSafeMathUpgradeable.add(a, b); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/SingleInheritanceInitializableMocks.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/SingleInheritanceInitializableMocks.sol deleted file mode 100644 index 6c82dd2..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/SingleInheritanceInitializableMocks.sol +++ /dev/null @@ -1,49 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../proxy/utils/Initializable.sol"; - -/** - * @title MigratableMockV1 - * @dev This contract is a mock to test initializable functionality through migrations - */ -contract MigratableMockV1 is Initializable { - uint256 public x; - - function initialize(uint256 value) public payable initializer { - x = value; - } -} - -/** - * @title MigratableMockV2 - * @dev This contract is a mock to test migratable functionality with params - */ -contract MigratableMockV2 is MigratableMockV1 { - bool internal _migratedV2; - uint256 public y; - - function migrate(uint256 value, uint256 anotherValue) public payable { - require(!_migratedV2); - x = value; - y = anotherValue; - _migratedV2 = true; - } -} - -/** - * @title MigratableMockV3 - * @dev This contract is a mock to test migratable functionality without params - */ -contract MigratableMockV3 is MigratableMockV2 { - bool internal _migratedV3; - - function migrate() public payable { - require(!_migratedV3); - uint256 oldX = x; - x = y; - y = oldX; - _migratedV3 = true; - } -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/StorageSlotMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/StorageSlotMockUpgradeable.sol deleted file mode 100644 index 95698c0..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/StorageSlotMockUpgradeable.sol +++ /dev/null @@ -1,54 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/StorageSlotUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract StorageSlotMockUpgradeable is Initializable { - function __StorageSlotMock_init() internal onlyInitializing { - } - - function __StorageSlotMock_init_unchained() internal onlyInitializing { - } - using StorageSlotUpgradeable for bytes32; - - function setBoolean(bytes32 slot, bool value) public { - slot.getBooleanSlot().value = value; - } - - function setAddress(bytes32 slot, address value) public { - slot.getAddressSlot().value = value; - } - - function setBytes32(bytes32 slot, bytes32 value) public { - slot.getBytes32Slot().value = value; - } - - function setUint256(bytes32 slot, uint256 value) public { - slot.getUint256Slot().value = value; - } - - function getBoolean(bytes32 slot) public view returns (bool) { - return slot.getBooleanSlot().value; - } - - function getAddress(bytes32 slot) public view returns (address) { - return slot.getAddressSlot().value; - } - - function getBytes32(bytes32 slot) public view returns (bytes32) { - return slot.getBytes32Slot().value; - } - - function getUint256(bytes32 slot) public view returns (uint256) { - return slot.getUint256Slot().value; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/StringsMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/StringsMockUpgradeable.sol deleted file mode 100644 index 0a612c0..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/StringsMockUpgradeable.sol +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/StringsUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract StringsMockUpgradeable is Initializable { - function __StringsMock_init() internal onlyInitializing { - } - - function __StringsMock_init_unchained() internal onlyInitializing { - } - function toString(uint256 value) public pure returns (string memory) { - return StringsUpgradeable.toString(value); - } - - function toHexString(uint256 value) public pure returns (string memory) { - return StringsUpgradeable.toHexString(value); - } - - function toHexString(uint256 value, uint256 length) public pure returns (string memory) { - return StringsUpgradeable.toHexString(value, length); - } - - function toHexString(address addr) public pure returns (string memory) { - return StringsUpgradeable.toHexString(addr); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/TimersBlockNumberImplUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/TimersBlockNumberImplUpgradeable.sol deleted file mode 100644 index b657a7f..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/TimersBlockNumberImplUpgradeable.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/TimersUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract TimersBlockNumberImplUpgradeable is Initializable { - function __TimersBlockNumberImpl_init() internal onlyInitializing { - } - - function __TimersBlockNumberImpl_init_unchained() internal onlyInitializing { - } - using TimersUpgradeable for TimersUpgradeable.BlockNumber; - - TimersUpgradeable.BlockNumber private _timer; - - function getDeadline() public view returns (uint64) { - return _timer.getDeadline(); - } - - function setDeadline(uint64 timestamp) public { - _timer.setDeadline(timestamp); - } - - function reset() public { - _timer.reset(); - } - - function isUnset() public view returns (bool) { - return _timer.isUnset(); - } - - function isStarted() public view returns (bool) { - return _timer.isStarted(); - } - - function isPending() public view returns (bool) { - return _timer.isPending(); - } - - function isExpired() public view returns (bool) { - return _timer.isExpired(); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/TimersTimestampImplUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/TimersTimestampImplUpgradeable.sol deleted file mode 100644 index f28f301..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/TimersTimestampImplUpgradeable.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../utils/TimersUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract TimersTimestampImplUpgradeable is Initializable { - function __TimersTimestampImpl_init() internal onlyInitializing { - } - - function __TimersTimestampImpl_init_unchained() internal onlyInitializing { - } - using TimersUpgradeable for TimersUpgradeable.Timestamp; - - TimersUpgradeable.Timestamp private _timer; - - function getDeadline() public view returns (uint64) { - return _timer.getDeadline(); - } - - function setDeadline(uint64 timestamp) public { - _timer.setDeadline(timestamp); - } - - function reset() public { - _timer.reset(); - } - - function isUnset() public view returns (bool) { - return _timer.isUnset(); - } - - function isStarted() public view returns (bool) { - return _timer.isStarted(); - } - - function isPending() public view returns (bool) { - return _timer.isPending(); - } - - function isExpired() public view returns (bool) { - return _timer.isExpired(); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/UUPS/UUPSLegacyUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/UUPS/UUPSLegacyUpgradeable.sol deleted file mode 100644 index 2377863..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/UUPS/UUPSLegacyUpgradeable.sol +++ /dev/null @@ -1,81 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "./UUPSUpgradeableMockUpgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -// This contract implements the pre-4.5 UUPS upgrade function with a rollback test. -// It's used to test that newer UUPS contracts are considered valid upgrades by older UUPS contracts. -contract UUPSUpgradeableLegacyMockUpgradeable is Initializable, UUPSUpgradeableMockUpgradeable { - function __UUPSUpgradeableLegacyMock_init() internal onlyInitializing { - } - - function __UUPSUpgradeableLegacyMock_init_unchained() internal onlyInitializing { - } - // Inlined from ERC1967Upgrade - bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143; - - // ERC1967Upgrade._setImplementation is private so we reproduce it here. - // An extra underscore prevents a name clash error. - function __setImplementation(address newImplementation) private { - require(AddressUpgradeable.isContract(newImplementation), "ERC1967: new implementation is not a contract"); - StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; - } - - function _upgradeToAndCallSecureLegacyV1( - address newImplementation, - bytes memory data, - bool forceCall - ) internal { - address oldImplementation = _getImplementation(); - - // Initial upgrade and setup call - __setImplementation(newImplementation); - if (data.length > 0 || forceCall) { - __functionDelegateCall(newImplementation, data); - } - - // Perform rollback test if not already in progress - StorageSlotUpgradeable.BooleanSlot storage rollbackTesting = StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT); - if (!rollbackTesting.value) { - // Trigger rollback using upgradeTo from the new implementation - rollbackTesting.value = true; - __functionDelegateCall( - newImplementation, - abi.encodeWithSignature("upgradeTo(address)", oldImplementation) - ); - rollbackTesting.value = false; - // Check rollback was effective - require(oldImplementation == _getImplementation(), "ERC1967Upgrade: upgrade breaks further upgrades"); - // Finally reset to the new implementation and log the upgrade - _upgradeTo(newImplementation); - } - } - - // hooking into the old mechanism - function upgradeTo(address newImplementation) external override { - _upgradeToAndCallSecureLegacyV1(newImplementation, bytes(""), false); - } - - function upgradeToAndCall(address newImplementation, bytes memory data) external payable override { - _upgradeToAndCallSecureLegacyV1(newImplementation, data, false); - } - - // ERC1967Upgrade._functionDelegateCall is private so we reproduce it here. - // An extra underscore prevents a name clash error. - function __functionDelegateCall(address target, bytes memory data) private returns (bytes memory) { - require(AddressUpgradeable.isContract(target), "Address: delegate call to non-contract"); - - // solhint-disable-next-line avoid-low-level-calls - (bool success, bytes memory returndata) = target.delegatecall(data); - return AddressUpgradeable.verifyCallResult(success, returndata, "Address: low-level delegate call failed"); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/UUPS/UUPSUpgradeableMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/UUPS/UUPSUpgradeableMockUpgradeable.sol deleted file mode 100644 index 47f3bdb..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/UUPS/UUPSUpgradeableMockUpgradeable.sol +++ /dev/null @@ -1,46 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../CountersImplUpgradeable.sol"; -import "../../proxy/utils/UUPSUpgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -contract UUPSUpgradeableMockUpgradeable is Initializable, CountersImplUpgradeable, UUPSUpgradeable { - function __UUPSUpgradeableMock_init() internal onlyInitializing { - } - - function __UUPSUpgradeableMock_init_unchained() internal onlyInitializing { - } - // Not having any checks in this function is dangerous! Do not do this outside tests! - function _authorizeUpgrade(address) internal override {} - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} - -contract UUPSUpgradeableUnsafeMockUpgradeable is Initializable, UUPSUpgradeableMockUpgradeable { - function __UUPSUpgradeableUnsafeMock_init() internal onlyInitializing { - } - - function __UUPSUpgradeableUnsafeMock_init_unchained() internal onlyInitializing { - } - function upgradeTo(address newImplementation) external override { - ERC1967UpgradeUpgradeable._upgradeToAndCall(newImplementation, bytes(""), false); - } - - function upgradeToAndCall(address newImplementation, bytes memory data) external payable override { - ERC1967UpgradeUpgradeable._upgradeToAndCall(newImplementation, data, false); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/VotesMockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/VotesMockUpgradeable.sol deleted file mode 100644 index f5b08d1..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/VotesMockUpgradeable.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../governance/utils/VotesUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -contract VotesMockUpgradeable is Initializable, VotesUpgradeable { - mapping(address => uint256) private _balances; - mapping(uint256 => address) private _owners; - - function __VotesMock_init(string memory name) internal onlyInitializing { - __EIP712_init_unchained(name, "1"); - } - - function __VotesMock_init_unchained(string memory) internal onlyInitializing {} - - function getTotalSupply() public view returns (uint256) { - return _getTotalSupply(); - } - - function delegate(address account, address newDelegation) public { - return _delegate(account, newDelegation); - } - - function _getVotingUnits(address account) internal view override returns (uint256) { - return _balances[account]; - } - - function mint(address account, uint256 voteId) external { - _balances[account] += 1; - _owners[voteId] = account; - _transferVotingUnits(address(0), account, 1); - } - - function burn(uint256 voteId) external { - address owner = _owners[voteId]; - _balances[owner] -= 1; - _transferVotingUnits(owner, address(0), 1); - } - - function getChainId() external view returns (uint256) { - return block.chainid; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[48] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/WithInit.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/WithInit.sol deleted file mode 100644 index 61c2adf..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/WithInit.sol +++ /dev/null @@ -1,1233 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >=0.7 <0.9; -pragma experimental ABIEncoderV2; - -import "./AccessControlMockUpgradeable.sol"; - -contract AccessControlMockUpgradeableWithInit is AccessControlMockUpgradeable { - constructor() payable initializer { - __AccessControlMock_init(); - } -} -import "../governance/TimelockControllerUpgradeable.sol"; - -contract TimelockControllerUpgradeableWithInit is TimelockControllerUpgradeable { - constructor( - uint256 minDelay, - address[] memory proposers, - address[] memory executors, - address admin - ) payable initializer { - __TimelockController_init(minDelay, proposers, executors, admin); - } -} -import "./wizard/MyGovernor3Upgradeable.sol"; - -contract MyGovernorUpgradeableWithInit is MyGovernorUpgradeable { - constructor(IVotesUpgradeable _token, TimelockControllerUpgradeable _timelock) payable initializer { - __MyGovernor_init(_token, _timelock); - } -} -import "./wizard/MyGovernor2Upgradeable.sol"; - -contract MyGovernor2UpgradeableWithInit is MyGovernor2Upgradeable { - constructor(IVotesUpgradeable _token, TimelockControllerUpgradeable _timelock) payable initializer { - __MyGovernor2_init(_token, _timelock); - } -} -import "./wizard/MyGovernor1Upgradeable.sol"; - -contract MyGovernor1UpgradeableWithInit is MyGovernor1Upgradeable { - constructor(IVotesUpgradeable _token, TimelockControllerUpgradeable _timelock) payable initializer { - __MyGovernor1_init(_token, _timelock); - } -} -import "./GovernorWithParamsMockUpgradeable.sol"; - -contract GovernorWithParamsMockUpgradeableWithInit is GovernorWithParamsMockUpgradeable { - constructor(string memory name_, IVotesUpgradeable token_) payable initializer { - __GovernorWithParamsMock_init(name_, token_); - } -} -import "./GovernorVoteMockUpgradeable.sol"; - -contract GovernorVoteMocksUpgradeableWithInit is GovernorVoteMocksUpgradeable { - constructor(string memory name_, IVotesUpgradeable token_) payable initializer { - __GovernorVoteMocks_init(name_, token_); - } -} -import "./GovernorTimelockControlMockUpgradeable.sol"; - -contract GovernorTimelockControlMockUpgradeableWithInit is GovernorTimelockControlMockUpgradeable { - constructor( - string memory name_, - IVotesUpgradeable token_, - uint256 votingDelay_, - uint256 votingPeriod_, - TimelockControllerUpgradeable timelock_, - uint256 quorumNumerator_ - ) payable initializer { - __GovernorTimelockControlMock_init(name_, token_, votingDelay_, votingPeriod_, timelock_, quorumNumerator_); - } -} -import "./GovernorTimelockCompoundMockUpgradeable.sol"; - -contract GovernorTimelockCompoundMockUpgradeableWithInit is GovernorTimelockCompoundMockUpgradeable { - constructor( - string memory name_, - IVotesUpgradeable token_, - uint256 votingDelay_, - uint256 votingPeriod_, - ICompoundTimelockUpgradeable timelock_, - uint256 quorumNumerator_ - ) payable initializer { - __GovernorTimelockCompoundMock_init(name_, token_, votingDelay_, votingPeriod_, timelock_, quorumNumerator_); - } -} -import "./GovernorCompatibilityBravoMockUpgradeable.sol"; - -contract GovernorCompatibilityBravoMockUpgradeableWithInit is GovernorCompatibilityBravoMockUpgradeable { - constructor( - string memory name_, - ERC20VotesCompUpgradeable token_, - uint256 votingDelay_, - uint256 votingPeriod_, - uint256 proposalThreshold_, - ICompoundTimelockUpgradeable timelock_ - ) payable initializer { - __GovernorCompatibilityBravoMock_init(name_, token_, votingDelay_, votingPeriod_, proposalThreshold_, timelock_); - } -} -import "../token/ERC20/ERC20Upgradeable.sol"; - -contract ERC20UpgradeableWithInit is ERC20Upgradeable { - constructor(string memory name_, string memory symbol_) payable initializer { - __ERC20_init(name_, symbol_); - } -} -import "./GovernorCompMockUpgradeable.sol"; - -contract GovernorCompMockUpgradeableWithInit is GovernorCompMockUpgradeable { - constructor(string memory name_, ERC20VotesCompUpgradeable token_) payable initializer { - __GovernorCompMock_init(name_, token_); - } -} -import "./ERC1271WalletMockUpgradeable.sol"; - -contract ERC1271WalletMockUpgradeableWithInit is ERC1271WalletMockUpgradeable { - constructor(address originalOwner) payable initializer { - __ERC1271WalletMock_init(originalOwner); - } -} -import "./ERC1271WalletMockUpgradeable.sol"; - -contract ERC1271MaliciousMockUpgradeableWithInit is ERC1271MaliciousMockUpgradeable { - constructor() payable initializer { - __ERC1271MaliciousMock_init(); - } -} -import "../utils/escrow/EscrowUpgradeable.sol"; - -contract EscrowUpgradeableWithInit is EscrowUpgradeable { - constructor() payable initializer { - __Escrow_init(); - } -} -import "./MulticallTokenMockUpgradeable.sol"; - -contract MulticallTokenMockUpgradeableWithInit is MulticallTokenMockUpgradeable { - constructor(uint256 initialBalance) payable initializer { - __MulticallTokenMock_init(initialBalance); - } -} -import "./ERC20MockUpgradeable.sol"; - -contract ERC20MockUpgradeableWithInit is ERC20MockUpgradeable { - constructor( - string memory name, - string memory symbol, - address initialAccount, - uint256 initialBalance - ) payable initializer { - __ERC20Mock_init(name, symbol, initialAccount, initialBalance); - } -} -import "../token/ERC20/presets/ERC20PresetMinterPauserUpgradeable.sol"; - -contract ERC20PresetMinterPauserUpgradeableWithInit is ERC20PresetMinterPauserUpgradeable { - constructor(string memory name, string memory symbol) payable initializer { - __ERC20PresetMinterPauser_init(name, symbol); - } -} -import "../token/ERC777/ERC777Upgradeable.sol"; - -contract ERC777UpgradeableWithInit is ERC777Upgradeable { - constructor( - string memory name_, - string memory symbol_, - address[] memory defaultOperators_ - ) payable initializer { - __ERC777_init(name_, symbol_, defaultOperators_); - } -} -import "../token/ERC777/presets/ERC777PresetFixedSupplyUpgradeable.sol"; - -contract ERC777PresetFixedSupplyUpgradeableWithInit is ERC777PresetFixedSupplyUpgradeable { - constructor( - string memory name, - string memory symbol, - address[] memory defaultOperators, - uint256 initialSupply, - address owner - ) payable initializer { - __ERC777PresetFixedSupply_init(name, symbol, defaultOperators, initialSupply, owner); - } -} -import "./ERC777SenderRecipientMockUpgradeable.sol"; - -contract ERC777SenderRecipientMockUpgradeableWithInit is ERC777SenderRecipientMockUpgradeable { - constructor() payable initializer { - __ERC777SenderRecipientMock_init(); - } -} -import "../utils/introspection/ERC1820ImplementerUpgradeable.sol"; - -contract ERC1820ImplementerUpgradeableWithInit is ERC1820ImplementerUpgradeable { - constructor() payable initializer { - __ERC1820Implementer_init(); - } -} -import "./ERC1820ImplementerMockUpgradeable.sol"; - -contract ERC1820ImplementerMockUpgradeableWithInit is ERC1820ImplementerMockUpgradeable { - constructor() payable initializer { - __ERC1820ImplementerMock_init(); - } -} -import "./Create2ImplUpgradeable.sol"; - -contract Create2ImplUpgradeableWithInit is Create2ImplUpgradeable { - constructor() payable initializer { - __Create2Impl_init(); - } -} -import "../token/ERC20/utils/TokenTimelockUpgradeable.sol"; - -contract TokenTimelockUpgradeableWithInit is TokenTimelockUpgradeable { - constructor( - IERC20Upgradeable token_, - address beneficiary_, - uint256 releaseTime_ - ) payable initializer { - __TokenTimelock_init(token_, beneficiary_, releaseTime_); - } -} -import "../token/ERC721/presets/ERC721PresetMinterPauserAutoIdUpgradeable.sol"; - -contract ERC721PresetMinterPauserAutoIdUpgradeableWithInit is ERC721PresetMinterPauserAutoIdUpgradeable { - constructor( - string memory name, - string memory symbol, - string memory baseTokenURI - ) payable initializer { - __ERC721PresetMinterPauserAutoId_init(name, symbol, baseTokenURI); - } -} -import "../token/ERC721/ERC721Upgradeable.sol"; - -contract ERC721UpgradeableWithInit is ERC721Upgradeable { - constructor(string memory name_, string memory symbol_) payable initializer { - __ERC721_init(name_, symbol_); - } -} -import "../token/ERC1155/presets/ERC1155PresetMinterPauserUpgradeable.sol"; - -contract ERC1155PresetMinterPauserUpgradeableWithInit is ERC1155PresetMinterPauserUpgradeable { - constructor(string memory uri) payable initializer { - __ERC1155PresetMinterPauser_init(uri); - } -} -import "../token/ERC1155/ERC1155Upgradeable.sol"; - -contract ERC1155UpgradeableWithInit is ERC1155Upgradeable { - constructor(string memory uri_) payable initializer { - __ERC1155_init(uri_); - } -} -import "./VotesMockUpgradeable.sol"; - -contract VotesMockUpgradeableWithInit is VotesMockUpgradeable { - constructor(string memory name) payable initializer { - __VotesMock_init(name); - } -} -import "./EIP712ExternalUpgradeable.sol"; - -contract EIP712ExternalUpgradeableWithInit is EIP712ExternalUpgradeable { - constructor(string memory name, string memory version) payable initializer { - __EIP712External_init(name, version); - } -} -import "../metatx/MinimalForwarderUpgradeable.sol"; - -contract MinimalForwarderUpgradeableWithInit is MinimalForwarderUpgradeable { - constructor() payable initializer { - __MinimalForwarder_init(); - } -} -import "./GovernorMockUpgradeable.sol"; - -contract GovernorMockUpgradeableWithInit is GovernorMockUpgradeable { - constructor( - string memory name_, - IVotesUpgradeable token_, - uint256 votingDelay_, - uint256 votingPeriod_, - uint256 quorumNumerator_ - ) payable initializer { - __GovernorMock_init(name_, token_, votingDelay_, votingPeriod_, quorumNumerator_); - } -} -import "./GovernorPreventLateQuorumMockUpgradeable.sol"; - -contract GovernorPreventLateQuorumMockUpgradeableWithInit is GovernorPreventLateQuorumMockUpgradeable { - constructor( - string memory name_, - IVotesUpgradeable token_, - uint256 votingDelay_, - uint256 votingPeriod_, - uint256 quorum_, - uint64 voteExtension_ - ) payable initializer { - __GovernorPreventLateQuorumMock_init(name_, token_, votingDelay_, votingPeriod_, quorum_, voteExtension_); - } -} -import "./ERC1155SupplyMockUpgradeable.sol"; - -contract ERC1155SupplyMockUpgradeableWithInit is ERC1155SupplyMockUpgradeable { - constructor(string memory uri) payable initializer { - __ERC1155SupplyMock_init(uri); - } -} -import "./ERC1155MockUpgradeable.sol"; - -contract ERC1155MockUpgradeableWithInit is ERC1155MockUpgradeable { - constructor(string memory uri) payable initializer { - __ERC1155Mock_init(uri); - } -} -import "./ERC1155URIStorageMockUpgradeable.sol"; - -contract ERC1155URIStorageMockUpgradeableWithInit is ERC1155URIStorageMockUpgradeable { - constructor(string memory _uri) payable initializer { - __ERC1155URIStorageMock_init(_uri); - } -} -import "./ERC1155PausableMockUpgradeable.sol"; - -contract ERC1155PausableMockUpgradeableWithInit is ERC1155PausableMockUpgradeable { - constructor(string memory uri) payable initializer { - __ERC1155PausableMock_init(uri); - } -} -import "./ERC1155BurnableMockUpgradeable.sol"; - -contract ERC1155BurnableMockUpgradeableWithInit is ERC1155BurnableMockUpgradeable { - constructor(string memory uri) payable initializer { - __ERC1155BurnableMock_init(uri); - } -} -import "./ERC165StorageMockUpgradeable.sol"; - -contract ERC165StorageMockUpgradeableWithInit is ERC165StorageMockUpgradeable { - constructor() payable initializer { - __ERC165StorageMock_init(); - } -} -import "./ERC165CheckerMockUpgradeable.sol"; - -contract ERC165CheckerMockUpgradeableWithInit is ERC165CheckerMockUpgradeable { - constructor() payable initializer { - __ERC165CheckerMock_init(); - } -} -import "./ERC721EnumerableMockUpgradeable.sol"; - -contract ERC721EnumerableMockUpgradeableWithInit is ERC721EnumerableMockUpgradeable { - constructor(string memory name, string memory symbol) payable initializer { - __ERC721EnumerableMock_init(name, symbol); - } -} -import "./ERC721ConsecutiveMockUpgradeable.sol"; - -contract ERC721ConsecutiveMockUpgradeableWithInit is ERC721ConsecutiveMockUpgradeable { - constructor( - string memory name, - string memory symbol, - address[] memory delegates, - address[] memory receivers, - uint96[] memory amounts - ) payable initializer { - __ERC721ConsecutiveMock_init(name, symbol, delegates, receivers, amounts); - } -} -import "./ERC721ConsecutiveMockUpgradeable.sol"; - -contract ERC721ConsecutiveNoConstructorMintMockUpgradeableWithInit is ERC721ConsecutiveNoConstructorMintMockUpgradeable { - constructor(string memory name, string memory symbol) payable initializer { - __ERC721ConsecutiveNoConstructorMintMock_init(name, symbol); - } -} -import "./BitmapMockUpgradeable.sol"; - -contract BitMapMockUpgradeableWithInit is BitMapMockUpgradeable { - constructor() payable initializer { - __BitMapMock_init(); - } -} -import "./DoubleEndedQueueMockUpgradeable.sol"; - -contract Bytes32DequeMockUpgradeableWithInit is Bytes32DequeMockUpgradeable { - constructor() payable initializer { - __Bytes32DequeMock_init(); - } -} -import "./SafeCastMockUpgradeable.sol"; - -contract SafeCastMockUpgradeableWithInit is SafeCastMockUpgradeable { - constructor() payable initializer { - __SafeCastMock_init(); - } -} -import "./CheckpointsMockUpgradeable.sol"; - -contract CheckpointsMockUpgradeableWithInit is CheckpointsMockUpgradeable { - constructor() payable initializer { - __CheckpointsMock_init(); - } -} -import "./CheckpointsMockUpgradeable.sol"; - -contract Checkpoints224MockUpgradeableWithInit is Checkpoints224MockUpgradeable { - constructor() payable initializer { - __Checkpoints224Mock_init(); - } -} -import "./CheckpointsMockUpgradeable.sol"; - -contract Checkpoints160MockUpgradeableWithInit is Checkpoints160MockUpgradeable { - constructor() payable initializer { - __Checkpoints160Mock_init(); - } -} -import "./ERC721ConsecutiveEnumerableMockUpgradeable.sol"; - -contract ERC721ConsecutiveEnumerableMockUpgradeableWithInit is ERC721ConsecutiveEnumerableMockUpgradeable { - constructor( - string memory name, - string memory symbol, - address[] memory receivers, - uint96[] memory amounts - ) payable initializer { - __ERC721ConsecutiveEnumerableMock_init(name, symbol, receivers, amounts); - } -} -import "./ERC721BurnableMockUpgradeable.sol"; - -contract ERC721BurnableMockUpgradeableWithInit is ERC721BurnableMockUpgradeable { - constructor(string memory name, string memory symbol) payable initializer { - __ERC721BurnableMock_init(name, symbol); - } -} -import "../token/ERC1155/utils/ERC1155HolderUpgradeable.sol"; - -contract ERC1155HolderUpgradeableWithInit is ERC1155HolderUpgradeable { - constructor() payable initializer { - __ERC1155Holder_init(); - } -} -import "./ERC1155ReceiverMockUpgradeable.sol"; - -contract ERC1155ReceiverMockUpgradeableWithInit is ERC1155ReceiverMockUpgradeable { - constructor( - bytes4 recRetval, - bool recReverts, - bytes4 batRetval, - bool batReverts - ) payable initializer { - __ERC1155ReceiverMock_init(recRetval, recReverts, batRetval, batReverts); - } -} -import "./ERC165/ERC165ReturnBombUpgradeable.sol"; - -contract ERC165ReturnBombMockUpgradeableWithInit is ERC165ReturnBombMockUpgradeable { - constructor() payable initializer { - __ERC165ReturnBombMock_init(); - } -} -import "./ERC165/ERC165InterfacesSupportedUpgradeable.sol"; - -contract SupportsInterfaceWithLookupMockUpgradeableWithInit is SupportsInterfaceWithLookupMockUpgradeable { - constructor() payable initializer { - __SupportsInterfaceWithLookupMock_init(); - } -} -import "./ERC165/ERC165InterfacesSupportedUpgradeable.sol"; - -contract ERC165InterfacesSupportedUpgradeableWithInit is ERC165InterfacesSupportedUpgradeable { - constructor(bytes4[] memory interfaceIds) payable initializer { - __ERC165InterfacesSupported_init(interfaceIds); - } -} -import "./ERC721RoyaltyMockUpgradeable.sol"; - -contract ERC721RoyaltyMockUpgradeableWithInit is ERC721RoyaltyMockUpgradeable { - constructor(string memory name, string memory symbol) payable initializer { - __ERC721RoyaltyMock_init(name, symbol); - } -} -import "./ERC165MockUpgradeable.sol"; - -contract ERC165MockUpgradeableWithInit is ERC165MockUpgradeable { - constructor() payable initializer { - __ERC165Mock_init(); - } -} -import "./StringsMockUpgradeable.sol"; - -contract StringsMockUpgradeableWithInit is StringsMockUpgradeable { - constructor() payable initializer { - __StringsMock_init(); - } -} -import "./UUPS/UUPSUpgradeableMockUpgradeable.sol"; - -contract UUPSUpgradeableMockUpgradeableWithInit is UUPSUpgradeableMockUpgradeable { - constructor() payable initializer { - __UUPSUpgradeableMock_init(); - } -} -import "./UUPS/UUPSUpgradeableMockUpgradeable.sol"; - -contract UUPSUpgradeableUnsafeMockUpgradeableWithInit is UUPSUpgradeableUnsafeMockUpgradeable { - constructor() payable initializer { - __UUPSUpgradeableUnsafeMock_init(); - } -} -import "./CountersImplUpgradeable.sol"; - -contract CountersImplUpgradeableWithInit is CountersImplUpgradeable { - constructor() payable initializer { - __CountersImpl_init(); - } -} -import "./UUPS/UUPSLegacyUpgradeable.sol"; - -contract UUPSUpgradeableLegacyMockUpgradeableWithInit is UUPSUpgradeableLegacyMockUpgradeable { - constructor() payable initializer { - __UUPSUpgradeableLegacyMock_init(); - } -} -import "./StorageSlotMockUpgradeable.sol"; - -contract StorageSlotMockUpgradeableWithInit is StorageSlotMockUpgradeable { - constructor() payable initializer { - __StorageSlotMock_init(); - } -} -import "./ERC20SnapshotMockUpgradeable.sol"; - -contract ERC20SnapshotMockUpgradeableWithInit is ERC20SnapshotMockUpgradeable { - constructor( - string memory name, - string memory symbol, - address initialAccount, - uint256 initialBalance - ) payable initializer { - __ERC20SnapshotMock_init(name, symbol, initialAccount, initialBalance); - } -} -import "./ArraysMockUpgradeable.sol"; - -contract Uint256ArraysMockUpgradeableWithInit is Uint256ArraysMockUpgradeable { - constructor(uint256[] memory array) payable initializer { - __Uint256ArraysMock_init(array); - } -} -import "./ArraysMockUpgradeable.sol"; - -contract AddressArraysMockUpgradeableWithInit is AddressArraysMockUpgradeable { - constructor(address[] memory array) payable initializer { - __AddressArraysMock_init(array); - } -} -import "./ArraysMockUpgradeable.sol"; - -contract Bytes32ArraysMockUpgradeableWithInit is Bytes32ArraysMockUpgradeable { - constructor(bytes32[] memory array) payable initializer { - __Bytes32ArraysMock_init(array); - } -} -import "./ERC4626MockUpgradeable.sol"; - -contract ERC4626MockUpgradeableWithInit is ERC4626MockUpgradeable { - constructor( - IERC20MetadataUpgradeable asset, - string memory name, - string memory symbol - ) payable initializer { - __ERC4626Mock_init(asset, name, symbol); - } -} -import "./ERC4626MockUpgradeable.sol"; - -contract ERC4626DecimalMockUpgradeableWithInit is ERC4626DecimalMockUpgradeable { - constructor( - IERC20MetadataUpgradeable asset, - string memory name, - string memory symbol, - uint8 decimalsOverride - ) payable initializer { - __ERC4626DecimalMock_init(asset, name, symbol, decimalsOverride); - } -} -import "./MathMockUpgradeable.sol"; - -contract MathMockUpgradeableWithInit is MathMockUpgradeable { - constructor() payable initializer { - __MathMock_init(); - } -} -import "./TimersTimestampImplUpgradeable.sol"; - -contract TimersTimestampImplUpgradeableWithInit is TimersTimestampImplUpgradeable { - constructor() payable initializer { - __TimersTimestampImpl_init(); - } -} -import "./TimersBlockNumberImplUpgradeable.sol"; - -contract TimersBlockNumberImplUpgradeableWithInit is TimersBlockNumberImplUpgradeable { - constructor() payable initializer { - __TimersBlockNumberImpl_init(); - } -} -import "../token/ERC721/utils/ERC721HolderUpgradeable.sol"; - -contract ERC721HolderUpgradeableWithInit is ERC721HolderUpgradeable { - constructor() payable initializer { - __ERC721Holder_init(); - } -} -import "./ERC721ReceiverMockUpgradeable.sol"; - -contract ERC721ReceiverMockUpgradeableWithInit is ERC721ReceiverMockUpgradeable { - constructor(bytes4 retval, Error error) payable initializer { - __ERC721ReceiverMock_init(retval, error); - } -} -import "./ERC721VotesMockUpgradeable.sol"; - -contract ERC721VotesMockUpgradeableWithInit is ERC721VotesMockUpgradeable { - constructor(string memory name, string memory symbol) payable initializer { - __ERC721VotesMock_init(name, symbol); - } -} -import "./ERC721URIStorageMockUpgradeable.sol"; - -contract ERC721URIStorageMockUpgradeableWithInit is ERC721URIStorageMockUpgradeable { - constructor(string memory name, string memory symbol) payable initializer { - __ERC721URIStorageMock_init(name, symbol); - } -} -import "./ERC721MockUpgradeable.sol"; - -contract ERC721MockUpgradeableWithInit is ERC721MockUpgradeable { - constructor(string memory name, string memory symbol) payable initializer { - __ERC721Mock_init(name, symbol); - } -} -import "./ERC721PausableMockUpgradeable.sol"; - -contract ERC721PausableMockUpgradeableWithInit is ERC721PausableMockUpgradeable { - constructor(string memory name, string memory symbol) payable initializer { - __ERC721PausableMock_init(name, symbol); - } -} -import "./ERC20PausableMockUpgradeable.sol"; - -contract ERC20PausableMockUpgradeableWithInit is ERC20PausableMockUpgradeable { - constructor( - string memory name, - string memory symbol, - address initialAccount, - uint256 initialBalance - ) payable initializer { - __ERC20PausableMock_init(name, symbol, initialAccount, initialBalance); - } -} -import "./PausableMockUpgradeable.sol"; - -contract PausableMockUpgradeableWithInit is PausableMockUpgradeable { - constructor() payable initializer { - __PausableMock_init(); - } -} -import "./AccessControlEnumerableMockUpgradeable.sol"; - -contract AccessControlEnumerableMockUpgradeableWithInit is AccessControlEnumerableMockUpgradeable { - constructor() payable initializer { - __AccessControlEnumerableMock_init(); - } -} -import "./EnumerableMapMockUpgradeable.sol"; - -contract UintToAddressMapMockUpgradeableWithInit is UintToAddressMapMockUpgradeable { - constructor() payable initializer { - __UintToAddressMapMock_init(); - } -} -import "./EnumerableMapMockUpgradeable.sol"; - -contract AddressToUintMapMockUpgradeableWithInit is AddressToUintMapMockUpgradeable { - constructor() payable initializer { - __AddressToUintMapMock_init(); - } -} -import "./EnumerableMapMockUpgradeable.sol"; - -contract Bytes32ToBytes32MapMockUpgradeableWithInit is Bytes32ToBytes32MapMockUpgradeable { - constructor() payable initializer { - __Bytes32ToBytes32MapMock_init(); - } -} -import "./EnumerableMapMockUpgradeable.sol"; - -contract UintToUintMapMockUpgradeableWithInit is UintToUintMapMockUpgradeable { - constructor() payable initializer { - __UintToUintMapMock_init(); - } -} -import "./EnumerableMapMockUpgradeable.sol"; - -contract Bytes32ToUintMapMockUpgradeableWithInit is Bytes32ToUintMapMockUpgradeable { - constructor() payable initializer { - __Bytes32ToUintMapMock_init(); - } -} -import "./EnumerableSetMockUpgradeable.sol"; - -contract EnumerableBytes32SetMockUpgradeableWithInit is EnumerableBytes32SetMockUpgradeable { - constructor() payable initializer { - __EnumerableBytes32SetMock_init(); - } -} -import "./EnumerableSetMockUpgradeable.sol"; - -contract EnumerableAddressSetMockUpgradeableWithInit is EnumerableAddressSetMockUpgradeable { - constructor() payable initializer { - __EnumerableAddressSetMock_init(); - } -} -import "./EnumerableSetMockUpgradeable.sol"; - -contract EnumerableUintSetMockUpgradeableWithInit is EnumerableUintSetMockUpgradeable { - constructor() payable initializer { - __EnumerableUintSetMock_init(); - } -} -import "./SafeERC20HelperUpgradeable.sol"; - -contract ERC20ReturnFalseMockUpgradeableWithInit is ERC20ReturnFalseMockUpgradeable { - constructor() payable initializer { - __ERC20ReturnFalseMock_init(); - } -} -import "./SafeERC20HelperUpgradeable.sol"; - -contract ERC20ReturnTrueMockUpgradeableWithInit is ERC20ReturnTrueMockUpgradeable { - constructor() payable initializer { - __ERC20ReturnTrueMock_init(); - } -} -import "./SafeERC20HelperUpgradeable.sol"; - -contract ERC20NoReturnMockUpgradeableWithInit is ERC20NoReturnMockUpgradeable { - constructor() payable initializer { - __ERC20NoReturnMock_init(); - } -} -import "./SafeERC20HelperUpgradeable.sol"; - -contract ERC20PermitNoRevertMockUpgradeableWithInit is ERC20PermitNoRevertMockUpgradeable { - constructor() payable initializer { - __ERC20PermitNoRevertMock_init(); - } -} -import "./SafeERC20HelperUpgradeable.sol"; - -contract SafeERC20WrapperUpgradeableWithInit is SafeERC20WrapperUpgradeable { - constructor(IERC20Upgradeable token) payable initializer { - __SafeERC20Wrapper_init(token); - } -} -import "./ERC20PermitMockUpgradeable.sol"; - -contract ERC20PermitMockUpgradeableWithInit is ERC20PermitMockUpgradeable { - constructor( - string memory name, - string memory symbol, - address initialAccount, - uint256 initialBalance - ) payable initializer { - __ERC20PermitMock_init(name, symbol, initialAccount, initialBalance); - } -} -import "./ERC20WrapperMockUpgradeable.sol"; - -contract ERC20WrapperMockUpgradeableWithInit is ERC20WrapperMockUpgradeable { - constructor( - IERC20Upgradeable _underlyingToken, - string memory name, - string memory symbol - ) payable initializer { - __ERC20WrapperMock_init(_underlyingToken, name, symbol); - } -} -import "../finance/VestingWalletUpgradeable.sol"; - -contract VestingWalletUpgradeableWithInit is VestingWalletUpgradeable { - constructor( - address beneficiaryAddress, - uint64 startTimestamp, - uint64 durationSeconds - ) payable initializer { - __VestingWallet_init(beneficiaryAddress, startTimestamp, durationSeconds); - } -} -import "../finance/PaymentSplitterUpgradeable.sol"; - -contract PaymentSplitterUpgradeableWithInit is PaymentSplitterUpgradeable { - constructor(address[] memory payees, uint256[] memory shares_) payable initializer { - __PaymentSplitter_init(payees, shares_); - } -} -import "./ERC3156FlashBorrowerMockUpgradeable.sol"; - -contract ERC3156FlashBorrowerMockUpgradeableWithInit is ERC3156FlashBorrowerMockUpgradeable { - constructor(bool enableReturn, bool enableApprove) payable initializer { - __ERC3156FlashBorrowerMock_init(enableReturn, enableApprove); - } -} -import "./ERC20FlashMintMockUpgradeable.sol"; - -contract ERC20FlashMintMockUpgradeableWithInit is ERC20FlashMintMockUpgradeable { - constructor( - string memory name, - string memory symbol, - address initialAccount, - uint256 initialBalance - ) payable initializer { - __ERC20FlashMintMock_init(name, symbol, initialAccount, initialBalance); - } -} -import "./ERC777MockUpgradeable.sol"; - -contract ERC777MockUpgradeableWithInit is ERC777MockUpgradeable { - constructor( - address initialHolder, - uint256 initialBalance, - string memory name, - string memory symbol, - address[] memory defaultOperators - ) payable initializer { - __ERC777Mock_init(initialHolder, initialBalance, name, symbol, defaultOperators); - } -} -import "../token/ERC20/presets/ERC20PresetFixedSupplyUpgradeable.sol"; - -contract ERC20PresetFixedSupplyUpgradeableWithInit is ERC20PresetFixedSupplyUpgradeable { - constructor( - string memory name, - string memory symbol, - uint256 initialSupply, - address owner - ) payable initializer { - __ERC20PresetFixedSupply_init(name, symbol, initialSupply, owner); - } -} -import "./ERC20BurnableMockUpgradeable.sol"; - -contract ERC20BurnableMockUpgradeableWithInit is ERC20BurnableMockUpgradeable { - constructor( - string memory name, - string memory symbol, - address initialAccount, - uint256 initialBalance - ) payable initializer { - __ERC20BurnableMock_init(name, symbol, initialAccount, initialBalance); - } -} -import "./ReentrancyAttackUpgradeable.sol"; - -contract ReentrancyAttackUpgradeableWithInit is ReentrancyAttackUpgradeable { - constructor() payable initializer { - __ReentrancyAttack_init(); - } -} -import "./ReentrancyMockUpgradeable.sol"; - -contract ReentrancyMockUpgradeableWithInit is ReentrancyMockUpgradeable { - constructor() payable initializer { - __ReentrancyMock_init(); - } -} -import "./crosschain/receiversUpgradeable.sol"; - -contract CrossChainEnabledAMBMockUpgradeableWithInit is CrossChainEnabledAMBMockUpgradeable { - constructor(address bridge) CrossChainEnabledAMBMockUpgradeable(bridge) payable initializer { - - } -} -import "./crosschain/receiversUpgradeable.sol"; - -contract CrossChainEnabledArbitrumL1MockUpgradeableWithInit is CrossChainEnabledArbitrumL1MockUpgradeable { - constructor(address bridge) CrossChainEnabledArbitrumL1MockUpgradeable(bridge) payable initializer { - - } -} -import "./crosschain/receiversUpgradeable.sol"; - -contract CrossChainEnabledArbitrumL2MockUpgradeableWithInit is CrossChainEnabledArbitrumL2MockUpgradeable { - constructor() payable initializer { - __CrossChainEnabledArbitrumL2Mock_init(); - } -} -import "./crosschain/receiversUpgradeable.sol"; - -contract CrossChainEnabledOptimismMockUpgradeableWithInit is CrossChainEnabledOptimismMockUpgradeable { - constructor(address bridge) CrossChainEnabledOptimismMockUpgradeable(bridge) payable initializer { - - } -} -import "./crosschain/receiversUpgradeable.sol"; - -contract CrossChainEnabledPolygonChildMockUpgradeableWithInit is CrossChainEnabledPolygonChildMockUpgradeable { - constructor(address bridge) CrossChainEnabledPolygonChildMockUpgradeable(bridge) payable initializer { - - } -} -import "../crosschain/amb/CrossChainEnabledAMBUpgradeable.sol"; - -contract CrossChainEnabledAMBUpgradeableWithInit is CrossChainEnabledAMBUpgradeable { - constructor(address bridge) CrossChainEnabledAMBUpgradeable(bridge) payable initializer { - - } -} -import "./AccessControlCrossChainMockUpgradeable.sol"; - -contract AccessControlCrossChainMockUpgradeableWithInit is AccessControlCrossChainMockUpgradeable { - constructor() payable initializer { - __AccessControlCrossChainMock_init(); - } -} -import "./crosschain/bridgesUpgradeable.sol"; - -contract BridgeAMBMockUpgradeableWithInit is BridgeAMBMockUpgradeable { - constructor() payable initializer { - __BridgeAMBMock_init(); - } -} -import "./crosschain/bridgesUpgradeable.sol"; - -contract BridgeArbitrumL1MockUpgradeableWithInit is BridgeArbitrumL1MockUpgradeable { - constructor() payable initializer { - __BridgeArbitrumL1Mock_init(); - } -} -import "./crosschain/bridgesUpgradeable.sol"; - -contract BridgeArbitrumL1InboxUpgradeableWithInit is BridgeArbitrumL1InboxUpgradeable { - constructor() payable initializer { - __BridgeArbitrumL1Inbox_init(); - } -} -import "./crosschain/bridgesUpgradeable.sol"; - -contract BridgeArbitrumL1OutboxUpgradeableWithInit is BridgeArbitrumL1OutboxUpgradeable { - constructor() payable initializer { - __BridgeArbitrumL1Outbox_init(); - } -} -import "./crosschain/bridgesUpgradeable.sol"; - -contract BridgeArbitrumL2MockUpgradeableWithInit is BridgeArbitrumL2MockUpgradeable { - constructor() payable initializer { - __BridgeArbitrumL2Mock_init(); - } -} -import "./crosschain/bridgesUpgradeable.sol"; - -contract BridgeOptimismMockUpgradeableWithInit is BridgeOptimismMockUpgradeable { - constructor() payable initializer { - __BridgeOptimismMock_init(); - } -} -import "./crosschain/bridgesUpgradeable.sol"; - -contract BridgePolygonChildMockUpgradeableWithInit is BridgePolygonChildMockUpgradeable { - constructor() payable initializer { - __BridgePolygonChildMock_init(); - } -} -import "./ContextMockUpgradeable.sol"; - -contract ContextMockUpgradeableWithInit is ContextMockUpgradeable { - constructor() payable initializer { - __ContextMock_init(); - } -} -import "./ContextMockUpgradeable.sol"; - -contract ContextMockCallerUpgradeableWithInit is ContextMockCallerUpgradeable { - constructor() payable initializer { - __ContextMockCaller_init(); - } -} -import "./ERC2771ContextMockUpgradeable.sol"; - -contract ERC2771ContextMockUpgradeableWithInit is ERC2771ContextMockUpgradeable { - constructor(address trustedForwarder) ERC2771ContextMockUpgradeable(trustedForwarder) payable initializer { - - } -} -import "./ERC20CappedMockUpgradeable.sol"; - -contract ERC20CappedMockUpgradeableWithInit is ERC20CappedMockUpgradeable { - constructor( - string memory name, - string memory symbol, - uint256 cap - ) payable initializer { - __ERC20CappedMock_init(name, symbol, cap); - } -} -import "./ERC20DecimalsMockUpgradeable.sol"; - -contract ERC20DecimalsMockUpgradeableWithInit is ERC20DecimalsMockUpgradeable { - constructor( - string memory name_, - string memory symbol_, - uint8 decimals_ - ) payable initializer { - __ERC20DecimalsMock_init(name_, symbol_, decimals_); - } -} -import "./MulticallTestUpgradeable.sol"; - -contract MulticallTestUpgradeableWithInit is MulticallTestUpgradeable { - constructor() payable initializer { - __MulticallTest_init(); - } -} -import "./ClonesMockUpgradeable.sol"; - -contract ClonesMockUpgradeableWithInit is ClonesMockUpgradeable { - constructor() payable initializer { - __ClonesMock_init(); - } -} -import "./AddressImplUpgradeable.sol"; - -contract AddressImplUpgradeableWithInit is AddressImplUpgradeable { - constructor() payable initializer { - __AddressImpl_init(); - } -} -import "../utils/escrow/RefundEscrowUpgradeable.sol"; - -contract RefundEscrowUpgradeableWithInit is RefundEscrowUpgradeable { - constructor(address payable beneficiary_) payable initializer { - __RefundEscrow_init(beneficiary_); - } -} -import "./ConditionalEscrowMockUpgradeable.sol"; - -contract ConditionalEscrowMockUpgradeableWithInit is ConditionalEscrowMockUpgradeable { - constructor() payable initializer { - __ConditionalEscrowMock_init(); - } -} -import "./PullPaymentMockUpgradeable.sol"; - -contract PullPaymentMockUpgradeableWithInit is PullPaymentMockUpgradeable { - constructor() payable initializer { - __PullPaymentMock_init(); - } -} -import "./OwnableMockUpgradeable.sol"; - -contract OwnableMockUpgradeableWithInit is OwnableMockUpgradeable { - constructor() payable initializer { - __OwnableMock_init(); - } -} -import "./Ownable2StepMockUpgradeable.sol"; - -contract Ownable2StepMockUpgradeableWithInit is Ownable2StepMockUpgradeable { - constructor() payable initializer { - __Ownable2StepMock_init(); - } -} -import "./SignatureCheckerMockUpgradeable.sol"; - -contract SignatureCheckerMockUpgradeableWithInit is SignatureCheckerMockUpgradeable { - constructor() payable initializer { - __SignatureCheckerMock_init(); - } -} -import "./ECDSAMockUpgradeable.sol"; - -contract ECDSAMockUpgradeableWithInit is ECDSAMockUpgradeable { - constructor() payable initializer { - __ECDSAMock_init(); - } -} -import "./ERC20VotesMockUpgradeable.sol"; - -contract ERC20VotesMockUpgradeableWithInit is ERC20VotesMockUpgradeable { - constructor(string memory name, string memory symbol) payable initializer { - __ERC20VotesMock_init(name, symbol); - } -} -import "./ERC20VotesCompMockUpgradeable.sol"; - -contract ERC20VotesCompMockUpgradeableWithInit is ERC20VotesCompMockUpgradeable { - constructor(string memory name, string memory symbol) payable initializer { - __ERC20VotesCompMock_init(name, symbol); - } -} -import "../governance/TimelockControllerWith46MigrationUpgradeable.sol"; - -contract TimelockControllerWith46MigrationUpgradeableWithInit is TimelockControllerWith46MigrationUpgradeable { - constructor( - uint256 minDelay, - address[] memory proposers, - address[] memory executors, - address admin - ) payable initializer { - __TimelockControllerWith46Migration_init(minDelay, proposers, executors, admin); - } -} -import "./BadBeaconUpgradeable.sol"; - -contract BadBeaconNoImplUpgradeableWithInit is BadBeaconNoImplUpgradeable { - constructor() payable initializer { - __BadBeaconNoImpl_init(); - } -} -import "./BadBeaconUpgradeable.sol"; - -contract BadBeaconNotContractUpgradeableWithInit is BadBeaconNotContractUpgradeable { - constructor() payable initializer { - __BadBeaconNotContract_init(); - } -} -import "./Base64MockUpgradeable.sol"; - -contract Base64MockUpgradeableWithInit is Base64MockUpgradeable { - constructor() payable initializer { - __Base64Mock_init(); - } -} -import "./CallReceiverMockUpgradeable.sol"; - -contract CallReceiverMockUpgradeableWithInit is CallReceiverMockUpgradeable { - constructor() payable initializer { - __CallReceiverMock_init(); - } -} -import "./ClashingImplementationUpgradeable.sol"; - -contract ClashingImplementationUpgradeableWithInit is ClashingImplementationUpgradeable { - constructor() payable initializer { - __ClashingImplementation_init(); - } -} -import "./DummyImplementationUpgradeable.sol"; - -contract DummyImplementationUpgradeableWithInit is DummyImplementationUpgradeable { - constructor() payable initializer { - __DummyImplementation_init(); - } -} -import "./DummyImplementationUpgradeable.sol"; - -contract DummyImplementationV2UpgradeableWithInit is DummyImplementationV2Upgradeable { - constructor() payable initializer { - __DummyImplementationV2_init(); - } -} -import "./ERC165/ERC165MaliciousDataUpgradeable.sol"; - -contract ERC165MaliciousDataUpgradeableWithInit is ERC165MaliciousDataUpgradeable { - constructor() payable initializer { - __ERC165MaliciousData_init(); - } -} -import "./ERC165/ERC165MissingDataUpgradeable.sol"; - -contract ERC165MissingDataUpgradeableWithInit is ERC165MissingDataUpgradeable { - constructor() payable initializer { - __ERC165MissingData_init(); - } -} -import "./ERC165/ERC165NotSupportedUpgradeable.sol"; - -contract ERC165NotSupportedUpgradeableWithInit is ERC165NotSupportedUpgradeable { - constructor() payable initializer { - __ERC165NotSupported_init(); - } -} -import "./EtherReceiverMockUpgradeable.sol"; - -contract EtherReceiverMockUpgradeableWithInit is EtherReceiverMockUpgradeable { - constructor() payable initializer { - __EtherReceiverMock_init(); - } -} -import "./MerkleProofWrapperUpgradeable.sol"; - -contract MerkleProofWrapperUpgradeableWithInit is MerkleProofWrapperUpgradeable { - constructor() payable initializer { - __MerkleProofWrapper_init(); - } -} -import "./SafeMathMockUpgradeable.sol"; - -contract SafeMathMockUpgradeableWithInit is SafeMathMockUpgradeable { - constructor() payable initializer { - __SafeMathMock_init(); - } -} -import "./SignedMathMockUpgradeable.sol"; - -contract SignedMathMockUpgradeableWithInit is SignedMathMockUpgradeable { - constructor() payable initializer { - __SignedMathMock_init(); - } -} -import "./SignedSafeMathMockUpgradeable.sol"; - -contract SignedSafeMathMockUpgradeableWithInit is SignedSafeMathMockUpgradeable { - constructor() payable initializer { - __SignedSafeMathMock_init(); - } -} -import "./compound/CompTimelockUpgradeable.sol"; - -contract CompTimelockUpgradeableWithInit is CompTimelockUpgradeable { - constructor(address admin_, uint256 delay_) payable initializer { - __CompTimelock_init(admin_, delay_); - } -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/compound/CompTimelockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/compound/CompTimelockUpgradeable.sol deleted file mode 100644 index 43ed215..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/compound/CompTimelockUpgradeable.sol +++ /dev/null @@ -1,186 +0,0 @@ -// SPDX-License-Identifier: BSD-3-Clause -// solhint-disable private-vars-leading-underscore -/** - * Copyright 2020 Compound Labs, Inc. - * - * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the - * following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following - * disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the - * following disclaimer in the documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote - * products derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -pragma solidity ^0.8.0; -import "../../proxy/utils/Initializable.sol"; - -contract CompTimelockUpgradeable is Initializable { - event NewAdmin(address indexed newAdmin); - event NewPendingAdmin(address indexed newPendingAdmin); - event NewDelay(uint256 indexed newDelay); - event CancelTransaction( - bytes32 indexed txHash, - address indexed target, - uint256 value, - string signature, - bytes data, - uint256 eta - ); - event ExecuteTransaction( - bytes32 indexed txHash, - address indexed target, - uint256 value, - string signature, - bytes data, - uint256 eta - ); - event QueueTransaction( - bytes32 indexed txHash, - address indexed target, - uint256 value, - string signature, - bytes data, - uint256 eta - ); - - uint256 public constant GRACE_PERIOD = 14 days; - uint256 public constant MINIMUM_DELAY = 2 days; - uint256 public constant MAXIMUM_DELAY = 30 days; - - address public admin; - address public pendingAdmin; - uint256 public delay; - - mapping(bytes32 => bool) public queuedTransactions; - - function __CompTimelock_init(address admin_, uint256 delay_) internal onlyInitializing { - __CompTimelock_init_unchained(admin_, delay_); - } - - function __CompTimelock_init_unchained(address admin_, uint256 delay_) internal onlyInitializing { - require(delay_ >= MINIMUM_DELAY, "Timelock::constructor: Delay must exceed minimum delay."); - require(delay_ <= MAXIMUM_DELAY, "Timelock::setDelay: Delay must not exceed maximum delay."); - - admin = admin_; - delay = delay_; - } - - receive() external payable {} - - function setDelay(uint256 delay_) public { - require(msg.sender == address(this), "Timelock::setDelay: Call must come from Timelock."); - require(delay_ >= MINIMUM_DELAY, "Timelock::setDelay: Delay must exceed minimum delay."); - require(delay_ <= MAXIMUM_DELAY, "Timelock::setDelay: Delay must not exceed maximum delay."); - delay = delay_; - - emit NewDelay(delay); - } - - function acceptAdmin() public { - require(msg.sender == pendingAdmin, "Timelock::acceptAdmin: Call must come from pendingAdmin."); - admin = msg.sender; - pendingAdmin = address(0); - - emit NewAdmin(admin); - } - - function setPendingAdmin(address pendingAdmin_) public { - require(msg.sender == address(this), "Timelock::setPendingAdmin: Call must come from Timelock."); - pendingAdmin = pendingAdmin_; - - emit NewPendingAdmin(pendingAdmin); - } - - function queueTransaction( - address target, - uint256 value, - string memory signature, - bytes memory data, - uint256 eta - ) public returns (bytes32) { - require(msg.sender == admin, "Timelock::queueTransaction: Call must come from admin."); - require( - eta >= getBlockTimestamp() + delay, - "Timelock::queueTransaction: Estimated execution block must satisfy delay." - ); - - bytes32 txHash = keccak256(abi.encode(target, value, signature, data, eta)); - queuedTransactions[txHash] = true; - - emit QueueTransaction(txHash, target, value, signature, data, eta); - return txHash; - } - - function cancelTransaction( - address target, - uint256 value, - string memory signature, - bytes memory data, - uint256 eta - ) public { - require(msg.sender == admin, "Timelock::cancelTransaction: Call must come from admin."); - - bytes32 txHash = keccak256(abi.encode(target, value, signature, data, eta)); - queuedTransactions[txHash] = false; - - emit CancelTransaction(txHash, target, value, signature, data, eta); - } - - function executeTransaction( - address target, - uint256 value, - string memory signature, - bytes memory data, - uint256 eta - ) public payable returns (bytes memory) { - require(msg.sender == admin, "Timelock::executeTransaction: Call must come from admin."); - - bytes32 txHash = keccak256(abi.encode(target, value, signature, data, eta)); - require(queuedTransactions[txHash], "Timelock::executeTransaction: Transaction hasn't been queued."); - require(getBlockTimestamp() >= eta, "Timelock::executeTransaction: Transaction hasn't surpassed time lock."); - require(getBlockTimestamp() <= eta + GRACE_PERIOD, "Timelock::executeTransaction: Transaction is stale."); - - queuedTransactions[txHash] = false; - - bytes memory callData; - - if (bytes(signature).length == 0) { - callData = data; - } else { - callData = abi.encodePacked(bytes4(keccak256(bytes(signature))), data); - } - - // solium-disable-next-line security/no-call-value - (bool success, bytes memory returnData) = target.call{value: value}(callData); - require(success, "Timelock::executeTransaction: Transaction execution reverted."); - - emit ExecuteTransaction(txHash, target, value, signature, data, eta); - - return returnData; - } - - function getBlockTimestamp() internal view returns (uint256) { - // solium-disable-next-line security/no-block-members - return block.timestamp; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[46] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/crosschain/bridgesUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/crosschain/bridgesUpgradeable.sol deleted file mode 100644 index 09afc17..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/crosschain/bridgesUpgradeable.sol +++ /dev/null @@ -1,199 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../../utils/AddressUpgradeable.sol"; -import "../../vendor/polygon/IFxMessageProcessorUpgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -abstract contract BaseRelayMockUpgradeable is Initializable { - function __BaseRelayMock_init() internal onlyInitializing { - } - - function __BaseRelayMock_init_unchained() internal onlyInitializing { - } - // needed to parse custom errors - error NotCrossChainCall(); - error InvalidCrossChainSender(address sender, address expected); - - address internal _currentSender; - - function relayAs( - address target, - bytes calldata data, - address sender - ) external virtual { - address previousSender = _currentSender; - - _currentSender = sender; - - (bool success, bytes memory returndata) = target.call(data); - AddressUpgradeable.verifyCallResultFromTarget(target, success, returndata, "low-level call reverted"); - - _currentSender = previousSender; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} - -/** - * AMB - */ -contract BridgeAMBMockUpgradeable is Initializable, BaseRelayMockUpgradeable { - function __BridgeAMBMock_init() internal onlyInitializing { - } - - function __BridgeAMBMock_init_unchained() internal onlyInitializing { - } - function messageSender() public view returns (address) { - return _currentSender; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} - -/** - * Arbitrum - */ -contract BridgeArbitrumL1MockUpgradeable is Initializable, BaseRelayMockUpgradeable { - function __BridgeArbitrumL1Mock_init() internal onlyInitializing { - } - - function __BridgeArbitrumL1Mock_init_unchained() internal onlyInitializing { - } - /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment - address public immutable inbox = address(new BridgeArbitrumL1InboxUpgradeable()); - /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment - address public immutable outbox = address(new BridgeArbitrumL1OutboxUpgradeable()); - - function activeOutbox() public view returns (address) { - return outbox; - } - - function currentSender() public view returns (address) { - return _currentSender; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} - -contract BridgeArbitrumL1InboxUpgradeable is Initializable { - function __BridgeArbitrumL1Inbox_init() internal onlyInitializing { - } - - function __BridgeArbitrumL1Inbox_init_unchained() internal onlyInitializing { - } - /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment - address public immutable bridge = msg.sender; - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} - -contract BridgeArbitrumL1OutboxUpgradeable is Initializable { - function __BridgeArbitrumL1Outbox_init() internal onlyInitializing { - } - - function __BridgeArbitrumL1Outbox_init_unchained() internal onlyInitializing { - } - /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment - address public immutable bridge = msg.sender; - - function l2ToL1Sender() public view returns (address) { - return BridgeArbitrumL1MockUpgradeable(bridge).currentSender(); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} - -contract BridgeArbitrumL2MockUpgradeable is Initializable, BaseRelayMockUpgradeable { - function __BridgeArbitrumL2Mock_init() internal onlyInitializing { - } - - function __BridgeArbitrumL2Mock_init_unchained() internal onlyInitializing { - } - function wasMyCallersAddressAliased() public view returns (bool) { - return _currentSender != address(0); - } - - function myCallersAddressWithoutAliasing() public view returns (address) { - return _currentSender; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} - -/** - * Optimism - */ -contract BridgeOptimismMockUpgradeable is Initializable, BaseRelayMockUpgradeable { - function __BridgeOptimismMock_init() internal onlyInitializing { - } - - function __BridgeOptimismMock_init_unchained() internal onlyInitializing { - } - function xDomainMessageSender() public view returns (address) { - return _currentSender; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} - -/** - * Polygon - */ -contract BridgePolygonChildMockUpgradeable is Initializable, BaseRelayMockUpgradeable { - function __BridgePolygonChildMock_init() internal onlyInitializing { - } - - function __BridgePolygonChildMock_init_unchained() internal onlyInitializing { - } - function relayAs( - address target, - bytes calldata data, - address sender - ) external override { - IFxMessageProcessorUpgradeable(target).processMessageFromRoot(0, sender, data); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/crosschain/receiversUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/crosschain/receiversUpgradeable.sol deleted file mode 100644 index c76d321..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/crosschain/receiversUpgradeable.sol +++ /dev/null @@ -1,107 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.4; - -import "../../access/OwnableUpgradeable.sol"; -import "../../crosschain/amb/CrossChainEnabledAMBUpgradeable.sol"; -import "../../crosschain/arbitrum/CrossChainEnabledArbitrumL1Upgradeable.sol"; -import "../../crosschain/arbitrum/CrossChainEnabledArbitrumL2Upgradeable.sol"; -import "../../crosschain/optimism/CrossChainEnabledOptimismUpgradeable.sol"; -import "../../crosschain/polygon/CrossChainEnabledPolygonChildUpgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -abstract contract ReceiverUpgradeable is Initializable, CrossChainEnabledUpgradeable { - function __Receiver_init() internal onlyInitializing { - } - - function __Receiver_init_unchained() internal onlyInitializing { - } - // we don't use Ownable because it messes up testing for the upgradeable contracts - /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment - address public immutable owner = msg.sender; - - function crossChainRestricted() external onlyCrossChain {} - - function crossChainOwnerRestricted() external onlyCrossChainSender(owner) {} - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} - -/** - * AMB - */ -contract CrossChainEnabledAMBMockUpgradeable is Initializable, ReceiverUpgradeable, CrossChainEnabledAMBUpgradeable { - /// @custom:oz-upgrades-unsafe-allow constructor - constructor(address bridge) CrossChainEnabledAMBUpgradeable(bridge) {} - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} - -/** - * Arbitrum - */ -contract CrossChainEnabledArbitrumL1MockUpgradeable is Initializable, ReceiverUpgradeable, CrossChainEnabledArbitrumL1Upgradeable { - /// @custom:oz-upgrades-unsafe-allow constructor - constructor(address bridge) CrossChainEnabledArbitrumL1Upgradeable(bridge) {} - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} - -contract CrossChainEnabledArbitrumL2MockUpgradeable is Initializable, ReceiverUpgradeable, CrossChainEnabledArbitrumL2Upgradeable { function __CrossChainEnabledArbitrumL2Mock_init() internal onlyInitializing { - } - - function __CrossChainEnabledArbitrumL2Mock_init_unchained() internal onlyInitializing { - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} - -/** - * Optimism - */ -contract CrossChainEnabledOptimismMockUpgradeable is Initializable, ReceiverUpgradeable, CrossChainEnabledOptimismUpgradeable { - /// @custom:oz-upgrades-unsafe-allow constructor - constructor(address bridge) CrossChainEnabledOptimismUpgradeable(bridge) {} - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} - -/** - * Polygon - */ -contract CrossChainEnabledPolygonChildMockUpgradeable is Initializable, ReceiverUpgradeable, CrossChainEnabledPolygonChildUpgradeable { - /// @custom:oz-upgrades-unsafe-allow constructor - constructor(address bridge) CrossChainEnabledPolygonChildUpgradeable(bridge) {} - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/wizard/MyGovernor1Upgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/wizard/MyGovernor1Upgradeable.sol deleted file mode 100644 index 1507671..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/wizard/MyGovernor1Upgradeable.sol +++ /dev/null @@ -1,98 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.2; - -import "../../governance/GovernorUpgradeable.sol"; -import "../../governance/extensions/GovernorCountingSimpleUpgradeable.sol"; -import "../../governance/extensions/GovernorVotesUpgradeable.sol"; -import "../../governance/extensions/GovernorVotesQuorumFractionUpgradeable.sol"; -import "../../governance/extensions/GovernorTimelockControlUpgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -contract MyGovernor1Upgradeable is - Initializable, GovernorUpgradeable, - GovernorTimelockControlUpgradeable, - GovernorVotesUpgradeable, - GovernorVotesQuorumFractionUpgradeable, - GovernorCountingSimpleUpgradeable -{ - function __MyGovernor1_init(IVotesUpgradeable _token, TimelockControllerUpgradeable _timelock) internal onlyInitializing { - __EIP712_init_unchained("MyGovernor", version()); - __Governor_init_unchained("MyGovernor"); - __GovernorTimelockControl_init_unchained(_timelock); - __GovernorVotes_init_unchained(_token); - __GovernorVotesQuorumFraction_init_unchained(4); - } - - function __MyGovernor1_init_unchained(IVotesUpgradeable, TimelockControllerUpgradeable) internal onlyInitializing {} - - function votingDelay() public pure override returns (uint256) { - return 1; // 1 block - } - - function votingPeriod() public pure override returns (uint256) { - return 45818; // 1 week - } - - // The following functions are overrides required by Solidity. - - function quorum(uint256 blockNumber) - public - view - override(IGovernorUpgradeable, GovernorVotesQuorumFractionUpgradeable) - returns (uint256) - { - return super.quorum(blockNumber); - } - - function state(uint256 proposalId) public view override(GovernorUpgradeable, GovernorTimelockControlUpgradeable) returns (ProposalState) { - return super.state(proposalId); - } - - function propose( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - string memory description - ) public override(GovernorUpgradeable, IGovernorUpgradeable) returns (uint256) { - return super.propose(targets, values, calldatas, description); - } - - function _execute( - uint256 proposalId, - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) internal override(GovernorUpgradeable, GovernorTimelockControlUpgradeable) { - super._execute(proposalId, targets, values, calldatas, descriptionHash); - } - - function _cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) internal override(GovernorUpgradeable, GovernorTimelockControlUpgradeable) returns (uint256) { - return super._cancel(targets, values, calldatas, descriptionHash); - } - - function _executor() internal view override(GovernorUpgradeable, GovernorTimelockControlUpgradeable) returns (address) { - return super._executor(); - } - - function supportsInterface(bytes4 interfaceId) - public - view - override(GovernorUpgradeable, GovernorTimelockControlUpgradeable) - returns (bool) - { - return super.supportsInterface(interfaceId); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/wizard/MyGovernor2Upgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/wizard/MyGovernor2Upgradeable.sol deleted file mode 100644 index c6c2df4..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/wizard/MyGovernor2Upgradeable.sol +++ /dev/null @@ -1,104 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.2; - -import "../../governance/GovernorUpgradeable.sol"; -import "../../governance/extensions/GovernorProposalThresholdUpgradeable.sol"; -import "../../governance/extensions/GovernorCountingSimpleUpgradeable.sol"; -import "../../governance/extensions/GovernorVotesUpgradeable.sol"; -import "../../governance/extensions/GovernorVotesQuorumFractionUpgradeable.sol"; -import "../../governance/extensions/GovernorTimelockControlUpgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -contract MyGovernor2Upgradeable is - Initializable, GovernorUpgradeable, - GovernorTimelockControlUpgradeable, - GovernorProposalThresholdUpgradeable, - GovernorVotesUpgradeable, - GovernorVotesQuorumFractionUpgradeable, - GovernorCountingSimpleUpgradeable -{ - function __MyGovernor2_init(IVotesUpgradeable _token, TimelockControllerUpgradeable _timelock) internal onlyInitializing { - __EIP712_init_unchained("MyGovernor", version()); - __Governor_init_unchained("MyGovernor"); - __GovernorTimelockControl_init_unchained(_timelock); - __GovernorVotes_init_unchained(_token); - __GovernorVotesQuorumFraction_init_unchained(4); - } - - function __MyGovernor2_init_unchained(IVotesUpgradeable, TimelockControllerUpgradeable) internal onlyInitializing {} - - function votingDelay() public pure override returns (uint256) { - return 1; // 1 block - } - - function votingPeriod() public pure override returns (uint256) { - return 45818; // 1 week - } - - function proposalThreshold() public pure override returns (uint256) { - return 1000e18; - } - - // The following functions are overrides required by Solidity. - - function quorum(uint256 blockNumber) - public - view - override(IGovernorUpgradeable, GovernorVotesQuorumFractionUpgradeable) - returns (uint256) - { - return super.quorum(blockNumber); - } - - function state(uint256 proposalId) public view override(GovernorUpgradeable, GovernorTimelockControlUpgradeable) returns (ProposalState) { - return super.state(proposalId); - } - - function propose( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - string memory description - ) public override(GovernorUpgradeable, GovernorProposalThresholdUpgradeable, IGovernorUpgradeable) returns (uint256) { - return super.propose(targets, values, calldatas, description); - } - - function _execute( - uint256 proposalId, - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) internal override(GovernorUpgradeable, GovernorTimelockControlUpgradeable) { - super._execute(proposalId, targets, values, calldatas, descriptionHash); - } - - function _cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) internal override(GovernorUpgradeable, GovernorTimelockControlUpgradeable) returns (uint256) { - return super._cancel(targets, values, calldatas, descriptionHash); - } - - function _executor() internal view override(GovernorUpgradeable, GovernorTimelockControlUpgradeable) returns (address) { - return super._executor(); - } - - function supportsInterface(bytes4 interfaceId) - public - view - override(GovernorUpgradeable, GovernorTimelockControlUpgradeable) - returns (bool) - { - return super.supportsInterface(interfaceId); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/wizard/MyGovernor3Upgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/wizard/MyGovernor3Upgradeable.sol deleted file mode 100644 index d2ddc6b..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/mocks/wizard/MyGovernor3Upgradeable.sol +++ /dev/null @@ -1,107 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.2; - -import "../../governance/GovernorUpgradeable.sol"; -import "../../governance/compatibility/GovernorCompatibilityBravoUpgradeable.sol"; -import "../../governance/extensions/GovernorVotesUpgradeable.sol"; -import "../../governance/extensions/GovernorVotesQuorumFractionUpgradeable.sol"; -import "../../governance/extensions/GovernorTimelockControlUpgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -contract MyGovernorUpgradeable is - Initializable, GovernorUpgradeable, - GovernorTimelockControlUpgradeable, - GovernorCompatibilityBravoUpgradeable, - GovernorVotesUpgradeable, - GovernorVotesQuorumFractionUpgradeable -{ - function __MyGovernor_init(IVotesUpgradeable _token, TimelockControllerUpgradeable _timelock) internal onlyInitializing { - __EIP712_init_unchained("MyGovernor", version()); - __Governor_init_unchained("MyGovernor"); - __GovernorTimelockControl_init_unchained(_timelock); - __GovernorVotes_init_unchained(_token); - __GovernorVotesQuorumFraction_init_unchained(4); - } - - function __MyGovernor_init_unchained(IVotesUpgradeable, TimelockControllerUpgradeable) internal onlyInitializing {} - - function votingDelay() public pure override returns (uint256) { - return 1; // 1 block - } - - function votingPeriod() public pure override returns (uint256) { - return 45818; // 1 week - } - - function proposalThreshold() public pure override returns (uint256) { - return 1000e18; - } - - // The following functions are overrides required by Solidity. - - function quorum(uint256 blockNumber) - public - view - override(IGovernorUpgradeable, GovernorVotesQuorumFractionUpgradeable) - returns (uint256) - { - return super.quorum(blockNumber); - } - - function state(uint256 proposalId) - public - view - override(GovernorUpgradeable, IGovernorUpgradeable, GovernorTimelockControlUpgradeable) - returns (ProposalState) - { - return super.state(proposalId); - } - - function propose( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - string memory description - ) public override(GovernorUpgradeable, GovernorCompatibilityBravoUpgradeable, IGovernorUpgradeable) returns (uint256) { - return super.propose(targets, values, calldatas, description); - } - - function _execute( - uint256 proposalId, - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) internal override(GovernorUpgradeable, GovernorTimelockControlUpgradeable) { - super._execute(proposalId, targets, values, calldatas, descriptionHash); - } - - function _cancel( - address[] memory targets, - uint256[] memory values, - bytes[] memory calldatas, - bytes32 descriptionHash - ) internal override(GovernorUpgradeable, GovernorTimelockControlUpgradeable) returns (uint256) { - return super._cancel(targets, values, calldatas, descriptionHash); - } - - function _executor() internal view override(GovernorUpgradeable, GovernorTimelockControlUpgradeable) returns (address) { - return super._executor(); - } - - function supportsInterface(bytes4 interfaceId) - public - view - override(GovernorUpgradeable, IERC165Upgradeable, GovernorTimelockControlUpgradeable) - returns (bool) - { - return super.supportsInterface(interfaceId); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/package.json b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/package.json deleted file mode 100644 index bab5013..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/package.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "@openzeppelin/contracts-upgradeable", - "description": "Secure Smart Contract library for Solidity", - "version": "4.7.0", - "files": [ - "**/*.sol", - "/build/contracts/*.json", - "!/mocks/**/*" - ], - "scripts": { - "prepare": "bash ../scripts/prepare-contracts-package.sh", - "prepare-docs": "cd ..; npm run prepare-docs" - }, - "repository": { - "type": "git", - "url": "https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable.git" - }, - "keywords": [ - "solidity", - "ethereum", - "smart", - "contracts", - "security", - "zeppelin" - ], - "author": "OpenZeppelin Community ", - "license": "MIT", - "bugs": { - "url": "https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable/issues" - }, - "homepage": "https://openzeppelin.com/contracts/" -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/proxy/ClonesUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/proxy/ClonesUpgradeable.sol deleted file mode 100644 index 599b9c0..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/proxy/ClonesUpgradeable.sol +++ /dev/null @@ -1,89 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (proxy/Clones.sol) - -pragma solidity ^0.8.0; - -/** - * @dev https://eips.ethereum.org/EIPS/eip-1167[EIP 1167] is a standard for - * deploying minimal proxy contracts, also known as "clones". - * - * > To simply and cheaply clone contract functionality in an immutable way, this standard specifies - * > a minimal bytecode implementation that delegates all calls to a known, fixed address. - * - * The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2` - * (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the - * deterministic method. - * - * _Available since v3.4._ - */ -library ClonesUpgradeable { - /** - * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. - * - * This function uses the create opcode, which should never revert. - */ - function clone(address implementation) internal returns (address instance) { - /// @solidity memory-safe-assembly - assembly { - // Cleans the upper 96 bits of the `implementation` word, then packs the first 3 bytes - // of the `implementation` address with the bytecode before the address. - mstore(0x00, or(shr(0xe8, shl(0x60, implementation)), 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000)) - // Packs the remaining 17 bytes of `implementation` with the bytecode after the address. - mstore(0x20, or(shl(0x78, implementation), 0x5af43d82803e903d91602b57fd5bf3)) - instance := create(0, 0x09, 0x37) - } - require(instance != address(0), "ERC1167: create failed"); - } - - /** - * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. - * - * This function uses the create2 opcode and a `salt` to deterministically deploy - * the clone. Using the same `implementation` and `salt` multiple time will revert, since - * the clones cannot be deployed twice at the same address. - */ - function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) { - /// @solidity memory-safe-assembly - assembly { - // Cleans the upper 96 bits of the `implementation` word, then packs the first 3 bytes - // of the `implementation` address with the bytecode before the address. - mstore(0x00, or(shr(0xe8, shl(0x60, implementation)), 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000)) - // Packs the remaining 17 bytes of `implementation` with the bytecode after the address. - mstore(0x20, or(shl(0x78, implementation), 0x5af43d82803e903d91602b57fd5bf3)) - instance := create2(0, 0x09, 0x37, salt) - } - require(instance != address(0), "ERC1167: create2 failed"); - } - - /** - * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. - */ - function predictDeterministicAddress( - address implementation, - bytes32 salt, - address deployer - ) internal pure returns (address predicted) { - /// @solidity memory-safe-assembly - assembly { - let ptr := mload(0x40) - mstore(add(ptr, 0x38), deployer) - mstore(add(ptr, 0x24), 0x5af43d82803e903d91602b57fd5bf3ff) - mstore(add(ptr, 0x14), implementation) - mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73) - mstore(add(ptr, 0x58), salt) - mstore(add(ptr, 0x78), keccak256(add(ptr, 0x0c), 0x37)) - predicted := keccak256(add(ptr, 0x43), 0x55) - } - } - - /** - * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. - */ - function predictDeterministicAddress(address implementation, bytes32 salt) - internal - view - returns (address predicted) - { - return predictDeterministicAddress(implementation, salt, address(this)); - } -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol deleted file mode 100644 index b1e3ed5..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol +++ /dev/null @@ -1,212 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol) - -pragma solidity ^0.8.2; - -import "../beacon/IBeaconUpgradeable.sol"; -import "../../interfaces/draft-IERC1822Upgradeable.sol"; -import "../../utils/AddressUpgradeable.sol"; -import "../../utils/StorageSlotUpgradeable.sol"; -import "../utils/Initializable.sol"; - -/** - * @dev This abstract contract provides getters and event emitting update functions for - * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. - * - * _Available since v4.1._ - * - * @custom:oz-upgrades-unsafe-allow delegatecall - */ -abstract contract ERC1967UpgradeUpgradeable is Initializable { - function __ERC1967Upgrade_init() internal onlyInitializing { - } - - function __ERC1967Upgrade_init_unchained() internal onlyInitializing { - } - // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1 - bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143; - - /** - * @dev Storage slot with the address of the current implementation. - * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is - * validated in the constructor. - */ - bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; - - /** - * @dev Emitted when the implementation is upgraded. - */ - event Upgraded(address indexed implementation); - - /** - * @dev Returns the current implementation address. - */ - function _getImplementation() internal view returns (address) { - return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value; - } - - /** - * @dev Stores a new address in the EIP1967 implementation slot. - */ - function _setImplementation(address newImplementation) private { - require(AddressUpgradeable.isContract(newImplementation), "ERC1967: new implementation is not a contract"); - StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; - } - - /** - * @dev Perform implementation upgrade - * - * Emits an {Upgraded} event. - */ - function _upgradeTo(address newImplementation) internal { - _setImplementation(newImplementation); - emit Upgraded(newImplementation); - } - - /** - * @dev Perform implementation upgrade with additional setup call. - * - * Emits an {Upgraded} event. - */ - function _upgradeToAndCall( - address newImplementation, - bytes memory data, - bool forceCall - ) internal { - _upgradeTo(newImplementation); - if (data.length > 0 || forceCall) { - _functionDelegateCall(newImplementation, data); - } - } - - /** - * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call. - * - * Emits an {Upgraded} event. - */ - function _upgradeToAndCallUUPS( - address newImplementation, - bytes memory data, - bool forceCall - ) internal { - // Upgrades from old implementations will perform a rollback test. This test requires the new - // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing - // this special case will break upgrade paths from old UUPS implementation to new ones. - if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) { - _setImplementation(newImplementation); - } else { - try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) { - require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID"); - } catch { - revert("ERC1967Upgrade: new implementation is not UUPS"); - } - _upgradeToAndCall(newImplementation, data, forceCall); - } - } - - /** - * @dev Storage slot with the admin of the contract. - * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is - * validated in the constructor. - */ - bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; - - /** - * @dev Emitted when the admin account has changed. - */ - event AdminChanged(address previousAdmin, address newAdmin); - - /** - * @dev Returns the current admin. - */ - function _getAdmin() internal view returns (address) { - return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value; - } - - /** - * @dev Stores a new address in the EIP1967 admin slot. - */ - function _setAdmin(address newAdmin) private { - require(newAdmin != address(0), "ERC1967: new admin is the zero address"); - StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin; - } - - /** - * @dev Changes the admin of the proxy. - * - * Emits an {AdminChanged} event. - */ - function _changeAdmin(address newAdmin) internal { - emit AdminChanged(_getAdmin(), newAdmin); - _setAdmin(newAdmin); - } - - /** - * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. - * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor. - */ - bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; - - /** - * @dev Emitted when the beacon is upgraded. - */ - event BeaconUpgraded(address indexed beacon); - - /** - * @dev Returns the current beacon. - */ - function _getBeacon() internal view returns (address) { - return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value; - } - - /** - * @dev Stores a new beacon in the EIP1967 beacon slot. - */ - function _setBeacon(address newBeacon) private { - require(AddressUpgradeable.isContract(newBeacon), "ERC1967: new beacon is not a contract"); - require( - AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()), - "ERC1967: beacon implementation is not a contract" - ); - StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon; - } - - /** - * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does - * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that). - * - * Emits a {BeaconUpgraded} event. - */ - function _upgradeBeaconToAndCall( - address newBeacon, - bytes memory data, - bool forceCall - ) internal { - _setBeacon(newBeacon); - emit BeaconUpgraded(newBeacon); - if (data.length > 0 || forceCall) { - _functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data); - } - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function _functionDelegateCall(address target, bytes memory data) private returns (bytes memory) { - require(AddressUpgradeable.isContract(target), "Address: delegate call to non-contract"); - - // solhint-disable-next-line avoid-low-level-calls - (bool success, bytes memory returndata) = target.delegatecall(data); - return AddressUpgradeable.verifyCallResult(success, returndata, "Address: low-level delegate call failed"); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/proxy/README.adoc b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/proxy/README.adoc deleted file mode 100644 index 5ada16e..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/proxy/README.adoc +++ /dev/null @@ -1,85 +0,0 @@ -= Proxies - -[.readme-notice] -NOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/proxy - -This is a low-level set of contracts implementing different proxy patterns with and without upgradeability. For an in-depth overview of this pattern check out the xref:upgrades-plugins::proxies.adoc[Proxy Upgrade Pattern] page. - -Most of the proxies below are built on an abstract base contract. - -- {Proxy}: Abstract contract implementing the core delegation functionality. - -In order to avoid clashes with the storage variables of the implementation contract behind a proxy, we use https://eips.ethereum.org/EIPS/eip-1967[EIP1967] storage slots. - -- {ERC1967Upgrade}: Internal functions to get and set the storage slots defined in EIP1967. -- {ERC1967Proxy}: A proxy using EIP1967 storage slots. Not upgradeable by default. - -There are two alternative ways to add upgradeability to an ERC1967 proxy. Their differences are explained below in <>. - -- {TransparentUpgradeableProxy}: A proxy with a built in admin and upgrade interface. -- {UUPSUpgradeable}: An upgradeability mechanism to be included in the implementation contract. - -CAUTION: Using upgradeable proxies correctly and securely is a difficult task that requires deep knowledge of the proxy pattern, Solidity, and the EVM. Unless you want a lot of low level control, we recommend using the xref:upgrades-plugins::index.adoc[OpenZeppelin Upgrades Plugins] for Truffle and Hardhat. - -A different family of proxies are beacon proxies. This pattern, popularized by Dharma, allows multiple proxies to be upgraded to a different implementation in a single transaction. - -- {BeaconProxy}: A proxy that retrieves its implementation from a beacon contract. -- {UpgradeableBeacon}: A beacon contract with a built in admin that can upgrade the {BeaconProxy} pointing to it. - -In this pattern, the proxy contract doesn't hold the implementation address in storage like an ERC1967 proxy. Instead, the address is stored in a separate beacon contract. The `upgrade` operations are sent to the beacon instead of to the proxy contract, and all proxies that follow that beacon are automatically upgraded. - -Outside the realm of upgradeability, proxies can also be useful to make cheap contract clones, such as those created by an on-chain factory contract that creates many instances of the same contract. These instances are designed to be both cheap to deploy, and cheap to call. - -- {Clones}: A library that can deploy cheap minimal non-upgradeable proxies. - -[[transparent-vs-uups]] -== Transparent vs UUPS Proxies - -The original proxies included in OpenZeppelin followed the https://blog.openzeppelin.com/the-transparent-proxy-pattern/[Transparent Proxy Pattern]. While this pattern is still provided, our recommendation is now shifting towards UUPS proxies, which are both lightweight and versatile. The name UUPS comes from https://eips.ethereum.org/EIPS/eip-1822[EIP1822], which first documented the pattern. - -While both of these share the same interface for upgrades, in UUPS proxies the upgrade is handled by the implementation, and can eventually be removed. Transparent proxies, on the other hand, include the upgrade and admin logic in the proxy itself. This means {TransparentUpgradeableProxy} is more expensive to deploy than what is possible with UUPS proxies. - -UUPS proxies are implemented using an {ERC1967Proxy}. Note that this proxy is not by itself upgradeable. It is the role of the implementation to include, alongside the contract's logic, all the code necessary to update the implementation's address that is stored at a specific slot in the proxy's storage space. This is where the {UUPSUpgradeable} contract comes in. Inheriting from it (and overriding the {xref-UUPSUpgradeable-_authorizeUpgrade-address-}[`_authorizeUpgrade`] function with the relevant access control mechanism) will turn your contract into a UUPS compliant implementation. - -Note that since both proxies use the same storage slot for the implementation address, using a UUPS compliant implementation with a {TransparentUpgradeableProxy} might allow non-admins to perform upgrade operations. - -By default, the upgrade functionality included in {UUPSUpgradeable} contains a security mechanism that will prevent any upgrades to a non UUPS compliant implementation. This prevents upgrades to an implementation contract that wouldn't contain the necessary upgrade mechanism, as it would lock the upgradeability of the proxy forever. This security mechanism can be bypassed by either of: - -- Adding a flag mechanism in the implementation that will disable the upgrade function when triggered. -- Upgrading to an implementation that features an upgrade mechanism without the additional security check, and then upgrading again to another implementation without the upgrade mechanism. - -The current implementation of this security mechanism uses https://eips.ethereum.org/EIPS/eip-1822[EIP1822] to detect the storage slot used by the implementation. A previous implementation, now deprecated, relied on a rollback check. It is possible to upgrade from a contract using the old mechanism to a new one. The inverse is however not possible, as old implementations (before version 4.5) did not include the `ERC1822` interface. - -== Core - -{{Proxy}} - -== ERC1967 - -{{ERC1967Proxy}} - -{{ERC1967Upgrade}} - -== Transparent Proxy - -{{TransparentUpgradeableProxy}} - -{{ProxyAdmin}} - -== Beacon - -{{BeaconProxy}} - -{{IBeacon}} - -{{UpgradeableBeacon}} - -== Minimal Clones - -{{Clones}} - -== Utils - -{{Initializable}} - -{{UUPSUpgradeable}} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/proxy/beacon/IBeaconUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/proxy/beacon/IBeaconUpgradeable.sol deleted file mode 100644 index 7a17d4f..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/proxy/beacon/IBeaconUpgradeable.sol +++ /dev/null @@ -1,16 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol) - -pragma solidity ^0.8.0; - -/** - * @dev This is the interface that {BeaconProxy} expects of its beacon. - */ -interface IBeaconUpgradeable { - /** - * @dev Must return an address that can be used as a delegate call target. - * - * {BeaconProxy} will check that this address is a contract. - */ - function implementation() external view returns (address); -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol deleted file mode 100644 index 7c2a0cc..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol +++ /dev/null @@ -1,165 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol) - -pragma solidity ^0.8.2; - -import "../../utils/AddressUpgradeable.sol"; - -/** - * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed - * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an - * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer - * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. - * - * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be - * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in - * case an upgrade adds a module that needs to be initialized. - * - * For example: - * - * [.hljs-theme-light.nopadding] - * ``` - * contract MyToken is ERC20Upgradeable { - * function initialize() initializer public { - * __ERC20_init("MyToken", "MTK"); - * } - * } - * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { - * function initializeV2() reinitializer(2) public { - * __ERC20Permit_init("MyToken"); - * } - * } - * ``` - * - * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as - * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. - * - * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure - * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. - * - * [CAUTION] - * ==== - * Avoid leaving a contract uninitialized. - * - * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation - * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke - * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: - * - * [.hljs-theme-light.nopadding] - * ``` - * /// @custom:oz-upgrades-unsafe-allow constructor - * constructor() { - * _disableInitializers(); - * } - * ``` - * ==== - */ -abstract contract Initializable { - /** - * @dev Indicates that the contract has been initialized. - * @custom:oz-retyped-from bool - */ - uint8 private _initialized; - - /** - * @dev Indicates that the contract is in the process of being initialized. - */ - bool private _initializing; - - /** - * @dev Triggered when the contract has been initialized or reinitialized. - */ - event Initialized(uint8 version); - - /** - * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, - * `onlyInitializing` functions can be used to initialize parent contracts. - * - * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a - * constructor. - * - * Emits an {Initialized} event. - */ - modifier initializer() { - bool isTopLevelCall = !_initializing; - require( - (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), - "Initializable: contract is already initialized" - ); - _initialized = 1; - if (isTopLevelCall) { - _initializing = true; - } - _; - if (isTopLevelCall) { - _initializing = false; - emit Initialized(1); - } - } - - /** - * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the - * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be - * used to initialize parent contracts. - * - * A reinitializer may be used after the original initialization step. This is essential to configure modules that - * are added through upgrades and that require initialization. - * - * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` - * cannot be nested. If one is invoked in the context of another, execution will revert. - * - * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in - * a contract, executing them in the right order is up to the developer or operator. - * - * WARNING: setting the version to 255 will prevent any future reinitialization. - * - * Emits an {Initialized} event. - */ - modifier reinitializer(uint8 version) { - require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); - _initialized = version; - _initializing = true; - _; - _initializing = false; - emit Initialized(version); - } - - /** - * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the - * {initializer} and {reinitializer} modifiers, directly or indirectly. - */ - modifier onlyInitializing() { - require(_initializing, "Initializable: contract is not initializing"); - _; - } - - /** - * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. - * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized - * to any version. It is recommended to use this to lock implementation contracts that are designed to be called - * through proxies. - * - * Emits an {Initialized} event the first time it is successfully executed. - */ - function _disableInitializers() internal virtual { - require(!_initializing, "Initializable: contract is initializing"); - if (_initialized != type(uint8).max) { - _initialized = type(uint8).max; - emit Initialized(type(uint8).max); - } - } - - /** - * @dev Internal function that returns the initialized version. Returns `_initialized` - */ - function _getInitializedVersion() internal view returns (uint8) { - return _initialized; - } - - /** - * @dev Internal function that returns the initialized version. Returns `_initializing` - */ - function _isInitializing() internal view returns (bool) { - return _initializing; - } -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol deleted file mode 100644 index f46b58e..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol +++ /dev/null @@ -1,108 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (proxy/utils/UUPSUpgradeable.sol) - -pragma solidity ^0.8.0; - -import "../../interfaces/draft-IERC1822Upgradeable.sol"; -import "../ERC1967/ERC1967UpgradeUpgradeable.sol"; -import "./Initializable.sol"; - -/** - * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an - * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy. - * - * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is - * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing - * `UUPSUpgradeable` with a custom implementation of upgrades. - * - * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism. - * - * _Available since v4.1._ - */ -abstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable { - function __UUPSUpgradeable_init() internal onlyInitializing { - } - - function __UUPSUpgradeable_init_unchained() internal onlyInitializing { - } - /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment - address private immutable __self = address(this); - - /** - * @dev Check that the execution is being performed through a delegatecall call and that the execution context is - * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case - * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a - * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to - * fail. - */ - modifier onlyProxy() { - require(address(this) != __self, "Function must be called through delegatecall"); - require(_getImplementation() == __self, "Function must be called through active proxy"); - _; - } - - /** - * @dev Check that the execution is not being performed through a delegate call. This allows a function to be - * callable on the implementing contract but not through proxies. - */ - modifier notDelegated() { - require(address(this) == __self, "UUPSUpgradeable: must not be called through delegatecall"); - _; - } - - /** - * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the - * implementation. It is used to validate the implementation's compatibility when performing an upgrade. - * - * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks - * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this - * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier. - */ - function proxiableUUID() external view virtual override notDelegated returns (bytes32) { - return _IMPLEMENTATION_SLOT; - } - - /** - * @dev Upgrade the implementation of the proxy to `newImplementation`. - * - * Calls {_authorizeUpgrade}. - * - * Emits an {Upgraded} event. - */ - function upgradeTo(address newImplementation) external virtual onlyProxy { - _authorizeUpgrade(newImplementation); - _upgradeToAndCallUUPS(newImplementation, new bytes(0), false); - } - - /** - * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call - * encoded in `data`. - * - * Calls {_authorizeUpgrade}. - * - * Emits an {Upgraded} event. - */ - function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy { - _authorizeUpgrade(newImplementation); - _upgradeToAndCallUUPS(newImplementation, data, true); - } - - /** - * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by - * {upgradeTo} and {upgradeToAndCall}. - * - * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}. - * - * ```solidity - * function _authorizeUpgrade(address) internal override onlyOwner {} - * ``` - */ - function _authorizeUpgrade(address newImplementation) internal virtual; - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/security/PausableUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/security/PausableUpgradeable.sol deleted file mode 100644 index 445648c..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/security/PausableUpgradeable.sol +++ /dev/null @@ -1,117 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) - -pragma solidity ^0.8.0; - -import "../utils/ContextUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -/** - * @dev Contract module which allows children to implement an emergency stop - * mechanism that can be triggered by an authorized account. - * - * This module is used through inheritance. It will make available the - * modifiers `whenNotPaused` and `whenPaused`, which can be applied to - * the functions of your contract. Note that they will not be pausable by - * simply including this module, only once the modifiers are put in place. - */ -abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { - /** - * @dev Emitted when the pause is triggered by `account`. - */ - event Paused(address account); - - /** - * @dev Emitted when the pause is lifted by `account`. - */ - event Unpaused(address account); - - bool private _paused; - - /** - * @dev Initializes the contract in unpaused state. - */ - function __Pausable_init() internal onlyInitializing { - __Pausable_init_unchained(); - } - - function __Pausable_init_unchained() internal onlyInitializing { - _paused = false; - } - - /** - * @dev Modifier to make a function callable only when the contract is not paused. - * - * Requirements: - * - * - The contract must not be paused. - */ - modifier whenNotPaused() { - _requireNotPaused(); - _; - } - - /** - * @dev Modifier to make a function callable only when the contract is paused. - * - * Requirements: - * - * - The contract must be paused. - */ - modifier whenPaused() { - _requirePaused(); - _; - } - - /** - * @dev Returns true if the contract is paused, and false otherwise. - */ - function paused() public view virtual returns (bool) { - return _paused; - } - - /** - * @dev Throws if the contract is paused. - */ - function _requireNotPaused() internal view virtual { - require(!paused(), "Pausable: paused"); - } - - /** - * @dev Throws if the contract is not paused. - */ - function _requirePaused() internal view virtual { - require(paused(), "Pausable: not paused"); - } - - /** - * @dev Triggers stopped state. - * - * Requirements: - * - * - The contract must not be paused. - */ - function _pause() internal virtual whenNotPaused { - _paused = true; - emit Paused(_msgSender()); - } - - /** - * @dev Returns to normal state. - * - * Requirements: - * - * - The contract must be paused. - */ - function _unpause() internal virtual whenPaused { - _paused = false; - emit Unpaused(_msgSender()); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/security/PullPaymentUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/security/PullPaymentUpgradeable.sol deleted file mode 100644 index d347718..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/security/PullPaymentUpgradeable.sol +++ /dev/null @@ -1,89 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (security/PullPayment.sol) - -pragma solidity ^0.8.0; - -import "../utils/escrow/EscrowUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -/** - * @dev Simple implementation of a - * https://consensys.github.io/smart-contract-best-practices/development-recommendations/general/external-calls/#favor-pull-over-push-for-external-calls[pull-payment] - * strategy, where the paying contract doesn't interact directly with the - * receiver account, which must withdraw its payments itself. - * - * Pull-payments are often considered the best practice when it comes to sending - * Ether, security-wise. It prevents recipients from blocking execution, and - * eliminates reentrancy concerns. - * - * TIP: If you would like to learn more about reentrancy and alternative ways - * to protect against it, check out our blog post - * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. - * - * To use, derive from the `PullPayment` contract, and use {_asyncTransfer} - * instead of Solidity's `transfer` function. Payees can query their due - * payments with {payments}, and retrieve them with {withdrawPayments}. - * - * @custom:storage-size 51 - */ -abstract contract PullPaymentUpgradeable is Initializable { - EscrowUpgradeable private _escrow; - - function __PullPayment_init() internal onlyInitializing { - __PullPayment_init_unchained(); - } - - function __PullPayment_init_unchained() internal onlyInitializing { - _escrow = new EscrowUpgradeable(); - _escrow.initialize(); - } - - /** - * @dev Withdraw accumulated payments, forwarding all gas to the recipient. - * - * Note that _any_ account can call this function, not just the `payee`. - * This means that contracts unaware of the `PullPayment` protocol can still - * receive funds this way, by having a separate account call - * {withdrawPayments}. - * - * WARNING: Forwarding all gas opens the door to reentrancy vulnerabilities. - * Make sure you trust the recipient, or are either following the - * checks-effects-interactions pattern or using {ReentrancyGuard}. - * - * @param payee Whose payments will be withdrawn. - * - * Causes the `escrow` to emit a {Withdrawn} event. - */ - function withdrawPayments(address payable payee) public virtual { - _escrow.withdraw(payee); - } - - /** - * @dev Returns the payments owed to an address. - * @param dest The creditor's address. - */ - function payments(address dest) public view returns (uint256) { - return _escrow.depositsOf(dest); - } - - /** - * @dev Called by the payer to store the sent amount as credit to be pulled. - * Funds sent in this way are stored in an intermediate {Escrow} contract, so - * there is no danger of them being spent before withdrawal. - * - * @param dest The destination address of the funds. - * @param amount The amount to transfer. - * - * Causes the `escrow` to emit a {Deposited} event. - */ - function _asyncTransfer(address dest, uint256 amount) internal virtual { - _escrow.deposit{value: amount}(dest); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/security/README.adoc b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/security/README.adoc deleted file mode 100644 index 66f398f..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/security/README.adoc +++ /dev/null @@ -1,20 +0,0 @@ -= Security - -[.readme-notice] -NOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/security - -These contracts aim to cover common security practices. - -* {PullPayment}: A pattern that can be used to avoid reentrancy attacks. -* {ReentrancyGuard}: A modifier that can prevent reentrancy during certain functions. -* {Pausable}: A common emergency response mechanism that can pause functionality while a remediation is pending. - -TIP: For an overview on reentrancy and the possible mechanisms to prevent it, read our article https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. - -== Contracts - -{{PullPayment}} - -{{ReentrancyGuard}} - -{{Pausable}} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/security/ReentrancyGuardUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/security/ReentrancyGuardUpgradeable.sol deleted file mode 100644 index 0321149..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/security/ReentrancyGuardUpgradeable.sol +++ /dev/null @@ -1,89 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) - -pragma solidity ^0.8.0; -import "../proxy/utils/Initializable.sol"; - -/** - * @dev Contract module that helps prevent reentrant calls to a function. - * - * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier - * available, which can be applied to functions to make sure there are no nested - * (reentrant) calls to them. - * - * Note that because there is a single `nonReentrant` guard, functions marked as - * `nonReentrant` may not call one another. This can be worked around by making - * those functions `private`, and then adding `external` `nonReentrant` entry - * points to them. - * - * TIP: If you would like to learn more about reentrancy and alternative ways - * to protect against it, check out our blog post - * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. - */ -abstract contract ReentrancyGuardUpgradeable is Initializable { - // Booleans are more expensive than uint256 or any type that takes up a full - // word because each write operation emits an extra SLOAD to first read the - // slot's contents, replace the bits taken up by the boolean, and then write - // back. This is the compiler's defense against contract upgrades and - // pointer aliasing, and it cannot be disabled. - - // The values being non-zero value makes deployment a bit more expensive, - // but in exchange the refund on every call to nonReentrant will be lower in - // amount. Since refunds are capped to a percentage of the total - // transaction's gas, it is best to keep them low in cases like this one, to - // increase the likelihood of the full refund coming into effect. - uint256 private constant _NOT_ENTERED = 1; - uint256 private constant _ENTERED = 2; - - uint256 private _status; - - function __ReentrancyGuard_init() internal onlyInitializing { - __ReentrancyGuard_init_unchained(); - } - - function __ReentrancyGuard_init_unchained() internal onlyInitializing { - _status = _NOT_ENTERED; - } - - /** - * @dev Prevents a contract from calling itself, directly or indirectly. - * Calling a `nonReentrant` function from another `nonReentrant` - * function is not supported. It is possible to prevent this from happening - * by making the `nonReentrant` function external, and making it call a - * `private` function that does the actual work. - */ - modifier nonReentrant() { - _nonReentrantBefore(); - _; - _nonReentrantAfter(); - } - - function _nonReentrantBefore() private { - // On the first call to nonReentrant, _status will be _NOT_ENTERED - require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); - - // Any calls to nonReentrant after this point will fail - _status = _ENTERED; - } - - function _nonReentrantAfter() private { - // By storing the original value once again, a refund is triggered (see - // https://eips.ethereum.org/EIPS/eip-2200) - _status = _NOT_ENTERED; - } - - /** - * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a - * `nonReentrant` function in the call stack. - */ - function _reentrancyGuardEntered() internal view returns (bool) { - return _status == _ENTERED; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/ERC1155Upgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/ERC1155Upgradeable.sol deleted file mode 100644 index ce925fd..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/ERC1155Upgradeable.sol +++ /dev/null @@ -1,529 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/ERC1155.sol) - -pragma solidity ^0.8.0; - -import "./IERC1155Upgradeable.sol"; -import "./IERC1155ReceiverUpgradeable.sol"; -import "./extensions/IERC1155MetadataURIUpgradeable.sol"; -import "../../utils/AddressUpgradeable.sol"; -import "../../utils/ContextUpgradeable.sol"; -import "../../utils/introspection/ERC165Upgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -/** - * @dev Implementation of the basic standard multi-token. - * See https://eips.ethereum.org/EIPS/eip-1155 - * Originally based on code by Enjin: https://github.com/enjin/erc-1155 - * - * _Available since v3.1._ - */ -contract ERC1155Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC1155Upgradeable, IERC1155MetadataURIUpgradeable { - using AddressUpgradeable for address; - - // Mapping from token ID to account balances - mapping(uint256 => mapping(address => uint256)) private _balances; - - // Mapping from account to operator approvals - mapping(address => mapping(address => bool)) private _operatorApprovals; - - // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json - string private _uri; - - /** - * @dev See {_setURI}. - */ - function __ERC1155_init(string memory uri_) internal onlyInitializing { - __ERC1155_init_unchained(uri_); - } - - function __ERC1155_init_unchained(string memory uri_) internal onlyInitializing { - _setURI(uri_); - } - - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) { - return - interfaceId == type(IERC1155Upgradeable).interfaceId || - interfaceId == type(IERC1155MetadataURIUpgradeable).interfaceId || - super.supportsInterface(interfaceId); - } - - /** - * @dev See {IERC1155MetadataURI-uri}. - * - * This implementation returns the same URI for *all* token types. It relies - * on the token type ID substitution mechanism - * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. - * - * Clients calling this function must replace the `\{id\}` substring with the - * actual token type ID. - */ - function uri(uint256) public view virtual override returns (string memory) { - return _uri; - } - - /** - * @dev See {IERC1155-balanceOf}. - * - * Requirements: - * - * - `account` cannot be the zero address. - */ - function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { - require(account != address(0), "ERC1155: address zero is not a valid owner"); - return _balances[id][account]; - } - - /** - * @dev See {IERC1155-balanceOfBatch}. - * - * Requirements: - * - * - `accounts` and `ids` must have the same length. - */ - function balanceOfBatch(address[] memory accounts, uint256[] memory ids) - public - view - virtual - override - returns (uint256[] memory) - { - require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); - - uint256[] memory batchBalances = new uint256[](accounts.length); - - for (uint256 i = 0; i < accounts.length; ++i) { - batchBalances[i] = balanceOf(accounts[i], ids[i]); - } - - return batchBalances; - } - - /** - * @dev See {IERC1155-setApprovalForAll}. - */ - function setApprovalForAll(address operator, bool approved) public virtual override { - _setApprovalForAll(_msgSender(), operator, approved); - } - - /** - * @dev See {IERC1155-isApprovedForAll}. - */ - function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { - return _operatorApprovals[account][operator]; - } - - /** - * @dev See {IERC1155-safeTransferFrom}. - */ - function safeTransferFrom( - address from, - address to, - uint256 id, - uint256 amount, - bytes memory data - ) public virtual override { - require( - from == _msgSender() || isApprovedForAll(from, _msgSender()), - "ERC1155: caller is not token owner or approved" - ); - _safeTransferFrom(from, to, id, amount, data); - } - - /** - * @dev See {IERC1155-safeBatchTransferFrom}. - */ - function safeBatchTransferFrom( - address from, - address to, - uint256[] memory ids, - uint256[] memory amounts, - bytes memory data - ) public virtual override { - require( - from == _msgSender() || isApprovedForAll(from, _msgSender()), - "ERC1155: caller is not token owner or approved" - ); - _safeBatchTransferFrom(from, to, ids, amounts, data); - } - - /** - * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. - * - * Emits a {TransferSingle} event. - * - * Requirements: - * - * - `to` cannot be the zero address. - * - `from` must have a balance of tokens of type `id` of at least `amount`. - * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the - * acceptance magic value. - */ - function _safeTransferFrom( - address from, - address to, - uint256 id, - uint256 amount, - bytes memory data - ) internal virtual { - require(to != address(0), "ERC1155: transfer to the zero address"); - - address operator = _msgSender(); - uint256[] memory ids = _asSingletonArray(id); - uint256[] memory amounts = _asSingletonArray(amount); - - _beforeTokenTransfer(operator, from, to, ids, amounts, data); - - uint256 fromBalance = _balances[id][from]; - require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); - unchecked { - _balances[id][from] = fromBalance - amount; - } - _balances[id][to] += amount; - - emit TransferSingle(operator, from, to, id, amount); - - _afterTokenTransfer(operator, from, to, ids, amounts, data); - - _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); - } - - /** - * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. - * - * Emits a {TransferBatch} event. - * - * Requirements: - * - * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the - * acceptance magic value. - */ - function _safeBatchTransferFrom( - address from, - address to, - uint256[] memory ids, - uint256[] memory amounts, - bytes memory data - ) internal virtual { - require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); - require(to != address(0), "ERC1155: transfer to the zero address"); - - address operator = _msgSender(); - - _beforeTokenTransfer(operator, from, to, ids, amounts, data); - - for (uint256 i = 0; i < ids.length; ++i) { - uint256 id = ids[i]; - uint256 amount = amounts[i]; - - uint256 fromBalance = _balances[id][from]; - require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); - unchecked { - _balances[id][from] = fromBalance - amount; - } - _balances[id][to] += amount; - } - - emit TransferBatch(operator, from, to, ids, amounts); - - _afterTokenTransfer(operator, from, to, ids, amounts, data); - - _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); - } - - /** - * @dev Sets a new URI for all token types, by relying on the token type ID - * substitution mechanism - * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. - * - * By this mechanism, any occurrence of the `\{id\}` substring in either the - * URI or any of the amounts in the JSON file at said URI will be replaced by - * clients with the token type ID. - * - * For example, the `https://token-cdn-domain/\{id\}.json` URI would be - * interpreted by clients as - * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` - * for token type ID 0x4cce0. - * - * See {uri}. - * - * Because these URIs cannot be meaningfully represented by the {URI} event, - * this function emits no events. - */ - function _setURI(string memory newuri) internal virtual { - _uri = newuri; - } - - /** - * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. - * - * Emits a {TransferSingle} event. - * - * Requirements: - * - * - `to` cannot be the zero address. - * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the - * acceptance magic value. - */ - function _mint( - address to, - uint256 id, - uint256 amount, - bytes memory data - ) internal virtual { - require(to != address(0), "ERC1155: mint to the zero address"); - - address operator = _msgSender(); - uint256[] memory ids = _asSingletonArray(id); - uint256[] memory amounts = _asSingletonArray(amount); - - _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); - - _balances[id][to] += amount; - emit TransferSingle(operator, address(0), to, id, amount); - - _afterTokenTransfer(operator, address(0), to, ids, amounts, data); - - _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); - } - - /** - * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. - * - * Emits a {TransferBatch} event. - * - * Requirements: - * - * - `ids` and `amounts` must have the same length. - * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the - * acceptance magic value. - */ - function _mintBatch( - address to, - uint256[] memory ids, - uint256[] memory amounts, - bytes memory data - ) internal virtual { - require(to != address(0), "ERC1155: mint to the zero address"); - require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); - - address operator = _msgSender(); - - _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); - - for (uint256 i = 0; i < ids.length; i++) { - _balances[ids[i]][to] += amounts[i]; - } - - emit TransferBatch(operator, address(0), to, ids, amounts); - - _afterTokenTransfer(operator, address(0), to, ids, amounts, data); - - _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); - } - - /** - * @dev Destroys `amount` tokens of token type `id` from `from` - * - * Emits a {TransferSingle} event. - * - * Requirements: - * - * - `from` cannot be the zero address. - * - `from` must have at least `amount` tokens of token type `id`. - */ - function _burn( - address from, - uint256 id, - uint256 amount - ) internal virtual { - require(from != address(0), "ERC1155: burn from the zero address"); - - address operator = _msgSender(); - uint256[] memory ids = _asSingletonArray(id); - uint256[] memory amounts = _asSingletonArray(amount); - - _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); - - uint256 fromBalance = _balances[id][from]; - require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); - unchecked { - _balances[id][from] = fromBalance - amount; - } - - emit TransferSingle(operator, from, address(0), id, amount); - - _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); - } - - /** - * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. - * - * Emits a {TransferBatch} event. - * - * Requirements: - * - * - `ids` and `amounts` must have the same length. - */ - function _burnBatch( - address from, - uint256[] memory ids, - uint256[] memory amounts - ) internal virtual { - require(from != address(0), "ERC1155: burn from the zero address"); - require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); - - address operator = _msgSender(); - - _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); - - for (uint256 i = 0; i < ids.length; i++) { - uint256 id = ids[i]; - uint256 amount = amounts[i]; - - uint256 fromBalance = _balances[id][from]; - require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); - unchecked { - _balances[id][from] = fromBalance - amount; - } - } - - emit TransferBatch(operator, from, address(0), ids, amounts); - - _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); - } - - /** - * @dev Approve `operator` to operate on all of `owner` tokens - * - * Emits an {ApprovalForAll} event. - */ - function _setApprovalForAll( - address owner, - address operator, - bool approved - ) internal virtual { - require(owner != operator, "ERC1155: setting approval status for self"); - _operatorApprovals[owner][operator] = approved; - emit ApprovalForAll(owner, operator, approved); - } - - /** - * @dev Hook that is called before any token transfer. This includes minting - * and burning, as well as batched variants. - * - * The same hook is called on both single and batched variants. For single - * transfers, the length of the `ids` and `amounts` arrays will be 1. - * - * Calling conditions (for each `id` and `amount` pair): - * - * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens - * of token type `id` will be transferred to `to`. - * - When `from` is zero, `amount` tokens of token type `id` will be minted - * for `to`. - * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` - * will be burned. - * - `from` and `to` are never both zero. - * - `ids` and `amounts` have the same, non-zero length. - * - * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. - */ - function _beforeTokenTransfer( - address operator, - address from, - address to, - uint256[] memory ids, - uint256[] memory amounts, - bytes memory data - ) internal virtual {} - - /** - * @dev Hook that is called after any token transfer. This includes minting - * and burning, as well as batched variants. - * - * The same hook is called on both single and batched variants. For single - * transfers, the length of the `id` and `amount` arrays will be 1. - * - * Calling conditions (for each `id` and `amount` pair): - * - * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens - * of token type `id` will be transferred to `to`. - * - When `from` is zero, `amount` tokens of token type `id` will be minted - * for `to`. - * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` - * will be burned. - * - `from` and `to` are never both zero. - * - `ids` and `amounts` have the same, non-zero length. - * - * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. - */ - function _afterTokenTransfer( - address operator, - address from, - address to, - uint256[] memory ids, - uint256[] memory amounts, - bytes memory data - ) internal virtual {} - - function _doSafeTransferAcceptanceCheck( - address operator, - address from, - address to, - uint256 id, - uint256 amount, - bytes memory data - ) private { - if (to.isContract()) { - try IERC1155ReceiverUpgradeable(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { - if (response != IERC1155ReceiverUpgradeable.onERC1155Received.selector) { - revert("ERC1155: ERC1155Receiver rejected tokens"); - } - } catch Error(string memory reason) { - revert(reason); - } catch { - revert("ERC1155: transfer to non-ERC1155Receiver implementer"); - } - } - } - - function _doSafeBatchTransferAcceptanceCheck( - address operator, - address from, - address to, - uint256[] memory ids, - uint256[] memory amounts, - bytes memory data - ) private { - if (to.isContract()) { - try IERC1155ReceiverUpgradeable(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( - bytes4 response - ) { - if (response != IERC1155ReceiverUpgradeable.onERC1155BatchReceived.selector) { - revert("ERC1155: ERC1155Receiver rejected tokens"); - } - } catch Error(string memory reason) { - revert(reason); - } catch { - revert("ERC1155: transfer to non-ERC1155Receiver implementer"); - } - } - } - - function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { - uint256[] memory array = new uint256[](1); - array[0] = element; - - return array; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[47] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/IERC1155ReceiverUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/IERC1155ReceiverUpgradeable.sol deleted file mode 100644 index 2a40cc5..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/IERC1155ReceiverUpgradeable.sol +++ /dev/null @@ -1,58 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) - -pragma solidity ^0.8.0; - -import "../../utils/introspection/IERC165Upgradeable.sol"; - -/** - * @dev _Available since v3.1._ - */ -interface IERC1155ReceiverUpgradeable is IERC165Upgradeable { - /** - * @dev Handles the receipt of a single ERC1155 token type. This function is - * called at the end of a `safeTransferFrom` after the balance has been updated. - * - * NOTE: To accept the transfer, this must return - * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` - * (i.e. 0xf23a6e61, or its own function selector). - * - * @param operator The address which initiated the transfer (i.e. msg.sender) - * @param from The address which previously owned the token - * @param id The ID of the token being transferred - * @param value The amount of tokens being transferred - * @param data Additional data with no specified format - * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed - */ - function onERC1155Received( - address operator, - address from, - uint256 id, - uint256 value, - bytes calldata data - ) external returns (bytes4); - - /** - * @dev Handles the receipt of a multiple ERC1155 token types. This function - * is called at the end of a `safeBatchTransferFrom` after the balances have - * been updated. - * - * NOTE: To accept the transfer(s), this must return - * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` - * (i.e. 0xbc197c81, or its own function selector). - * - * @param operator The address which initiated the batch transfer (i.e. msg.sender) - * @param from The address which previously owned the token - * @param ids An array containing ids of each token being transferred (order and length must match values array) - * @param values An array containing amounts of each token being transferred (order and length must match ids array) - * @param data Additional data with no specified format - * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed - */ - function onERC1155BatchReceived( - address operator, - address from, - uint256[] calldata ids, - uint256[] calldata values, - bytes calldata data - ) external returns (bytes4); -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/IERC1155Upgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/IERC1155Upgradeable.sol deleted file mode 100644 index 817fb52..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/IERC1155Upgradeable.sol +++ /dev/null @@ -1,125 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol) - -pragma solidity ^0.8.0; - -import "../../utils/introspection/IERC165Upgradeable.sol"; - -/** - * @dev Required interface of an ERC1155 compliant contract, as defined in the - * https://eips.ethereum.org/EIPS/eip-1155[EIP]. - * - * _Available since v3.1._ - */ -interface IERC1155Upgradeable is IERC165Upgradeable { - /** - * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. - */ - event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); - - /** - * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all - * transfers. - */ - event TransferBatch( - address indexed operator, - address indexed from, - address indexed to, - uint256[] ids, - uint256[] values - ); - - /** - * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to - * `approved`. - */ - event ApprovalForAll(address indexed account, address indexed operator, bool approved); - - /** - * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. - * - * If an {URI} event was emitted for `id`, the standard - * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value - * returned by {IERC1155MetadataURI-uri}. - */ - event URI(string value, uint256 indexed id); - - /** - * @dev Returns the amount of tokens of token type `id` owned by `account`. - * - * Requirements: - * - * - `account` cannot be the zero address. - */ - function balanceOf(address account, uint256 id) external view returns (uint256); - - /** - * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. - * - * Requirements: - * - * - `accounts` and `ids` must have the same length. - */ - function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) - external - view - returns (uint256[] memory); - - /** - * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, - * - * Emits an {ApprovalForAll} event. - * - * Requirements: - * - * - `operator` cannot be the caller. - */ - function setApprovalForAll(address operator, bool approved) external; - - /** - * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. - * - * See {setApprovalForAll}. - */ - function isApprovedForAll(address account, address operator) external view returns (bool); - - /** - * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. - * - * Emits a {TransferSingle} event. - * - * Requirements: - * - * - `to` cannot be the zero address. - * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. - * - `from` must have a balance of tokens of type `id` of at least `amount`. - * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the - * acceptance magic value. - */ - function safeTransferFrom( - address from, - address to, - uint256 id, - uint256 amount, - bytes calldata data - ) external; - - /** - * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. - * - * Emits a {TransferBatch} event. - * - * Requirements: - * - * - `ids` and `amounts` must have the same length. - * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the - * acceptance magic value. - */ - function safeBatchTransferFrom( - address from, - address to, - uint256[] calldata ids, - uint256[] calldata amounts, - bytes calldata data - ) external; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/README.adoc b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/README.adoc deleted file mode 100644 index 13ffbdb..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/README.adoc +++ /dev/null @@ -1,49 +0,0 @@ -= ERC 1155 - -[.readme-notice] -NOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/token/erc1155 - -This set of interfaces and contracts are all related to the https://eips.ethereum.org/EIPS/eip-1155[ERC1155 Multi Token Standard]. - -The EIP consists of three interfaces which fulfill different roles, found here as {IERC1155}, {IERC1155MetadataURI} and {IERC1155Receiver}. - -{ERC1155} implements the mandatory {IERC1155} interface, as well as the optional extension {IERC1155MetadataURI}, by relying on the substitution mechanism to use the same URI for all token types, dramatically reducing gas costs. - -Additionally there are multiple custom extensions, including: - -* designation of addresses that can pause token transfers for all users ({ERC1155Pausable}). -* destruction of own tokens ({ERC1155Burnable}). - -NOTE: This core set of contracts is designed to be unopinionated, allowing developers to access the internal functions in ERC1155 (such as <>) and expose them as external functions in the way they prefer. On the other hand, xref:ROOT:erc1155.adoc#Presets[ERC1155 Presets] (such as {ERC1155PresetMinterPauser}) are designed using opinionated patterns to provide developers with ready to use, deployable contracts. - -== Core - -{{IERC1155}} - -{{IERC1155MetadataURI}} - -{{ERC1155}} - -{{IERC1155Receiver}} - -{{ERC1155Receiver}} - -== Extensions - -{{ERC1155Pausable}} - -{{ERC1155Burnable}} - -{{ERC1155Supply}} - -{{ERC1155URIStorage}} - -== Presets - -These contracts are preconfigured combinations of the above features. They can be used through inheritance or as models to copy and paste their source code. - -{{ERC1155PresetMinterPauser}} - -== Utilities - -{{ERC1155Holder}} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155BurnableUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155BurnableUpgradeable.sol deleted file mode 100644 index da01755..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155BurnableUpgradeable.sol +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/extensions/ERC1155Burnable.sol) - -pragma solidity ^0.8.0; - -import "../ERC1155Upgradeable.sol"; -import "../../../proxy/utils/Initializable.sol"; - -/** - * @dev Extension of {ERC1155} that allows token holders to destroy both their - * own tokens and those that they have been approved to use. - * - * _Available since v3.1._ - */ -abstract contract ERC1155BurnableUpgradeable is Initializable, ERC1155Upgradeable { - function __ERC1155Burnable_init() internal onlyInitializing { - } - - function __ERC1155Burnable_init_unchained() internal onlyInitializing { - } - function burn( - address account, - uint256 id, - uint256 value - ) public virtual { - require( - account == _msgSender() || isApprovedForAll(account, _msgSender()), - "ERC1155: caller is not token owner or approved" - ); - - _burn(account, id, value); - } - - function burnBatch( - address account, - uint256[] memory ids, - uint256[] memory values - ) public virtual { - require( - account == _msgSender() || isApprovedForAll(account, _msgSender()), - "ERC1155: caller is not token owner or approved" - ); - - _burnBatch(account, ids, values); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155PausableUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155PausableUpgradeable.sol deleted file mode 100644 index 93e9ede..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155PausableUpgradeable.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Pausable.sol) - -pragma solidity ^0.8.0; - -import "../ERC1155Upgradeable.sol"; -import "../../../security/PausableUpgradeable.sol"; -import "../../../proxy/utils/Initializable.sol"; - -/** - * @dev ERC1155 token with pausable token transfers, minting and burning. - * - * Useful for scenarios such as preventing trades until the end of an evaluation - * period, or having an emergency switch for freezing all token transfers in the - * event of a large bug. - * - * _Available since v3.1._ - */ -abstract contract ERC1155PausableUpgradeable is Initializable, ERC1155Upgradeable, PausableUpgradeable { - function __ERC1155Pausable_init() internal onlyInitializing { - __Pausable_init_unchained(); - } - - function __ERC1155Pausable_init_unchained() internal onlyInitializing { - } - /** - * @dev See {ERC1155-_beforeTokenTransfer}. - * - * Requirements: - * - * - the contract must not be paused. - */ - function _beforeTokenTransfer( - address operator, - address from, - address to, - uint256[] memory ids, - uint256[] memory amounts, - bytes memory data - ) internal virtual override { - super._beforeTokenTransfer(operator, from, to, ids, amounts, data); - - require(!paused(), "ERC1155Pausable: token transfer while paused"); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155SupplyUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155SupplyUpgradeable.sol deleted file mode 100644 index c96fe2d..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155SupplyUpgradeable.sol +++ /dev/null @@ -1,77 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155Supply.sol) - -pragma solidity ^0.8.0; - -import "../ERC1155Upgradeable.sol"; -import "../../../proxy/utils/Initializable.sol"; - -/** - * @dev Extension of ERC1155 that adds tracking of total supply per id. - * - * Useful for scenarios where Fungible and Non-fungible tokens have to be - * clearly identified. Note: While a totalSupply of 1 might mean the - * corresponding is an NFT, there is no guarantees that no other token with the - * same id are not going to be minted. - */ -abstract contract ERC1155SupplyUpgradeable is Initializable, ERC1155Upgradeable { - function __ERC1155Supply_init() internal onlyInitializing { - } - - function __ERC1155Supply_init_unchained() internal onlyInitializing { - } - mapping(uint256 => uint256) private _totalSupply; - - /** - * @dev Total amount of tokens in with a given id. - */ - function totalSupply(uint256 id) public view virtual returns (uint256) { - return _totalSupply[id]; - } - - /** - * @dev Indicates whether any token exist with a given id, or not. - */ - function exists(uint256 id) public view virtual returns (bool) { - return ERC1155SupplyUpgradeable.totalSupply(id) > 0; - } - - /** - * @dev See {ERC1155-_beforeTokenTransfer}. - */ - function _beforeTokenTransfer( - address operator, - address from, - address to, - uint256[] memory ids, - uint256[] memory amounts, - bytes memory data - ) internal virtual override { - super._beforeTokenTransfer(operator, from, to, ids, amounts, data); - - if (from == address(0)) { - for (uint256 i = 0; i < ids.length; ++i) { - _totalSupply[ids[i]] += amounts[i]; - } - } - - if (to == address(0)) { - for (uint256 i = 0; i < ids.length; ++i) { - uint256 id = ids[i]; - uint256 amount = amounts[i]; - uint256 supply = _totalSupply[id]; - require(supply >= amount, "ERC1155: burn amount exceeds totalSupply"); - unchecked { - _totalSupply[id] = supply - amount; - } - } - } - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol deleted file mode 100644 index ccb912a..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol +++ /dev/null @@ -1,78 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155URIStorage.sol) - -pragma solidity ^0.8.0; - -import "../../../utils/StringsUpgradeable.sol"; -import "../ERC1155Upgradeable.sol"; -import "../../../proxy/utils/Initializable.sol"; - -/** - * @dev ERC1155 token with storage based token URI management. - * Inspired by the ERC721URIStorage extension - * - * _Available since v4.6._ - */ -abstract contract ERC1155URIStorageUpgradeable is Initializable, ERC1155Upgradeable { - function __ERC1155URIStorage_init() internal onlyInitializing { - __ERC1155URIStorage_init_unchained(); - } - - function __ERC1155URIStorage_init_unchained() internal onlyInitializing { - _baseURI = ""; - } - using StringsUpgradeable for uint256; - - // Optional base URI - string private _baseURI; - - // Optional mapping for token URIs - mapping(uint256 => string) private _tokenURIs; - - /** - * @dev See {IERC1155MetadataURI-uri}. - * - * This implementation returns the concatenation of the `_baseURI` - * and the token-specific uri if the latter is set - * - * This enables the following behaviors: - * - * - if `_tokenURIs[tokenId]` is set, then the result is the concatenation - * of `_baseURI` and `_tokenURIs[tokenId]` (keep in mind that `_baseURI` - * is empty per default); - * - * - if `_tokenURIs[tokenId]` is NOT set then we fallback to `super.uri()` - * which in most cases will contain `ERC1155._uri`; - * - * - if `_tokenURIs[tokenId]` is NOT set, and if the parents do not have a - * uri value set, then the result is empty. - */ - function uri(uint256 tokenId) public view virtual override returns (string memory) { - string memory tokenURI = _tokenURIs[tokenId]; - - // If token URI is set, concatenate base URI and tokenURI (via abi.encodePacked). - return bytes(tokenURI).length > 0 ? string(abi.encodePacked(_baseURI, tokenURI)) : super.uri(tokenId); - } - - /** - * @dev Sets `tokenURI` as the tokenURI of `tokenId`. - */ - function _setURI(uint256 tokenId, string memory tokenURI) internal virtual { - _tokenURIs[tokenId] = tokenURI; - emit URI(uri(tokenId), tokenId); - } - - /** - * @dev Sets `baseURI` as the `_baseURI` for all tokens - */ - function _setBaseURI(string memory baseURI) internal virtual { - _baseURI = baseURI; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[48] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/IERC1155MetadataURIUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/IERC1155MetadataURIUpgradeable.sol deleted file mode 100644 index e47f021..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/extensions/IERC1155MetadataURIUpgradeable.sol +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) - -pragma solidity ^0.8.0; - -import "../IERC1155Upgradeable.sol"; - -/** - * @dev Interface of the optional ERC1155MetadataExtension interface, as defined - * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. - * - * _Available since v3.1._ - */ -interface IERC1155MetadataURIUpgradeable is IERC1155Upgradeable { - /** - * @dev Returns the URI for token type `id`. - * - * If the `\{id\}` substring is present in the URI, it must be replaced by - * clients with the actual token type ID. - */ - function uri(uint256 id) external view returns (string memory); -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/presets/ERC1155PresetMinterPauserUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/presets/ERC1155PresetMinterPauserUpgradeable.sol deleted file mode 100644 index 5fcb96f..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/presets/ERC1155PresetMinterPauserUpgradeable.sol +++ /dev/null @@ -1,145 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/presets/ERC1155PresetMinterPauser.sol) - -pragma solidity ^0.8.0; - -import "../ERC1155Upgradeable.sol"; -import "../extensions/ERC1155BurnableUpgradeable.sol"; -import "../extensions/ERC1155PausableUpgradeable.sol"; -import "../../../access/AccessControlEnumerableUpgradeable.sol"; -import "../../../utils/ContextUpgradeable.sol"; -import "../../../proxy/utils/Initializable.sol"; - -/** - * @dev {ERC1155} token, including: - * - * - ability for holders to burn (destroy) their tokens - * - a minter role that allows for token minting (creation) - * - a pauser role that allows to stop all token transfers - * - * This contract uses {AccessControl} to lock permissioned functions using the - * different roles - head to its documentation for details. - * - * The account that deploys the contract will be granted the minter and pauser - * roles, as well as the default admin role, which will let it grant both minter - * and pauser roles to other accounts. - * - * _Deprecated in favor of https://wizard.openzeppelin.com/[Contracts Wizard]._ - */ -contract ERC1155PresetMinterPauserUpgradeable is Initializable, ContextUpgradeable, AccessControlEnumerableUpgradeable, ERC1155BurnableUpgradeable, ERC1155PausableUpgradeable { - function initialize(string memory uri) public virtual initializer { - __ERC1155PresetMinterPauser_init(uri); - } - bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); - bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); - - /** - * @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE`, and `PAUSER_ROLE` to the account that - * deploys the contract. - */ - function __ERC1155PresetMinterPauser_init(string memory uri) internal onlyInitializing { - __ERC1155_init_unchained(uri); - __Pausable_init_unchained(); - __ERC1155PresetMinterPauser_init_unchained(uri); - } - - function __ERC1155PresetMinterPauser_init_unchained(string memory) internal onlyInitializing { - _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); - - _setupRole(MINTER_ROLE, _msgSender()); - _setupRole(PAUSER_ROLE, _msgSender()); - } - - /** - * @dev Creates `amount` new tokens for `to`, of token type `id`. - * - * See {ERC1155-_mint}. - * - * Requirements: - * - * - the caller must have the `MINTER_ROLE`. - */ - function mint( - address to, - uint256 id, - uint256 amount, - bytes memory data - ) public virtual { - require(hasRole(MINTER_ROLE, _msgSender()), "ERC1155PresetMinterPauser: must have minter role to mint"); - - _mint(to, id, amount, data); - } - - /** - * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] variant of {mint}. - */ - function mintBatch( - address to, - uint256[] memory ids, - uint256[] memory amounts, - bytes memory data - ) public virtual { - require(hasRole(MINTER_ROLE, _msgSender()), "ERC1155PresetMinterPauser: must have minter role to mint"); - - _mintBatch(to, ids, amounts, data); - } - - /** - * @dev Pauses all token transfers. - * - * See {ERC1155Pausable} and {Pausable-_pause}. - * - * Requirements: - * - * - the caller must have the `PAUSER_ROLE`. - */ - function pause() public virtual { - require(hasRole(PAUSER_ROLE, _msgSender()), "ERC1155PresetMinterPauser: must have pauser role to pause"); - _pause(); - } - - /** - * @dev Unpauses all token transfers. - * - * See {ERC1155Pausable} and {Pausable-_unpause}. - * - * Requirements: - * - * - the caller must have the `PAUSER_ROLE`. - */ - function unpause() public virtual { - require(hasRole(PAUSER_ROLE, _msgSender()), "ERC1155PresetMinterPauser: must have pauser role to unpause"); - _unpause(); - } - - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) - public - view - virtual - override(AccessControlEnumerableUpgradeable, ERC1155Upgradeable) - returns (bool) - { - return super.supportsInterface(interfaceId); - } - - function _beforeTokenTransfer( - address operator, - address from, - address to, - uint256[] memory ids, - uint256[] memory amounts, - bytes memory data - ) internal virtual override(ERC1155Upgradeable, ERC1155PausableUpgradeable) { - super._beforeTokenTransfer(operator, from, to, ids, amounts, data); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/presets/README.md b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/presets/README.md deleted file mode 100644 index 468200b..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/presets/README.md +++ /dev/null @@ -1 +0,0 @@ -Contract presets are now deprecated in favor of [Contracts Wizard](https://wizard.openzeppelin.com/) as a more powerful alternative. diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/utils/ERC1155HolderUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/utils/ERC1155HolderUpgradeable.sol deleted file mode 100644 index c21db22..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/utils/ERC1155HolderUpgradeable.sol +++ /dev/null @@ -1,49 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/utils/ERC1155Holder.sol) - -pragma solidity ^0.8.0; - -import "./ERC1155ReceiverUpgradeable.sol"; -import "../../../proxy/utils/Initializable.sol"; - -/** - * Simple implementation of `ERC1155Receiver` that will allow a contract to hold ERC1155 tokens. - * - * IMPORTANT: When inheriting this contract, you must include a way to use the received tokens, otherwise they will be - * stuck. - * - * @dev _Available since v3.1._ - */ -contract ERC1155HolderUpgradeable is Initializable, ERC1155ReceiverUpgradeable { - function __ERC1155Holder_init() internal onlyInitializing { - } - - function __ERC1155Holder_init_unchained() internal onlyInitializing { - } - function onERC1155Received( - address, - address, - uint256, - uint256, - bytes memory - ) public virtual override returns (bytes4) { - return this.onERC1155Received.selector; - } - - function onERC1155BatchReceived( - address, - address, - uint256[] memory, - uint256[] memory, - bytes memory - ) public virtual override returns (bytes4) { - return this.onERC1155BatchReceived.selector; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/utils/ERC1155ReceiverUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/utils/ERC1155ReceiverUpgradeable.sol deleted file mode 100644 index a516a14..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC1155/utils/ERC1155ReceiverUpgradeable.sol +++ /dev/null @@ -1,32 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC1155/utils/ERC1155Receiver.sol) - -pragma solidity ^0.8.0; - -import "../IERC1155ReceiverUpgradeable.sol"; -import "../../../utils/introspection/ERC165Upgradeable.sol"; -import "../../../proxy/utils/Initializable.sol"; - -/** - * @dev _Available since v3.1._ - */ -abstract contract ERC1155ReceiverUpgradeable is Initializable, ERC165Upgradeable, IERC1155ReceiverUpgradeable { - function __ERC1155Receiver_init() internal onlyInitializing { - } - - function __ERC1155Receiver_init_unchained() internal onlyInitializing { - } - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) { - return interfaceId == type(IERC1155ReceiverUpgradeable).interfaceId || super.supportsInterface(interfaceId); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/ERC20Upgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/ERC20Upgradeable.sol deleted file mode 100644 index a3c62d8..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/ERC20Upgradeable.sol +++ /dev/null @@ -1,401 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol) - -pragma solidity ^0.8.0; - -import "./IERC20Upgradeable.sol"; -import "./extensions/IERC20MetadataUpgradeable.sol"; -import "../../utils/ContextUpgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -/** - * @dev Implementation of the {IERC20} interface. - * - * This implementation is agnostic to the way tokens are created. This means - * that a supply mechanism has to be added in a derived contract using {_mint}. - * For a generic mechanism see {ERC20PresetMinterPauser}. - * - * TIP: For a detailed writeup see our guide - * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How - * to implement supply mechanisms]. - * - * We have followed general OpenZeppelin Contracts guidelines: functions revert - * instead returning `false` on failure. This behavior is nonetheless - * conventional and does not conflict with the expectations of ERC20 - * applications. - * - * Additionally, an {Approval} event is emitted on calls to {transferFrom}. - * This allows applications to reconstruct the allowance for all accounts just - * by listening to said events. Other implementations of the EIP may not emit - * these events, as it isn't required by the specification. - * - * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} - * functions have been added to mitigate the well-known issues around setting - * allowances. See {IERC20-approve}. - */ -contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable { - mapping(address => uint256) private _balances; - - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 private _totalSupply; - - string private _name; - string private _symbol; - - /** - * @dev Sets the values for {name} and {symbol}. - * - * The default value of {decimals} is 18. To select a different value for - * {decimals} you should overload it. - * - * All two of these values are immutable: they can only be set once during - * construction. - */ - function __ERC20_init(string memory name_, string memory symbol_) internal onlyInitializing { - __ERC20_init_unchained(name_, symbol_); - } - - function __ERC20_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing { - _name = name_; - _symbol = symbol_; - } - - /** - * @dev Returns the name of the token. - */ - function name() public view virtual override returns (string memory) { - return _name; - } - - /** - * @dev Returns the symbol of the token, usually a shorter version of the - * name. - */ - function symbol() public view virtual override returns (string memory) { - return _symbol; - } - - /** - * @dev Returns the number of decimals used to get its user representation. - * For example, if `decimals` equals `2`, a balance of `505` tokens should - * be displayed to a user as `5.05` (`505 / 10 ** 2`). - * - * Tokens usually opt for a value of 18, imitating the relationship between - * Ether and Wei. This is the value {ERC20} uses, unless this function is - * overridden; - * - * NOTE: This information is only used for _display_ purposes: it in - * no way affects any of the arithmetic of the contract, including - * {IERC20-balanceOf} and {IERC20-transfer}. - */ - function decimals() public view virtual override returns (uint8) { - return 18; - } - - /** - * @dev See {IERC20-totalSupply}. - */ - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /** - * @dev See {IERC20-balanceOf}. - */ - function balanceOf(address account) public view virtual override returns (uint256) { - return _balances[account]; - } - - /** - * @dev See {IERC20-transfer}. - * - * Requirements: - * - * - `to` cannot be the zero address. - * - the caller must have a balance of at least `amount`. - */ - function transfer(address to, uint256 amount) public virtual override returns (bool) { - address owner = _msgSender(); - _transfer(owner, to, amount); - return true; - } - - /** - * @dev See {IERC20-allowance}. - */ - function allowance(address owner, address spender) public view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /** - * @dev See {IERC20-approve}. - * - * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on - * `transferFrom`. This is semantically equivalent to an infinite approval. - * - * Requirements: - * - * - `spender` cannot be the zero address. - */ - function approve(address spender, uint256 amount) public virtual override returns (bool) { - address owner = _msgSender(); - _approve(owner, spender, amount); - return true; - } - - /** - * @dev See {IERC20-transferFrom}. - * - * Emits an {Approval} event indicating the updated allowance. This is not - * required by the EIP. See the note at the beginning of {ERC20}. - * - * NOTE: Does not update the allowance if the current allowance - * is the maximum `uint256`. - * - * Requirements: - * - * - `from` and `to` cannot be the zero address. - * - `from` must have a balance of at least `amount`. - * - the caller must have allowance for ``from``'s tokens of at least - * `amount`. - */ - function transferFrom( - address from, - address to, - uint256 amount - ) public virtual override returns (bool) { - address spender = _msgSender(); - _spendAllowance(from, spender, amount); - _transfer(from, to, amount); - return true; - } - - /** - * @dev Atomically increases the allowance granted to `spender` by the caller. - * - * This is an alternative to {approve} that can be used as a mitigation for - * problems described in {IERC20-approve}. - * - * Emits an {Approval} event indicating the updated allowance. - * - * Requirements: - * - * - `spender` cannot be the zero address. - */ - function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { - address owner = _msgSender(); - _approve(owner, spender, allowance(owner, spender) + addedValue); - return true; - } - - /** - * @dev Atomically decreases the allowance granted to `spender` by the caller. - * - * This is an alternative to {approve} that can be used as a mitigation for - * problems described in {IERC20-approve}. - * - * Emits an {Approval} event indicating the updated allowance. - * - * Requirements: - * - * - `spender` cannot be the zero address. - * - `spender` must have allowance for the caller of at least - * `subtractedValue`. - */ - function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { - address owner = _msgSender(); - uint256 currentAllowance = allowance(owner, spender); - require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); - unchecked { - _approve(owner, spender, currentAllowance - subtractedValue); - } - - return true; - } - - /** - * @dev Moves `amount` of tokens from `from` to `to`. - * - * This internal function is equivalent to {transfer}, and can be used to - * e.g. implement automatic token fees, slashing mechanisms, etc. - * - * Emits a {Transfer} event. - * - * Requirements: - * - * - `from` cannot be the zero address. - * - `to` cannot be the zero address. - * - `from` must have a balance of at least `amount`. - */ - function _transfer( - address from, - address to, - uint256 amount - ) internal virtual { - require(from != address(0), "ERC20: transfer from the zero address"); - require(to != address(0), "ERC20: transfer to the zero address"); - - _beforeTokenTransfer(from, to, amount); - - uint256 fromBalance = _balances[from]; - require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); - unchecked { - _balances[from] = fromBalance - amount; - // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by - // decrementing then incrementing. - _balances[to] += amount; - } - - emit Transfer(from, to, amount); - - _afterTokenTransfer(from, to, amount); - } - - /** @dev Creates `amount` tokens and assigns them to `account`, increasing - * the total supply. - * - * Emits a {Transfer} event with `from` set to the zero address. - * - * Requirements: - * - * - `account` cannot be the zero address. - */ - function _mint(address account, uint256 amount) internal virtual { - require(account != address(0), "ERC20: mint to the zero address"); - - _beforeTokenTransfer(address(0), account, amount); - - _totalSupply += amount; - unchecked { - // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. - _balances[account] += amount; - } - emit Transfer(address(0), account, amount); - - _afterTokenTransfer(address(0), account, amount); - } - - /** - * @dev Destroys `amount` tokens from `account`, reducing the - * total supply. - * - * Emits a {Transfer} event with `to` set to the zero address. - * - * Requirements: - * - * - `account` cannot be the zero address. - * - `account` must have at least `amount` tokens. - */ - function _burn(address account, uint256 amount) internal virtual { - require(account != address(0), "ERC20: burn from the zero address"); - - _beforeTokenTransfer(account, address(0), amount); - - uint256 accountBalance = _balances[account]; - require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); - unchecked { - _balances[account] = accountBalance - amount; - // Overflow not possible: amount <= accountBalance <= totalSupply. - _totalSupply -= amount; - } - - emit Transfer(account, address(0), amount); - - _afterTokenTransfer(account, address(0), amount); - } - - /** - * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. - * - * This internal function is equivalent to `approve`, and can be used to - * e.g. set automatic allowances for certain subsystems, etc. - * - * Emits an {Approval} event. - * - * Requirements: - * - * - `owner` cannot be the zero address. - * - `spender` cannot be the zero address. - */ - function _approve( - address owner, - address spender, - uint256 amount - ) internal virtual { - require(owner != address(0), "ERC20: approve from the zero address"); - require(spender != address(0), "ERC20: approve to the zero address"); - - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @dev Updates `owner` s allowance for `spender` based on spent `amount`. - * - * Does not update the allowance amount in case of infinite allowance. - * Revert if not enough allowance is available. - * - * Might emit an {Approval} event. - */ - function _spendAllowance( - address owner, - address spender, - uint256 amount - ) internal virtual { - uint256 currentAllowance = allowance(owner, spender); - if (currentAllowance != type(uint256).max) { - require(currentAllowance >= amount, "ERC20: insufficient allowance"); - unchecked { - _approve(owner, spender, currentAllowance - amount); - } - } - } - - /** - * @dev Hook that is called before any transfer of tokens. This includes - * minting and burning. - * - * Calling conditions: - * - * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens - * will be transferred to `to`. - * - when `from` is zero, `amount` tokens will be minted for `to`. - * - when `to` is zero, `amount` of ``from``'s tokens will be burned. - * - `from` and `to` are never both zero. - * - * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. - */ - function _beforeTokenTransfer( - address from, - address to, - uint256 amount - ) internal virtual {} - - /** - * @dev Hook that is called after any transfer of tokens. This includes - * minting and burning. - * - * Calling conditions: - * - * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens - * has been transferred to `to`. - * - when `from` is zero, `amount` tokens have been minted for `to`. - * - when `to` is zero, `amount` of ``from``'s tokens have been burned. - * - `from` and `to` are never both zero. - * - * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. - */ - function _afterTokenTransfer( - address from, - address to, - uint256 amount - ) internal virtual {} - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[45] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/IERC20Upgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/IERC20Upgradeable.sol deleted file mode 100644 index f72ebe9..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/IERC20Upgradeable.sol +++ /dev/null @@ -1,82 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20Upgradeable { - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); - - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `to`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address to, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `from` to `to` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom( - address from, - address to, - uint256 amount - ) external returns (bool); -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/README.adoc b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/README.adoc deleted file mode 100644 index ae2ce36..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/README.adoc +++ /dev/null @@ -1,86 +0,0 @@ -= ERC 20 - -[.readme-notice] -NOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/token/erc20 - -This set of interfaces, contracts, and utilities are all related to the https://eips.ethereum.org/EIPS/eip-20[ERC20 Token Standard]. - -TIP: For an overview of ERC20 tokens and a walk through on how to create a token contract read our xref:ROOT:erc20.adoc[ERC20 guide]. - -There are a few core contracts that implement the behavior specified in the EIP: - -* {IERC20}: the interface all ERC20 implementations should conform to. -* {IERC20Metadata}: the extended ERC20 interface including the <>, <> and <> functions. -* {ERC20}: the implementation of the ERC20 interface, including the <>, <> and <> optional standard extension to the base interface. - -Additionally there are multiple custom extensions, including: - -* {ERC20Burnable}: destruction of own tokens. -* {ERC20Capped}: enforcement of a cap to the total supply when minting tokens. -* {ERC20Pausable}: ability to pause token transfers. -* {ERC20Snapshot}: efficient storage of past token balances to be later queried at any point in time. -* {ERC20Permit}: gasless approval of tokens (standardized as ERC2612). -* {ERC20FlashMint}: token level support for flash loans through the minting and burning of ephemeral tokens (standardized as ERC3156). -* {ERC20Votes}: support for voting and vote delegation. -* {ERC20VotesComp}: support for voting and vote delegation (compatible with Compound's token, with uint96 restrictions). -* {ERC20Wrapper}: wrapper to create an ERC20 backed by another ERC20, with deposit and withdraw methods. Useful in conjunction with {ERC20Votes}. -* {ERC4626}: tokenized vault that manages shares (represented as ERC20) that are backed by assets (another ERC20). - -Finally, there are some utilities to interact with ERC20 contracts in various ways. - -* {SafeERC20}: a wrapper around the interface that eliminates the need to handle boolean return values. -* {TokenTimelock}: hold tokens for a beneficiary until a specified time. - -The following related EIPs are in draft status. - -- {ERC20Permit} - -NOTE: This core set of contracts is designed to be unopinionated, allowing developers to access the internal functions in ERC20 (such as <>) and expose them as external functions in the way they prefer. On the other hand, xref:ROOT:erc20.adoc#Presets[ERC20 Presets] (such as {ERC20PresetMinterPauser}) are designed using opinionated patterns to provide developers with ready to use, deployable contracts. - -== Core - -{{IERC20}} - -{{IERC20Metadata}} - -{{ERC20}} - -== Extensions - -{{ERC20Burnable}} - -{{ERC20Capped}} - -{{ERC20Pausable}} - -{{ERC20Snapshot}} - -{{ERC20Votes}} - -{{ERC20VotesComp}} - -{{ERC20Wrapper}} - -{{ERC20FlashMint}} - -{{ERC4626}} - -== Draft EIPs - -The following EIPs are still in Draft status. Due to their nature as drafts, the details of these contracts may change and we cannot guarantee their xref:ROOT:releases-stability.adoc[stability]. Minor releases of OpenZeppelin Contracts may contain breaking changes for the contracts in this directory, which will be duly announced in the https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/CHANGELOG.md[changelog]. The EIPs included here are used by projects in production and this may make them less likely to change significantly. - -{{ERC20Permit}} - -== Presets - -These contracts are preconfigured combinations of the above features. They can be used through inheritance or as models to copy and paste their source code. - -{{ERC20PresetMinterPauser}} - -{{ERC20PresetFixedSupply}} - -== Utilities - -{{SafeERC20}} - -{{TokenTimelock}} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/ERC20BurnableUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/ERC20BurnableUpgradeable.sol deleted file mode 100644 index 98766b8..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/ERC20BurnableUpgradeable.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol) - -pragma solidity ^0.8.0; - -import "../ERC20Upgradeable.sol"; -import "../../../utils/ContextUpgradeable.sol"; -import "../../../proxy/utils/Initializable.sol"; - -/** - * @dev Extension of {ERC20} that allows token holders to destroy both their own - * tokens and those that they have an allowance for, in a way that can be - * recognized off-chain (via event analysis). - */ -abstract contract ERC20BurnableUpgradeable is Initializable, ContextUpgradeable, ERC20Upgradeable { - function __ERC20Burnable_init() internal onlyInitializing { - } - - function __ERC20Burnable_init_unchained() internal onlyInitializing { - } - /** - * @dev Destroys `amount` tokens from the caller. - * - * See {ERC20-_burn}. - */ - function burn(uint256 amount) public virtual { - _burn(_msgSender(), amount); - } - - /** - * @dev Destroys `amount` tokens from `account`, deducting from the caller's - * allowance. - * - * See {ERC20-_burn} and {ERC20-allowance}. - * - * Requirements: - * - * - the caller must have allowance for ``accounts``'s tokens of at least - * `amount`. - */ - function burnFrom(address account, uint256 amount) public virtual { - _spendAllowance(account, _msgSender(), amount); - _burn(account, amount); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/ERC20CappedUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/ERC20CappedUpgradeable.sol deleted file mode 100644 index 3935b65..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/ERC20CappedUpgradeable.sol +++ /dev/null @@ -1,51 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/ERC20Capped.sol) - -pragma solidity ^0.8.0; - -import "../ERC20Upgradeable.sol"; -import "../../../proxy/utils/Initializable.sol"; - -/** - * @dev Extension of {ERC20} that adds a cap to the supply of tokens. - * - * @custom:storage-size 51 - */ -abstract contract ERC20CappedUpgradeable is Initializable, ERC20Upgradeable { - uint256 private _cap; - - /** - * @dev Sets the value of the `cap`. This value is immutable, it can only be - * set once during construction. - */ - function __ERC20Capped_init(uint256 cap_) internal onlyInitializing { - __ERC20Capped_init_unchained(cap_); - } - - function __ERC20Capped_init_unchained(uint256 cap_) internal onlyInitializing { - require(cap_ > 0, "ERC20Capped: cap is 0"); - _cap = cap_; - } - - /** - * @dev Returns the cap on the token's total supply. - */ - function cap() public view virtual returns (uint256) { - return _cap; - } - - /** - * @dev See {ERC20-_mint}. - */ - function _mint(address account, uint256 amount) internal virtual override { - require(ERC20Upgradeable.totalSupply() + amount <= cap(), "ERC20Capped: cap exceeded"); - super._mint(account, amount); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/ERC20FlashMintUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/ERC20FlashMintUpgradeable.sol deleted file mode 100644 index 1ba471b..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/ERC20FlashMintUpgradeable.sol +++ /dev/null @@ -1,122 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/extensions/ERC20FlashMint.sol) - -pragma solidity ^0.8.0; - -import "../../../interfaces/IERC3156FlashBorrowerUpgradeable.sol"; -import "../../../interfaces/IERC3156FlashLenderUpgradeable.sol"; -import "../ERC20Upgradeable.sol"; -import "../../../proxy/utils/Initializable.sol"; - -/** - * @dev Implementation of the ERC3156 Flash loans extension, as defined in - * https://eips.ethereum.org/EIPS/eip-3156[ERC-3156]. - * - * Adds the {flashLoan} method, which provides flash loan support at the token - * level. By default there is no fee, but this can be changed by overriding {flashFee}. - * - * _Available since v4.1._ - */ -abstract contract ERC20FlashMintUpgradeable is Initializable, ERC20Upgradeable, IERC3156FlashLenderUpgradeable { - function __ERC20FlashMint_init() internal onlyInitializing { - } - - function __ERC20FlashMint_init_unchained() internal onlyInitializing { - } - bytes32 private constant _RETURN_VALUE = keccak256("ERC3156FlashBorrower.onFlashLoan"); - - /** - * @dev Returns the maximum amount of tokens available for loan. - * @param token The address of the token that is requested. - * @return The amount of token that can be loaned. - */ - function maxFlashLoan(address token) public view virtual override returns (uint256) { - return token == address(this) ? type(uint256).max - ERC20Upgradeable.totalSupply() : 0; - } - - /** - * @dev Returns the fee applied when doing flash loans. This function calls - * the {_flashFee} function which returns the fee applied when doing flash - * loans. - * @param token The token to be flash loaned. - * @param amount The amount of tokens to be loaned. - * @return The fees applied to the corresponding flash loan. - */ - function flashFee(address token, uint256 amount) public view virtual override returns (uint256) { - require(token == address(this), "ERC20FlashMint: wrong token"); - return _flashFee(token, amount); - } - - /** - * @dev Returns the fee applied when doing flash loans. By default this - * implementation has 0 fees. This function can be overloaded to make - * the flash loan mechanism deflationary. - * @param token The token to be flash loaned. - * @param amount The amount of tokens to be loaned. - * @return The fees applied to the corresponding flash loan. - */ - function _flashFee(address token, uint256 amount) internal view virtual returns (uint256) { - // silence warning about unused variable without the addition of bytecode. - token; - amount; - return 0; - } - - /** - * @dev Returns the receiver address of the flash fee. By default this - * implementation returns the address(0) which means the fee amount will be burnt. - * This function can be overloaded to change the fee receiver. - * @return The address for which the flash fee will be sent to. - */ - function _flashFeeReceiver() internal view virtual returns (address) { - return address(0); - } - - /** - * @dev Performs a flash loan. New tokens are minted and sent to the - * `receiver`, who is required to implement the {IERC3156FlashBorrower} - * interface. By the end of the flash loan, the receiver is expected to own - * amount + fee tokens and have them approved back to the token contract itself so - * they can be burned. - * @param receiver The receiver of the flash loan. Should implement the - * {IERC3156FlashBorrower-onFlashLoan} interface. - * @param token The token to be flash loaned. Only `address(this)` is - * supported. - * @param amount The amount of tokens to be loaned. - * @param data An arbitrary datafield that is passed to the receiver. - * @return `true` if the flash loan was successful. - */ - // This function can reenter, but it doesn't pose a risk because it always preserves the property that the amount - // minted at the beginning is always recovered and burned at the end, or else the entire function will revert. - // slither-disable-next-line reentrancy-no-eth - function flashLoan( - IERC3156FlashBorrowerUpgradeable receiver, - address token, - uint256 amount, - bytes calldata data - ) public virtual override returns (bool) { - require(amount <= maxFlashLoan(token), "ERC20FlashMint: amount exceeds maxFlashLoan"); - uint256 fee = flashFee(token, amount); - _mint(address(receiver), amount); - require( - receiver.onFlashLoan(msg.sender, token, amount, fee, data) == _RETURN_VALUE, - "ERC20FlashMint: invalid return value" - ); - address flashFeeReceiver = _flashFeeReceiver(); - _spendAllowance(address(receiver), address(this), amount + fee); - if (fee == 0 || flashFeeReceiver == address(0)) { - _burn(address(receiver), amount + fee); - } else { - _burn(address(receiver), amount); - _transfer(address(receiver), flashFeeReceiver, fee); - } - return true; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/ERC20PausableUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/ERC20PausableUpgradeable.sol deleted file mode 100644 index d53070b..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/ERC20PausableUpgradeable.sol +++ /dev/null @@ -1,47 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/ERC20Pausable.sol) - -pragma solidity ^0.8.0; - -import "../ERC20Upgradeable.sol"; -import "../../../security/PausableUpgradeable.sol"; -import "../../../proxy/utils/Initializable.sol"; - -/** - * @dev ERC20 token with pausable token transfers, minting and burning. - * - * Useful for scenarios such as preventing trades until the end of an evaluation - * period, or having an emergency switch for freezing all token transfers in the - * event of a large bug. - */ -abstract contract ERC20PausableUpgradeable is Initializable, ERC20Upgradeable, PausableUpgradeable { - function __ERC20Pausable_init() internal onlyInitializing { - __Pausable_init_unchained(); - } - - function __ERC20Pausable_init_unchained() internal onlyInitializing { - } - /** - * @dev See {ERC20-_beforeTokenTransfer}. - * - * Requirements: - * - * - the contract must not be paused. - */ - function _beforeTokenTransfer( - address from, - address to, - uint256 amount - ) internal virtual override { - super._beforeTokenTransfer(from, to, amount); - - require(!paused(), "ERC20Pausable: token transfer while paused"); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/ERC20SnapshotUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/ERC20SnapshotUpgradeable.sol deleted file mode 100644 index 657ab2e..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/ERC20SnapshotUpgradeable.sol +++ /dev/null @@ -1,208 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/extensions/ERC20Snapshot.sol) - -pragma solidity ^0.8.0; - -import "../ERC20Upgradeable.sol"; -import "../../../utils/ArraysUpgradeable.sol"; -import "../../../utils/CountersUpgradeable.sol"; -import "../../../proxy/utils/Initializable.sol"; - -/** - * @dev This contract extends an ERC20 token with a snapshot mechanism. When a snapshot is created, the balances and - * total supply at the time are recorded for later access. - * - * This can be used to safely create mechanisms based on token balances such as trustless dividends or weighted voting. - * In naive implementations it's possible to perform a "double spend" attack by reusing the same balance from different - * accounts. By using snapshots to calculate dividends or voting power, those attacks no longer apply. It can also be - * used to create an efficient ERC20 forking mechanism. - * - * Snapshots are created by the internal {_snapshot} function, which will emit the {Snapshot} event and return a - * snapshot id. To get the total supply at the time of a snapshot, call the function {totalSupplyAt} with the snapshot - * id. To get the balance of an account at the time of a snapshot, call the {balanceOfAt} function with the snapshot id - * and the account address. - * - * NOTE: Snapshot policy can be customized by overriding the {_getCurrentSnapshotId} method. For example, having it - * return `block.number` will trigger the creation of snapshot at the beginning of each new block. When overriding this - * function, be careful about the monotonicity of its result. Non-monotonic snapshot ids will break the contract. - * - * Implementing snapshots for every block using this method will incur significant gas costs. For a gas-efficient - * alternative consider {ERC20Votes}. - * - * ==== Gas Costs - * - * Snapshots are efficient. Snapshot creation is _O(1)_. Retrieval of balances or total supply from a snapshot is _O(log - * n)_ in the number of snapshots that have been created, although _n_ for a specific account will generally be much - * smaller since identical balances in subsequent snapshots are stored as a single entry. - * - * There is a constant overhead for normal ERC20 transfers due to the additional snapshot bookkeeping. This overhead is - * only significant for the first transfer that immediately follows a snapshot for a particular account. Subsequent - * transfers will have normal cost until the next snapshot, and so on. - */ - -abstract contract ERC20SnapshotUpgradeable is Initializable, ERC20Upgradeable { - function __ERC20Snapshot_init() internal onlyInitializing { - } - - function __ERC20Snapshot_init_unchained() internal onlyInitializing { - } - // Inspired by Jordi Baylina's MiniMeToken to record historical balances: - // https://github.com/Giveth/minime/blob/ea04d950eea153a04c51fa510b068b9dded390cb/contracts/MiniMeToken.sol - - using ArraysUpgradeable for uint256[]; - using CountersUpgradeable for CountersUpgradeable.Counter; - - // Snapshotted values have arrays of ids and the value corresponding to that id. These could be an array of a - // Snapshot struct, but that would impede usage of functions that work on an array. - struct Snapshots { - uint256[] ids; - uint256[] values; - } - - mapping(address => Snapshots) private _accountBalanceSnapshots; - Snapshots private _totalSupplySnapshots; - - // Snapshot ids increase monotonically, with the first value being 1. An id of 0 is invalid. - CountersUpgradeable.Counter private _currentSnapshotId; - - /** - * @dev Emitted by {_snapshot} when a snapshot identified by `id` is created. - */ - event Snapshot(uint256 id); - - /** - * @dev Creates a new snapshot and returns its snapshot id. - * - * Emits a {Snapshot} event that contains the same id. - * - * {_snapshot} is `internal` and you have to decide how to expose it externally. Its usage may be restricted to a - * set of accounts, for example using {AccessControl}, or it may be open to the public. - * - * [WARNING] - * ==== - * While an open way of calling {_snapshot} is required for certain trust minimization mechanisms such as forking, - * you must consider that it can potentially be used by attackers in two ways. - * - * First, it can be used to increase the cost of retrieval of values from snapshots, although it will grow - * logarithmically thus rendering this attack ineffective in the long term. Second, it can be used to target - * specific accounts and increase the cost of ERC20 transfers for them, in the ways specified in the Gas Costs - * section above. - * - * We haven't measured the actual numbers; if this is something you're interested in please reach out to us. - * ==== - */ - function _snapshot() internal virtual returns (uint256) { - _currentSnapshotId.increment(); - - uint256 currentId = _getCurrentSnapshotId(); - emit Snapshot(currentId); - return currentId; - } - - /** - * @dev Get the current snapshotId - */ - function _getCurrentSnapshotId() internal view virtual returns (uint256) { - return _currentSnapshotId.current(); - } - - /** - * @dev Retrieves the balance of `account` at the time `snapshotId` was created. - */ - function balanceOfAt(address account, uint256 snapshotId) public view virtual returns (uint256) { - (bool snapshotted, uint256 value) = _valueAt(snapshotId, _accountBalanceSnapshots[account]); - - return snapshotted ? value : balanceOf(account); - } - - /** - * @dev Retrieves the total supply at the time `snapshotId` was created. - */ - function totalSupplyAt(uint256 snapshotId) public view virtual returns (uint256) { - (bool snapshotted, uint256 value) = _valueAt(snapshotId, _totalSupplySnapshots); - - return snapshotted ? value : totalSupply(); - } - - // Update balance and/or total supply snapshots before the values are modified. This is implemented - // in the _beforeTokenTransfer hook, which is executed for _mint, _burn, and _transfer operations. - function _beforeTokenTransfer( - address from, - address to, - uint256 amount - ) internal virtual override { - super._beforeTokenTransfer(from, to, amount); - - if (from == address(0)) { - // mint - _updateAccountSnapshot(to); - _updateTotalSupplySnapshot(); - } else if (to == address(0)) { - // burn - _updateAccountSnapshot(from); - _updateTotalSupplySnapshot(); - } else { - // transfer - _updateAccountSnapshot(from); - _updateAccountSnapshot(to); - } - } - - function _valueAt(uint256 snapshotId, Snapshots storage snapshots) private view returns (bool, uint256) { - require(snapshotId > 0, "ERC20Snapshot: id is 0"); - require(snapshotId <= _getCurrentSnapshotId(), "ERC20Snapshot: nonexistent id"); - - // When a valid snapshot is queried, there are three possibilities: - // a) The queried value was not modified after the snapshot was taken. Therefore, a snapshot entry was never - // created for this id, and all stored snapshot ids are smaller than the requested one. The value that corresponds - // to this id is the current one. - // b) The queried value was modified after the snapshot was taken. Therefore, there will be an entry with the - // requested id, and its value is the one to return. - // c) More snapshots were created after the requested one, and the queried value was later modified. There will be - // no entry for the requested id: the value that corresponds to it is that of the smallest snapshot id that is - // larger than the requested one. - // - // In summary, we need to find an element in an array, returning the index of the smallest value that is larger if - // it is not found, unless said value doesn't exist (e.g. when all values are smaller). Arrays.findUpperBound does - // exactly this. - - uint256 index = snapshots.ids.findUpperBound(snapshotId); - - if (index == snapshots.ids.length) { - return (false, 0); - } else { - return (true, snapshots.values[index]); - } - } - - function _updateAccountSnapshot(address account) private { - _updateSnapshot(_accountBalanceSnapshots[account], balanceOf(account)); - } - - function _updateTotalSupplySnapshot() private { - _updateSnapshot(_totalSupplySnapshots, totalSupply()); - } - - function _updateSnapshot(Snapshots storage snapshots, uint256 currentValue) private { - uint256 currentId = _getCurrentSnapshotId(); - if (_lastSnapshotId(snapshots.ids) < currentId) { - snapshots.ids.push(currentId); - snapshots.values.push(currentValue); - } - } - - function _lastSnapshotId(uint256[] storage ids) private view returns (uint256) { - if (ids.length == 0) { - return 0; - } else { - return ids[ids.length - 1]; - } - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[46] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/ERC20VotesCompUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/ERC20VotesCompUpgradeable.sol deleted file mode 100644 index 5a6eb2a..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/ERC20VotesCompUpgradeable.sol +++ /dev/null @@ -1,59 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20VotesComp.sol) - -pragma solidity ^0.8.0; - -import "./ERC20VotesUpgradeable.sol"; -import "../../../proxy/utils/Initializable.sol"; - -/** - * @dev Extension of ERC20 to support Compound's voting and delegation. This version exactly matches Compound's - * interface, with the drawback of only supporting supply up to (2^96^ - 1). - * - * NOTE: You should use this contract if you need exact compatibility with COMP (for example in order to use your token - * with Governor Alpha or Bravo) and if you are sure the supply cap of 2^96^ is enough for you. Otherwise, use the - * {ERC20Votes} variant of this module. - * - * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either - * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting - * power can be queried through the public accessors {getCurrentVotes} and {getPriorVotes}. - * - * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it - * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked. - * - * _Available since v4.2._ - */ -abstract contract ERC20VotesCompUpgradeable is Initializable, ERC20VotesUpgradeable { - function __ERC20VotesComp_init() internal onlyInitializing { - } - - function __ERC20VotesComp_init_unchained() internal onlyInitializing { - } - /** - * @dev Comp version of the {getVotes} accessor, with `uint96` return type. - */ - function getCurrentVotes(address account) external view virtual returns (uint96) { - return SafeCastUpgradeable.toUint96(getVotes(account)); - } - - /** - * @dev Comp version of the {getPastVotes} accessor, with `uint96` return type. - */ - function getPriorVotes(address account, uint256 blockNumber) external view virtual returns (uint96) { - return SafeCastUpgradeable.toUint96(getPastVotes(account, blockNumber)); - } - - /** - * @dev Maximum token supply. Reduced to `type(uint96).max` (2^96^ - 1) to fit COMP interface. - */ - function _maxSupply() internal view virtual override returns (uint224) { - return type(uint96).max; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/ERC20VotesUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/ERC20VotesUpgradeable.sol deleted file mode 100644 index 220d5ba..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/ERC20VotesUpgradeable.sol +++ /dev/null @@ -1,293 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Votes.sol) - -pragma solidity ^0.8.0; - -import "./draft-ERC20PermitUpgradeable.sol"; -import "../../../utils/math/MathUpgradeable.sol"; -import "../../../governance/utils/IVotesUpgradeable.sol"; -import "../../../utils/math/SafeCastUpgradeable.sol"; -import "../../../utils/cryptography/ECDSAUpgradeable.sol"; -import "../../../proxy/utils/Initializable.sol"; - -/** - * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's, - * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1. - * - * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module. - * - * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either - * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting - * power can be queried through the public accessors {getVotes} and {getPastVotes}. - * - * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it - * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked. - * - * _Available since v4.2._ - */ -abstract contract ERC20VotesUpgradeable is Initializable, IVotesUpgradeable, ERC20PermitUpgradeable { - function __ERC20Votes_init() internal onlyInitializing { - } - - function __ERC20Votes_init_unchained() internal onlyInitializing { - } - struct Checkpoint { - uint32 fromBlock; - uint224 votes; - } - - bytes32 private constant _DELEGATION_TYPEHASH = - keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); - - mapping(address => address) private _delegates; - mapping(address => Checkpoint[]) private _checkpoints; - Checkpoint[] private _totalSupplyCheckpoints; - - /** - * @dev Get the `pos`-th checkpoint for `account`. - */ - function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) { - return _checkpoints[account][pos]; - } - - /** - * @dev Get number of checkpoints for `account`. - */ - function numCheckpoints(address account) public view virtual returns (uint32) { - return SafeCastUpgradeable.toUint32(_checkpoints[account].length); - } - - /** - * @dev Get the address `account` is currently delegating to. - */ - function delegates(address account) public view virtual override returns (address) { - return _delegates[account]; - } - - /** - * @dev Gets the current votes balance for `account` - */ - function getVotes(address account) public view virtual override returns (uint256) { - uint256 pos = _checkpoints[account].length; - unchecked { - return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes; - } - } - - /** - * @dev Retrieve the number of votes for `account` at the end of `blockNumber`. - * - * Requirements: - * - * - `blockNumber` must have been already mined - */ - function getPastVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) { - require(blockNumber < block.number, "ERC20Votes: block not yet mined"); - return _checkpointsLookup(_checkpoints[account], blockNumber); - } - - /** - * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances. - * It is NOT the sum of all the delegated votes! - * - * Requirements: - * - * - `blockNumber` must have been already mined - */ - function getPastTotalSupply(uint256 blockNumber) public view virtual override returns (uint256) { - require(blockNumber < block.number, "ERC20Votes: block not yet mined"); - return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber); - } - - /** - * @dev Lookup a value in a list of (sorted) checkpoints. - */ - function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) { - // We run a binary search to look for the earliest checkpoint taken after `blockNumber`. - // - // Initially we check if the block is recent to narrow the search range. - // During the loop, the index of the wanted checkpoint remains in the range [low-1, high). - // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant. - // - If the middle checkpoint is after `blockNumber`, we look in [low, mid) - // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high) - // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not - // out of bounds (in which case we're looking too far in the past and the result is 0). - // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is - // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out - // the same. - uint256 length = ckpts.length; - - uint256 low = 0; - uint256 high = length; - - if (length > 5) { - uint256 mid = length - MathUpgradeable.sqrt(length); - if (_unsafeAccess(ckpts, mid).fromBlock > blockNumber) { - high = mid; - } else { - low = mid + 1; - } - } - - while (low < high) { - uint256 mid = MathUpgradeable.average(low, high); - if (_unsafeAccess(ckpts, mid).fromBlock > blockNumber) { - high = mid; - } else { - low = mid + 1; - } - } - - unchecked { - return high == 0 ? 0 : _unsafeAccess(ckpts, high - 1).votes; - } - } - - /** - * @dev Delegate votes from the sender to `delegatee`. - */ - function delegate(address delegatee) public virtual override { - _delegate(_msgSender(), delegatee); - } - - /** - * @dev Delegates votes from signer to `delegatee` - */ - function delegateBySig( - address delegatee, - uint256 nonce, - uint256 expiry, - uint8 v, - bytes32 r, - bytes32 s - ) public virtual override { - require(block.timestamp <= expiry, "ERC20Votes: signature expired"); - address signer = ECDSAUpgradeable.recover( - _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))), - v, - r, - s - ); - require(nonce == _useNonce(signer), "ERC20Votes: invalid nonce"); - _delegate(signer, delegatee); - } - - /** - * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1). - */ - function _maxSupply() internal view virtual returns (uint224) { - return type(uint224).max; - } - - /** - * @dev Snapshots the totalSupply after it has been increased. - */ - function _mint(address account, uint256 amount) internal virtual override { - super._mint(account, amount); - require(totalSupply() <= _maxSupply(), "ERC20Votes: total supply risks overflowing votes"); - - _writeCheckpoint(_totalSupplyCheckpoints, _add, amount); - } - - /** - * @dev Snapshots the totalSupply after it has been decreased. - */ - function _burn(address account, uint256 amount) internal virtual override { - super._burn(account, amount); - - _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount); - } - - /** - * @dev Move voting power when tokens are transferred. - * - * Emits a {IVotes-DelegateVotesChanged} event. - */ - function _afterTokenTransfer( - address from, - address to, - uint256 amount - ) internal virtual override { - super._afterTokenTransfer(from, to, amount); - - _moveVotingPower(delegates(from), delegates(to), amount); - } - - /** - * @dev Change delegation for `delegator` to `delegatee`. - * - * Emits events {IVotes-DelegateChanged} and {IVotes-DelegateVotesChanged}. - */ - function _delegate(address delegator, address delegatee) internal virtual { - address currentDelegate = delegates(delegator); - uint256 delegatorBalance = balanceOf(delegator); - _delegates[delegator] = delegatee; - - emit DelegateChanged(delegator, currentDelegate, delegatee); - - _moveVotingPower(currentDelegate, delegatee, delegatorBalance); - } - - function _moveVotingPower( - address src, - address dst, - uint256 amount - ) private { - if (src != dst && amount > 0) { - if (src != address(0)) { - (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount); - emit DelegateVotesChanged(src, oldWeight, newWeight); - } - - if (dst != address(0)) { - (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount); - emit DelegateVotesChanged(dst, oldWeight, newWeight); - } - } - } - - function _writeCheckpoint( - Checkpoint[] storage ckpts, - function(uint256, uint256) view returns (uint256) op, - uint256 delta - ) private returns (uint256 oldWeight, uint256 newWeight) { - uint256 pos = ckpts.length; - - unchecked { - Checkpoint memory oldCkpt = pos == 0 ? Checkpoint(0, 0) : _unsafeAccess(ckpts, pos - 1); - - oldWeight = oldCkpt.votes; - newWeight = op(oldWeight, delta); - - if (pos > 0 && oldCkpt.fromBlock == block.number) { - _unsafeAccess(ckpts, pos - 1).votes = SafeCastUpgradeable.toUint224(newWeight); - } else { - ckpts.push( - Checkpoint({fromBlock: SafeCastUpgradeable.toUint32(block.number), votes: SafeCastUpgradeable.toUint224(newWeight)}) - ); - } - } - } - - function _add(uint256 a, uint256 b) private pure returns (uint256) { - return a + b; - } - - function _subtract(uint256 a, uint256 b) private pure returns (uint256) { - return a - b; - } - - function _unsafeAccess(Checkpoint[] storage ckpts, uint256 pos) private pure returns (Checkpoint storage result) { - assembly { - mstore(0, ckpts.slot) - result.slot := add(keccak256(0, 0x20), pos) - } - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[47] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/ERC20WrapperUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/ERC20WrapperUpgradeable.sol deleted file mode 100644 index 5088b94..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/ERC20WrapperUpgradeable.sol +++ /dev/null @@ -1,77 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/extensions/ERC20Wrapper.sol) - -pragma solidity ^0.8.0; - -import "../ERC20Upgradeable.sol"; -import "../utils/SafeERC20Upgradeable.sol"; -import "../../../proxy/utils/Initializable.sol"; - -/** - * @dev Extension of the ERC20 token contract to support token wrapping. - * - * Users can deposit and withdraw "underlying tokens" and receive a matching number of "wrapped tokens". This is useful - * in conjunction with other modules. For example, combining this wrapping mechanism with {ERC20Votes} will allow the - * wrapping of an existing "basic" ERC20 into a governance token. - * - * _Available since v4.2._ - * - * @custom:storage-size 51 - */ -abstract contract ERC20WrapperUpgradeable is Initializable, ERC20Upgradeable { - IERC20Upgradeable public underlying; - - function __ERC20Wrapper_init(IERC20Upgradeable underlyingToken) internal onlyInitializing { - __ERC20Wrapper_init_unchained(underlyingToken); - } - - function __ERC20Wrapper_init_unchained(IERC20Upgradeable underlyingToken) internal onlyInitializing { - underlying = underlyingToken; - } - - /** - * @dev See {ERC20-decimals}. - */ - function decimals() public view virtual override returns (uint8) { - try IERC20MetadataUpgradeable(address(underlying)).decimals() returns (uint8 value) { - return value; - } catch { - return super.decimals(); - } - } - - /** - * @dev Allow a user to deposit underlying tokens and mint the corresponding number of wrapped tokens. - */ - function depositFor(address account, uint256 amount) public virtual returns (bool) { - SafeERC20Upgradeable.safeTransferFrom(underlying, _msgSender(), address(this), amount); - _mint(account, amount); - return true; - } - - /** - * @dev Allow a user to burn a number of wrapped tokens and withdraw the corresponding number of underlying tokens. - */ - function withdrawTo(address account, uint256 amount) public virtual returns (bool) { - _burn(_msgSender(), amount); - SafeERC20Upgradeable.safeTransfer(underlying, account, amount); - return true; - } - - /** - * @dev Mint wrapped token to cover any underlyingTokens that would have been transferred by mistake. Internal - * function that can be exposed with access control if desired. - */ - function _recover(address account) internal virtual returns (uint256) { - uint256 value = underlying.balanceOf(address(this)) - totalSupply(); - _mint(account, value); - return value; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/ERC4626Upgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/ERC4626Upgradeable.sol deleted file mode 100644 index 2b4e6c1..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/ERC4626Upgradeable.sol +++ /dev/null @@ -1,285 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/extensions/ERC4626.sol) - -pragma solidity ^0.8.0; - -import "../ERC20Upgradeable.sol"; -import "../utils/SafeERC20Upgradeable.sol"; -import "../../../interfaces/IERC4626Upgradeable.sol"; -import "../../../utils/math/MathUpgradeable.sol"; -import "../../../proxy/utils/Initializable.sol"; - -/** - * @dev Implementation of the ERC4626 "Tokenized Vault Standard" as defined in - * https://eips.ethereum.org/EIPS/eip-4626[EIP-4626]. - * - * This extension allows the minting and burning of "shares" (represented using the ERC20 inheritance) in exchange for - * underlying "assets" through standardized {deposit}, {mint}, {redeem} and {burn} workflows. This contract extends - * the ERC20 standard. Any additional extensions included along it would affect the "shares" token represented by this - * contract and not the "assets" token which is an independent contract. - * - * CAUTION: Deposits and withdrawals may incur unexpected slippage. Users should verify that the amount received of - * shares or assets is as expected. EOAs should operate through a wrapper that performs these checks such as - * https://github.com/fei-protocol/ERC4626#erc4626router-and-base[ERC4626Router]. - * - * _Available since v4.7._ - */ -abstract contract ERC4626Upgradeable is Initializable, ERC20Upgradeable, IERC4626Upgradeable { - using MathUpgradeable for uint256; - - IERC20Upgradeable private _asset; - uint8 private _decimals; - - /** - * @dev Set the underlying asset contract. This must be an ERC20-compatible contract (ERC20 or ERC777). - */ - function __ERC4626_init(IERC20Upgradeable asset_) internal onlyInitializing { - __ERC4626_init_unchained(asset_); - } - - function __ERC4626_init_unchained(IERC20Upgradeable asset_) internal onlyInitializing { - (bool success, uint8 assetDecimals) = _tryGetAssetDecimals(asset_); - _decimals = success ? assetDecimals : super.decimals(); - _asset = asset_; - } - - /** - * @dev Attempts to fetch the asset decimals. A return value of false indicates that the attempt failed in some way. - */ - function _tryGetAssetDecimals(IERC20Upgradeable asset_) private returns (bool, uint8) { - (bool success, bytes memory encodedDecimals) = address(asset_).call( - abi.encodeWithSelector(IERC20MetadataUpgradeable.decimals.selector) - ); - if (success && encodedDecimals.length >= 32) { - uint256 returnedDecimals = abi.decode(encodedDecimals, (uint256)); - if (returnedDecimals <= type(uint8).max) { - return (true, uint8(returnedDecimals)); - } - } - return (false, 0); - } - - /** - * @dev Decimals are read from the underlying asset in the constructor and cached. If this fails (e.g., the asset - * has not been created yet), the cached value is set to a default obtained by `super.decimals()` (which depends on - * inheritance but is most likely 18). Override this function in order to set a guaranteed hardcoded value. - * See {IERC20Metadata-decimals}. - */ - function decimals() public view virtual override(IERC20MetadataUpgradeable, ERC20Upgradeable) returns (uint8) { - return _decimals; - } - - /** @dev See {IERC4626-asset}. */ - function asset() public view virtual override returns (address) { - return address(_asset); - } - - /** @dev See {IERC4626-totalAssets}. */ - function totalAssets() public view virtual override returns (uint256) { - return _asset.balanceOf(address(this)); - } - - /** @dev See {IERC4626-convertToShares}. */ - function convertToShares(uint256 assets) public view virtual override returns (uint256) { - return _convertToShares(assets, MathUpgradeable.Rounding.Down); - } - - /** @dev See {IERC4626-convertToAssets}. */ - function convertToAssets(uint256 shares) public view virtual override returns (uint256) { - return _convertToAssets(shares, MathUpgradeable.Rounding.Down); - } - - /** @dev See {IERC4626-maxDeposit}. */ - function maxDeposit(address) public view virtual override returns (uint256) { - return _isVaultHealthy() ? type(uint256).max : 0; - } - - /** @dev See {IERC4626-maxMint}. */ - function maxMint(address) public view virtual override returns (uint256) { - return type(uint256).max; - } - - /** @dev See {IERC4626-maxWithdraw}. */ - function maxWithdraw(address owner) public view virtual override returns (uint256) { - return _convertToAssets(balanceOf(owner), MathUpgradeable.Rounding.Down); - } - - /** @dev See {IERC4626-maxRedeem}. */ - function maxRedeem(address owner) public view virtual override returns (uint256) { - return balanceOf(owner); - } - - /** @dev See {IERC4626-previewDeposit}. */ - function previewDeposit(uint256 assets) public view virtual override returns (uint256) { - return _convertToShares(assets, MathUpgradeable.Rounding.Down); - } - - /** @dev See {IERC4626-previewMint}. */ - function previewMint(uint256 shares) public view virtual override returns (uint256) { - return _convertToAssets(shares, MathUpgradeable.Rounding.Up); - } - - /** @dev See {IERC4626-previewWithdraw}. */ - function previewWithdraw(uint256 assets) public view virtual override returns (uint256) { - return _convertToShares(assets, MathUpgradeable.Rounding.Up); - } - - /** @dev See {IERC4626-previewRedeem}. */ - function previewRedeem(uint256 shares) public view virtual override returns (uint256) { - return _convertToAssets(shares, MathUpgradeable.Rounding.Down); - } - - /** @dev See {IERC4626-deposit}. */ - function deposit(uint256 assets, address receiver) public virtual override returns (uint256) { - require(assets <= maxDeposit(receiver), "ERC4626: deposit more than max"); - - uint256 shares = previewDeposit(assets); - _deposit(_msgSender(), receiver, assets, shares); - - return shares; - } - - /** @dev See {IERC4626-mint}. */ - function mint(uint256 shares, address receiver) public virtual override returns (uint256) { - require(shares <= maxMint(receiver), "ERC4626: mint more than max"); - - uint256 assets = previewMint(shares); - _deposit(_msgSender(), receiver, assets, shares); - - return assets; - } - - /** @dev See {IERC4626-withdraw}. */ - function withdraw( - uint256 assets, - address receiver, - address owner - ) public virtual override returns (uint256) { - require(assets <= maxWithdraw(owner), "ERC4626: withdraw more than max"); - - uint256 shares = previewWithdraw(assets); - _withdraw(_msgSender(), receiver, owner, assets, shares); - - return shares; - } - - /** @dev See {IERC4626-redeem}. */ - function redeem( - uint256 shares, - address receiver, - address owner - ) public virtual override returns (uint256) { - require(shares <= maxRedeem(owner), "ERC4626: redeem more than max"); - - uint256 assets = previewRedeem(shares); - _withdraw(_msgSender(), receiver, owner, assets, shares); - - return assets; - } - - /** - * @dev Internal conversion function (from assets to shares) with support for rounding direction. - * - * Will revert if assets > 0, totalSupply > 0 and totalAssets = 0. That corresponds to a case where any asset - * would represent an infinite amount of shares. - */ - function _convertToShares(uint256 assets, MathUpgradeable.Rounding rounding) internal view virtual returns (uint256) { - uint256 supply = totalSupply(); - return - (assets == 0 || supply == 0) - ? _initialConvertToShares(assets, rounding) - : assets.mulDiv(supply, totalAssets(), rounding); - } - - /** - * @dev Internal conversion function (from assets to shares) to apply when the vault is empty. - * - * NOTE: Make sure to keep this function consistent with {_initialConvertToAssets} when overriding it. - */ - function _initialConvertToShares( - uint256 assets, - MathUpgradeable.Rounding /*rounding*/ - ) internal view virtual returns (uint256 shares) { - return assets; - } - - /** - * @dev Internal conversion function (from shares to assets) with support for rounding direction. - */ - function _convertToAssets(uint256 shares, MathUpgradeable.Rounding rounding) internal view virtual returns (uint256) { - uint256 supply = totalSupply(); - return - (supply == 0) ? _initialConvertToAssets(shares, rounding) : shares.mulDiv(totalAssets(), supply, rounding); - } - - /** - * @dev Internal conversion function (from shares to assets) to apply when the vault is empty. - * - * NOTE: Make sure to keep this function consistent with {_initialConvertToShares} when overriding it. - */ - function _initialConvertToAssets( - uint256 shares, - MathUpgradeable.Rounding /*rounding*/ - ) internal view virtual returns (uint256) { - return shares; - } - - /** - * @dev Deposit/mint common workflow. - */ - function _deposit( - address caller, - address receiver, - uint256 assets, - uint256 shares - ) internal virtual { - // If _asset is ERC777, `transferFrom` can trigger a reenterancy BEFORE the transfer happens through the - // `tokensToSend` hook. On the other hand, the `tokenReceived` hook, that is triggered after the transfer, - // calls the vault, which is assumed not malicious. - // - // Conclusion: we need to do the transfer before we mint so that any reentrancy would happen before the - // assets are transferred and before the shares are minted, which is a valid state. - // slither-disable-next-line reentrancy-no-eth - SafeERC20Upgradeable.safeTransferFrom(_asset, caller, address(this), assets); - _mint(receiver, shares); - - emit Deposit(caller, receiver, assets, shares); - } - - /** - * @dev Withdraw/redeem common workflow. - */ - function _withdraw( - address caller, - address receiver, - address owner, - uint256 assets, - uint256 shares - ) internal virtual { - if (caller != owner) { - _spendAllowance(owner, caller, shares); - } - - // If _asset is ERC777, `transfer` can trigger a reentrancy AFTER the transfer happens through the - // `tokensReceived` hook. On the other hand, the `tokensToSend` hook, that is triggered before the transfer, - // calls the vault, which is assumed not malicious. - // - // Conclusion: we need to do the transfer after the burn so that any reentrancy would happen after the - // shares are burned and after the assets are transferred, which is a valid state. - _burn(owner, shares); - SafeERC20Upgradeable.safeTransfer(_asset, receiver, assets); - - emit Withdraw(caller, receiver, owner, assets, shares); - } - - function _isVaultHealthy() private view returns (bool) { - return totalAssets() > 0 || totalSupply() == 0; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/IERC20MetadataUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/IERC20MetadataUpgradeable.sol deleted file mode 100644 index 381d8ea..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/IERC20MetadataUpgradeable.sol +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) - -pragma solidity ^0.8.0; - -import "../IERC20Upgradeable.sol"; - -/** - * @dev Interface for the optional metadata functions from the ERC20 standard. - * - * _Available since v4.1._ - */ -interface IERC20MetadataUpgradeable is IERC20Upgradeable { - /** - * @dev Returns the name of the token. - */ - function name() external view returns (string memory); - - /** - * @dev Returns the symbol of the token. - */ - function symbol() external view returns (string memory); - - /** - * @dev Returns the decimals places of the token. - */ - function decimals() external view returns (uint8); -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/draft-ERC20PermitUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/draft-ERC20PermitUpgradeable.sol deleted file mode 100644 index 19b1b0b..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/draft-ERC20PermitUpgradeable.sol +++ /dev/null @@ -1,109 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/extensions/draft-ERC20Permit.sol) - -pragma solidity ^0.8.0; - -import "./draft-IERC20PermitUpgradeable.sol"; -import "../ERC20Upgradeable.sol"; -import "../../../utils/cryptography/ECDSAUpgradeable.sol"; -import "../../../utils/cryptography/EIP712Upgradeable.sol"; -import "../../../utils/CountersUpgradeable.sol"; -import "../../../proxy/utils/Initializable.sol"; - -/** - * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in - * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. - * - * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by - * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't - * need to send a transaction, and thus is not required to hold Ether at all. - * - * _Available since v3.4._ - * - * @custom:storage-size 51 - */ -abstract contract ERC20PermitUpgradeable is Initializable, ERC20Upgradeable, IERC20PermitUpgradeable, EIP712Upgradeable { - using CountersUpgradeable for CountersUpgradeable.Counter; - - mapping(address => CountersUpgradeable.Counter) private _nonces; - - // solhint-disable-next-line var-name-mixedcase - bytes32 private constant _PERMIT_TYPEHASH = - keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); - /** - * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`. - * However, to ensure consistency with the upgradeable transpiler, we will continue - * to reserve a slot. - * @custom:oz-renamed-from _PERMIT_TYPEHASH - */ - // solhint-disable-next-line var-name-mixedcase - bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT; - - /** - * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`. - * - * It's a good idea to use the same `name` that is defined as the ERC20 token name. - */ - function __ERC20Permit_init(string memory name) internal onlyInitializing { - __EIP712_init_unchained(name, "1"); - } - - function __ERC20Permit_init_unchained(string memory) internal onlyInitializing {} - - /** - * @dev See {IERC20Permit-permit}. - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) public virtual override { - require(block.timestamp <= deadline, "ERC20Permit: expired deadline"); - - bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline)); - - bytes32 hash = _hashTypedDataV4(structHash); - - address signer = ECDSAUpgradeable.recover(hash, v, r, s); - require(signer == owner, "ERC20Permit: invalid signature"); - - _approve(owner, spender, value); - } - - /** - * @dev See {IERC20Permit-nonces}. - */ - function nonces(address owner) public view virtual override returns (uint256) { - return _nonces[owner].current(); - } - - /** - * @dev See {IERC20Permit-DOMAIN_SEPARATOR}. - */ - // solhint-disable-next-line func-name-mixedcase - function DOMAIN_SEPARATOR() external view override returns (bytes32) { - return _domainSeparatorV4(); - } - - /** - * @dev "Consume a nonce": return the current value and increment. - * - * _Available since v4.1._ - */ - function _useNonce(address owner) internal virtual returns (uint256 current) { - CountersUpgradeable.Counter storage nonce = _nonces[owner]; - current = nonce.current(); - nonce.increment(); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/draft-IERC20PermitUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/draft-IERC20PermitUpgradeable.sol deleted file mode 100644 index bd57513..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/extensions/draft-IERC20PermitUpgradeable.sol +++ /dev/null @@ -1,60 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in - * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. - * - * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by - * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't - * need to send a transaction, and thus is not required to hold Ether at all. - */ -interface IERC20PermitUpgradeable { - /** - * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, - * given ``owner``'s signed approval. - * - * IMPORTANT: The same issues {IERC20-approve} has related to transaction - * ordering also apply here. - * - * Emits an {Approval} event. - * - * Requirements: - * - * - `spender` cannot be the zero address. - * - `deadline` must be a timestamp in the future. - * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` - * over the EIP712-formatted function arguments. - * - the signature must use ``owner``'s current nonce (see {nonces}). - * - * For more information on the signature format, see the - * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP - * section]. - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @dev Returns the current nonce for `owner`. This value must be - * included whenever a signature is generated for {permit}. - * - * Every successful call to {permit} increases ``owner``'s nonce by one. This - * prevents a signature from being used multiple times. - */ - function nonces(address owner) external view returns (uint256); - - /** - * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. - */ - // solhint-disable-next-line func-name-mixedcase - function DOMAIN_SEPARATOR() external view returns (bytes32); -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/presets/ERC20PresetFixedSupplyUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/presets/ERC20PresetFixedSupplyUpgradeable.sol deleted file mode 100644 index 6ac231a..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/presets/ERC20PresetFixedSupplyUpgradeable.sol +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/presets/ERC20PresetFixedSupply.sol) -pragma solidity ^0.8.0; - -import "../extensions/ERC20BurnableUpgradeable.sol"; -import "../../../proxy/utils/Initializable.sol"; - -/** - * @dev {ERC20} token, including: - * - * - Preminted initial supply - * - Ability for holders to burn (destroy) their tokens - * - No access control mechanism (for minting/pausing) and hence no governance - * - * This contract uses {ERC20Burnable} to include burn capabilities - head to - * its documentation for details. - * - * _Available since v3.4._ - * - * _Deprecated in favor of https://wizard.openzeppelin.com/[Contracts Wizard]._ - */ -contract ERC20PresetFixedSupplyUpgradeable is Initializable, ERC20BurnableUpgradeable { - function initialize( - string memory name, - string memory symbol, - uint256 initialSupply, - address owner - ) public virtual initializer { - __ERC20PresetFixedSupply_init(name, symbol, initialSupply, owner); - } - /** - * @dev Mints `initialSupply` amount of token and transfers them to `owner`. - * - * See {ERC20-constructor}. - */ - function __ERC20PresetFixedSupply_init( - string memory name, - string memory symbol, - uint256 initialSupply, - address owner - ) internal onlyInitializing { - __ERC20_init_unchained(name, symbol); - __ERC20PresetFixedSupply_init_unchained(name, symbol, initialSupply, owner); - } - - function __ERC20PresetFixedSupply_init_unchained( - string memory, - string memory, - uint256 initialSupply, - address owner - ) internal onlyInitializing { - _mint(owner, initialSupply); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/presets/ERC20PresetMinterPauserUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/presets/ERC20PresetMinterPauserUpgradeable.sol deleted file mode 100644 index dc481b8..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/presets/ERC20PresetMinterPauserUpgradeable.sol +++ /dev/null @@ -1,111 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/presets/ERC20PresetMinterPauser.sol) - -pragma solidity ^0.8.0; - -import "../ERC20Upgradeable.sol"; -import "../extensions/ERC20BurnableUpgradeable.sol"; -import "../extensions/ERC20PausableUpgradeable.sol"; -import "../../../access/AccessControlEnumerableUpgradeable.sol"; -import "../../../utils/ContextUpgradeable.sol"; -import "../../../proxy/utils/Initializable.sol"; - -/** - * @dev {ERC20} token, including: - * - * - ability for holders to burn (destroy) their tokens - * - a minter role that allows for token minting (creation) - * - a pauser role that allows to stop all token transfers - * - * This contract uses {AccessControl} to lock permissioned functions using the - * different roles - head to its documentation for details. - * - * The account that deploys the contract will be granted the minter and pauser - * roles, as well as the default admin role, which will let it grant both minter - * and pauser roles to other accounts. - * - * _Deprecated in favor of https://wizard.openzeppelin.com/[Contracts Wizard]._ - */ -contract ERC20PresetMinterPauserUpgradeable is Initializable, ContextUpgradeable, AccessControlEnumerableUpgradeable, ERC20BurnableUpgradeable, ERC20PausableUpgradeable { - function initialize(string memory name, string memory symbol) public virtual initializer { - __ERC20PresetMinterPauser_init(name, symbol); - } - bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); - bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); - - /** - * @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE` and `PAUSER_ROLE` to the - * account that deploys the contract. - * - * See {ERC20-constructor}. - */ - function __ERC20PresetMinterPauser_init(string memory name, string memory symbol) internal onlyInitializing { - __ERC20_init_unchained(name, symbol); - __Pausable_init_unchained(); - __ERC20PresetMinterPauser_init_unchained(name, symbol); - } - - function __ERC20PresetMinterPauser_init_unchained(string memory, string memory) internal onlyInitializing { - _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); - - _setupRole(MINTER_ROLE, _msgSender()); - _setupRole(PAUSER_ROLE, _msgSender()); - } - - /** - * @dev Creates `amount` new tokens for `to`. - * - * See {ERC20-_mint}. - * - * Requirements: - * - * - the caller must have the `MINTER_ROLE`. - */ - function mint(address to, uint256 amount) public virtual { - require(hasRole(MINTER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have minter role to mint"); - _mint(to, amount); - } - - /** - * @dev Pauses all token transfers. - * - * See {ERC20Pausable} and {Pausable-_pause}. - * - * Requirements: - * - * - the caller must have the `PAUSER_ROLE`. - */ - function pause() public virtual { - require(hasRole(PAUSER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have pauser role to pause"); - _pause(); - } - - /** - * @dev Unpauses all token transfers. - * - * See {ERC20Pausable} and {Pausable-_unpause}. - * - * Requirements: - * - * - the caller must have the `PAUSER_ROLE`. - */ - function unpause() public virtual { - require(hasRole(PAUSER_ROLE, _msgSender()), "ERC20PresetMinterPauser: must have pauser role to unpause"); - _unpause(); - } - - function _beforeTokenTransfer( - address from, - address to, - uint256 amount - ) internal virtual override(ERC20Upgradeable, ERC20PausableUpgradeable) { - super._beforeTokenTransfer(from, to, amount); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/presets/README.md b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/presets/README.md deleted file mode 100644 index 468200b..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/presets/README.md +++ /dev/null @@ -1 +0,0 @@ -Contract presets are now deprecated in favor of [Contracts Wizard](https://wizard.openzeppelin.com/) as a more powerful alternative. diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/utils/SafeERC20Upgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/utils/SafeERC20Upgradeable.sol deleted file mode 100644 index 52f3b98..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/utils/SafeERC20Upgradeable.sol +++ /dev/null @@ -1,116 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol) - -pragma solidity ^0.8.0; - -import "../IERC20Upgradeable.sol"; -import "../extensions/draft-IERC20PermitUpgradeable.sol"; -import "../../../utils/AddressUpgradeable.sol"; - -/** - * @title SafeERC20 - * @dev Wrappers around ERC20 operations that throw on failure (when the token - * contract returns false). Tokens that return no value (and instead revert or - * throw on failure) are also supported, non-reverting calls are assumed to be - * successful. - * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, - * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. - */ -library SafeERC20Upgradeable { - using AddressUpgradeable for address; - - function safeTransfer( - IERC20Upgradeable token, - address to, - uint256 value - ) internal { - _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); - } - - function safeTransferFrom( - IERC20Upgradeable token, - address from, - address to, - uint256 value - ) internal { - _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); - } - - /** - * @dev Deprecated. This function has issues similar to the ones found in - * {IERC20-approve}, and its usage is discouraged. - * - * Whenever possible, use {safeIncreaseAllowance} and - * {safeDecreaseAllowance} instead. - */ - function safeApprove( - IERC20Upgradeable token, - address spender, - uint256 value - ) internal { - // safeApprove should only be called when setting an initial allowance, - // or when resetting it to zero. To increase and decrease it, use - // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' - require( - (value == 0) || (token.allowance(address(this), spender) == 0), - "SafeERC20: approve from non-zero to non-zero allowance" - ); - _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); - } - - function safeIncreaseAllowance( - IERC20Upgradeable token, - address spender, - uint256 value - ) internal { - uint256 newAllowance = token.allowance(address(this), spender) + value; - _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); - } - - function safeDecreaseAllowance( - IERC20Upgradeable token, - address spender, - uint256 value - ) internal { - unchecked { - uint256 oldAllowance = token.allowance(address(this), spender); - require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); - uint256 newAllowance = oldAllowance - value; - _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); - } - } - - function safePermit( - IERC20PermitUpgradeable token, - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) internal { - uint256 nonceBefore = token.nonces(owner); - token.permit(owner, spender, value, deadline, v, r, s); - uint256 nonceAfter = token.nonces(owner); - require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); - } - - /** - * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement - * on the return value: the return value is optional (but if data is returned, it must not be false). - * @param token The token targeted by the call. - * @param data The call data (encoded using abi.encode or one of its variants). - */ - function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private { - // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since - // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that - // the target address contains contract code and also asserts for success in the low-level call. - - bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); - if (returndata.length > 0) { - // Return data is optional - require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); - } - } -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/utils/TokenTimelockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/utils/TokenTimelockUpgradeable.sol deleted file mode 100644 index ed55f68..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC20/utils/TokenTimelockUpgradeable.sol +++ /dev/null @@ -1,94 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/utils/TokenTimelock.sol) - -pragma solidity ^0.8.0; - -import "./SafeERC20Upgradeable.sol"; -import "../../../proxy/utils/Initializable.sol"; - -/** - * @dev A token holder contract that will allow a beneficiary to extract the - * tokens after a given release time. - * - * Useful for simple vesting schedules like "advisors get all of their tokens - * after 1 year". - * - * @custom:storage-size 53 - */ -contract TokenTimelockUpgradeable is Initializable { - using SafeERC20Upgradeable for IERC20Upgradeable; - - // ERC20 basic token contract being held - IERC20Upgradeable private _token; - - // beneficiary of tokens after they are released - address private _beneficiary; - - // timestamp when token release is enabled - uint256 private _releaseTime; - - /** - * @dev Deploys a timelock instance that is able to hold the token specified, and will only release it to - * `beneficiary_` when {release} is invoked after `releaseTime_`. The release time is specified as a Unix timestamp - * (in seconds). - */ - function __TokenTimelock_init( - IERC20Upgradeable token_, - address beneficiary_, - uint256 releaseTime_ - ) internal onlyInitializing { - __TokenTimelock_init_unchained(token_, beneficiary_, releaseTime_); - } - - function __TokenTimelock_init_unchained( - IERC20Upgradeable token_, - address beneficiary_, - uint256 releaseTime_ - ) internal onlyInitializing { - require(releaseTime_ > block.timestamp, "TokenTimelock: release time is before current time"); - _token = token_; - _beneficiary = beneficiary_; - _releaseTime = releaseTime_; - } - - /** - * @dev Returns the token being held. - */ - function token() public view virtual returns (IERC20Upgradeable) { - return _token; - } - - /** - * @dev Returns the beneficiary that will receive the tokens. - */ - function beneficiary() public view virtual returns (address) { - return _beneficiary; - } - - /** - * @dev Returns the time when the tokens are released in seconds since Unix epoch (i.e. Unix timestamp). - */ - function releaseTime() public view virtual returns (uint256) { - return _releaseTime; - } - - /** - * @dev Transfers tokens held by the timelock to the beneficiary. Will only succeed if invoked after the release - * time. - */ - function release() public virtual { - require(block.timestamp >= releaseTime(), "TokenTimelock: current time is before release time"); - - uint256 amount = token().balanceOf(address(this)); - require(amount > 0, "TokenTimelock: no tokens to release"); - - token().safeTransfer(beneficiary(), amount); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/ERC721Upgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/ERC721Upgradeable.sol deleted file mode 100644 index 38e6588..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/ERC721Upgradeable.sol +++ /dev/null @@ -1,515 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol) - -pragma solidity ^0.8.0; - -import "./IERC721Upgradeable.sol"; -import "./IERC721ReceiverUpgradeable.sol"; -import "./extensions/IERC721MetadataUpgradeable.sol"; -import "../../utils/AddressUpgradeable.sol"; -import "../../utils/ContextUpgradeable.sol"; -import "../../utils/StringsUpgradeable.sol"; -import "../../utils/introspection/ERC165Upgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -/** - * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including - * the Metadata extension, but not including the Enumerable extension, which is available separately as - * {ERC721Enumerable}. - */ -contract ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable { - using AddressUpgradeable for address; - using StringsUpgradeable for uint256; - - // Token name - string private _name; - - // Token symbol - string private _symbol; - - // Mapping from token ID to owner address - mapping(uint256 => address) private _owners; - - // Mapping owner address to token count - mapping(address => uint256) private _balances; - - // Mapping from token ID to approved address - mapping(uint256 => address) private _tokenApprovals; - - // Mapping from owner to operator approvals - mapping(address => mapping(address => bool)) private _operatorApprovals; - - /** - * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. - */ - function __ERC721_init(string memory name_, string memory symbol_) internal onlyInitializing { - __ERC721_init_unchained(name_, symbol_); - } - - function __ERC721_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing { - _name = name_; - _symbol = symbol_; - } - - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) { - return - interfaceId == type(IERC721Upgradeable).interfaceId || - interfaceId == type(IERC721MetadataUpgradeable).interfaceId || - super.supportsInterface(interfaceId); - } - - /** - * @dev See {IERC721-balanceOf}. - */ - function balanceOf(address owner) public view virtual override returns (uint256) { - require(owner != address(0), "ERC721: address zero is not a valid owner"); - return _balances[owner]; - } - - /** - * @dev See {IERC721-ownerOf}. - */ - function ownerOf(uint256 tokenId) public view virtual override returns (address) { - address owner = _ownerOf(tokenId); - require(owner != address(0), "ERC721: invalid token ID"); - return owner; - } - - /** - * @dev See {IERC721Metadata-name}. - */ - function name() public view virtual override returns (string memory) { - return _name; - } - - /** - * @dev See {IERC721Metadata-symbol}. - */ - function symbol() public view virtual override returns (string memory) { - return _symbol; - } - - /** - * @dev See {IERC721Metadata-tokenURI}. - */ - function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { - _requireMinted(tokenId); - - string memory baseURI = _baseURI(); - return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; - } - - /** - * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each - * token will be the concatenation of the `baseURI` and the `tokenId`. Empty - * by default, can be overridden in child contracts. - */ - function _baseURI() internal view virtual returns (string memory) { - return ""; - } - - /** - * @dev See {IERC721-approve}. - */ - function approve(address to, uint256 tokenId) public virtual override { - address owner = ERC721Upgradeable.ownerOf(tokenId); - require(to != owner, "ERC721: approval to current owner"); - - require( - _msgSender() == owner || isApprovedForAll(owner, _msgSender()), - "ERC721: approve caller is not token owner or approved for all" - ); - - _approve(to, tokenId); - } - - /** - * @dev See {IERC721-getApproved}. - */ - function getApproved(uint256 tokenId) public view virtual override returns (address) { - _requireMinted(tokenId); - - return _tokenApprovals[tokenId]; - } - - /** - * @dev See {IERC721-setApprovalForAll}. - */ - function setApprovalForAll(address operator, bool approved) public virtual override { - _setApprovalForAll(_msgSender(), operator, approved); - } - - /** - * @dev See {IERC721-isApprovedForAll}. - */ - function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { - return _operatorApprovals[owner][operator]; - } - - /** - * @dev See {IERC721-transferFrom}. - */ - function transferFrom( - address from, - address to, - uint256 tokenId - ) public virtual override { - //solhint-disable-next-line max-line-length - require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); - - _transfer(from, to, tokenId); - } - - /** - * @dev See {IERC721-safeTransferFrom}. - */ - function safeTransferFrom( - address from, - address to, - uint256 tokenId - ) public virtual override { - safeTransferFrom(from, to, tokenId, ""); - } - - /** - * @dev See {IERC721-safeTransferFrom}. - */ - function safeTransferFrom( - address from, - address to, - uint256 tokenId, - bytes memory data - ) public virtual override { - require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); - _safeTransfer(from, to, tokenId, data); - } - - /** - * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients - * are aware of the ERC721 protocol to prevent tokens from being forever locked. - * - * `data` is additional data, it has no specified format and it is sent in call to `to`. - * - * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. - * implement alternative mechanisms to perform token transfer, such as signature-based. - * - * Requirements: - * - * - `from` cannot be the zero address. - * - `to` cannot be the zero address. - * - `tokenId` token must exist and be owned by `from`. - * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. - * - * Emits a {Transfer} event. - */ - function _safeTransfer( - address from, - address to, - uint256 tokenId, - bytes memory data - ) internal virtual { - _transfer(from, to, tokenId); - require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); - } - - /** - * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist - */ - function _ownerOf(uint256 tokenId) internal view virtual returns (address) { - return _owners[tokenId]; - } - - /** - * @dev Returns whether `tokenId` exists. - * - * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. - * - * Tokens start existing when they are minted (`_mint`), - * and stop existing when they are burned (`_burn`). - */ - function _exists(uint256 tokenId) internal view virtual returns (bool) { - return _ownerOf(tokenId) != address(0); - } - - /** - * @dev Returns whether `spender` is allowed to manage `tokenId`. - * - * Requirements: - * - * - `tokenId` must exist. - */ - function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { - address owner = ERC721Upgradeable.ownerOf(tokenId); - return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); - } - - /** - * @dev Safely mints `tokenId` and transfers it to `to`. - * - * Requirements: - * - * - `tokenId` must not exist. - * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. - * - * Emits a {Transfer} event. - */ - function _safeMint(address to, uint256 tokenId) internal virtual { - _safeMint(to, tokenId, ""); - } - - /** - * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is - * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. - */ - function _safeMint( - address to, - uint256 tokenId, - bytes memory data - ) internal virtual { - _mint(to, tokenId); - require( - _checkOnERC721Received(address(0), to, tokenId, data), - "ERC721: transfer to non ERC721Receiver implementer" - ); - } - - /** - * @dev Mints `tokenId` and transfers it to `to`. - * - * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible - * - * Requirements: - * - * - `tokenId` must not exist. - * - `to` cannot be the zero address. - * - * Emits a {Transfer} event. - */ - function _mint(address to, uint256 tokenId) internal virtual { - require(to != address(0), "ERC721: mint to the zero address"); - require(!_exists(tokenId), "ERC721: token already minted"); - - _beforeTokenTransfer(address(0), to, tokenId, 1); - - // Check that tokenId was not minted by `_beforeTokenTransfer` hook - require(!_exists(tokenId), "ERC721: token already minted"); - - unchecked { - // Will not overflow unless all 2**256 token ids are minted to the same owner. - // Given that tokens are minted one by one, it is impossible in practice that - // this ever happens. Might change if we allow batch minting. - // The ERC fails to describe this case. - _balances[to] += 1; - } - - _owners[tokenId] = to; - - emit Transfer(address(0), to, tokenId); - - _afterTokenTransfer(address(0), to, tokenId, 1); - } - - /** - * @dev Destroys `tokenId`. - * The approval is cleared when the token is burned. - * This is an internal function that does not check if the sender is authorized to operate on the token. - * - * Requirements: - * - * - `tokenId` must exist. - * - * Emits a {Transfer} event. - */ - function _burn(uint256 tokenId) internal virtual { - address owner = ERC721Upgradeable.ownerOf(tokenId); - - _beforeTokenTransfer(owner, address(0), tokenId, 1); - - // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook - owner = ERC721Upgradeable.ownerOf(tokenId); - - // Clear approvals - delete _tokenApprovals[tokenId]; - - unchecked { - // Cannot overflow, as that would require more tokens to be burned/transferred - // out than the owner initially received through minting and transferring in. - _balances[owner] -= 1; - } - delete _owners[tokenId]; - - emit Transfer(owner, address(0), tokenId); - - _afterTokenTransfer(owner, address(0), tokenId, 1); - } - - /** - * @dev Transfers `tokenId` from `from` to `to`. - * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. - * - * Requirements: - * - * - `to` cannot be the zero address. - * - `tokenId` token must be owned by `from`. - * - * Emits a {Transfer} event. - */ - function _transfer( - address from, - address to, - uint256 tokenId - ) internal virtual { - require(ERC721Upgradeable.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); - require(to != address(0), "ERC721: transfer to the zero address"); - - _beforeTokenTransfer(from, to, tokenId, 1); - - // Check that tokenId was not transferred by `_beforeTokenTransfer` hook - require(ERC721Upgradeable.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); - - // Clear approvals from the previous owner - delete _tokenApprovals[tokenId]; - - unchecked { - // `_balances[from]` cannot overflow for the same reason as described in `_burn`: - // `from`'s balance is the number of token held, which is at least one before the current - // transfer. - // `_balances[to]` could overflow in the conditions described in `_mint`. That would require - // all 2**256 token ids to be minted, which in practice is impossible. - _balances[from] -= 1; - _balances[to] += 1; - } - _owners[tokenId] = to; - - emit Transfer(from, to, tokenId); - - _afterTokenTransfer(from, to, tokenId, 1); - } - - /** - * @dev Approve `to` to operate on `tokenId` - * - * Emits an {Approval} event. - */ - function _approve(address to, uint256 tokenId) internal virtual { - _tokenApprovals[tokenId] = to; - emit Approval(ERC721Upgradeable.ownerOf(tokenId), to, tokenId); - } - - /** - * @dev Approve `operator` to operate on all of `owner` tokens - * - * Emits an {ApprovalForAll} event. - */ - function _setApprovalForAll( - address owner, - address operator, - bool approved - ) internal virtual { - require(owner != operator, "ERC721: approve to caller"); - _operatorApprovals[owner][operator] = approved; - emit ApprovalForAll(owner, operator, approved); - } - - /** - * @dev Reverts if the `tokenId` has not been minted yet. - */ - function _requireMinted(uint256 tokenId) internal view virtual { - require(_exists(tokenId), "ERC721: invalid token ID"); - } - - /** - * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. - * The call is not executed if the target address is not a contract. - * - * @param from address representing the previous owner of the given token ID - * @param to target address that will receive the tokens - * @param tokenId uint256 ID of the token to be transferred - * @param data bytes optional data to send along with the call - * @return bool whether the call correctly returned the expected magic value - */ - function _checkOnERC721Received( - address from, - address to, - uint256 tokenId, - bytes memory data - ) private returns (bool) { - if (to.isContract()) { - try IERC721ReceiverUpgradeable(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { - return retval == IERC721ReceiverUpgradeable.onERC721Received.selector; - } catch (bytes memory reason) { - if (reason.length == 0) { - revert("ERC721: transfer to non ERC721Receiver implementer"); - } else { - /// @solidity memory-safe-assembly - assembly { - revert(add(32, reason), mload(reason)) - } - } - } - } else { - return true; - } - } - - /** - * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is - * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. - * - * Calling conditions: - * - * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. - * - When `from` is zero, the tokens will be minted for `to`. - * - When `to` is zero, ``from``'s tokens will be burned. - * - `from` and `to` are never both zero. - * - `batchSize` is non-zero. - * - * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. - */ - function _beforeTokenTransfer( - address from, - address to, - uint256, /* firstTokenId */ - uint256 batchSize - ) internal virtual { - if (batchSize > 1) { - if (from != address(0)) { - _balances[from] -= batchSize; - } - if (to != address(0)) { - _balances[to] += batchSize; - } - } - } - - /** - * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is - * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. - * - * Calling conditions: - * - * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. - * - When `from` is zero, the tokens were minted for `to`. - * - When `to` is zero, ``from``'s tokens were burned. - * - `from` and `to` are never both zero. - * - `batchSize` is non-zero. - * - * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. - */ - function _afterTokenTransfer( - address from, - address to, - uint256 firstTokenId, - uint256 batchSize - ) internal virtual {} - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[44] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/IERC721ReceiverUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/IERC721ReceiverUpgradeable.sol deleted file mode 100644 index c832817..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/IERC721ReceiverUpgradeable.sol +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) - -pragma solidity ^0.8.0; - -/** - * @title ERC721 token receiver interface - * @dev Interface for any contract that wants to support safeTransfers - * from ERC721 asset contracts. - */ -interface IERC721ReceiverUpgradeable { - /** - * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} - * by `operator` from `from`, this function is called. - * - * It must return its Solidity selector to confirm the token transfer. - * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. - * - * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. - */ - function onERC721Received( - address operator, - address from, - uint256 tokenId, - bytes calldata data - ) external returns (bytes4); -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/IERC721Upgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/IERC721Upgradeable.sol deleted file mode 100644 index 362a5ae..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/IERC721Upgradeable.sol +++ /dev/null @@ -1,145 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) - -pragma solidity ^0.8.0; - -import "../../utils/introspection/IERC165Upgradeable.sol"; - -/** - * @dev Required interface of an ERC721 compliant contract. - */ -interface IERC721Upgradeable is IERC165Upgradeable { - /** - * @dev Emitted when `tokenId` token is transferred from `from` to `to`. - */ - event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); - - /** - * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. - */ - event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); - - /** - * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. - */ - event ApprovalForAll(address indexed owner, address indexed operator, bool approved); - - /** - * @dev Returns the number of tokens in ``owner``'s account. - */ - function balanceOf(address owner) external view returns (uint256 balance); - - /** - * @dev Returns the owner of the `tokenId` token. - * - * Requirements: - * - * - `tokenId` must exist. - */ - function ownerOf(uint256 tokenId) external view returns (address owner); - - /** - * @dev Safely transfers `tokenId` token from `from` to `to`. - * - * Requirements: - * - * - `from` cannot be the zero address. - * - `to` cannot be the zero address. - * - `tokenId` token must exist and be owned by `from`. - * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. - * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. - * - * Emits a {Transfer} event. - */ - function safeTransferFrom( - address from, - address to, - uint256 tokenId, - bytes calldata data - ) external; - - /** - * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients - * are aware of the ERC721 protocol to prevent tokens from being forever locked. - * - * Requirements: - * - * - `from` cannot be the zero address. - * - `to` cannot be the zero address. - * - `tokenId` token must exist and be owned by `from`. - * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. - * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. - * - * Emits a {Transfer} event. - */ - function safeTransferFrom( - address from, - address to, - uint256 tokenId - ) external; - - /** - * @dev Transfers `tokenId` token from `from` to `to`. - * - * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 - * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must - * understand this adds an external call which potentially creates a reentrancy vulnerability. - * - * Requirements: - * - * - `from` cannot be the zero address. - * - `to` cannot be the zero address. - * - `tokenId` token must be owned by `from`. - * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. - * - * Emits a {Transfer} event. - */ - function transferFrom( - address from, - address to, - uint256 tokenId - ) external; - - /** - * @dev Gives permission to `to` to transfer `tokenId` token to another account. - * The approval is cleared when the token is transferred. - * - * Only a single account can be approved at a time, so approving the zero address clears previous approvals. - * - * Requirements: - * - * - The caller must own the token or be an approved operator. - * - `tokenId` must exist. - * - * Emits an {Approval} event. - */ - function approve(address to, uint256 tokenId) external; - - /** - * @dev Approve or remove `operator` as an operator for the caller. - * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. - * - * Requirements: - * - * - The `operator` cannot be the caller. - * - * Emits an {ApprovalForAll} event. - */ - function setApprovalForAll(address operator, bool _approved) external; - - /** - * @dev Returns the account approved for `tokenId` token. - * - * Requirements: - * - * - `tokenId` must exist. - */ - function getApproved(uint256 tokenId) external view returns (address operator); - - /** - * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. - * - * See {setApprovalForAll} - */ - function isApprovedForAll(address owner, address operator) external view returns (bool); -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/README.adoc b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/README.adoc deleted file mode 100644 index b3377af..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/README.adoc +++ /dev/null @@ -1,70 +0,0 @@ -= ERC 721 - -[.readme-notice] -NOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/token/erc721 - -This set of interfaces, contracts, and utilities are all related to the https://eips.ethereum.org/EIPS/eip-721[ERC721 Non-Fungible Token Standard]. - -TIP: For a walk through on how to create an ERC721 token read our xref:ROOT:erc721.adoc[ERC721 guide]. - -The EIP specifies four interfaces: - -* {IERC721}: Core functionality required in all compliant implementation. -* {IERC721Metadata}: Optional extension that adds name, symbol, and token URI, almost always included. -* {IERC721Enumerable}: Optional extension that allows enumerating the tokens on chain, often not included since it requires large gas overhead. -* {IERC721Receiver}: An interface that must be implemented by contracts if they want to accept tokens through `safeTransferFrom`. - -OpenZeppelin Contracts provides implementations of all four interfaces: - -* {ERC721}: The core and metadata extensions, with a base URI mechanism. -* {ERC721Enumerable}: The enumerable extension. -* {ERC721Holder}: A bare bones implementation of the receiver interface. - -Additionally there are a few of other extensions: - -* {ERC721Consecutive}: An implementation of https://eips.ethereum.org/EIPS/eip-2309[ERC2309] for minting batchs of tokens during construction, in accordance with ERC721. -* {ERC721URIStorage}: A more flexible but more expensive way of storing metadata. -* {ERC721Votes}: Support for voting and vote delegation. -* {ERC721Royalty}: A way to signal royalty information following ERC2981. -* {ERC721Pausable}: A primitive to pause contract operation. -* {ERC721Burnable}: A way for token holders to burn their own tokens. - -NOTE: This core set of contracts is designed to be unopinionated, allowing developers to access the internal functions in ERC721 (such as <>) and expose them as external functions in the way they prefer. On the other hand, xref:ROOT:erc721.adoc#Presets[ERC721 Presets] (such as {ERC721PresetMinterPauserAutoId}) are designed using opinionated patterns to provide developers with ready to use, deployable contracts. - -== Core - -{{IERC721}} - -{{IERC721Metadata}} - -{{IERC721Enumerable}} - -{{ERC721}} - -{{ERC721Enumerable}} - -{{IERC721Receiver}} - -== Extensions - -{{ERC721Pausable}} - -{{ERC721Burnable}} - -{{ERC721Consecutive}} - -{{ERC721URIStorage}} - -{{ERC721Votes}} - -{{ERC721Royalty}} - -== Presets - -These contracts are preconfigured combinations of the above features. They can be used through inheritance or as models to copy and paste their source code. - -{{ERC721PresetMinterPauserAutoId}} - -== Utilities - -{{ERC721Holder}} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/extensions/ERC721BurnableUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/extensions/ERC721BurnableUpgradeable.sol deleted file mode 100644 index e50eeb2..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/extensions/ERC721BurnableUpgradeable.sol +++ /dev/null @@ -1,39 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721Burnable.sol) - -pragma solidity ^0.8.0; - -import "../ERC721Upgradeable.sol"; -import "../../../utils/ContextUpgradeable.sol"; -import "../../../proxy/utils/Initializable.sol"; - -/** - * @title ERC721 Burnable Token - * @dev ERC721 Token that can be burned (destroyed). - */ -abstract contract ERC721BurnableUpgradeable is Initializable, ContextUpgradeable, ERC721Upgradeable { - function __ERC721Burnable_init() internal onlyInitializing { - } - - function __ERC721Burnable_init_unchained() internal onlyInitializing { - } - /** - * @dev Burns `tokenId`. See {ERC721-_burn}. - * - * Requirements: - * - * - The caller must own `tokenId` or be an approved operator. - */ - function burn(uint256 tokenId) public virtual { - //solhint-disable-next-line max-line-length - require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); - _burn(tokenId); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/extensions/ERC721ConsecutiveUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/extensions/ERC721ConsecutiveUpgradeable.sol deleted file mode 100644 index 7008141..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/extensions/ERC721ConsecutiveUpgradeable.sol +++ /dev/null @@ -1,155 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../ERC721Upgradeable.sol"; -import "../../../interfaces/IERC2309Upgradeable.sol"; -import "../../../utils/CheckpointsUpgradeable.sol"; -import "../../../utils/structs/BitMapsUpgradeable.sol"; -import "../../../proxy/utils/Initializable.sol"; - -/** - * @dev Implementation of the ERC2309 "Consecutive Transfer Extension" as defined in - * https://eips.ethereum.org/EIPS/eip-2309[EIP-2309]. - * - * This extension allows the minting of large batches of tokens, during contract construction only. For upgradeable - * contracts this implies that batch minting is only available during proxy deployment, and not in subsequent upgrades. - * These batches are limited to 5000 tokens at a time by default to accommodate off-chain indexers. - * - * Using this extension removes the ability to mint single tokens during contract construction. This ability is - * regained after construction. During construction, only batch minting is allowed. - * - * IMPORTANT: This extension bypasses the hooks {_beforeTokenTransfer} and {_afterTokenTransfer} for tokens minted in - * batch. When using this extension, you should consider the {_beforeConsecutiveTokenTransfer} and - * {_afterConsecutiveTokenTransfer} hooks in addition to {_beforeTokenTransfer} and {_afterTokenTransfer}. - * - * IMPORTANT: When overriding {_afterTokenTransfer}, be careful about call ordering. {ownerOf} may return invalid - * values during the {_afterTokenTransfer} execution if the super call is not called first. To be safe, execute the - * super call before your custom logic. - * - * _Available since v4.8._ - */ -abstract contract ERC721ConsecutiveUpgradeable is Initializable, IERC2309Upgradeable, ERC721Upgradeable { - function __ERC721Consecutive_init() internal onlyInitializing { - } - - function __ERC721Consecutive_init_unchained() internal onlyInitializing { - } - using BitMapsUpgradeable for BitMapsUpgradeable.BitMap; - using CheckpointsUpgradeable for CheckpointsUpgradeable.Trace160; - - CheckpointsUpgradeable.Trace160 private _sequentialOwnership; - BitMapsUpgradeable.BitMap private _sequentialBurn; - - /** - * @dev Maximum size of a batch of consecutive tokens. This is designed to limit stress on off-chain indexing - * services that have to record one entry per token, and have protections against "unreasonably large" batches of - * tokens. - * - * NOTE: Overriding the default value of 5000 will not cause on-chain issues, but may result in the asset not being - * correctly supported by off-chain indexing services (including marketplaces). - */ - function _maxBatchSize() internal view virtual returns (uint96) { - return 5000; - } - - /** - * @dev See {ERC721-_ownerOf}. Override that checks the sequential ownership structure for tokens that have - * been minted as part of a batch, and not yet transferred. - */ - function _ownerOf(uint256 tokenId) internal view virtual override returns (address) { - address owner = super._ownerOf(tokenId); - - // If token is owned by the core, or beyond consecutive range, return base value - if (owner != address(0) || tokenId > type(uint96).max) { - return owner; - } - - // Otherwise, check the token was not burned, and fetch ownership from the anchors - // Note: no need for safe cast, we know that tokenId <= type(uint96).max - return _sequentialBurn.get(tokenId) ? address(0) : address(_sequentialOwnership.lowerLookup(uint96(tokenId))); - } - - /** - * @dev Mint a batch of tokens of length `batchSize` for `to`. Returns the token id of the first token minted in the - * batch; if `batchSize` is 0, returns the number of consecutive ids minted so far. - * - * Requirements: - * - * - `batchSize` must not be greater than {_maxBatchSize}. - * - The function is called in the constructor of the contract (directly or indirectly). - * - * CAUTION: Does not emit a `Transfer` event. This is ERC721 compliant as long as it is done inside of the - * constructor, which is enforced by this function. - * - * CAUTION: Does not invoke `onERC721Received` on the receiver. - * - * Emits a {IERC2309-ConsecutiveTransfer} event. - */ - function _mintConsecutive(address to, uint96 batchSize) internal virtual returns (uint96) { - uint96 first = _totalConsecutiveSupply(); - - // minting a batch of size 0 is a no-op - if (batchSize > 0) { - require(!AddressUpgradeable.isContract(address(this)), "ERC721Consecutive: batch minting restricted to constructor"); - require(to != address(0), "ERC721Consecutive: mint to the zero address"); - require(batchSize <= _maxBatchSize(), "ERC721Consecutive: batch too large"); - - // hook before - _beforeTokenTransfer(address(0), to, first, batchSize); - - // push an ownership checkpoint & emit event - uint96 last = first + batchSize - 1; - _sequentialOwnership.push(last, uint160(to)); - emit ConsecutiveTransfer(first, last, address(0), to); - - // hook after - _afterTokenTransfer(address(0), to, first, batchSize); - } - - return first; - } - - /** - * @dev See {ERC721-_mint}. Override version that restricts normal minting to after construction. - * - * Warning: Using {ERC721Consecutive} prevents using {_mint} during construction in favor of {_mintConsecutive}. - * After construction, {_mintConsecutive} is no longer available and {_mint} becomes available. - */ - function _mint(address to, uint256 tokenId) internal virtual override { - require(AddressUpgradeable.isContract(address(this)), "ERC721Consecutive: can't mint during construction"); - super._mint(to, tokenId); - } - - /** - * @dev See {ERC721-_afterTokenTransfer}. Burning of tokens that have been sequentially minted must be explicit. - */ - function _afterTokenTransfer( - address from, - address to, - uint256 firstTokenId, - uint256 batchSize - ) internal virtual override { - if ( - to == address(0) && // if we burn - firstTokenId < _totalConsecutiveSupply() && // and the tokenId was minted in a batch - !_sequentialBurn.get(firstTokenId) // and the token was never marked as burnt - ) { - require(batchSize == 1, "ERC721Consecutive: batch burn not supported"); - _sequentialBurn.set(firstTokenId); - } - super._afterTokenTransfer(from, to, firstTokenId, batchSize); - } - - function _totalConsecutiveSupply() private view returns (uint96) { - (bool exists, uint96 latestId, ) = _sequentialOwnership.latestCheckpoint(); - return exists ? latestId + 1 : 0; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[48] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol deleted file mode 100644 index 4de99f6..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol +++ /dev/null @@ -1,172 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) - -pragma solidity ^0.8.0; - -import "../ERC721Upgradeable.sol"; -import "./IERC721EnumerableUpgradeable.sol"; -import "../../../proxy/utils/Initializable.sol"; - -/** - * @dev This implements an optional extension of {ERC721} defined in the EIP that adds - * enumerability of all the token ids in the contract as well as all token ids owned by each - * account. - */ -abstract contract ERC721EnumerableUpgradeable is Initializable, ERC721Upgradeable, IERC721EnumerableUpgradeable { - function __ERC721Enumerable_init() internal onlyInitializing { - } - - function __ERC721Enumerable_init_unchained() internal onlyInitializing { - } - // Mapping from owner to list of owned token IDs - mapping(address => mapping(uint256 => uint256)) private _ownedTokens; - - // Mapping from token ID to index of the owner tokens list - mapping(uint256 => uint256) private _ownedTokensIndex; - - // Array with all token ids, used for enumeration - uint256[] private _allTokens; - - // Mapping from token id to position in the allTokens array - mapping(uint256 => uint256) private _allTokensIndex; - - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165Upgradeable, ERC721Upgradeable) returns (bool) { - return interfaceId == type(IERC721EnumerableUpgradeable).interfaceId || super.supportsInterface(interfaceId); - } - - /** - * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. - */ - function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { - require(index < ERC721Upgradeable.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); - return _ownedTokens[owner][index]; - } - - /** - * @dev See {IERC721Enumerable-totalSupply}. - */ - function totalSupply() public view virtual override returns (uint256) { - return _allTokens.length; - } - - /** - * @dev See {IERC721Enumerable-tokenByIndex}. - */ - function tokenByIndex(uint256 index) public view virtual override returns (uint256) { - require(index < ERC721EnumerableUpgradeable.totalSupply(), "ERC721Enumerable: global index out of bounds"); - return _allTokens[index]; - } - - /** - * @dev See {ERC721-_beforeTokenTransfer}. - */ - function _beforeTokenTransfer( - address from, - address to, - uint256 firstTokenId, - uint256 batchSize - ) internal virtual override { - super._beforeTokenTransfer(from, to, firstTokenId, batchSize); - - if (batchSize > 1) { - // Will only trigger during construction. Batch transferring (minting) is not available afterwards. - revert("ERC721Enumerable: consecutive transfers not supported"); - } - - uint256 tokenId = firstTokenId; - - if (from == address(0)) { - _addTokenToAllTokensEnumeration(tokenId); - } else if (from != to) { - _removeTokenFromOwnerEnumeration(from, tokenId); - } - if (to == address(0)) { - _removeTokenFromAllTokensEnumeration(tokenId); - } else if (to != from) { - _addTokenToOwnerEnumeration(to, tokenId); - } - } - - /** - * @dev Private function to add a token to this extension's ownership-tracking data structures. - * @param to address representing the new owner of the given token ID - * @param tokenId uint256 ID of the token to be added to the tokens list of the given address - */ - function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { - uint256 length = ERC721Upgradeable.balanceOf(to); - _ownedTokens[to][length] = tokenId; - _ownedTokensIndex[tokenId] = length; - } - - /** - * @dev Private function to add a token to this extension's token tracking data structures. - * @param tokenId uint256 ID of the token to be added to the tokens list - */ - function _addTokenToAllTokensEnumeration(uint256 tokenId) private { - _allTokensIndex[tokenId] = _allTokens.length; - _allTokens.push(tokenId); - } - - /** - * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that - * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for - * gas optimizations e.g. when performing a transfer operation (avoiding double writes). - * This has O(1) time complexity, but alters the order of the _ownedTokens array. - * @param from address representing the previous owner of the given token ID - * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address - */ - function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { - // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and - // then delete the last slot (swap and pop). - - uint256 lastTokenIndex = ERC721Upgradeable.balanceOf(from) - 1; - uint256 tokenIndex = _ownedTokensIndex[tokenId]; - - // When the token to delete is the last token, the swap operation is unnecessary - if (tokenIndex != lastTokenIndex) { - uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; - - _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token - _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index - } - - // This also deletes the contents at the last position of the array - delete _ownedTokensIndex[tokenId]; - delete _ownedTokens[from][lastTokenIndex]; - } - - /** - * @dev Private function to remove a token from this extension's token tracking data structures. - * This has O(1) time complexity, but alters the order of the _allTokens array. - * @param tokenId uint256 ID of the token to be removed from the tokens list - */ - function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { - // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and - // then delete the last slot (swap and pop). - - uint256 lastTokenIndex = _allTokens.length - 1; - uint256 tokenIndex = _allTokensIndex[tokenId]; - - // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so - // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding - // an 'if' statement (like in _removeTokenFromOwnerEnumeration) - uint256 lastTokenId = _allTokens[lastTokenIndex]; - - _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token - _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index - - // This also deletes the contents at the last position of the array - delete _allTokensIndex[tokenId]; - _allTokens.pop(); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[46] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/extensions/ERC721PausableUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/extensions/ERC721PausableUpgradeable.sol deleted file mode 100644 index 055ec97..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/extensions/ERC721PausableUpgradeable.sol +++ /dev/null @@ -1,48 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Pausable.sol) - -pragma solidity ^0.8.0; - -import "../ERC721Upgradeable.sol"; -import "../../../security/PausableUpgradeable.sol"; -import "../../../proxy/utils/Initializable.sol"; - -/** - * @dev ERC721 token with pausable token transfers, minting and burning. - * - * Useful for scenarios such as preventing trades until the end of an evaluation - * period, or having an emergency switch for freezing all token transfers in the - * event of a large bug. - */ -abstract contract ERC721PausableUpgradeable is Initializable, ERC721Upgradeable, PausableUpgradeable { - function __ERC721Pausable_init() internal onlyInitializing { - __Pausable_init_unchained(); - } - - function __ERC721Pausable_init_unchained() internal onlyInitializing { - } - /** - * @dev See {ERC721-_beforeTokenTransfer}. - * - * Requirements: - * - * - the contract must not be paused. - */ - function _beforeTokenTransfer( - address from, - address to, - uint256 firstTokenId, - uint256 batchSize - ) internal virtual override { - super._beforeTokenTransfer(from, to, firstTokenId, batchSize); - - require(!paused(), "ERC721Pausable: token transfer while paused"); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/extensions/ERC721RoyaltyUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/extensions/ERC721RoyaltyUpgradeable.sol deleted file mode 100644 index 0760c80..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/extensions/ERC721RoyaltyUpgradeable.sol +++ /dev/null @@ -1,51 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/ERC721Royalty.sol) - -pragma solidity ^0.8.0; - -import "../ERC721Upgradeable.sol"; -import "../../common/ERC2981Upgradeable.sol"; -import "../../../utils/introspection/ERC165Upgradeable.sol"; -import "../../../proxy/utils/Initializable.sol"; - -/** - * @dev Extension of ERC721 with the ERC2981 NFT Royalty Standard, a standardized way to retrieve royalty payment - * information. - * - * Royalty information can be specified globally for all token ids via {ERC2981-_setDefaultRoyalty}, and/or individually for - * specific token ids via {ERC2981-_setTokenRoyalty}. The latter takes precedence over the first. - * - * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See - * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to - * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. - * - * _Available since v4.5._ - */ -abstract contract ERC721RoyaltyUpgradeable is Initializable, ERC2981Upgradeable, ERC721Upgradeable { - function __ERC721Royalty_init() internal onlyInitializing { - } - - function __ERC721Royalty_init_unchained() internal onlyInitializing { - } - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721Upgradeable, ERC2981Upgradeable) returns (bool) { - return super.supportsInterface(interfaceId); - } - - /** - * @dev See {ERC721-_burn}. This override additionally clears the royalty information for the token. - */ - function _burn(uint256 tokenId) internal virtual override { - super._burn(tokenId); - _resetTokenRoyalty(tokenId); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/extensions/ERC721URIStorageUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/extensions/ERC721URIStorageUpgradeable.sol deleted file mode 100644 index 5f349d2..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/extensions/ERC721URIStorageUpgradeable.sol +++ /dev/null @@ -1,75 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721URIStorage.sol) - -pragma solidity ^0.8.0; - -import "../ERC721Upgradeable.sol"; -import "../../../proxy/utils/Initializable.sol"; - -/** - * @dev ERC721 token with storage based token URI management. - */ -abstract contract ERC721URIStorageUpgradeable is Initializable, ERC721Upgradeable { - function __ERC721URIStorage_init() internal onlyInitializing { - } - - function __ERC721URIStorage_init_unchained() internal onlyInitializing { - } - using StringsUpgradeable for uint256; - - // Optional mapping for token URIs - mapping(uint256 => string) private _tokenURIs; - - /** - * @dev See {IERC721Metadata-tokenURI}. - */ - function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { - _requireMinted(tokenId); - - string memory _tokenURI = _tokenURIs[tokenId]; - string memory base = _baseURI(); - - // If there is no base URI, return the token URI. - if (bytes(base).length == 0) { - return _tokenURI; - } - // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). - if (bytes(_tokenURI).length > 0) { - return string(abi.encodePacked(base, _tokenURI)); - } - - return super.tokenURI(tokenId); - } - - /** - * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. - * - * Requirements: - * - * - `tokenId` must exist. - */ - function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { - require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); - _tokenURIs[tokenId] = _tokenURI; - } - - /** - * @dev See {ERC721-_burn}. This override additionally checks to see if a - * token-specific URI was set for the token, and if so, it deletes the token URI from - * the storage mapping. - */ - function _burn(uint256 tokenId) internal virtual override { - super._burn(tokenId); - - if (bytes(_tokenURIs[tokenId]).length != 0) { - delete _tokenURIs[tokenId]; - } - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/extensions/ERC721VotesUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/extensions/ERC721VotesUpgradeable.sol deleted file mode 100644 index bd6e54d..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/extensions/ERC721VotesUpgradeable.sol +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "../ERC721Upgradeable.sol"; -import "../../../governance/utils/VotesUpgradeable.sol"; -import "../../../proxy/utils/Initializable.sol"; - -/** - * @dev Extension of ERC721 to support voting and delegation as implemented by {Votes}, where each individual NFT counts - * as 1 vote unit. - * - * Tokens do not count as votes until they are delegated, because votes must be tracked which incurs an additional cost - * on every transfer. Token holders can either delegate to a trusted representative who will decide how to make use of - * the votes in governance decisions, or they can delegate to themselves to be their own representative. - * - * _Available since v4.5._ - */ -abstract contract ERC721VotesUpgradeable is Initializable, ERC721Upgradeable, VotesUpgradeable { - function __ERC721Votes_init() internal onlyInitializing { - } - - function __ERC721Votes_init_unchained() internal onlyInitializing { - } - /** - * @dev See {ERC721-_afterTokenTransfer}. Adjusts votes when tokens are transferred. - * - * Emits a {IVotes-DelegateVotesChanged} event. - */ - function _afterTokenTransfer( - address from, - address to, - uint256 firstTokenId, - uint256 batchSize - ) internal virtual override { - _transferVotingUnits(from, to, batchSize); - super._afterTokenTransfer(from, to, firstTokenId, batchSize); - } - - /** - * @dev Returns the balance of `account`. - */ - function _getVotingUnits(address account) internal view virtual override returns (uint256) { - return balanceOf(account); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/extensions/IERC721EnumerableUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/extensions/IERC721EnumerableUpgradeable.sol deleted file mode 100644 index 77a7631..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/extensions/IERC721EnumerableUpgradeable.sol +++ /dev/null @@ -1,29 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) - -pragma solidity ^0.8.0; - -import "../IERC721Upgradeable.sol"; - -/** - * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension - * @dev See https://eips.ethereum.org/EIPS/eip-721 - */ -interface IERC721EnumerableUpgradeable is IERC721Upgradeable { - /** - * @dev Returns the total amount of tokens stored by the contract. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns a token ID owned by `owner` at a given `index` of its token list. - * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. - */ - function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); - - /** - * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. - * Use along with {totalSupply} to enumerate all tokens. - */ - function tokenByIndex(uint256 index) external view returns (uint256); -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/extensions/IERC721MetadataUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/extensions/IERC721MetadataUpgradeable.sol deleted file mode 100644 index 2a3ce91..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/extensions/IERC721MetadataUpgradeable.sol +++ /dev/null @@ -1,27 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) - -pragma solidity ^0.8.0; - -import "../IERC721Upgradeable.sol"; - -/** - * @title ERC-721 Non-Fungible Token Standard, optional metadata extension - * @dev See https://eips.ethereum.org/EIPS/eip-721 - */ -interface IERC721MetadataUpgradeable is IERC721Upgradeable { - /** - * @dev Returns the token collection name. - */ - function name() external view returns (string memory); - - /** - * @dev Returns the token collection symbol. - */ - function symbol() external view returns (string memory); - - /** - * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. - */ - function tokenURI(uint256 tokenId) external view returns (string memory); -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/extensions/draft-ERC721VotesUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/extensions/draft-ERC721VotesUpgradeable.sol deleted file mode 100644 index 992fd44..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/extensions/draft-ERC721VotesUpgradeable.sol +++ /dev/null @@ -1,8 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -// ERC721Votes was marked as draft due to the EIP-712 dependency. -// EIP-712 is Final as of 2022-08-11. This file is deprecated. - -import "./ERC721VotesUpgradeable.sol"; diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoIdUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoIdUpgradeable.sol deleted file mode 100644 index 00a9528..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/presets/ERC721PresetMinterPauserAutoIdUpgradeable.sol +++ /dev/null @@ -1,165 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol) - -pragma solidity ^0.8.0; - -import "../ERC721Upgradeable.sol"; -import "../extensions/ERC721EnumerableUpgradeable.sol"; -import "../extensions/ERC721BurnableUpgradeable.sol"; -import "../extensions/ERC721PausableUpgradeable.sol"; -import "../../../access/AccessControlEnumerableUpgradeable.sol"; -import "../../../utils/ContextUpgradeable.sol"; -import "../../../utils/CountersUpgradeable.sol"; -import "../../../proxy/utils/Initializable.sol"; - -/** - * @dev {ERC721} token, including: - * - * - ability for holders to burn (destroy) their tokens - * - a minter role that allows for token minting (creation) - * - a pauser role that allows to stop all token transfers - * - token ID and URI autogeneration - * - * This contract uses {AccessControl} to lock permissioned functions using the - * different roles - head to its documentation for details. - * - * The account that deploys the contract will be granted the minter and pauser - * roles, as well as the default admin role, which will let it grant both minter - * and pauser roles to other accounts. - * - * _Deprecated in favor of https://wizard.openzeppelin.com/[Contracts Wizard]._ - */ -contract ERC721PresetMinterPauserAutoIdUpgradeable is - Initializable, ContextUpgradeable, - AccessControlEnumerableUpgradeable, - ERC721EnumerableUpgradeable, - ERC721BurnableUpgradeable, - ERC721PausableUpgradeable -{ - function initialize( - string memory name, - string memory symbol, - string memory baseTokenURI - ) public virtual initializer { - __ERC721PresetMinterPauserAutoId_init(name, symbol, baseTokenURI); - } - using CountersUpgradeable for CountersUpgradeable.Counter; - - bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); - bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); - - CountersUpgradeable.Counter private _tokenIdTracker; - - string private _baseTokenURI; - - /** - * @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE` and `PAUSER_ROLE` to the - * account that deploys the contract. - * - * Token URIs will be autogenerated based on `baseURI` and their token IDs. - * See {ERC721-tokenURI}. - */ - function __ERC721PresetMinterPauserAutoId_init( - string memory name, - string memory symbol, - string memory baseTokenURI - ) internal onlyInitializing { - __ERC721_init_unchained(name, symbol); - __Pausable_init_unchained(); - __ERC721PresetMinterPauserAutoId_init_unchained(name, symbol, baseTokenURI); - } - - function __ERC721PresetMinterPauserAutoId_init_unchained( - string memory, - string memory, - string memory baseTokenURI - ) internal onlyInitializing { - _baseTokenURI = baseTokenURI; - - _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); - - _setupRole(MINTER_ROLE, _msgSender()); - _setupRole(PAUSER_ROLE, _msgSender()); - } - - function _baseURI() internal view virtual override returns (string memory) { - return _baseTokenURI; - } - - /** - * @dev Creates a new token for `to`. Its token ID will be automatically - * assigned (and available on the emitted {IERC721-Transfer} event), and the token - * URI autogenerated based on the base URI passed at construction. - * - * See {ERC721-_mint}. - * - * Requirements: - * - * - the caller must have the `MINTER_ROLE`. - */ - function mint(address to) public virtual { - require(hasRole(MINTER_ROLE, _msgSender()), "ERC721PresetMinterPauserAutoId: must have minter role to mint"); - - // We cannot just use balanceOf to create the new tokenId because tokens - // can be burned (destroyed), so we need a separate counter. - _mint(to, _tokenIdTracker.current()); - _tokenIdTracker.increment(); - } - - /** - * @dev Pauses all token transfers. - * - * See {ERC721Pausable} and {Pausable-_pause}. - * - * Requirements: - * - * - the caller must have the `PAUSER_ROLE`. - */ - function pause() public virtual { - require(hasRole(PAUSER_ROLE, _msgSender()), "ERC721PresetMinterPauserAutoId: must have pauser role to pause"); - _pause(); - } - - /** - * @dev Unpauses all token transfers. - * - * See {ERC721Pausable} and {Pausable-_unpause}. - * - * Requirements: - * - * - the caller must have the `PAUSER_ROLE`. - */ - function unpause() public virtual { - require(hasRole(PAUSER_ROLE, _msgSender()), "ERC721PresetMinterPauserAutoId: must have pauser role to unpause"); - _unpause(); - } - - function _beforeTokenTransfer( - address from, - address to, - uint256 firstTokenId, - uint256 batchSize - ) internal virtual override(ERC721Upgradeable, ERC721EnumerableUpgradeable, ERC721PausableUpgradeable) { - super._beforeTokenTransfer(from, to, firstTokenId, batchSize); - } - - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) - public - view - virtual - override(AccessControlEnumerableUpgradeable, ERC721Upgradeable, ERC721EnumerableUpgradeable) - returns (bool) - { - return super.supportsInterface(interfaceId); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[48] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/presets/README.md b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/presets/README.md deleted file mode 100644 index 468200b..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/presets/README.md +++ /dev/null @@ -1 +0,0 @@ -Contract presets are now deprecated in favor of [Contracts Wizard](https://wizard.openzeppelin.com/) as a more powerful alternative. diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/utils/ERC721HolderUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/utils/ERC721HolderUpgradeable.sol deleted file mode 100644 index df0166e..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC721/utils/ERC721HolderUpgradeable.sol +++ /dev/null @@ -1,41 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC721/utils/ERC721Holder.sol) - -pragma solidity ^0.8.0; - -import "../IERC721ReceiverUpgradeable.sol"; -import "../../../proxy/utils/Initializable.sol"; - -/** - * @dev Implementation of the {IERC721Receiver} interface. - * - * Accepts all token transfers. - * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}. - */ -contract ERC721HolderUpgradeable is Initializable, IERC721ReceiverUpgradeable { - function __ERC721Holder_init() internal onlyInitializing { - } - - function __ERC721Holder_init_unchained() internal onlyInitializing { - } - /** - * @dev See {IERC721Receiver-onERC721Received}. - * - * Always returns `IERC721Receiver.onERC721Received.selector`. - */ - function onERC721Received( - address, - address, - uint256, - bytes memory - ) public virtual override returns (bytes4) { - return this.onERC721Received.selector; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC777/ERC777Upgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC777/ERC777Upgradeable.sol deleted file mode 100644 index a028d46..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC777/ERC777Upgradeable.sol +++ /dev/null @@ -1,563 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC777/ERC777.sol) - -pragma solidity ^0.8.0; - -import "./IERC777Upgradeable.sol"; -import "./IERC777RecipientUpgradeable.sol"; -import "./IERC777SenderUpgradeable.sol"; -import "../ERC20/IERC20Upgradeable.sol"; -import "../../utils/AddressUpgradeable.sol"; -import "../../utils/ContextUpgradeable.sol"; -import "../../utils/introspection/IERC1820RegistryUpgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -/** - * @dev Implementation of the {IERC777} interface. - * - * This implementation is agnostic to the way tokens are created. This means - * that a supply mechanism has to be added in a derived contract using {_mint}. - * - * Support for ERC20 is included in this contract, as specified by the EIP: both - * the ERC777 and ERC20 interfaces can be safely used when interacting with it. - * Both {IERC777-Sent} and {IERC20-Transfer} events are emitted on token - * movements. - * - * Additionally, the {IERC777-granularity} value is hard-coded to `1`, meaning that there - * are no special restrictions in the amount of tokens that created, moved, or - * destroyed. This makes integration with ERC20 applications seamless. - */ -contract ERC777Upgradeable is Initializable, ContextUpgradeable, IERC777Upgradeable, IERC20Upgradeable { - using AddressUpgradeable for address; - - IERC1820RegistryUpgradeable internal constant _ERC1820_REGISTRY = IERC1820RegistryUpgradeable(0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24); - - mapping(address => uint256) private _balances; - - uint256 private _totalSupply; - - string private _name; - string private _symbol; - - bytes32 private constant _TOKENS_SENDER_INTERFACE_HASH = keccak256("ERC777TokensSender"); - bytes32 private constant _TOKENS_RECIPIENT_INTERFACE_HASH = keccak256("ERC777TokensRecipient"); - - // This isn't ever read from - it's only used to respond to the defaultOperators query. - address[] private _defaultOperatorsArray; - - // Immutable, but accounts may revoke them (tracked in __revokedDefaultOperators). - mapping(address => bool) private _defaultOperators; - - // For each account, a mapping of its operators and revoked default operators. - mapping(address => mapping(address => bool)) private _operators; - mapping(address => mapping(address => bool)) private _revokedDefaultOperators; - - // ERC20-allowances - mapping(address => mapping(address => uint256)) private _allowances; - - /** - * @dev `defaultOperators` may be an empty array. - */ - function __ERC777_init( - string memory name_, - string memory symbol_, - address[] memory defaultOperators_ - ) internal onlyInitializing { - __ERC777_init_unchained(name_, symbol_, defaultOperators_); - } - - function __ERC777_init_unchained( - string memory name_, - string memory symbol_, - address[] memory defaultOperators_ - ) internal onlyInitializing { - _name = name_; - _symbol = symbol_; - - _defaultOperatorsArray = defaultOperators_; - for (uint256 i = 0; i < defaultOperators_.length; i++) { - _defaultOperators[defaultOperators_[i]] = true; - } - - // register interfaces - _ERC1820_REGISTRY.setInterfaceImplementer(address(this), keccak256("ERC777Token"), address(this)); - _ERC1820_REGISTRY.setInterfaceImplementer(address(this), keccak256("ERC20Token"), address(this)); - } - - /** - * @dev See {IERC777-name}. - */ - function name() public view virtual override returns (string memory) { - return _name; - } - - /** - * @dev See {IERC777-symbol}. - */ - function symbol() public view virtual override returns (string memory) { - return _symbol; - } - - /** - * @dev See {ERC20-decimals}. - * - * Always returns 18, as per the - * [ERC777 EIP](https://eips.ethereum.org/EIPS/eip-777#backward-compatibility). - */ - function decimals() public pure virtual returns (uint8) { - return 18; - } - - /** - * @dev See {IERC777-granularity}. - * - * This implementation always returns `1`. - */ - function granularity() public view virtual override returns (uint256) { - return 1; - } - - /** - * @dev See {IERC777-totalSupply}. - */ - function totalSupply() public view virtual override(IERC20Upgradeable, IERC777Upgradeable) returns (uint256) { - return _totalSupply; - } - - /** - * @dev Returns the amount of tokens owned by an account (`tokenHolder`). - */ - function balanceOf(address tokenHolder) public view virtual override(IERC20Upgradeable, IERC777Upgradeable) returns (uint256) { - return _balances[tokenHolder]; - } - - /** - * @dev See {IERC777-send}. - * - * Also emits a {IERC20-Transfer} event for ERC20 compatibility. - */ - function send( - address recipient, - uint256 amount, - bytes memory data - ) public virtual override { - _send(_msgSender(), recipient, amount, data, "", true); - } - - /** - * @dev See {IERC20-transfer}. - * - * Unlike `send`, `recipient` is _not_ required to implement the {IERC777Recipient} - * interface if it is a contract. - * - * Also emits a {Sent} event. - */ - function transfer(address recipient, uint256 amount) public virtual override returns (bool) { - _send(_msgSender(), recipient, amount, "", "", false); - return true; - } - - /** - * @dev See {IERC777-burn}. - * - * Also emits a {IERC20-Transfer} event for ERC20 compatibility. - */ - function burn(uint256 amount, bytes memory data) public virtual override { - _burn(_msgSender(), amount, data, ""); - } - - /** - * @dev See {IERC777-isOperatorFor}. - */ - function isOperatorFor(address operator, address tokenHolder) public view virtual override returns (bool) { - return - operator == tokenHolder || - (_defaultOperators[operator] && !_revokedDefaultOperators[tokenHolder][operator]) || - _operators[tokenHolder][operator]; - } - - /** - * @dev See {IERC777-authorizeOperator}. - */ - function authorizeOperator(address operator) public virtual override { - require(_msgSender() != operator, "ERC777: authorizing self as operator"); - - if (_defaultOperators[operator]) { - delete _revokedDefaultOperators[_msgSender()][operator]; - } else { - _operators[_msgSender()][operator] = true; - } - - emit AuthorizedOperator(operator, _msgSender()); - } - - /** - * @dev See {IERC777-revokeOperator}. - */ - function revokeOperator(address operator) public virtual override { - require(operator != _msgSender(), "ERC777: revoking self as operator"); - - if (_defaultOperators[operator]) { - _revokedDefaultOperators[_msgSender()][operator] = true; - } else { - delete _operators[_msgSender()][operator]; - } - - emit RevokedOperator(operator, _msgSender()); - } - - /** - * @dev See {IERC777-defaultOperators}. - */ - function defaultOperators() public view virtual override returns (address[] memory) { - return _defaultOperatorsArray; - } - - /** - * @dev See {IERC777-operatorSend}. - * - * Emits {Sent} and {IERC20-Transfer} events. - */ - function operatorSend( - address sender, - address recipient, - uint256 amount, - bytes memory data, - bytes memory operatorData - ) public virtual override { - require(isOperatorFor(_msgSender(), sender), "ERC777: caller is not an operator for holder"); - _send(sender, recipient, amount, data, operatorData, true); - } - - /** - * @dev See {IERC777-operatorBurn}. - * - * Emits {Burned} and {IERC20-Transfer} events. - */ - function operatorBurn( - address account, - uint256 amount, - bytes memory data, - bytes memory operatorData - ) public virtual override { - require(isOperatorFor(_msgSender(), account), "ERC777: caller is not an operator for holder"); - _burn(account, amount, data, operatorData); - } - - /** - * @dev See {IERC20-allowance}. - * - * Note that operator and allowance concepts are orthogonal: operators may - * not have allowance, and accounts with allowance may not be operators - * themselves. - */ - function allowance(address holder, address spender) public view virtual override returns (uint256) { - return _allowances[holder][spender]; - } - - /** - * @dev See {IERC20-approve}. - * - * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on - * `transferFrom`. This is semantically equivalent to an infinite approval. - * - * Note that accounts cannot have allowance issued by their operators. - */ - function approve(address spender, uint256 value) public virtual override returns (bool) { - address holder = _msgSender(); - _approve(holder, spender, value); - return true; - } - - /** - * @dev See {IERC20-transferFrom}. - * - * NOTE: Does not update the allowance if the current allowance - * is the maximum `uint256`. - * - * Note that operator and allowance concepts are orthogonal: operators cannot - * call `transferFrom` (unless they have allowance), and accounts with - * allowance cannot call `operatorSend` (unless they are operators). - * - * Emits {Sent}, {IERC20-Transfer} and {IERC20-Approval} events. - */ - function transferFrom( - address holder, - address recipient, - uint256 amount - ) public virtual override returns (bool) { - address spender = _msgSender(); - _spendAllowance(holder, spender, amount); - _send(holder, recipient, amount, "", "", false); - return true; - } - - /** - * @dev Creates `amount` tokens and assigns them to `account`, increasing - * the total supply. - * - * If a send hook is registered for `account`, the corresponding function - * will be called with the caller address as the `operator` and with - * `userData` and `operatorData`. - * - * See {IERC777Sender} and {IERC777Recipient}. - * - * Emits {Minted} and {IERC20-Transfer} events. - * - * Requirements - * - * - `account` cannot be the zero address. - * - if `account` is a contract, it must implement the {IERC777Recipient} - * interface. - */ - function _mint( - address account, - uint256 amount, - bytes memory userData, - bytes memory operatorData - ) internal virtual { - _mint(account, amount, userData, operatorData, true); - } - - /** - * @dev Creates `amount` tokens and assigns them to `account`, increasing - * the total supply. - * - * If `requireReceptionAck` is set to true, and if a send hook is - * registered for `account`, the corresponding function will be called with - * `operator`, `data` and `operatorData`. - * - * See {IERC777Sender} and {IERC777Recipient}. - * - * Emits {Minted} and {IERC20-Transfer} events. - * - * Requirements - * - * - `account` cannot be the zero address. - * - if `account` is a contract, it must implement the {IERC777Recipient} - * interface. - */ - function _mint( - address account, - uint256 amount, - bytes memory userData, - bytes memory operatorData, - bool requireReceptionAck - ) internal virtual { - require(account != address(0), "ERC777: mint to the zero address"); - - address operator = _msgSender(); - - _beforeTokenTransfer(operator, address(0), account, amount); - - // Update state variables - _totalSupply += amount; - _balances[account] += amount; - - _callTokensReceived(operator, address(0), account, amount, userData, operatorData, requireReceptionAck); - - emit Minted(operator, account, amount, userData, operatorData); - emit Transfer(address(0), account, amount); - } - - /** - * @dev Send tokens - * @param from address token holder address - * @param to address recipient address - * @param amount uint256 amount of tokens to transfer - * @param userData bytes extra information provided by the token holder (if any) - * @param operatorData bytes extra information provided by the operator (if any) - * @param requireReceptionAck if true, contract recipients are required to implement ERC777TokensRecipient - */ - function _send( - address from, - address to, - uint256 amount, - bytes memory userData, - bytes memory operatorData, - bool requireReceptionAck - ) internal virtual { - require(from != address(0), "ERC777: transfer from the zero address"); - require(to != address(0), "ERC777: transfer to the zero address"); - - address operator = _msgSender(); - - _callTokensToSend(operator, from, to, amount, userData, operatorData); - - _move(operator, from, to, amount, userData, operatorData); - - _callTokensReceived(operator, from, to, amount, userData, operatorData, requireReceptionAck); - } - - /** - * @dev Burn tokens - * @param from address token holder address - * @param amount uint256 amount of tokens to burn - * @param data bytes extra information provided by the token holder - * @param operatorData bytes extra information provided by the operator (if any) - */ - function _burn( - address from, - uint256 amount, - bytes memory data, - bytes memory operatorData - ) internal virtual { - require(from != address(0), "ERC777: burn from the zero address"); - - address operator = _msgSender(); - - _callTokensToSend(operator, from, address(0), amount, data, operatorData); - - _beforeTokenTransfer(operator, from, address(0), amount); - - // Update state variables - uint256 fromBalance = _balances[from]; - require(fromBalance >= amount, "ERC777: burn amount exceeds balance"); - unchecked { - _balances[from] = fromBalance - amount; - } - _totalSupply -= amount; - - emit Burned(operator, from, amount, data, operatorData); - emit Transfer(from, address(0), amount); - } - - function _move( - address operator, - address from, - address to, - uint256 amount, - bytes memory userData, - bytes memory operatorData - ) private { - _beforeTokenTransfer(operator, from, to, amount); - - uint256 fromBalance = _balances[from]; - require(fromBalance >= amount, "ERC777: transfer amount exceeds balance"); - unchecked { - _balances[from] = fromBalance - amount; - } - _balances[to] += amount; - - emit Sent(operator, from, to, amount, userData, operatorData); - emit Transfer(from, to, amount); - } - - /** - * @dev See {ERC20-_approve}. - * - * Note that accounts cannot have allowance issued by their operators. - */ - function _approve( - address holder, - address spender, - uint256 value - ) internal virtual { - require(holder != address(0), "ERC777: approve from the zero address"); - require(spender != address(0), "ERC777: approve to the zero address"); - - _allowances[holder][spender] = value; - emit Approval(holder, spender, value); - } - - /** - * @dev Call from.tokensToSend() if the interface is registered - * @param operator address operator requesting the transfer - * @param from address token holder address - * @param to address recipient address - * @param amount uint256 amount of tokens to transfer - * @param userData bytes extra information provided by the token holder (if any) - * @param operatorData bytes extra information provided by the operator (if any) - */ - function _callTokensToSend( - address operator, - address from, - address to, - uint256 amount, - bytes memory userData, - bytes memory operatorData - ) private { - address implementer = _ERC1820_REGISTRY.getInterfaceImplementer(from, _TOKENS_SENDER_INTERFACE_HASH); - if (implementer != address(0)) { - IERC777SenderUpgradeable(implementer).tokensToSend(operator, from, to, amount, userData, operatorData); - } - } - - /** - * @dev Call to.tokensReceived() if the interface is registered. Reverts if the recipient is a contract but - * tokensReceived() was not registered for the recipient - * @param operator address operator requesting the transfer - * @param from address token holder address - * @param to address recipient address - * @param amount uint256 amount of tokens to transfer - * @param userData bytes extra information provided by the token holder (if any) - * @param operatorData bytes extra information provided by the operator (if any) - * @param requireReceptionAck if true, contract recipients are required to implement ERC777TokensRecipient - */ - function _callTokensReceived( - address operator, - address from, - address to, - uint256 amount, - bytes memory userData, - bytes memory operatorData, - bool requireReceptionAck - ) private { - address implementer = _ERC1820_REGISTRY.getInterfaceImplementer(to, _TOKENS_RECIPIENT_INTERFACE_HASH); - if (implementer != address(0)) { - IERC777RecipientUpgradeable(implementer).tokensReceived(operator, from, to, amount, userData, operatorData); - } else if (requireReceptionAck) { - require(!to.isContract(), "ERC777: token recipient contract has no implementer for ERC777TokensRecipient"); - } - } - - /** - * @dev Updates `owner` s allowance for `spender` based on spent `amount`. - * - * Does not update the allowance amount in case of infinite allowance. - * Revert if not enough allowance is available. - * - * Might emit an {IERC20-Approval} event. - */ - function _spendAllowance( - address owner, - address spender, - uint256 amount - ) internal virtual { - uint256 currentAllowance = allowance(owner, spender); - if (currentAllowance != type(uint256).max) { - require(currentAllowance >= amount, "ERC777: insufficient allowance"); - unchecked { - _approve(owner, spender, currentAllowance - amount); - } - } - } - - /** - * @dev Hook that is called before any token transfer. This includes - * calls to {send}, {transfer}, {operatorSend}, minting and burning. - * - * Calling conditions: - * - * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens - * will be to transferred to `to`. - * - when `from` is zero, `amount` tokens will be minted for `to`. - * - when `to` is zero, `amount` of ``from``'s tokens will be burned. - * - `from` and `to` are never both zero. - * - * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. - */ - function _beforeTokenTransfer( - address operator, - address from, - address to, - uint256 amount - ) internal virtual {} - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[41] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC777/IERC777RecipientUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC777/IERC777RecipientUpgradeable.sol deleted file mode 100644 index 9ffe79c..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC777/IERC777RecipientUpgradeable.sol +++ /dev/null @@ -1,35 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC777/IERC777Recipient.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC777TokensRecipient standard as defined in the EIP. - * - * Accounts can be notified of {IERC777} tokens being sent to them by having a - * contract implement this interface (contract holders can be their own - * implementer) and registering it on the - * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry]. - * - * See {IERC1820Registry} and {ERC1820Implementer}. - */ -interface IERC777RecipientUpgradeable { - /** - * @dev Called by an {IERC777} token contract whenever tokens are being - * moved or created into a registered account (`to`). The type of operation - * is conveyed by `from` being the zero address or not. - * - * This call occurs _after_ the token contract's state is updated, so - * {IERC777-balanceOf}, etc., can be used to query the post-operation state. - * - * This function may revert to prevent the operation from being executed. - */ - function tokensReceived( - address operator, - address from, - address to, - uint256 amount, - bytes calldata userData, - bytes calldata operatorData - ) external; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC777/IERC777SenderUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC777/IERC777SenderUpgradeable.sol deleted file mode 100644 index 3455d0a..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC777/IERC777SenderUpgradeable.sol +++ /dev/null @@ -1,35 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC777/IERC777Sender.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC777TokensSender standard as defined in the EIP. - * - * {IERC777} Token holders can be notified of operations performed on their - * tokens by having a contract implement this interface (contract holders can be - * their own implementer) and registering it on the - * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry]. - * - * See {IERC1820Registry} and {ERC1820Implementer}. - */ -interface IERC777SenderUpgradeable { - /** - * @dev Called by an {IERC777} token contract whenever a registered holder's - * (`from`) tokens are about to be moved or destroyed. The type of operation - * is conveyed by `to` being the zero address or not. - * - * This call occurs _before_ the token contract's state is updated, so - * {IERC777-balanceOf}, etc., can be used to query the pre-operation state. - * - * This function may revert to prevent the operation from being executed. - */ - function tokensToSend( - address operator, - address from, - address to, - uint256 amount, - bytes calldata userData, - bytes calldata operatorData - ) external; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC777/IERC777Upgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC777/IERC777Upgradeable.sol deleted file mode 100644 index 459d67c..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC777/IERC777Upgradeable.sol +++ /dev/null @@ -1,209 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC777/IERC777.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC777Token standard as defined in the EIP. - * - * This contract uses the - * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 registry standard] to let - * token holders and recipients react to token movements by using setting implementers - * for the associated interfaces in said registry. See {IERC1820Registry} and - * {ERC1820Implementer}. - */ -interface IERC777Upgradeable { - /** - * @dev Emitted when `amount` tokens are created by `operator` and assigned to `to`. - * - * Note that some additional user `data` and `operatorData` can be logged in the event. - */ - event Minted(address indexed operator, address indexed to, uint256 amount, bytes data, bytes operatorData); - - /** - * @dev Emitted when `operator` destroys `amount` tokens from `account`. - * - * Note that some additional user `data` and `operatorData` can be logged in the event. - */ - event Burned(address indexed operator, address indexed from, uint256 amount, bytes data, bytes operatorData); - - /** - * @dev Emitted when `operator` is made operator for `tokenHolder`. - */ - event AuthorizedOperator(address indexed operator, address indexed tokenHolder); - - /** - * @dev Emitted when `operator` is revoked its operator status for `tokenHolder`. - */ - event RevokedOperator(address indexed operator, address indexed tokenHolder); - - /** - * @dev Returns the name of the token. - */ - function name() external view returns (string memory); - - /** - * @dev Returns the symbol of the token, usually a shorter version of the - * name. - */ - function symbol() external view returns (string memory); - - /** - * @dev Returns the smallest part of the token that is not divisible. This - * means all token operations (creation, movement and destruction) must have - * amounts that are a multiple of this number. - * - * For most token contracts, this value will equal 1. - */ - function granularity() external view returns (uint256); - - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by an account (`owner`). - */ - function balanceOf(address owner) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * If send or receive hooks are registered for the caller and `recipient`, - * the corresponding functions will be called with `data` and empty - * `operatorData`. See {IERC777Sender} and {IERC777Recipient}. - * - * Emits a {Sent} event. - * - * Requirements - * - * - the caller must have at least `amount` tokens. - * - `recipient` cannot be the zero address. - * - if `recipient` is a contract, it must implement the {IERC777Recipient} - * interface. - */ - function send( - address recipient, - uint256 amount, - bytes calldata data - ) external; - - /** - * @dev Destroys `amount` tokens from the caller's account, reducing the - * total supply. - * - * If a send hook is registered for the caller, the corresponding function - * will be called with `data` and empty `operatorData`. See {IERC777Sender}. - * - * Emits a {Burned} event. - * - * Requirements - * - * - the caller must have at least `amount` tokens. - */ - function burn(uint256 amount, bytes calldata data) external; - - /** - * @dev Returns true if an account is an operator of `tokenHolder`. - * Operators can send and burn tokens on behalf of their owners. All - * accounts are their own operator. - * - * See {operatorSend} and {operatorBurn}. - */ - function isOperatorFor(address operator, address tokenHolder) external view returns (bool); - - /** - * @dev Make an account an operator of the caller. - * - * See {isOperatorFor}. - * - * Emits an {AuthorizedOperator} event. - * - * Requirements - * - * - `operator` cannot be calling address. - */ - function authorizeOperator(address operator) external; - - /** - * @dev Revoke an account's operator status for the caller. - * - * See {isOperatorFor} and {defaultOperators}. - * - * Emits a {RevokedOperator} event. - * - * Requirements - * - * - `operator` cannot be calling address. - */ - function revokeOperator(address operator) external; - - /** - * @dev Returns the list of default operators. These accounts are operators - * for all token holders, even if {authorizeOperator} was never called on - * them. - * - * This list is immutable, but individual holders may revoke these via - * {revokeOperator}, in which case {isOperatorFor} will return false. - */ - function defaultOperators() external view returns (address[] memory); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient`. The caller must - * be an operator of `sender`. - * - * If send or receive hooks are registered for `sender` and `recipient`, - * the corresponding functions will be called with `data` and - * `operatorData`. See {IERC777Sender} and {IERC777Recipient}. - * - * Emits a {Sent} event. - * - * Requirements - * - * - `sender` cannot be the zero address. - * - `sender` must have at least `amount` tokens. - * - the caller must be an operator for `sender`. - * - `recipient` cannot be the zero address. - * - if `recipient` is a contract, it must implement the {IERC777Recipient} - * interface. - */ - function operatorSend( - address sender, - address recipient, - uint256 amount, - bytes calldata data, - bytes calldata operatorData - ) external; - - /** - * @dev Destroys `amount` tokens from `account`, reducing the total supply. - * The caller must be an operator of `account`. - * - * If a send hook is registered for `account`, the corresponding function - * will be called with `data` and `operatorData`. See {IERC777Sender}. - * - * Emits a {Burned} event. - * - * Requirements - * - * - `account` cannot be the zero address. - * - `account` must have at least `amount` tokens. - * - the caller must be an operator for `account`. - */ - function operatorBurn( - address account, - uint256 amount, - bytes calldata data, - bytes calldata operatorData - ) external; - - event Sent( - address indexed operator, - address indexed from, - address indexed to, - uint256 amount, - bytes data, - bytes operatorData - ); -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC777/README.adoc b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC777/README.adoc deleted file mode 100644 index 5012a31..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC777/README.adoc +++ /dev/null @@ -1,30 +0,0 @@ -= ERC 777 - -[.readme-notice] -NOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/token/erc777 - -This set of interfaces and contracts are all related to the https://eips.ethereum.org/EIPS/eip-777[ERC777 token standard]. - -TIP: For an overview of ERC777 tokens and a walk through on how to create a token contract read our xref:ROOT:erc777.adoc[ERC777 guide]. - -The token behavior itself is implemented in the core contracts: {IERC777}, {ERC777}. - -Additionally there are interfaces used to develop contracts that react to token movements: {IERC777Sender}, {IERC777Recipient}. - -== Core - -{{IERC777}} - -{{ERC777}} - -== Hooks - -{{IERC777Sender}} - -{{IERC777Recipient}} - -== Presets - -These contracts are preconfigured combinations of features. They can be used through inheritance or as models to copy and paste their source code. - -{{ERC777PresetFixedSupply}} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC777/presets/ERC777PresetFixedSupplyUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC777/presets/ERC777PresetFixedSupplyUpgradeable.sol deleted file mode 100644 index 1f10f10..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/ERC777/presets/ERC777PresetFixedSupplyUpgradeable.sol +++ /dev/null @@ -1,58 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (token/ERC777/presets/ERC777PresetFixedSupply.sol) -pragma solidity ^0.8.0; - -import "../ERC777Upgradeable.sol"; -import "../../../proxy/utils/Initializable.sol"; - -/** - * @dev {ERC777} token, including: - * - * - Preminted initial supply - * - No access control mechanism (for minting/pausing) and hence no governance - * - * _Available since v3.4._ - */ -contract ERC777PresetFixedSupplyUpgradeable is Initializable, ERC777Upgradeable { - function initialize( - string memory name, - string memory symbol, - address[] memory defaultOperators, - uint256 initialSupply, - address owner - ) public virtual initializer { - __ERC777PresetFixedSupply_init(name, symbol, defaultOperators, initialSupply, owner); - } - /** - * @dev Mints `initialSupply` amount of token and transfers them to `owner`. - * - * See {ERC777-constructor}. - */ - function __ERC777PresetFixedSupply_init( - string memory name, - string memory symbol, - address[] memory defaultOperators, - uint256 initialSupply, - address owner - ) internal onlyInitializing { - __ERC777_init_unchained(name, symbol, defaultOperators); - __ERC777PresetFixedSupply_init_unchained(name, symbol, defaultOperators, initialSupply, owner); - } - - function __ERC777PresetFixedSupply_init_unchained( - string memory, - string memory, - address[] memory, - uint256 initialSupply, - address owner - ) internal onlyInitializing { - _mint(owner, initialSupply, "", ""); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/common/ERC2981Upgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/common/ERC2981Upgradeable.sol deleted file mode 100644 index 12ef990..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/common/ERC2981Upgradeable.sol +++ /dev/null @@ -1,124 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol) - -pragma solidity ^0.8.0; - -import "../../interfaces/IERC2981Upgradeable.sol"; -import "../../utils/introspection/ERC165Upgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -/** - * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. - * - * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for - * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. - * - * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the - * fee is specified in basis points by default. - * - * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See - * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to - * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. - * - * _Available since v4.5._ - */ -abstract contract ERC2981Upgradeable is Initializable, IERC2981Upgradeable, ERC165Upgradeable { - function __ERC2981_init() internal onlyInitializing { - } - - function __ERC2981_init_unchained() internal onlyInitializing { - } - struct RoyaltyInfo { - address receiver; - uint96 royaltyFraction; - } - - RoyaltyInfo private _defaultRoyaltyInfo; - mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; - - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165Upgradeable, ERC165Upgradeable) returns (bool) { - return interfaceId == type(IERC2981Upgradeable).interfaceId || super.supportsInterface(interfaceId); - } - - /** - * @inheritdoc IERC2981Upgradeable - */ - function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) { - RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; - - if (royalty.receiver == address(0)) { - royalty = _defaultRoyaltyInfo; - } - - uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); - - return (royalty.receiver, royaltyAmount); - } - - /** - * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a - * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an - * override. - */ - function _feeDenominator() internal pure virtual returns (uint96) { - return 10000; - } - - /** - * @dev Sets the royalty information that all ids in this contract will default to. - * - * Requirements: - * - * - `receiver` cannot be the zero address. - * - `feeNumerator` cannot be greater than the fee denominator. - */ - function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { - require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); - require(receiver != address(0), "ERC2981: invalid receiver"); - - _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); - } - - /** - * @dev Removes default royalty information. - */ - function _deleteDefaultRoyalty() internal virtual { - delete _defaultRoyaltyInfo; - } - - /** - * @dev Sets the royalty information for a specific token id, overriding the global default. - * - * Requirements: - * - * - `receiver` cannot be the zero address. - * - `feeNumerator` cannot be greater than the fee denominator. - */ - function _setTokenRoyalty( - uint256 tokenId, - address receiver, - uint96 feeNumerator - ) internal virtual { - require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); - require(receiver != address(0), "ERC2981: Invalid parameters"); - - _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); - } - - /** - * @dev Resets royalty information for the token id back to the global default. - */ - function _resetTokenRoyalty(uint256 tokenId) internal virtual { - delete _tokenRoyaltyInfo[tokenId]; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[48] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/common/README.adoc b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/common/README.adoc deleted file mode 100644 index af61674..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/token/common/README.adoc +++ /dev/null @@ -1,10 +0,0 @@ -= Common (Tokens) - -Functionality that is common to multiple token standards. - -* {ERC2981}: NFT Royalties compatible with both ERC721 and ERC1155. -** For ERC721 consider {ERC721Royalty} which clears the royalty information from storage on burn. - -== Contracts - -{{ERC2981}} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol deleted file mode 100644 index 6404cb8..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol +++ /dev/null @@ -1,219 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) - -pragma solidity ^0.8.1; - -/** - * @dev Collection of functions related to the address type - */ -library AddressUpgradeable { - /** - * @dev Returns true if `account` is a contract. - * - * [IMPORTANT] - * ==== - * It is unsafe to assume that an address for which this function returns - * false is an externally-owned account (EOA) and not a contract. - * - * Among others, `isContract` will return false for the following - * types of addresses: - * - * - an externally-owned account - * - a contract in construction - * - an address where a contract will be created - * - an address where a contract lived, but was destroyed - * ==== - * - * [IMPORTANT] - * ==== - * You shouldn't rely on `isContract` to protect against flash loan attacks! - * - * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets - * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract - * constructor. - * ==== - */ - function isContract(address account) internal view returns (bool) { - // This method relies on extcodesize/address.code.length, which returns 0 - // for contracts in construction, since the code is only stored at the end - // of the constructor execution. - - return account.code.length > 0; - } - - /** - * @dev Replacement for Solidity's `transfer`: sends `amount` wei to - * `recipient`, forwarding all available gas and reverting on errors. - * - * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost - * of certain opcodes, possibly making contracts go over the 2300 gas limit - * imposed by `transfer`, making them unable to receive funds via - * `transfer`. {sendValue} removes this limitation. - * - * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. - * - * IMPORTANT: because control is transferred to `recipient`, care must be - * taken to not create reentrancy vulnerabilities. Consider using - * {ReentrancyGuard} or the - * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. - */ - function sendValue(address payable recipient, uint256 amount) internal { - require(address(this).balance >= amount, "Address: insufficient balance"); - - (bool success, ) = recipient.call{value: amount}(""); - require(success, "Address: unable to send value, recipient may have reverted"); - } - - /** - * @dev Performs a Solidity function call using a low level `call`. A - * plain `call` is an unsafe replacement for a function call: use this - * function instead. - * - * If `target` reverts with a revert reason, it is bubbled up by this - * function (like regular Solidity function calls). - * - * Returns the raw returned data. To convert to the expected return value, - * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. - * - * Requirements: - * - * - `target` must be a contract. - * - calling `target` with `data` must not revert. - * - * _Available since v3.1._ - */ - function functionCall(address target, bytes memory data) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, "Address: low-level call failed"); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with - * `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCall( - address target, - bytes memory data, - string memory errorMessage - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, 0, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but also transferring `value` wei to `target`. - * - * Requirements: - * - * - the calling contract must have an ETH balance of at least `value`. - * - the called Solidity function must be `payable`. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) internal returns (bytes memory) { - return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); - } - - /** - * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but - * with `errorMessage` as a fallback revert reason when `target` reverts. - * - * _Available since v3.1._ - */ - function functionCallWithValue( - address target, - bytes memory data, - uint256 value, - string memory errorMessage - ) internal returns (bytes memory) { - require(address(this).balance >= value, "Address: insufficient balance for call"); - (bool success, bytes memory returndata) = target.call{value: value}(data); - return verifyCallResultFromTarget(target, success, returndata, errorMessage); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { - return functionStaticCall(target, data, "Address: low-level static call failed"); - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a static call. - * - * _Available since v3.3._ - */ - function functionStaticCall( - address target, - bytes memory data, - string memory errorMessage - ) internal view returns (bytes memory) { - (bool success, bytes memory returndata) = target.staticcall(data); - return verifyCallResultFromTarget(target, success, returndata, errorMessage); - } - - /** - * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling - * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. - * - * _Available since v4.8._ - */ - function verifyCallResultFromTarget( - address target, - bool success, - bytes memory returndata, - string memory errorMessage - ) internal view returns (bytes memory) { - if (success) { - if (returndata.length == 0) { - // only check isContract if the call was successful and the return data is empty - // otherwise we already know that it was a contract - require(isContract(target), "Address: call to non-contract"); - } - return returndata; - } else { - _revert(returndata, errorMessage); - } - } - - /** - * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the - * revert reason or using the provided one. - * - * _Available since v4.3._ - */ - function verifyCallResult( - bool success, - bytes memory returndata, - string memory errorMessage - ) internal pure returns (bytes memory) { - if (success) { - return returndata; - } else { - _revert(returndata, errorMessage); - } - } - - function _revert(bytes memory returndata, string memory errorMessage) private pure { - // Look for revert reason and bubble it up if present - if (returndata.length > 0) { - // The easiest way to bubble the revert reason is using memory via assembly - /// @solidity memory-safe-assembly - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert(errorMessage); - } - } -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/ArraysUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/ArraysUpgradeable.sol deleted file mode 100644 index 97cbc08..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/ArraysUpgradeable.sol +++ /dev/null @@ -1,105 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/Arrays.sol) - -pragma solidity ^0.8.0; - -import "./StorageSlotUpgradeable.sol"; -import "./math/MathUpgradeable.sol"; - -/** - * @dev Collection of functions related to array types. - */ -library ArraysUpgradeable { - using StorageSlotUpgradeable for bytes32; - - /** - * @dev Searches a sorted `array` and returns the first index that contains - * a value greater or equal to `element`. If no such index exists (i.e. all - * values in the array are strictly less than `element`), the array length is - * returned. Time complexity O(log n). - * - * `array` is expected to be sorted in ascending order, and to contain no - * repeated elements. - */ - function findUpperBound(uint256[] storage array, uint256 element) internal view returns (uint256) { - if (array.length == 0) { - return 0; - } - - uint256 low = 0; - uint256 high = array.length; - - while (low < high) { - uint256 mid = MathUpgradeable.average(low, high); - - // Note that mid will always be strictly less than high (i.e. it will be a valid array index) - // because Math.average rounds down (it does integer division with truncation). - if (unsafeAccess(array, mid).value > element) { - high = mid; - } else { - low = mid + 1; - } - } - - // At this point `low` is the exclusive upper bound. We will return the inclusive upper bound. - if (low > 0 && unsafeAccess(array, low - 1).value == element) { - return low - 1; - } else { - return low; - } - } - - /** - * @dev Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check. - * - * WARNING: Only use if you are certain `pos` is lower than the array length. - */ - function unsafeAccess(address[] storage arr, uint256 pos) internal pure returns (StorageSlotUpgradeable.AddressSlot storage) { - bytes32 slot; - // We use assembly to calculate the storage slot of the element at index `pos` of the dynamic array `arr` - // following https://docs.soliditylang.org/en/v0.8.17/internals/layout_in_storage.html#mappings-and-dynamic-arrays. - - /// @solidity memory-safe-assembly - assembly { - mstore(0, arr.slot) - slot := add(keccak256(0, 0x20), pos) - } - return slot.getAddressSlot(); - } - - /** - * @dev Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check. - * - * WARNING: Only use if you are certain `pos` is lower than the array length. - */ - function unsafeAccess(bytes32[] storage arr, uint256 pos) internal pure returns (StorageSlotUpgradeable.Bytes32Slot storage) { - bytes32 slot; - // We use assembly to calculate the storage slot of the element at index `pos` of the dynamic array `arr` - // following https://docs.soliditylang.org/en/v0.8.17/internals/layout_in_storage.html#mappings-and-dynamic-arrays. - - /// @solidity memory-safe-assembly - assembly { - mstore(0, arr.slot) - slot := add(keccak256(0, 0x20), pos) - } - return slot.getBytes32Slot(); - } - - /** - * @dev Access an array in an "unsafe" way. Skips solidity "index-out-of-range" check. - * - * WARNING: Only use if you are certain `pos` is lower than the array length. - */ - function unsafeAccess(uint256[] storage arr, uint256 pos) internal pure returns (StorageSlotUpgradeable.Uint256Slot storage) { - bytes32 slot; - // We use assembly to calculate the storage slot of the element at index `pos` of the dynamic array `arr` - // following https://docs.soliditylang.org/en/v0.8.17/internals/layout_in_storage.html#mappings-and-dynamic-arrays. - - /// @solidity memory-safe-assembly - assembly { - mstore(0, arr.slot) - slot := add(keccak256(0, 0x20), pos) - } - return slot.getUint256Slot(); - } -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/Base64Upgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/Base64Upgradeable.sol deleted file mode 100644 index 1ca0a0b..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/Base64Upgradeable.sol +++ /dev/null @@ -1,92 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Provides a set of functions to operate with Base64 strings. - * - * _Available since v4.5._ - */ -library Base64Upgradeable { - /** - * @dev Base64 Encoding/Decoding Table - */ - string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - - /** - * @dev Converts a `bytes` to its Bytes64 `string` representation. - */ - function encode(bytes memory data) internal pure returns (string memory) { - /** - * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence - * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol - */ - if (data.length == 0) return ""; - - // Loads the table into memory - string memory table = _TABLE; - - // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter - // and split into 4 numbers of 6 bits. - // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up - // - `data.length + 2` -> Round up - // - `/ 3` -> Number of 3-bytes chunks - // - `4 *` -> 4 characters for each chunk - string memory result = new string(4 * ((data.length + 2) / 3)); - - /// @solidity memory-safe-assembly - assembly { - // Prepare the lookup table (skip the first "length" byte) - let tablePtr := add(table, 1) - - // Prepare result pointer, jump over length - let resultPtr := add(result, 32) - - // Run over the input, 3 bytes at a time - for { - let dataPtr := data - let endPtr := add(data, mload(data)) - } lt(dataPtr, endPtr) { - - } { - // Advance 3 bytes - dataPtr := add(dataPtr, 3) - let input := mload(dataPtr) - - // To write each character, shift the 3 bytes (18 bits) chunk - // 4 times in blocks of 6 bits for each character (18, 12, 6, 0) - // and apply logical AND with 0x3F which is the number of - // the previous character in the ASCII table prior to the Base64 Table - // The result is then added to the table to get the character to write, - // and finally write it in the result pointer but with a left shift - // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits - - mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F)))) - resultPtr := add(resultPtr, 1) // Advance - - mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F)))) - resultPtr := add(resultPtr, 1) // Advance - - mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F)))) - resultPtr := add(resultPtr, 1) // Advance - - mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F)))) - resultPtr := add(resultPtr, 1) // Advance - } - - // When data `bytes` is not exactly 3 bytes long - // it is padded with `=` characters at the end - switch mod(mload(data), 3) - case 1 { - mstore8(sub(resultPtr, 1), 0x3d) - mstore8(sub(resultPtr, 2), 0x3d) - } - case 2 { - mstore8(sub(resultPtr, 1), 0x3d) - } - } - - return result; - } -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/CheckpointsUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/CheckpointsUpgradeable.sol deleted file mode 100644 index ca07183..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/CheckpointsUpgradeable.sol +++ /dev/null @@ -1,544 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (utils/Checkpoints.sol) -// This file was procedurally generated from scripts/generate/templates/Checkpoints.js. - -pragma solidity ^0.8.0; - -import "./math/MathUpgradeable.sol"; -import "./math/SafeCastUpgradeable.sol"; - -/** - * @dev This library defines the `History` struct, for checkpointing values as they change at different points in - * time, and later looking up past values by block number. See {Votes} as an example. - * - * To create a history of checkpoints define a variable type `Checkpoints.History` in your contract, and store a new - * checkpoint for the current transaction block using the {push} function. - * - * _Available since v4.5._ - */ -library CheckpointsUpgradeable { - struct History { - Checkpoint[] _checkpoints; - } - - struct Checkpoint { - uint32 _blockNumber; - uint224 _value; - } - - /** - * @dev Returns the value at a given block number. If a checkpoint is not available at that block, the closest one - * before it is returned, or zero otherwise. - */ - function getAtBlock(History storage self, uint256 blockNumber) internal view returns (uint256) { - require(blockNumber < block.number, "Checkpoints: block not yet mined"); - uint32 key = SafeCastUpgradeable.toUint32(blockNumber); - - uint256 len = self._checkpoints.length; - uint256 pos = _upperBinaryLookup(self._checkpoints, key, 0, len); - return pos == 0 ? 0 : _unsafeAccess(self._checkpoints, pos - 1)._value; - } - - /** - * @dev Returns the value at a given block number. If a checkpoint is not available at that block, the closest one - * before it is returned, or zero otherwise. Similar to {upperLookup} but optimized for the case when the searched - * checkpoint is probably "recent", defined as being among the last sqrt(N) checkpoints where N is the number of - * checkpoints. - */ - function getAtProbablyRecentBlock(History storage self, uint256 blockNumber) internal view returns (uint256) { - require(blockNumber < block.number, "Checkpoints: block not yet mined"); - uint32 key = SafeCastUpgradeable.toUint32(blockNumber); - - uint256 len = self._checkpoints.length; - - uint256 low = 0; - uint256 high = len; - - if (len > 5) { - uint256 mid = len - MathUpgradeable.sqrt(len); - if (key < _unsafeAccess(self._checkpoints, mid)._blockNumber) { - high = mid; - } else { - low = mid + 1; - } - } - - uint256 pos = _upperBinaryLookup(self._checkpoints, key, low, high); - - return pos == 0 ? 0 : _unsafeAccess(self._checkpoints, pos - 1)._value; - } - - /** - * @dev Pushes a value onto a History so that it is stored as the checkpoint for the current block. - * - * Returns previous value and new value. - */ - function push(History storage self, uint256 value) internal returns (uint256, uint256) { - return _insert(self._checkpoints, SafeCastUpgradeable.toUint32(block.number), SafeCastUpgradeable.toUint224(value)); - } - - /** - * @dev Pushes a value onto a History, by updating the latest value using binary operation `op`. The new value will - * be set to `op(latest, delta)`. - * - * Returns previous value and new value. - */ - function push( - History storage self, - function(uint256, uint256) view returns (uint256) op, - uint256 delta - ) internal returns (uint256, uint256) { - return push(self, op(latest(self), delta)); - } - - /** - * @dev Returns the value in the most recent checkpoint, or zero if there are no checkpoints. - */ - function latest(History storage self) internal view returns (uint224) { - uint256 pos = self._checkpoints.length; - return pos == 0 ? 0 : _unsafeAccess(self._checkpoints, pos - 1)._value; - } - - /** - * @dev Returns whether there is a checkpoint in the structure (i.e. it is not empty), and if so the key and value - * in the most recent checkpoint. - */ - function latestCheckpoint(History storage self) - internal - view - returns ( - bool exists, - uint32 _blockNumber, - uint224 _value - ) - { - uint256 pos = self._checkpoints.length; - if (pos == 0) { - return (false, 0, 0); - } else { - Checkpoint memory ckpt = _unsafeAccess(self._checkpoints, pos - 1); - return (true, ckpt._blockNumber, ckpt._value); - } - } - - /** - * @dev Returns the number of checkpoint. - */ - function length(History storage self) internal view returns (uint256) { - return self._checkpoints.length; - } - - /** - * @dev Pushes a (`key`, `value`) pair into an ordered list of checkpoints, either by inserting a new checkpoint, - * or by updating the last one. - */ - function _insert( - Checkpoint[] storage self, - uint32 key, - uint224 value - ) private returns (uint224, uint224) { - uint256 pos = self.length; - - if (pos > 0) { - // Copying to memory is important here. - Checkpoint memory last = _unsafeAccess(self, pos - 1); - - // Checkpoints keys must be increasing. - require(last._blockNumber <= key, "Checkpoint: invalid key"); - - // Update or push new checkpoint - if (last._blockNumber == key) { - _unsafeAccess(self, pos - 1)._value = value; - } else { - self.push(Checkpoint({_blockNumber: key, _value: value})); - } - return (last._value, value); - } else { - self.push(Checkpoint({_blockNumber: key, _value: value})); - return (0, value); - } - } - - /** - * @dev Return the index of the oldest checkpoint whose key is greater than the search key, or `high` if there is none. - * `low` and `high` define a section where to do the search, with inclusive `low` and exclusive `high`. - * - * WARNING: `high` should not be greater than the array's length. - */ - function _upperBinaryLookup( - Checkpoint[] storage self, - uint32 key, - uint256 low, - uint256 high - ) private view returns (uint256) { - while (low < high) { - uint256 mid = MathUpgradeable.average(low, high); - if (_unsafeAccess(self, mid)._blockNumber > key) { - high = mid; - } else { - low = mid + 1; - } - } - return high; - } - - /** - * @dev Return the index of the oldest checkpoint whose key is greater or equal than the search key, or `high` if there is none. - * `low` and `high` define a section where to do the search, with inclusive `low` and exclusive `high`. - * - * WARNING: `high` should not be greater than the array's length. - */ - function _lowerBinaryLookup( - Checkpoint[] storage self, - uint32 key, - uint256 low, - uint256 high - ) private view returns (uint256) { - while (low < high) { - uint256 mid = MathUpgradeable.average(low, high); - if (_unsafeAccess(self, mid)._blockNumber < key) { - low = mid + 1; - } else { - high = mid; - } - } - return high; - } - - function _unsafeAccess(Checkpoint[] storage self, uint256 pos) private pure returns (Checkpoint storage result) { - assembly { - mstore(0, self.slot) - result.slot := add(keccak256(0, 0x20), pos) - } - } - - struct Trace224 { - Checkpoint224[] _checkpoints; - } - - struct Checkpoint224 { - uint32 _key; - uint224 _value; - } - - /** - * @dev Pushes a (`key`, `value`) pair into a Trace224 so that it is stored as the checkpoint. - * - * Returns previous value and new value. - */ - function push( - Trace224 storage self, - uint32 key, - uint224 value - ) internal returns (uint224, uint224) { - return _insert(self._checkpoints, key, value); - } - - /** - * @dev Returns the value in the oldest checkpoint with key greater or equal than the search key, or zero if there is none. - */ - function lowerLookup(Trace224 storage self, uint32 key) internal view returns (uint224) { - uint256 len = self._checkpoints.length; - uint256 pos = _lowerBinaryLookup(self._checkpoints, key, 0, len); - return pos == len ? 0 : _unsafeAccess(self._checkpoints, pos)._value; - } - - /** - * @dev Returns the value in the most recent checkpoint with key lower or equal than the search key. - */ - function upperLookup(Trace224 storage self, uint32 key) internal view returns (uint224) { - uint256 len = self._checkpoints.length; - uint256 pos = _upperBinaryLookup(self._checkpoints, key, 0, len); - return pos == 0 ? 0 : _unsafeAccess(self._checkpoints, pos - 1)._value; - } - - /** - * @dev Returns the value in the most recent checkpoint, or zero if there are no checkpoints. - */ - function latest(Trace224 storage self) internal view returns (uint224) { - uint256 pos = self._checkpoints.length; - return pos == 0 ? 0 : _unsafeAccess(self._checkpoints, pos - 1)._value; - } - - /** - * @dev Returns whether there is a checkpoint in the structure (i.e. it is not empty), and if so the key and value - * in the most recent checkpoint. - */ - function latestCheckpoint(Trace224 storage self) - internal - view - returns ( - bool exists, - uint32 _key, - uint224 _value - ) - { - uint256 pos = self._checkpoints.length; - if (pos == 0) { - return (false, 0, 0); - } else { - Checkpoint224 memory ckpt = _unsafeAccess(self._checkpoints, pos - 1); - return (true, ckpt._key, ckpt._value); - } - } - - /** - * @dev Returns the number of checkpoint. - */ - function length(Trace224 storage self) internal view returns (uint256) { - return self._checkpoints.length; - } - - /** - * @dev Pushes a (`key`, `value`) pair into an ordered list of checkpoints, either by inserting a new checkpoint, - * or by updating the last one. - */ - function _insert( - Checkpoint224[] storage self, - uint32 key, - uint224 value - ) private returns (uint224, uint224) { - uint256 pos = self.length; - - if (pos > 0) { - // Copying to memory is important here. - Checkpoint224 memory last = _unsafeAccess(self, pos - 1); - - // Checkpoints keys must be increasing. - require(last._key <= key, "Checkpoint: invalid key"); - - // Update or push new checkpoint - if (last._key == key) { - _unsafeAccess(self, pos - 1)._value = value; - } else { - self.push(Checkpoint224({_key: key, _value: value})); - } - return (last._value, value); - } else { - self.push(Checkpoint224({_key: key, _value: value})); - return (0, value); - } - } - - /** - * @dev Return the index of the oldest checkpoint whose key is greater than the search key, or `high` if there is none. - * `low` and `high` define a section where to do the search, with inclusive `low` and exclusive `high`. - * - * WARNING: `high` should not be greater than the array's length. - */ - function _upperBinaryLookup( - Checkpoint224[] storage self, - uint32 key, - uint256 low, - uint256 high - ) private view returns (uint256) { - while (low < high) { - uint256 mid = MathUpgradeable.average(low, high); - if (_unsafeAccess(self, mid)._key > key) { - high = mid; - } else { - low = mid + 1; - } - } - return high; - } - - /** - * @dev Return the index of the oldest checkpoint whose key is greater or equal than the search key, or `high` if there is none. - * `low` and `high` define a section where to do the search, with inclusive `low` and exclusive `high`. - * - * WARNING: `high` should not be greater than the array's length. - */ - function _lowerBinaryLookup( - Checkpoint224[] storage self, - uint32 key, - uint256 low, - uint256 high - ) private view returns (uint256) { - while (low < high) { - uint256 mid = MathUpgradeable.average(low, high); - if (_unsafeAccess(self, mid)._key < key) { - low = mid + 1; - } else { - high = mid; - } - } - return high; - } - - function _unsafeAccess(Checkpoint224[] storage self, uint256 pos) - private - pure - returns (Checkpoint224 storage result) - { - assembly { - mstore(0, self.slot) - result.slot := add(keccak256(0, 0x20), pos) - } - } - - struct Trace160 { - Checkpoint160[] _checkpoints; - } - - struct Checkpoint160 { - uint96 _key; - uint160 _value; - } - - /** - * @dev Pushes a (`key`, `value`) pair into a Trace160 so that it is stored as the checkpoint. - * - * Returns previous value and new value. - */ - function push( - Trace160 storage self, - uint96 key, - uint160 value - ) internal returns (uint160, uint160) { - return _insert(self._checkpoints, key, value); - } - - /** - * @dev Returns the value in the oldest checkpoint with key greater or equal than the search key, or zero if there is none. - */ - function lowerLookup(Trace160 storage self, uint96 key) internal view returns (uint160) { - uint256 len = self._checkpoints.length; - uint256 pos = _lowerBinaryLookup(self._checkpoints, key, 0, len); - return pos == len ? 0 : _unsafeAccess(self._checkpoints, pos)._value; - } - - /** - * @dev Returns the value in the most recent checkpoint with key lower or equal than the search key. - */ - function upperLookup(Trace160 storage self, uint96 key) internal view returns (uint160) { - uint256 len = self._checkpoints.length; - uint256 pos = _upperBinaryLookup(self._checkpoints, key, 0, len); - return pos == 0 ? 0 : _unsafeAccess(self._checkpoints, pos - 1)._value; - } - - /** - * @dev Returns the value in the most recent checkpoint, or zero if there are no checkpoints. - */ - function latest(Trace160 storage self) internal view returns (uint160) { - uint256 pos = self._checkpoints.length; - return pos == 0 ? 0 : _unsafeAccess(self._checkpoints, pos - 1)._value; - } - - /** - * @dev Returns whether there is a checkpoint in the structure (i.e. it is not empty), and if so the key and value - * in the most recent checkpoint. - */ - function latestCheckpoint(Trace160 storage self) - internal - view - returns ( - bool exists, - uint96 _key, - uint160 _value - ) - { - uint256 pos = self._checkpoints.length; - if (pos == 0) { - return (false, 0, 0); - } else { - Checkpoint160 memory ckpt = _unsafeAccess(self._checkpoints, pos - 1); - return (true, ckpt._key, ckpt._value); - } - } - - /** - * @dev Returns the number of checkpoint. - */ - function length(Trace160 storage self) internal view returns (uint256) { - return self._checkpoints.length; - } - - /** - * @dev Pushes a (`key`, `value`) pair into an ordered list of checkpoints, either by inserting a new checkpoint, - * or by updating the last one. - */ - function _insert( - Checkpoint160[] storage self, - uint96 key, - uint160 value - ) private returns (uint160, uint160) { - uint256 pos = self.length; - - if (pos > 0) { - // Copying to memory is important here. - Checkpoint160 memory last = _unsafeAccess(self, pos - 1); - - // Checkpoints keys must be increasing. - require(last._key <= key, "Checkpoint: invalid key"); - - // Update or push new checkpoint - if (last._key == key) { - _unsafeAccess(self, pos - 1)._value = value; - } else { - self.push(Checkpoint160({_key: key, _value: value})); - } - return (last._value, value); - } else { - self.push(Checkpoint160({_key: key, _value: value})); - return (0, value); - } - } - - /** - * @dev Return the index of the oldest checkpoint whose key is greater than the search key, or `high` if there is none. - * `low` and `high` define a section where to do the search, with inclusive `low` and exclusive `high`. - * - * WARNING: `high` should not be greater than the array's length. - */ - function _upperBinaryLookup( - Checkpoint160[] storage self, - uint96 key, - uint256 low, - uint256 high - ) private view returns (uint256) { - while (low < high) { - uint256 mid = MathUpgradeable.average(low, high); - if (_unsafeAccess(self, mid)._key > key) { - high = mid; - } else { - low = mid + 1; - } - } - return high; - } - - /** - * @dev Return the index of the oldest checkpoint whose key is greater or equal than the search key, or `high` if there is none. - * `low` and `high` define a section where to do the search, with inclusive `low` and exclusive `high`. - * - * WARNING: `high` should not be greater than the array's length. - */ - function _lowerBinaryLookup( - Checkpoint160[] storage self, - uint96 key, - uint256 low, - uint256 high - ) private view returns (uint256) { - while (low < high) { - uint256 mid = MathUpgradeable.average(low, high); - if (_unsafeAccess(self, mid)._key < key) { - low = mid + 1; - } else { - high = mid; - } - } - return high; - } - - function _unsafeAccess(Checkpoint160[] storage self, uint256 pos) - private - pure - returns (Checkpoint160 storage result) - { - assembly { - mstore(0, self.slot) - result.slot := add(keccak256(0, 0x20), pos) - } - } -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol deleted file mode 100644 index 481064e..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol +++ /dev/null @@ -1,37 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/Context.sol) - -pragma solidity ^0.8.0; -import "../proxy/utils/Initializable.sol"; - -/** - * @dev Provides information about the current execution context, including the - * sender of the transaction and its data. While these are generally available - * via msg.sender and msg.data, they should not be accessed in such a direct - * manner, since when dealing with meta-transactions the account sending and - * paying for execution may not be the actual sender (as far as an application - * is concerned). - * - * This contract is only required for intermediate, library-like contracts. - */ -abstract contract ContextUpgradeable is Initializable { - function __Context_init() internal onlyInitializing { - } - - function __Context_init_unchained() internal onlyInitializing { - } - function _msgSender() internal view virtual returns (address) { - return msg.sender; - } - - function _msgData() internal view virtual returns (bytes calldata) { - return msg.data; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/CountersUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/CountersUpgradeable.sol deleted file mode 100644 index cfe7e90..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/CountersUpgradeable.sol +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) - -pragma solidity ^0.8.0; - -/** - * @title Counters - * @author Matt Condon (@shrugs) - * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number - * of elements in a mapping, issuing ERC721 ids, or counting request ids. - * - * Include with `using Counters for Counters.Counter;` - */ -library CountersUpgradeable { - struct Counter { - // This variable should never be directly accessed by users of the library: interactions must be restricted to - // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add - // this feature: see https://github.com/ethereum/solidity/issues/4637 - uint256 _value; // default: 0 - } - - function current(Counter storage counter) internal view returns (uint256) { - return counter._value; - } - - function increment(Counter storage counter) internal { - unchecked { - counter._value += 1; - } - } - - function decrement(Counter storage counter) internal { - uint256 value = counter._value; - require(value > 0, "Counter: decrement overflow"); - unchecked { - counter._value = value - 1; - } - } - - function reset(Counter storage counter) internal { - counter._value = 0; - } -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/Create2Upgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/Create2Upgradeable.sol deleted file mode 100644 index 4d57ee7..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/Create2Upgradeable.sol +++ /dev/null @@ -1,83 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (utils/Create2.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer. - * `CREATE2` can be used to compute in advance the address where a smart - * contract will be deployed, which allows for interesting new mechanisms known - * as 'counterfactual interactions'. - * - * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more - * information. - */ -library Create2Upgradeable { - /** - * @dev Deploys a contract using `CREATE2`. The address where the contract - * will be deployed can be known in advance via {computeAddress}. - * - * The bytecode for a contract can be obtained from Solidity with - * `type(contractName).creationCode`. - * - * Requirements: - * - * - `bytecode` must not be empty. - * - `salt` must have not been used for `bytecode` already. - * - the factory must have a balance of at least `amount`. - * - if `amount` is non-zero, `bytecode` must have a `payable` constructor. - */ - function deploy( - uint256 amount, - bytes32 salt, - bytes memory bytecode - ) internal returns (address addr) { - require(address(this).balance >= amount, "Create2: insufficient balance"); - require(bytecode.length != 0, "Create2: bytecode length is zero"); - /// @solidity memory-safe-assembly - assembly { - addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt) - } - require(addr != address(0), "Create2: Failed on deploy"); - } - - /** - * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the - * `bytecodeHash` or `salt` will result in a new destination address. - */ - function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) { - return computeAddress(salt, bytecodeHash, address(this)); - } - - /** - * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at - * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}. - */ - function computeAddress( - bytes32 salt, - bytes32 bytecodeHash, - address deployer - ) internal pure returns (address addr) { - /// @solidity memory-safe-assembly - assembly { - let ptr := mload(0x40) // Get free memory pointer - - // | | ↓ ptr ... ↓ ptr + 0x0B (start) ... ↓ ptr + 0x20 ... ↓ ptr + 0x40 ... | - // |-------------------|---------------------------------------------------------------------------| - // | bytecodeHash | CCCCCCCCCCCCC...CC | - // | salt | BBBBBBBBBBBBB...BB | - // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA | - // | 0xFF | FF | - // |-------------------|---------------------------------------------------------------------------| - // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC | - // | keccak(start, 85) | ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ | - - mstore(add(ptr, 0x40), bytecodeHash) - mstore(add(ptr, 0x20), salt) - mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes - let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff - mstore8(start, 0xff) - addr := keccak256(start, 85) - } - } -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/MulticallUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/MulticallUpgradeable.sol deleted file mode 100644 index bbdde89..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/MulticallUpgradeable.sol +++ /dev/null @@ -1,51 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (utils/Multicall.sol) - -pragma solidity ^0.8.0; - -import "./AddressUpgradeable.sol"; -import "../proxy/utils/Initializable.sol"; - -/** - * @dev Provides a function to batch together multiple calls in a single external call. - * - * _Available since v4.1._ - */ -abstract contract MulticallUpgradeable is Initializable { - function __Multicall_init() internal onlyInitializing { - } - - function __Multicall_init_unchained() internal onlyInitializing { - } - /** - * @dev Receives and executes a batch of function calls on this contract. - */ - function multicall(bytes[] calldata data) external virtual returns (bytes[] memory results) { - results = new bytes[](data.length); - for (uint256 i = 0; i < data.length; i++) { - results[i] = _functionDelegateCall(address(this), data[i]); - } - return results; - } - - /** - * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], - * but performing a delegate call. - * - * _Available since v3.4._ - */ - function _functionDelegateCall(address target, bytes memory data) private returns (bytes memory) { - require(AddressUpgradeable.isContract(target), "Address: delegate call to non-contract"); - - // solhint-disable-next-line avoid-low-level-calls - (bool success, bytes memory returndata) = target.delegatecall(data); - return AddressUpgradeable.verifyCallResult(success, returndata, "Address: low-level delegate call failed"); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/README.adoc b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/README.adoc deleted file mode 100644 index 7fef825..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/README.adoc +++ /dev/null @@ -1,111 +0,0 @@ -= Utilities - -[.readme-notice] -NOTE: This document is better viewed at https://docs.openzeppelin.com/contracts/api/utils - -Miscellaneous contracts and libraries containing utility functions you can use to improve security, work with new data types, or safely use low-level primitives. - -The {Address}, {Arrays}, {Base64} and {Strings} libraries provide more operations related to these native data types, while {SafeCast} adds ways to safely convert between the different signed and unsigned numeric types. -{Multicall} provides a function to batch together multiple calls in a single external call. - -For new data types: - - * {Counters}: a simple way to get a counter that can only be incremented, decremented or reset. Very useful for ID generation, counting contract activity, among others. - * {EnumerableMap}: like Solidity's https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`] type, but with key-value _enumeration_: this will let you know how many entries a mapping has, and iterate over them (which is not possible with `mapping`). - * {EnumerableSet}: like {EnumerableMap}, but for https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets]. Can be used to store privileged accounts, issued IDs, etc. - -[NOTE] -==== -Because Solidity does not support generic types, {EnumerableMap} and {EnumerableSet} are specialized to a limited number of key-value types. - -As of v3.0, {EnumerableMap} supports `uint256 -> address` (`UintToAddressMap`), and {EnumerableSet} supports `address` and `uint256` (`AddressSet` and `UintSet`). -==== - -Finally, {Create2} contains all necessary utilities to safely use the https://blog.openzeppelin.com/getting-the-most-out-of-create2/[`CREATE2` EVM opcode], without having to deal with low-level assembly. - -== Math - -{{Math}} - -{{SignedMath}} - -{{SafeCast}} - -{{SafeMath}} - -{{SignedSafeMath}} - -== Cryptography - -{{ECDSA}} - -{{SignatureChecker}} - -{{MerkleProof}} - -{{EIP712}} - -== Escrow - -{{ConditionalEscrow}} - -{{Escrow}} - -{{RefundEscrow}} - -== Introspection - -This set of interfaces and contracts deal with https://en.wikipedia.org/wiki/Type_introspection[type introspection] of contracts, that is, examining which functions can be called on them. This is usually referred to as a contract's _interface_. - -Ethereum contracts have no native concept of an interface, so applications must usually simply trust they are not making an incorrect call. For trusted setups this is a non-issue, but often unknown and untrusted third-party addresses need to be interacted with. There may even not be any direct calls to them! (e.g. `ERC20` tokens may be sent to a contract that lacks a way to transfer them out of it, locking them forever). In these cases, a contract _declaring_ its interface can be very helpful in preventing errors. - -There are two main ways to approach this. - -* Locally, where a contract implements `IERC165` and declares an interface, and a second one queries it directly via `ERC165Checker`. -* Globally, where a global and unique registry (`IERC1820Registry`) is used to register implementers of a certain interface (`IERC1820Implementer`). It is then the registry that is queried, which allows for more complex setups, like contracts implementing interfaces for externally-owned accounts. - -Note that, in all cases, accounts simply _declare_ their interfaces, but they are not required to actually implement them. This mechanism can therefore be used to both prevent errors and allow for complex interactions (see `ERC777`), but it must not be relied on for security. - -{{IERC165}} - -{{ERC165}} - -{{ERC165Storage}} - -{{ERC165Checker}} - -{{IERC1820Registry}} - -{{IERC1820Implementer}} - -{{ERC1820Implementer}} - -== Data Structures - -{{BitMaps}} - -{{EnumerableMap}} - -{{EnumerableSet}} - -{{DoubleEndedQueue}} - -{{Checkpoints}} - -== Libraries - -{{Create2}} - -{{Address}} - -{{Arrays}} - -{{Base64}} - -{{Counters}} - -{{Strings}} - -{{StorageSlot}} - -{{Multicall}} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/StorageSlotUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/StorageSlotUpgradeable.sol deleted file mode 100644 index d95ae3c..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/StorageSlotUpgradeable.sol +++ /dev/null @@ -1,88 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Library for reading and writing primitive types to specific storage slots. - * - * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. - * This library helps with reading and writing to such slots without the need for inline assembly. - * - * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. - * - * Example usage to set ERC1967 implementation slot: - * ``` - * contract ERC1967 { - * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; - * - * function _getImplementation() internal view returns (address) { - * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; - * } - * - * function _setImplementation(address newImplementation) internal { - * require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); - * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; - * } - * } - * ``` - * - * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._ - */ -library StorageSlotUpgradeable { - struct AddressSlot { - address value; - } - - struct BooleanSlot { - bool value; - } - - struct Bytes32Slot { - bytes32 value; - } - - struct Uint256Slot { - uint256 value; - } - - /** - * @dev Returns an `AddressSlot` with member `value` located at `slot`. - */ - function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { - /// @solidity memory-safe-assembly - assembly { - r.slot := slot - } - } - - /** - * @dev Returns an `BooleanSlot` with member `value` located at `slot`. - */ - function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { - /// @solidity memory-safe-assembly - assembly { - r.slot := slot - } - } - - /** - * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. - */ - function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { - /// @solidity memory-safe-assembly - assembly { - r.slot := slot - } - } - - /** - * @dev Returns an `Uint256Slot` with member `value` located at `slot`. - */ - function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { - /// @solidity memory-safe-assembly - assembly { - r.slot := slot - } - } -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/StringsUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/StringsUpgradeable.sol deleted file mode 100644 index decfea0..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/StringsUpgradeable.sol +++ /dev/null @@ -1,70 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) - -pragma solidity ^0.8.0; - -import "./math/MathUpgradeable.sol"; - -/** - * @dev String operations. - */ -library StringsUpgradeable { - bytes16 private constant _SYMBOLS = "0123456789abcdef"; - uint8 private constant _ADDRESS_LENGTH = 20; - - /** - * @dev Converts a `uint256` to its ASCII `string` decimal representation. - */ - function toString(uint256 value) internal pure returns (string memory) { - unchecked { - uint256 length = MathUpgradeable.log10(value) + 1; - string memory buffer = new string(length); - uint256 ptr; - /// @solidity memory-safe-assembly - assembly { - ptr := add(buffer, add(32, length)) - } - while (true) { - ptr--; - /// @solidity memory-safe-assembly - assembly { - mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) - } - value /= 10; - if (value == 0) break; - } - return buffer; - } - } - - /** - * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. - */ - function toHexString(uint256 value) internal pure returns (string memory) { - unchecked { - return toHexString(value, MathUpgradeable.log256(value) + 1); - } - } - - /** - * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. - */ - function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { - bytes memory buffer = new bytes(2 * length + 2); - buffer[0] = "0"; - buffer[1] = "x"; - for (uint256 i = 2 * length + 1; i > 1; --i) { - buffer[i] = _SYMBOLS[value & 0xf]; - value >>= 4; - } - require(value == 0, "Strings: hex length insufficient"); - return string(buffer); - } - - /** - * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. - */ - function toHexString(address addr) internal pure returns (string memory) { - return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); - } -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/TimersUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/TimersUpgradeable.sol deleted file mode 100644 index e58325a..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/TimersUpgradeable.sol +++ /dev/null @@ -1,73 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/Timers.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Tooling for timepoints, timers and delays - */ -library TimersUpgradeable { - struct Timestamp { - uint64 _deadline; - } - - function getDeadline(Timestamp memory timer) internal pure returns (uint64) { - return timer._deadline; - } - - function setDeadline(Timestamp storage timer, uint64 timestamp) internal { - timer._deadline = timestamp; - } - - function reset(Timestamp storage timer) internal { - timer._deadline = 0; - } - - function isUnset(Timestamp memory timer) internal pure returns (bool) { - return timer._deadline == 0; - } - - function isStarted(Timestamp memory timer) internal pure returns (bool) { - return timer._deadline > 0; - } - - function isPending(Timestamp memory timer) internal view returns (bool) { - return timer._deadline > block.timestamp; - } - - function isExpired(Timestamp memory timer) internal view returns (bool) { - return isStarted(timer) && timer._deadline <= block.timestamp; - } - - struct BlockNumber { - uint64 _deadline; - } - - function getDeadline(BlockNumber memory timer) internal pure returns (uint64) { - return timer._deadline; - } - - function setDeadline(BlockNumber storage timer, uint64 timestamp) internal { - timer._deadline = timestamp; - } - - function reset(BlockNumber storage timer) internal { - timer._deadline = 0; - } - - function isUnset(BlockNumber memory timer) internal pure returns (bool) { - return timer._deadline == 0; - } - - function isStarted(BlockNumber memory timer) internal pure returns (bool) { - return timer._deadline > 0; - } - - function isPending(BlockNumber memory timer) internal view returns (bool) { - return timer._deadline > block.number; - } - - function isExpired(BlockNumber memory timer) internal view returns (bool) { - return isStarted(timer) && timer._deadline <= block.number; - } -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/cryptography/ECDSAUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/cryptography/ECDSAUpgradeable.sol deleted file mode 100644 index ddab1ee..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/cryptography/ECDSAUpgradeable.sol +++ /dev/null @@ -1,213 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/ECDSA.sol) - -pragma solidity ^0.8.0; - -import "../StringsUpgradeable.sol"; - -/** - * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. - * - * These functions can be used to verify that a message was signed by the holder - * of the private keys of a given address. - */ -library ECDSAUpgradeable { - enum RecoverError { - NoError, - InvalidSignature, - InvalidSignatureLength, - InvalidSignatureS, - InvalidSignatureV // Deprecated in v4.8 - } - - function _throwError(RecoverError error) private pure { - if (error == RecoverError.NoError) { - return; // no error: do nothing - } else if (error == RecoverError.InvalidSignature) { - revert("ECDSA: invalid signature"); - } else if (error == RecoverError.InvalidSignatureLength) { - revert("ECDSA: invalid signature length"); - } else if (error == RecoverError.InvalidSignatureS) { - revert("ECDSA: invalid signature 's' value"); - } - } - - /** - * @dev Returns the address that signed a hashed message (`hash`) with - * `signature` or error string. This address can then be used for verification purposes. - * - * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: - * this function rejects them by requiring the `s` value to be in the lower - * half order, and the `v` value to be either 27 or 28. - * - * IMPORTANT: `hash` _must_ be the result of a hash operation for the - * verification to be secure: it is possible to craft signatures that - * recover to arbitrary addresses for non-hashed data. A safe way to ensure - * this is by receiving a hash of the original message (which may otherwise - * be too long), and then calling {toEthSignedMessageHash} on it. - * - * Documentation for signature generation: - * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] - * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] - * - * _Available since v4.3._ - */ - function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { - if (signature.length == 65) { - bytes32 r; - bytes32 s; - uint8 v; - // ecrecover takes the signature parameters, and the only way to get them - // currently is to use assembly. - /// @solidity memory-safe-assembly - assembly { - r := mload(add(signature, 0x20)) - s := mload(add(signature, 0x40)) - v := byte(0, mload(add(signature, 0x60))) - } - return tryRecover(hash, v, r, s); - } else { - return (address(0), RecoverError.InvalidSignatureLength); - } - } - - /** - * @dev Returns the address that signed a hashed message (`hash`) with - * `signature`. This address can then be used for verification purposes. - * - * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: - * this function rejects them by requiring the `s` value to be in the lower - * half order, and the `v` value to be either 27 or 28. - * - * IMPORTANT: `hash` _must_ be the result of a hash operation for the - * verification to be secure: it is possible to craft signatures that - * recover to arbitrary addresses for non-hashed data. A safe way to ensure - * this is by receiving a hash of the original message (which may otherwise - * be too long), and then calling {toEthSignedMessageHash} on it. - */ - function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { - (address recovered, RecoverError error) = tryRecover(hash, signature); - _throwError(error); - return recovered; - } - - /** - * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. - * - * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] - * - * _Available since v4.3._ - */ - function tryRecover( - bytes32 hash, - bytes32 r, - bytes32 vs - ) internal pure returns (address, RecoverError) { - bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); - uint8 v = uint8((uint256(vs) >> 255) + 27); - return tryRecover(hash, v, r, s); - } - - /** - * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. - * - * _Available since v4.2._ - */ - function recover( - bytes32 hash, - bytes32 r, - bytes32 vs - ) internal pure returns (address) { - (address recovered, RecoverError error) = tryRecover(hash, r, vs); - _throwError(error); - return recovered; - } - - /** - * @dev Overload of {ECDSA-tryRecover} that receives the `v`, - * `r` and `s` signature fields separately. - * - * _Available since v4.3._ - */ - function tryRecover( - bytes32 hash, - uint8 v, - bytes32 r, - bytes32 s - ) internal pure returns (address, RecoverError) { - // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature - // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines - // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most - // signatures from current libraries generate a unique signature with an s-value in the lower half order. - // - // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value - // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or - // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept - // these malleable signatures as well. - if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { - return (address(0), RecoverError.InvalidSignatureS); - } - - // If the signature is valid (and not malleable), return the signer address - address signer = ecrecover(hash, v, r, s); - if (signer == address(0)) { - return (address(0), RecoverError.InvalidSignature); - } - - return (signer, RecoverError.NoError); - } - - /** - * @dev Overload of {ECDSA-recover} that receives the `v`, - * `r` and `s` signature fields separately. - */ - function recover( - bytes32 hash, - uint8 v, - bytes32 r, - bytes32 s - ) internal pure returns (address) { - (address recovered, RecoverError error) = tryRecover(hash, v, r, s); - _throwError(error); - return recovered; - } - - /** - * @dev Returns an Ethereum Signed Message, created from a `hash`. This - * produces hash corresponding to the one signed with the - * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] - * JSON-RPC method as part of EIP-191. - * - * See {recover}. - */ - function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { - // 32 is the length in bytes of hash, - // enforced by the type signature above - return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); - } - - /** - * @dev Returns an Ethereum Signed Message, created from `s`. This - * produces hash corresponding to the one signed with the - * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] - * JSON-RPC method as part of EIP-191. - * - * See {recover}. - */ - function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { - return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", StringsUpgradeable.toString(s.length), s)); - } - - /** - * @dev Returns an Ethereum Signed Typed Data, created from a - * `domainSeparator` and a `structHash`. This produces hash corresponding - * to the one signed with the - * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] - * JSON-RPC method as part of EIP-712. - * - * See {recover}. - */ - function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { - return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); - } -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/cryptography/EIP712Upgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/cryptography/EIP712Upgradeable.sol deleted file mode 100644 index 60c927e..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/cryptography/EIP712Upgradeable.sol +++ /dev/null @@ -1,120 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -import "./ECDSAUpgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -/** - * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. - * - * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, - * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding - * they need in their contracts using a combination of `abi.encode` and `keccak256`. - * - * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding - * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA - * ({_hashTypedDataV4}). - * - * The implementation of the domain separator was designed to be as efficient as possible while still properly updating - * the chain id to protect against replay attacks on an eventual fork of the chain. - * - * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method - * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. - * - * _Available since v3.4._ - * - * @custom:storage-size 52 - */ -abstract contract EIP712Upgradeable is Initializable { - /* solhint-disable var-name-mixedcase */ - bytes32 private _HASHED_NAME; - bytes32 private _HASHED_VERSION; - bytes32 private constant _TYPE_HASH = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"); - - /* solhint-enable var-name-mixedcase */ - - /** - * @dev Initializes the domain separator and parameter caches. - * - * The meaning of `name` and `version` is specified in - * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: - * - * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. - * - `version`: the current major version of the signing domain. - * - * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart - * contract upgrade]. - */ - function __EIP712_init(string memory name, string memory version) internal onlyInitializing { - __EIP712_init_unchained(name, version); - } - - function __EIP712_init_unchained(string memory name, string memory version) internal onlyInitializing { - bytes32 hashedName = keccak256(bytes(name)); - bytes32 hashedVersion = keccak256(bytes(version)); - _HASHED_NAME = hashedName; - _HASHED_VERSION = hashedVersion; - } - - /** - * @dev Returns the domain separator for the current chain. - */ - function _domainSeparatorV4() internal view returns (bytes32) { - return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash()); - } - - function _buildDomainSeparator( - bytes32 typeHash, - bytes32 nameHash, - bytes32 versionHash - ) private view returns (bytes32) { - return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this))); - } - - /** - * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this - * function returns the hash of the fully encoded EIP712 message for this domain. - * - * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: - * - * ```solidity - * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( - * keccak256("Mail(address to,string contents)"), - * mailTo, - * keccak256(bytes(mailContents)) - * ))); - * address signer = ECDSA.recover(digest, signature); - * ``` - */ - function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { - return ECDSAUpgradeable.toTypedDataHash(_domainSeparatorV4(), structHash); - } - - /** - * @dev The hash of the name parameter for the EIP712 domain. - * - * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs - * are a concern. - */ - function _EIP712NameHash() internal virtual view returns (bytes32) { - return _HASHED_NAME; - } - - /** - * @dev The hash of the version parameter for the EIP712 domain. - * - * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs - * are a concern. - */ - function _EIP712VersionHash() internal virtual view returns (bytes32) { - return _HASHED_VERSION; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/cryptography/MerkleProofUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/cryptography/MerkleProofUpgradeable.sol deleted file mode 100644 index 5dc8b2b..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/cryptography/MerkleProofUpgradeable.sol +++ /dev/null @@ -1,223 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol) - -pragma solidity ^0.8.0; - -/** - * @dev These functions deal with verification of Merkle Tree proofs. - * - * The tree and the proofs can be generated using our - * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. - * You will find a quickstart guide in the readme. - * - * WARNING: You should avoid using leaf values that are 64 bytes long prior to - * hashing, or use a hash function other than keccak256 for hashing leaves. - * This is because the concatenation of a sorted pair of internal nodes in - * the merkle tree could be reinterpreted as a leaf value. - * OpenZeppelin's JavaScript library generates merkle trees that are safe - * against this attack out of the box. - */ -library MerkleProofUpgradeable { - /** - * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree - * defined by `root`. For this, a `proof` must be provided, containing - * sibling hashes on the branch from the leaf to the root of the tree. Each - * pair of leaves and each pair of pre-images are assumed to be sorted. - */ - function verify( - bytes32[] memory proof, - bytes32 root, - bytes32 leaf - ) internal pure returns (bool) { - return processProof(proof, leaf) == root; - } - - /** - * @dev Calldata version of {verify} - * - * _Available since v4.7._ - */ - function verifyCalldata( - bytes32[] calldata proof, - bytes32 root, - bytes32 leaf - ) internal pure returns (bool) { - return processProofCalldata(proof, leaf) == root; - } - - /** - * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up - * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt - * hash matches the root of the tree. When processing the proof, the pairs - * of leafs & pre-images are assumed to be sorted. - * - * _Available since v4.4._ - */ - function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { - bytes32 computedHash = leaf; - for (uint256 i = 0; i < proof.length; i++) { - computedHash = _hashPair(computedHash, proof[i]); - } - return computedHash; - } - - /** - * @dev Calldata version of {processProof} - * - * _Available since v4.7._ - */ - function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { - bytes32 computedHash = leaf; - for (uint256 i = 0; i < proof.length; i++) { - computedHash = _hashPair(computedHash, proof[i]); - } - return computedHash; - } - - /** - * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by - * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. - * - * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. - * - * _Available since v4.7._ - */ - function multiProofVerify( - bytes32[] memory proof, - bool[] memory proofFlags, - bytes32 root, - bytes32[] memory leaves - ) internal pure returns (bool) { - return processMultiProof(proof, proofFlags, leaves) == root; - } - - /** - * @dev Calldata version of {multiProofVerify} - * - * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. - * - * _Available since v4.7._ - */ - function multiProofVerifyCalldata( - bytes32[] calldata proof, - bool[] calldata proofFlags, - bytes32 root, - bytes32[] memory leaves - ) internal pure returns (bool) { - return processMultiProofCalldata(proof, proofFlags, leaves) == root; - } - - /** - * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction - * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another - * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false - * respectively. - * - * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree - * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the - * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). - * - * _Available since v4.7._ - */ - function processMultiProof( - bytes32[] memory proof, - bool[] memory proofFlags, - bytes32[] memory leaves - ) internal pure returns (bytes32 merkleRoot) { - // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by - // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the - // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of - // the merkle tree. - uint256 leavesLen = leaves.length; - uint256 totalHashes = proofFlags.length; - - // Check proof validity. - require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); - - // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using - // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". - bytes32[] memory hashes = new bytes32[](totalHashes); - uint256 leafPos = 0; - uint256 hashPos = 0; - uint256 proofPos = 0; - // At each step, we compute the next hash using two values: - // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we - // get the next hash. - // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the - // `proof` array. - for (uint256 i = 0; i < totalHashes; i++) { - bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; - bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; - hashes[i] = _hashPair(a, b); - } - - if (totalHashes > 0) { - return hashes[totalHashes - 1]; - } else if (leavesLen > 0) { - return leaves[0]; - } else { - return proof[0]; - } - } - - /** - * @dev Calldata version of {processMultiProof}. - * - * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. - * - * _Available since v4.7._ - */ - function processMultiProofCalldata( - bytes32[] calldata proof, - bool[] calldata proofFlags, - bytes32[] memory leaves - ) internal pure returns (bytes32 merkleRoot) { - // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by - // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the - // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of - // the merkle tree. - uint256 leavesLen = leaves.length; - uint256 totalHashes = proofFlags.length; - - // Check proof validity. - require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); - - // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using - // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". - bytes32[] memory hashes = new bytes32[](totalHashes); - uint256 leafPos = 0; - uint256 hashPos = 0; - uint256 proofPos = 0; - // At each step, we compute the next hash using two values: - // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we - // get the next hash. - // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the - // `proof` array. - for (uint256 i = 0; i < totalHashes; i++) { - bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; - bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; - hashes[i] = _hashPair(a, b); - } - - if (totalHashes > 0) { - return hashes[totalHashes - 1]; - } else if (leavesLen > 0) { - return leaves[0]; - } else { - return proof[0]; - } - } - - function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { - return a < b ? _efficientHash(a, b) : _efficientHash(b, a); - } - - function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { - /// @solidity memory-safe-assembly - assembly { - mstore(0x00, a) - mstore(0x20, b) - value := keccak256(0x00, 0x40) - } - } -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/cryptography/SignatureCheckerUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/cryptography/SignatureCheckerUpgradeable.sol deleted file mode 100644 index 8c95692..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/cryptography/SignatureCheckerUpgradeable.sol +++ /dev/null @@ -1,41 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/SignatureChecker.sol) - -pragma solidity ^0.8.0; - -import "./ECDSAUpgradeable.sol"; -import "../../interfaces/IERC1271Upgradeable.sol"; - -/** - * @dev Signature verification helper that can be used instead of `ECDSA.recover` to seamlessly support both ECDSA - * signatures from externally owned accounts (EOAs) as well as ERC1271 signatures from smart contract wallets like - * Argent and Gnosis Safe. - * - * _Available since v4.1._ - */ -library SignatureCheckerUpgradeable { - /** - * @dev Checks if a signature is valid for a given signer and data hash. If the signer is a smart contract, the - * signature is validated against that smart contract using ERC1271, otherwise it's validated using `ECDSA.recover`. - * - * NOTE: Unlike ECDSA signatures, contract signatures are revocable, and the outcome of this function can thus - * change through time. It could return true at block N and false at block N+1 (or the opposite). - */ - function isValidSignatureNow( - address signer, - bytes32 hash, - bytes memory signature - ) internal view returns (bool) { - (address recovered, ECDSAUpgradeable.RecoverError error) = ECDSAUpgradeable.tryRecover(hash, signature); - if (error == ECDSAUpgradeable.RecoverError.NoError && recovered == signer) { - return true; - } - - (bool success, bytes memory result) = signer.staticcall( - abi.encodeWithSelector(IERC1271Upgradeable.isValidSignature.selector, hash, signature) - ); - return (success && - result.length == 32 && - abi.decode(result, (bytes32)) == bytes32(IERC1271Upgradeable.isValidSignature.selector)); - } -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/cryptography/draft-EIP712Upgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/cryptography/draft-EIP712Upgradeable.sol deleted file mode 100644 index 3314813..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/cryptography/draft-EIP712Upgradeable.sol +++ /dev/null @@ -1,7 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -// EIP-712 is Final as of 2022-08-11. This file is deprecated. - -import "./EIP712Upgradeable.sol"; diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/escrow/ConditionalEscrowUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/escrow/ConditionalEscrowUpgradeable.sol deleted file mode 100644 index 9c7e02b..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/escrow/ConditionalEscrowUpgradeable.sol +++ /dev/null @@ -1,39 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/escrow/ConditionalEscrow.sol) - -pragma solidity ^0.8.0; - -import "./EscrowUpgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -/** - * @title ConditionalEscrow - * @dev Base abstract escrow to only allow withdrawal if a condition is met. - * @dev Intended usage: See {Escrow}. Same usage guidelines apply here. - */ -abstract contract ConditionalEscrowUpgradeable is Initializable, EscrowUpgradeable { - function __ConditionalEscrow_init() internal onlyInitializing { - __Ownable_init_unchained(); - } - - function __ConditionalEscrow_init_unchained() internal onlyInitializing { - } - /** - * @dev Returns whether an address is allowed to withdraw their funds. To be - * implemented by derived contracts. - * @param payee The destination address of the funds. - */ - function withdrawalAllowed(address payee) public view virtual returns (bool); - - function withdraw(address payable payee) public virtual override { - require(withdrawalAllowed(payee), "ConditionalEscrow: payee is not allowed to withdraw"); - super.withdraw(payee); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/escrow/EscrowUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/escrow/EscrowUpgradeable.sol deleted file mode 100644 index 4174037..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/escrow/EscrowUpgradeable.sol +++ /dev/null @@ -1,84 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (utils/escrow/Escrow.sol) - -pragma solidity ^0.8.0; - -import "../../access/OwnableUpgradeable.sol"; -import "../AddressUpgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -/** - * @title Escrow - * @dev Base escrow contract, holds funds designated for a payee until they - * withdraw them. - * - * Intended usage: This contract (and derived escrow contracts) should be a - * standalone contract, that only interacts with the contract that instantiated - * it. That way, it is guaranteed that all Ether will be handled according to - * the `Escrow` rules, and there is no need to check for payable functions or - * transfers in the inheritance tree. The contract that uses the escrow as its - * payment method should be its owner, and provide public methods redirecting - * to the escrow's deposit and withdraw. - */ -contract EscrowUpgradeable is Initializable, OwnableUpgradeable { - function __Escrow_init() internal onlyInitializing { - __Ownable_init_unchained(); - } - - function __Escrow_init_unchained() internal onlyInitializing { - } - function initialize() public virtual initializer { - __Escrow_init(); - } - using AddressUpgradeable for address payable; - - event Deposited(address indexed payee, uint256 weiAmount); - event Withdrawn(address indexed payee, uint256 weiAmount); - - mapping(address => uint256) private _deposits; - - function depositsOf(address payee) public view returns (uint256) { - return _deposits[payee]; - } - - /** - * @dev Stores the sent amount as credit to be withdrawn. - * @param payee The destination address of the funds. - * - * Emits a {Deposited} event. - */ - function deposit(address payee) public payable virtual onlyOwner { - uint256 amount = msg.value; - _deposits[payee] += amount; - emit Deposited(payee, amount); - } - - /** - * @dev Withdraw accumulated balance for a payee, forwarding all gas to the - * recipient. - * - * WARNING: Forwarding all gas opens the door to reentrancy vulnerabilities. - * Make sure you trust the recipient, or are either following the - * checks-effects-interactions pattern or using {ReentrancyGuard}. - * - * @param payee The address whose funds will be withdrawn and transferred to. - * - * Emits a {Withdrawn} event. - */ - function withdraw(address payable payee) public virtual onlyOwner { - uint256 payment = _deposits[payee]; - - _deposits[payee] = 0; - - payee.sendValue(payment); - - emit Withdrawn(payee, payment); - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/escrow/RefundEscrowUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/escrow/RefundEscrowUpgradeable.sol deleted file mode 100644 index f2bb794..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/escrow/RefundEscrowUpgradeable.sol +++ /dev/null @@ -1,113 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/escrow/RefundEscrow.sol) - -pragma solidity ^0.8.0; - -import "./ConditionalEscrowUpgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -/** - * @title RefundEscrow - * @dev Escrow that holds funds for a beneficiary, deposited from multiple - * parties. - * @dev Intended usage: See {Escrow}. Same usage guidelines apply here. - * @dev The owner account (that is, the contract that instantiates this - * contract) may deposit, close the deposit period, and allow for either - * withdrawal by the beneficiary, or refunds to the depositors. All interactions - * with `RefundEscrow` will be made through the owner contract. - */ -contract RefundEscrowUpgradeable is Initializable, ConditionalEscrowUpgradeable { - using AddressUpgradeable for address payable; - - enum State { - Active, - Refunding, - Closed - } - - event RefundsClosed(); - event RefundsEnabled(); - - State private _state; - address payable private _beneficiary; - - /** - * @dev Constructor. - * @param beneficiary_ The beneficiary of the deposits. - */ - function __RefundEscrow_init(address payable beneficiary_) internal onlyInitializing { - __Ownable_init_unchained(); - __RefundEscrow_init_unchained(beneficiary_); - } - - function __RefundEscrow_init_unchained(address payable beneficiary_) internal onlyInitializing { - require(beneficiary_ != address(0), "RefundEscrow: beneficiary is the zero address"); - _beneficiary = beneficiary_; - _state = State.Active; - } - - /** - * @return The current state of the escrow. - */ - function state() public view virtual returns (State) { - return _state; - } - - /** - * @return The beneficiary of the escrow. - */ - function beneficiary() public view virtual returns (address payable) { - return _beneficiary; - } - - /** - * @dev Stores funds that may later be refunded. - * @param refundee The address funds will be sent to if a refund occurs. - */ - function deposit(address refundee) public payable virtual override { - require(state() == State.Active, "RefundEscrow: can only deposit while active"); - super.deposit(refundee); - } - - /** - * @dev Allows for the beneficiary to withdraw their funds, rejecting - * further deposits. - */ - function close() public virtual onlyOwner { - require(state() == State.Active, "RefundEscrow: can only close while active"); - _state = State.Closed; - emit RefundsClosed(); - } - - /** - * @dev Allows for refunds to take place, rejecting further deposits. - */ - function enableRefunds() public virtual onlyOwner { - require(state() == State.Active, "RefundEscrow: can only enable refunds while active"); - _state = State.Refunding; - emit RefundsEnabled(); - } - - /** - * @dev Withdraws the beneficiary's funds. - */ - function beneficiaryWithdraw() public virtual { - require(state() == State.Closed, "RefundEscrow: beneficiary can only withdraw while closed"); - beneficiary().sendValue(address(this).balance); - } - - /** - * @dev Returns whether refundees can withdraw their deposits (be refunded). The overridden function receives a - * 'payee' argument, but we ignore it here since the condition is global, not per-payee. - */ - function withdrawalAllowed(address) public view override returns (bool) { - return state() == State.Refunding; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/introspection/ERC165CheckerUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/introspection/ERC165CheckerUpgradeable.sol deleted file mode 100644 index f98bd0a..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/introspection/ERC165CheckerUpgradeable.sol +++ /dev/null @@ -1,123 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165Checker.sol) - -pragma solidity ^0.8.0; - -import "./IERC165Upgradeable.sol"; - -/** - * @dev Library used to query support of an interface declared via {IERC165}. - * - * Note that these functions return the actual result of the query: they do not - * `revert` if an interface is not supported. It is up to the caller to decide - * what to do in these cases. - */ -library ERC165CheckerUpgradeable { - // As per the EIP-165 spec, no interface should ever match 0xffffffff - bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff; - - /** - * @dev Returns true if `account` supports the {IERC165} interface. - */ - function supportsERC165(address account) internal view returns (bool) { - // Any contract that implements ERC165 must explicitly indicate support of - // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid - return - supportsERC165InterfaceUnchecked(account, type(IERC165Upgradeable).interfaceId) && - !supportsERC165InterfaceUnchecked(account, _INTERFACE_ID_INVALID); - } - - /** - * @dev Returns true if `account` supports the interface defined by - * `interfaceId`. Support for {IERC165} itself is queried automatically. - * - * See {IERC165-supportsInterface}. - */ - function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) { - // query support of both ERC165 as per the spec and support of _interfaceId - return supportsERC165(account) && supportsERC165InterfaceUnchecked(account, interfaceId); - } - - /** - * @dev Returns a boolean array where each value corresponds to the - * interfaces passed in and whether they're supported or not. This allows - * you to batch check interfaces for a contract where your expectation - * is that some interfaces may not be supported. - * - * See {IERC165-supportsInterface}. - * - * _Available since v3.4._ - */ - function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) - internal - view - returns (bool[] memory) - { - // an array of booleans corresponding to interfaceIds and whether they're supported or not - bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length); - - // query support of ERC165 itself - if (supportsERC165(account)) { - // query support of each interface in interfaceIds - for (uint256 i = 0; i < interfaceIds.length; i++) { - interfaceIdsSupported[i] = supportsERC165InterfaceUnchecked(account, interfaceIds[i]); - } - } - - return interfaceIdsSupported; - } - - /** - * @dev Returns true if `account` supports all the interfaces defined in - * `interfaceIds`. Support for {IERC165} itself is queried automatically. - * - * Batch-querying can lead to gas savings by skipping repeated checks for - * {IERC165} support. - * - * See {IERC165-supportsInterface}. - */ - function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) { - // query support of ERC165 itself - if (!supportsERC165(account)) { - return false; - } - - // query support of each interface in interfaceIds - for (uint256 i = 0; i < interfaceIds.length; i++) { - if (!supportsERC165InterfaceUnchecked(account, interfaceIds[i])) { - return false; - } - } - - // all interfaces supported - return true; - } - - /** - * @notice Query if a contract implements an interface, does not check ERC165 support - * @param account The address of the contract to query for support of an interface - * @param interfaceId The interface identifier, as specified in ERC-165 - * @return true if the contract at account indicates support of the interface with - * identifier interfaceId, false otherwise - * @dev Assumes that account contains a contract that supports ERC165, otherwise - * the behavior of this method is undefined. This precondition can be checked - * with {supportsERC165}. - * Interface identification is specified in ERC-165. - */ - function supportsERC165InterfaceUnchecked(address account, bytes4 interfaceId) internal view returns (bool) { - // prepare call - bytes memory encodedParams = abi.encodeWithSelector(IERC165Upgradeable.supportsInterface.selector, interfaceId); - - // perform static call - bool success; - uint256 returnSize; - uint256 returnValue; - assembly { - success := staticcall(30000, account, add(encodedParams, 0x20), mload(encodedParams), 0x00, 0x20) - returnSize := returndatasize() - returnValue := mload(0x00) - } - - return success && returnSize >= 0x20 && returnValue > 0; - } -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/introspection/ERC165StorageUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/introspection/ERC165StorageUpgradeable.sol deleted file mode 100644 index 549e646..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/introspection/ERC165StorageUpgradeable.sol +++ /dev/null @@ -1,55 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165Storage.sol) - -pragma solidity ^0.8.0; - -import "./ERC165Upgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -/** - * @dev Storage based implementation of the {IERC165} interface. - * - * Contracts may inherit from this and call {_registerInterface} to declare - * their support of an interface. - */ -abstract contract ERC165StorageUpgradeable is Initializable, ERC165Upgradeable { - function __ERC165Storage_init() internal onlyInitializing { - } - - function __ERC165Storage_init_unchained() internal onlyInitializing { - } - /** - * @dev Mapping of interface ids to whether or not it's supported. - */ - mapping(bytes4 => bool) private _supportedInterfaces; - - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { - return super.supportsInterface(interfaceId) || _supportedInterfaces[interfaceId]; - } - - /** - * @dev Registers the contract as an implementer of the interface defined by - * `interfaceId`. Support of the actual ERC165 interface is automatic and - * registering its interface id is not required. - * - * See {IERC165-supportsInterface}. - * - * Requirements: - * - * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). - */ - function _registerInterface(bytes4 interfaceId) internal virtual { - require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); - _supportedInterfaces[interfaceId] = true; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/introspection/ERC165Upgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/introspection/ERC165Upgradeable.sol deleted file mode 100644 index 90158f0..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/introspection/ERC165Upgradeable.sol +++ /dev/null @@ -1,42 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) - -pragma solidity ^0.8.0; - -import "./IERC165Upgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -/** - * @dev Implementation of the {IERC165} interface. - * - * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check - * for the additional interface id that will be supported. For example: - * - * ```solidity - * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { - * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); - * } - * ``` - * - * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. - */ -abstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable { - function __ERC165_init() internal onlyInitializing { - } - - function __ERC165_init_unchained() internal onlyInitializing { - } - /** - * @dev See {IERC165-supportsInterface}. - */ - function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { - return interfaceId == type(IERC165Upgradeable).interfaceId; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[50] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/introspection/ERC1820ImplementerUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/introspection/ERC1820ImplementerUpgradeable.sol deleted file mode 100644 index a047452..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/introspection/ERC1820ImplementerUpgradeable.sol +++ /dev/null @@ -1,57 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC1820Implementer.sol) - -pragma solidity ^0.8.0; - -import "./IERC1820ImplementerUpgradeable.sol"; -import "../../proxy/utils/Initializable.sol"; - -/** - * @dev Implementation of the {IERC1820Implementer} interface. - * - * Contracts may inherit from this and call {_registerInterfaceForAddress} to - * declare their willingness to be implementers. - * {IERC1820Registry-setInterfaceImplementer} should then be called for the - * registration to be complete. - */ -contract ERC1820ImplementerUpgradeable is Initializable, IERC1820ImplementerUpgradeable { - function __ERC1820Implementer_init() internal onlyInitializing { - } - - function __ERC1820Implementer_init_unchained() internal onlyInitializing { - } - bytes32 private constant _ERC1820_ACCEPT_MAGIC = keccak256("ERC1820_ACCEPT_MAGIC"); - - mapping(bytes32 => mapping(address => bool)) private _supportedInterfaces; - - /** - * @dev See {IERC1820Implementer-canImplementInterfaceForAddress}. - */ - function canImplementInterfaceForAddress(bytes32 interfaceHash, address account) - public - view - virtual - override - returns (bytes32) - { - return _supportedInterfaces[interfaceHash][account] ? _ERC1820_ACCEPT_MAGIC : bytes32(0x00); - } - - /** - * @dev Declares the contract as willing to be an implementer of - * `interfaceHash` for `account`. - * - * See {IERC1820Registry-setInterfaceImplementer} and - * {IERC1820Registry-interfaceHash}. - */ - function _registerInterfaceForAddress(bytes32 interfaceHash, address account) internal virtual { - _supportedInterfaces[interfaceHash][account] = true; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[49] private __gap; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/introspection/IERC165Upgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/introspection/IERC165Upgradeable.sol deleted file mode 100644 index 26fc1d7..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/introspection/IERC165Upgradeable.sol +++ /dev/null @@ -1,25 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Interface of the ERC165 standard, as defined in the - * https://eips.ethereum.org/EIPS/eip-165[EIP]. - * - * Implementers can declare support of contract interfaces, which can then be - * queried by others ({ERC165Checker}). - * - * For an implementation, see {ERC165}. - */ -interface IERC165Upgradeable { - /** - * @dev Returns true if this contract implements the interface defined by - * `interfaceId`. See the corresponding - * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] - * to learn more about how these ids are created. - * - * This function call must use less than 30 000 gas. - */ - function supportsInterface(bytes4 interfaceId) external view returns (bool); -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/introspection/IERC1820ImplementerUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/introspection/IERC1820ImplementerUpgradeable.sol deleted file mode 100644 index 7a19d89..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/introspection/IERC1820ImplementerUpgradeable.sol +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC1820Implementer.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Interface for an ERC1820 implementer, as defined in the - * https://eips.ethereum.org/EIPS/eip-1820#interface-implementation-erc1820implementerinterface[EIP]. - * Used by contracts that will be registered as implementers in the - * {IERC1820Registry}. - */ -interface IERC1820ImplementerUpgradeable { - /** - * @dev Returns a special value (`ERC1820_ACCEPT_MAGIC`) if this contract - * implements `interfaceHash` for `account`. - * - * See {IERC1820Registry-setInterfaceImplementer}. - */ - function canImplementInterfaceForAddress(bytes32 interfaceHash, address account) external view returns (bytes32); -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/introspection/IERC1820RegistryUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/introspection/IERC1820RegistryUpgradeable.sol deleted file mode 100644 index 7755f31..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/introspection/IERC1820RegistryUpgradeable.sol +++ /dev/null @@ -1,116 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (utils/introspection/IERC1820Registry.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Interface of the global ERC1820 Registry, as defined in the - * https://eips.ethereum.org/EIPS/eip-1820[EIP]. Accounts may register - * implementers for interfaces in this registry, as well as query support. - * - * Implementers may be shared by multiple accounts, and can also implement more - * than a single interface for each account. Contracts can implement interfaces - * for themselves, but externally-owned accounts (EOA) must delegate this to a - * contract. - * - * {IERC165} interfaces can also be queried via the registry. - * - * For an in-depth explanation and source code analysis, see the EIP text. - */ -interface IERC1820RegistryUpgradeable { - event InterfaceImplementerSet(address indexed account, bytes32 indexed interfaceHash, address indexed implementer); - - event ManagerChanged(address indexed account, address indexed newManager); - - /** - * @dev Sets `newManager` as the manager for `account`. A manager of an - * account is able to set interface implementers for it. - * - * By default, each account is its own manager. Passing a value of `0x0` in - * `newManager` will reset the manager to this initial state. - * - * Emits a {ManagerChanged} event. - * - * Requirements: - * - * - the caller must be the current manager for `account`. - */ - function setManager(address account, address newManager) external; - - /** - * @dev Returns the manager for `account`. - * - * See {setManager}. - */ - function getManager(address account) external view returns (address); - - /** - * @dev Sets the `implementer` contract as ``account``'s implementer for - * `interfaceHash`. - * - * `account` being the zero address is an alias for the caller's address. - * The zero address can also be used in `implementer` to remove an old one. - * - * See {interfaceHash} to learn how these are created. - * - * Emits an {InterfaceImplementerSet} event. - * - * Requirements: - * - * - the caller must be the current manager for `account`. - * - `interfaceHash` must not be an {IERC165} interface id (i.e. it must not - * end in 28 zeroes). - * - `implementer` must implement {IERC1820Implementer} and return true when - * queried for support, unless `implementer` is the caller. See - * {IERC1820Implementer-canImplementInterfaceForAddress}. - */ - function setInterfaceImplementer( - address account, - bytes32 _interfaceHash, - address implementer - ) external; - - /** - * @dev Returns the implementer of `interfaceHash` for `account`. If no such - * implementer is registered, returns the zero address. - * - * If `interfaceHash` is an {IERC165} interface id (i.e. it ends with 28 - * zeroes), `account` will be queried for support of it. - * - * `account` being the zero address is an alias for the caller's address. - */ - function getInterfaceImplementer(address account, bytes32 _interfaceHash) external view returns (address); - - /** - * @dev Returns the interface hash for an `interfaceName`, as defined in the - * corresponding - * https://eips.ethereum.org/EIPS/eip-1820#interface-name[section of the EIP]. - */ - function interfaceHash(string calldata interfaceName) external pure returns (bytes32); - - /** - * @notice Updates the cache with whether the contract implements an ERC165 interface or not. - * @param account Address of the contract for which to update the cache. - * @param interfaceId ERC165 interface for which to update the cache. - */ - function updateERC165Cache(address account, bytes4 interfaceId) external; - - /** - * @notice Checks whether a contract implements an ERC165 interface or not. - * If the result is not cached a direct lookup on the contract address is performed. - * If the result is not cached or the cached value is out-of-date, the cache MUST be updated manually by calling - * {updateERC165Cache} with the contract address. - * @param account Address of the contract to check. - * @param interfaceId ERC165 interface to check. - * @return True if `account` implements `interfaceId`, false otherwise. - */ - function implementsERC165Interface(address account, bytes4 interfaceId) external view returns (bool); - - /** - * @notice Checks whether a contract implements an ERC165 interface or not without using or updating the cache. - * @param account Address of the contract to check. - * @param interfaceId ERC165 interface to check. - * @return True if `account` implements `interfaceId`, false otherwise. - */ - function implementsERC165InterfaceNoCache(address account, bytes4 interfaceId) external view returns (bool); -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/math/MathUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/math/MathUpgradeable.sol deleted file mode 100644 index 1b9436a..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/math/MathUpgradeable.sol +++ /dev/null @@ -1,345 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Standard math utilities missing in the Solidity language. - */ -library MathUpgradeable { - enum Rounding { - Down, // Toward negative infinity - Up, // Toward infinity - Zero // Toward zero - } - - /** - * @dev Returns the largest of two numbers. - */ - function max(uint256 a, uint256 b) internal pure returns (uint256) { - return a > b ? a : b; - } - - /** - * @dev Returns the smallest of two numbers. - */ - function min(uint256 a, uint256 b) internal pure returns (uint256) { - return a < b ? a : b; - } - - /** - * @dev Returns the average of two numbers. The result is rounded towards - * zero. - */ - function average(uint256 a, uint256 b) internal pure returns (uint256) { - // (a + b) / 2 can overflow. - return (a & b) + (a ^ b) / 2; - } - - /** - * @dev Returns the ceiling of the division of two numbers. - * - * This differs from standard division with `/` in that it rounds up instead - * of rounding down. - */ - function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { - // (a + b - 1) / b can overflow on addition, so we distribute. - return a == 0 ? 0 : (a - 1) / b + 1; - } - - /** - * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 - * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) - * with further edits by Uniswap Labs also under MIT license. - */ - function mulDiv( - uint256 x, - uint256 y, - uint256 denominator - ) internal pure returns (uint256 result) { - unchecked { - // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use - // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 - // variables such that product = prod1 * 2^256 + prod0. - uint256 prod0; // Least significant 256 bits of the product - uint256 prod1; // Most significant 256 bits of the product - assembly { - let mm := mulmod(x, y, not(0)) - prod0 := mul(x, y) - prod1 := sub(sub(mm, prod0), lt(mm, prod0)) - } - - // Handle non-overflow cases, 256 by 256 division. - if (prod1 == 0) { - return prod0 / denominator; - } - - // Make sure the result is less than 2^256. Also prevents denominator == 0. - require(denominator > prod1); - - /////////////////////////////////////////////// - // 512 by 256 division. - /////////////////////////////////////////////// - - // Make division exact by subtracting the remainder from [prod1 prod0]. - uint256 remainder; - assembly { - // Compute remainder using mulmod. - remainder := mulmod(x, y, denominator) - - // Subtract 256 bit number from 512 bit number. - prod1 := sub(prod1, gt(remainder, prod0)) - prod0 := sub(prod0, remainder) - } - - // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. - // See https://cs.stackexchange.com/q/138556/92363. - - // Does not overflow because the denominator cannot be zero at this stage in the function. - uint256 twos = denominator & (~denominator + 1); - assembly { - // Divide denominator by twos. - denominator := div(denominator, twos) - - // Divide [prod1 prod0] by twos. - prod0 := div(prod0, twos) - - // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. - twos := add(div(sub(0, twos), twos), 1) - } - - // Shift in bits from prod1 into prod0. - prod0 |= prod1 * twos; - - // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such - // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for - // four bits. That is, denominator * inv = 1 mod 2^4. - uint256 inverse = (3 * denominator) ^ 2; - - // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works - // in modular arithmetic, doubling the correct bits in each step. - inverse *= 2 - denominator * inverse; // inverse mod 2^8 - inverse *= 2 - denominator * inverse; // inverse mod 2^16 - inverse *= 2 - denominator * inverse; // inverse mod 2^32 - inverse *= 2 - denominator * inverse; // inverse mod 2^64 - inverse *= 2 - denominator * inverse; // inverse mod 2^128 - inverse *= 2 - denominator * inverse; // inverse mod 2^256 - - // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. - // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is - // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 - // is no longer required. - result = prod0 * inverse; - return result; - } - } - - /** - * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. - */ - function mulDiv( - uint256 x, - uint256 y, - uint256 denominator, - Rounding rounding - ) internal pure returns (uint256) { - uint256 result = mulDiv(x, y, denominator); - if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { - result += 1; - } - return result; - } - - /** - * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. - * - * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). - */ - function sqrt(uint256 a) internal pure returns (uint256) { - if (a == 0) { - return 0; - } - - // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. - // - // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have - // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. - // - // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` - // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` - // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` - // - // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. - uint256 result = 1 << (log2(a) >> 1); - - // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, - // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at - // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision - // into the expected uint128 result. - unchecked { - result = (result + a / result) >> 1; - result = (result + a / result) >> 1; - result = (result + a / result) >> 1; - result = (result + a / result) >> 1; - result = (result + a / result) >> 1; - result = (result + a / result) >> 1; - result = (result + a / result) >> 1; - return min(result, a / result); - } - } - - /** - * @notice Calculates sqrt(a), following the selected rounding direction. - */ - function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { - unchecked { - uint256 result = sqrt(a); - return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); - } - } - - /** - * @dev Return the log in base 2, rounded down, of a positive value. - * Returns 0 if given 0. - */ - function log2(uint256 value) internal pure returns (uint256) { - uint256 result = 0; - unchecked { - if (value >> 128 > 0) { - value >>= 128; - result += 128; - } - if (value >> 64 > 0) { - value >>= 64; - result += 64; - } - if (value >> 32 > 0) { - value >>= 32; - result += 32; - } - if (value >> 16 > 0) { - value >>= 16; - result += 16; - } - if (value >> 8 > 0) { - value >>= 8; - result += 8; - } - if (value >> 4 > 0) { - value >>= 4; - result += 4; - } - if (value >> 2 > 0) { - value >>= 2; - result += 2; - } - if (value >> 1 > 0) { - result += 1; - } - } - return result; - } - - /** - * @dev Return the log in base 2, following the selected rounding direction, of a positive value. - * Returns 0 if given 0. - */ - function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { - unchecked { - uint256 result = log2(value); - return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); - } - } - - /** - * @dev Return the log in base 10, rounded down, of a positive value. - * Returns 0 if given 0. - */ - function log10(uint256 value) internal pure returns (uint256) { - uint256 result = 0; - unchecked { - if (value >= 10**64) { - value /= 10**64; - result += 64; - } - if (value >= 10**32) { - value /= 10**32; - result += 32; - } - if (value >= 10**16) { - value /= 10**16; - result += 16; - } - if (value >= 10**8) { - value /= 10**8; - result += 8; - } - if (value >= 10**4) { - value /= 10**4; - result += 4; - } - if (value >= 10**2) { - value /= 10**2; - result += 2; - } - if (value >= 10**1) { - result += 1; - } - } - return result; - } - - /** - * @dev Return the log in base 10, following the selected rounding direction, of a positive value. - * Returns 0 if given 0. - */ - function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { - unchecked { - uint256 result = log10(value); - return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); - } - } - - /** - * @dev Return the log in base 256, rounded down, of a positive value. - * Returns 0 if given 0. - * - * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. - */ - function log256(uint256 value) internal pure returns (uint256) { - uint256 result = 0; - unchecked { - if (value >> 128 > 0) { - value >>= 128; - result += 16; - } - if (value >> 64 > 0) { - value >>= 64; - result += 8; - } - if (value >> 32 > 0) { - value >>= 32; - result += 4; - } - if (value >> 16 > 0) { - value >>= 16; - result += 2; - } - if (value >> 8 > 0) { - result += 1; - } - } - return result; - } - - /** - * @dev Return the log in base 10, following the selected rounding direction, of a positive value. - * Returns 0 if given 0. - */ - function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { - unchecked { - uint256 result = log256(value); - return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); - } - } -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/math/SafeCastUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/math/SafeCastUpgradeable.sol deleted file mode 100644 index 3bb7c24..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/math/SafeCastUpgradeable.sol +++ /dev/null @@ -1,1136 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol) -// This file was procedurally generated from scripts/generate/templates/SafeCast.js. - -pragma solidity ^0.8.0; - -/** - * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow - * checks. - * - * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can - * easily result in undesired exploitation or bugs, since developers usually - * assume that overflows raise errors. `SafeCast` restores this intuition by - * reverting the transaction when such an operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - * - * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing - * all math on `uint256` and `int256` and then downcasting. - */ -library SafeCastUpgradeable { - /** - * @dev Returns the downcasted uint248 from uint256, reverting on - * overflow (when the input is greater than largest uint248). - * - * Counterpart to Solidity's `uint248` operator. - * - * Requirements: - * - * - input must fit into 248 bits - * - * _Available since v4.7._ - */ - function toUint248(uint256 value) internal pure returns (uint248) { - require(value <= type(uint248).max, "SafeCast: value doesn't fit in 248 bits"); - return uint248(value); - } - - /** - * @dev Returns the downcasted uint240 from uint256, reverting on - * overflow (when the input is greater than largest uint240). - * - * Counterpart to Solidity's `uint240` operator. - * - * Requirements: - * - * - input must fit into 240 bits - * - * _Available since v4.7._ - */ - function toUint240(uint256 value) internal pure returns (uint240) { - require(value <= type(uint240).max, "SafeCast: value doesn't fit in 240 bits"); - return uint240(value); - } - - /** - * @dev Returns the downcasted uint232 from uint256, reverting on - * overflow (when the input is greater than largest uint232). - * - * Counterpart to Solidity's `uint232` operator. - * - * Requirements: - * - * - input must fit into 232 bits - * - * _Available since v4.7._ - */ - function toUint232(uint256 value) internal pure returns (uint232) { - require(value <= type(uint232).max, "SafeCast: value doesn't fit in 232 bits"); - return uint232(value); - } - - /** - * @dev Returns the downcasted uint224 from uint256, reverting on - * overflow (when the input is greater than largest uint224). - * - * Counterpart to Solidity's `uint224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - * - * _Available since v4.2._ - */ - function toUint224(uint256 value) internal pure returns (uint224) { - require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); - return uint224(value); - } - - /** - * @dev Returns the downcasted uint216 from uint256, reverting on - * overflow (when the input is greater than largest uint216). - * - * Counterpart to Solidity's `uint216` operator. - * - * Requirements: - * - * - input must fit into 216 bits - * - * _Available since v4.7._ - */ - function toUint216(uint256 value) internal pure returns (uint216) { - require(value <= type(uint216).max, "SafeCast: value doesn't fit in 216 bits"); - return uint216(value); - } - - /** - * @dev Returns the downcasted uint208 from uint256, reverting on - * overflow (when the input is greater than largest uint208). - * - * Counterpart to Solidity's `uint208` operator. - * - * Requirements: - * - * - input must fit into 208 bits - * - * _Available since v4.7._ - */ - function toUint208(uint256 value) internal pure returns (uint208) { - require(value <= type(uint208).max, "SafeCast: value doesn't fit in 208 bits"); - return uint208(value); - } - - /** - * @dev Returns the downcasted uint200 from uint256, reverting on - * overflow (when the input is greater than largest uint200). - * - * Counterpart to Solidity's `uint200` operator. - * - * Requirements: - * - * - input must fit into 200 bits - * - * _Available since v4.7._ - */ - function toUint200(uint256 value) internal pure returns (uint200) { - require(value <= type(uint200).max, "SafeCast: value doesn't fit in 200 bits"); - return uint200(value); - } - - /** - * @dev Returns the downcasted uint192 from uint256, reverting on - * overflow (when the input is greater than largest uint192). - * - * Counterpart to Solidity's `uint192` operator. - * - * Requirements: - * - * - input must fit into 192 bits - * - * _Available since v4.7._ - */ - function toUint192(uint256 value) internal pure returns (uint192) { - require(value <= type(uint192).max, "SafeCast: value doesn't fit in 192 bits"); - return uint192(value); - } - - /** - * @dev Returns the downcasted uint184 from uint256, reverting on - * overflow (when the input is greater than largest uint184). - * - * Counterpart to Solidity's `uint184` operator. - * - * Requirements: - * - * - input must fit into 184 bits - * - * _Available since v4.7._ - */ - function toUint184(uint256 value) internal pure returns (uint184) { - require(value <= type(uint184).max, "SafeCast: value doesn't fit in 184 bits"); - return uint184(value); - } - - /** - * @dev Returns the downcasted uint176 from uint256, reverting on - * overflow (when the input is greater than largest uint176). - * - * Counterpart to Solidity's `uint176` operator. - * - * Requirements: - * - * - input must fit into 176 bits - * - * _Available since v4.7._ - */ - function toUint176(uint256 value) internal pure returns (uint176) { - require(value <= type(uint176).max, "SafeCast: value doesn't fit in 176 bits"); - return uint176(value); - } - - /** - * @dev Returns the downcasted uint168 from uint256, reverting on - * overflow (when the input is greater than largest uint168). - * - * Counterpart to Solidity's `uint168` operator. - * - * Requirements: - * - * - input must fit into 168 bits - * - * _Available since v4.7._ - */ - function toUint168(uint256 value) internal pure returns (uint168) { - require(value <= type(uint168).max, "SafeCast: value doesn't fit in 168 bits"); - return uint168(value); - } - - /** - * @dev Returns the downcasted uint160 from uint256, reverting on - * overflow (when the input is greater than largest uint160). - * - * Counterpart to Solidity's `uint160` operator. - * - * Requirements: - * - * - input must fit into 160 bits - * - * _Available since v4.7._ - */ - function toUint160(uint256 value) internal pure returns (uint160) { - require(value <= type(uint160).max, "SafeCast: value doesn't fit in 160 bits"); - return uint160(value); - } - - /** - * @dev Returns the downcasted uint152 from uint256, reverting on - * overflow (when the input is greater than largest uint152). - * - * Counterpart to Solidity's `uint152` operator. - * - * Requirements: - * - * - input must fit into 152 bits - * - * _Available since v4.7._ - */ - function toUint152(uint256 value) internal pure returns (uint152) { - require(value <= type(uint152).max, "SafeCast: value doesn't fit in 152 bits"); - return uint152(value); - } - - /** - * @dev Returns the downcasted uint144 from uint256, reverting on - * overflow (when the input is greater than largest uint144). - * - * Counterpart to Solidity's `uint144` operator. - * - * Requirements: - * - * - input must fit into 144 bits - * - * _Available since v4.7._ - */ - function toUint144(uint256 value) internal pure returns (uint144) { - require(value <= type(uint144).max, "SafeCast: value doesn't fit in 144 bits"); - return uint144(value); - } - - /** - * @dev Returns the downcasted uint136 from uint256, reverting on - * overflow (when the input is greater than largest uint136). - * - * Counterpart to Solidity's `uint136` operator. - * - * Requirements: - * - * - input must fit into 136 bits - * - * _Available since v4.7._ - */ - function toUint136(uint256 value) internal pure returns (uint136) { - require(value <= type(uint136).max, "SafeCast: value doesn't fit in 136 bits"); - return uint136(value); - } - - /** - * @dev Returns the downcasted uint128 from uint256, reverting on - * overflow (when the input is greater than largest uint128). - * - * Counterpart to Solidity's `uint128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v2.5._ - */ - function toUint128(uint256 value) internal pure returns (uint128) { - require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); - return uint128(value); - } - - /** - * @dev Returns the downcasted uint120 from uint256, reverting on - * overflow (when the input is greater than largest uint120). - * - * Counterpart to Solidity's `uint120` operator. - * - * Requirements: - * - * - input must fit into 120 bits - * - * _Available since v4.7._ - */ - function toUint120(uint256 value) internal pure returns (uint120) { - require(value <= type(uint120).max, "SafeCast: value doesn't fit in 120 bits"); - return uint120(value); - } - - /** - * @dev Returns the downcasted uint112 from uint256, reverting on - * overflow (when the input is greater than largest uint112). - * - * Counterpart to Solidity's `uint112` operator. - * - * Requirements: - * - * - input must fit into 112 bits - * - * _Available since v4.7._ - */ - function toUint112(uint256 value) internal pure returns (uint112) { - require(value <= type(uint112).max, "SafeCast: value doesn't fit in 112 bits"); - return uint112(value); - } - - /** - * @dev Returns the downcasted uint104 from uint256, reverting on - * overflow (when the input is greater than largest uint104). - * - * Counterpart to Solidity's `uint104` operator. - * - * Requirements: - * - * - input must fit into 104 bits - * - * _Available since v4.7._ - */ - function toUint104(uint256 value) internal pure returns (uint104) { - require(value <= type(uint104).max, "SafeCast: value doesn't fit in 104 bits"); - return uint104(value); - } - - /** - * @dev Returns the downcasted uint96 from uint256, reverting on - * overflow (when the input is greater than largest uint96). - * - * Counterpart to Solidity's `uint96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - * - * _Available since v4.2._ - */ - function toUint96(uint256 value) internal pure returns (uint96) { - require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); - return uint96(value); - } - - /** - * @dev Returns the downcasted uint88 from uint256, reverting on - * overflow (when the input is greater than largest uint88). - * - * Counterpart to Solidity's `uint88` operator. - * - * Requirements: - * - * - input must fit into 88 bits - * - * _Available since v4.7._ - */ - function toUint88(uint256 value) internal pure returns (uint88) { - require(value <= type(uint88).max, "SafeCast: value doesn't fit in 88 bits"); - return uint88(value); - } - - /** - * @dev Returns the downcasted uint80 from uint256, reverting on - * overflow (when the input is greater than largest uint80). - * - * Counterpart to Solidity's `uint80` operator. - * - * Requirements: - * - * - input must fit into 80 bits - * - * _Available since v4.7._ - */ - function toUint80(uint256 value) internal pure returns (uint80) { - require(value <= type(uint80).max, "SafeCast: value doesn't fit in 80 bits"); - return uint80(value); - } - - /** - * @dev Returns the downcasted uint72 from uint256, reverting on - * overflow (when the input is greater than largest uint72). - * - * Counterpart to Solidity's `uint72` operator. - * - * Requirements: - * - * - input must fit into 72 bits - * - * _Available since v4.7._ - */ - function toUint72(uint256 value) internal pure returns (uint72) { - require(value <= type(uint72).max, "SafeCast: value doesn't fit in 72 bits"); - return uint72(value); - } - - /** - * @dev Returns the downcasted uint64 from uint256, reverting on - * overflow (when the input is greater than largest uint64). - * - * Counterpart to Solidity's `uint64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v2.5._ - */ - function toUint64(uint256 value) internal pure returns (uint64) { - require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); - return uint64(value); - } - - /** - * @dev Returns the downcasted uint56 from uint256, reverting on - * overflow (when the input is greater than largest uint56). - * - * Counterpart to Solidity's `uint56` operator. - * - * Requirements: - * - * - input must fit into 56 bits - * - * _Available since v4.7._ - */ - function toUint56(uint256 value) internal pure returns (uint56) { - require(value <= type(uint56).max, "SafeCast: value doesn't fit in 56 bits"); - return uint56(value); - } - - /** - * @dev Returns the downcasted uint48 from uint256, reverting on - * overflow (when the input is greater than largest uint48). - * - * Counterpart to Solidity's `uint48` operator. - * - * Requirements: - * - * - input must fit into 48 bits - * - * _Available since v4.7._ - */ - function toUint48(uint256 value) internal pure returns (uint48) { - require(value <= type(uint48).max, "SafeCast: value doesn't fit in 48 bits"); - return uint48(value); - } - - /** - * @dev Returns the downcasted uint40 from uint256, reverting on - * overflow (when the input is greater than largest uint40). - * - * Counterpart to Solidity's `uint40` operator. - * - * Requirements: - * - * - input must fit into 40 bits - * - * _Available since v4.7._ - */ - function toUint40(uint256 value) internal pure returns (uint40) { - require(value <= type(uint40).max, "SafeCast: value doesn't fit in 40 bits"); - return uint40(value); - } - - /** - * @dev Returns the downcasted uint32 from uint256, reverting on - * overflow (when the input is greater than largest uint32). - * - * Counterpart to Solidity's `uint32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v2.5._ - */ - function toUint32(uint256 value) internal pure returns (uint32) { - require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); - return uint32(value); - } - - /** - * @dev Returns the downcasted uint24 from uint256, reverting on - * overflow (when the input is greater than largest uint24). - * - * Counterpart to Solidity's `uint24` operator. - * - * Requirements: - * - * - input must fit into 24 bits - * - * _Available since v4.7._ - */ - function toUint24(uint256 value) internal pure returns (uint24) { - require(value <= type(uint24).max, "SafeCast: value doesn't fit in 24 bits"); - return uint24(value); - } - - /** - * @dev Returns the downcasted uint16 from uint256, reverting on - * overflow (when the input is greater than largest uint16). - * - * Counterpart to Solidity's `uint16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v2.5._ - */ - function toUint16(uint256 value) internal pure returns (uint16) { - require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); - return uint16(value); - } - - /** - * @dev Returns the downcasted uint8 from uint256, reverting on - * overflow (when the input is greater than largest uint8). - * - * Counterpart to Solidity's `uint8` operator. - * - * Requirements: - * - * - input must fit into 8 bits - * - * _Available since v2.5._ - */ - function toUint8(uint256 value) internal pure returns (uint8) { - require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); - return uint8(value); - } - - /** - * @dev Converts a signed int256 into an unsigned uint256. - * - * Requirements: - * - * - input must be greater than or equal to 0. - * - * _Available since v3.0._ - */ - function toUint256(int256 value) internal pure returns (uint256) { - require(value >= 0, "SafeCast: value must be positive"); - return uint256(value); - } - - /** - * @dev Returns the downcasted int248 from int256, reverting on - * overflow (when the input is less than smallest int248 or - * greater than largest int248). - * - * Counterpart to Solidity's `int248` operator. - * - * Requirements: - * - * - input must fit into 248 bits - * - * _Available since v4.7._ - */ - function toInt248(int256 value) internal pure returns (int248 downcasted) { - downcasted = int248(value); - require(downcasted == value, "SafeCast: value doesn't fit in 248 bits"); - } - - /** - * @dev Returns the downcasted int240 from int256, reverting on - * overflow (when the input is less than smallest int240 or - * greater than largest int240). - * - * Counterpart to Solidity's `int240` operator. - * - * Requirements: - * - * - input must fit into 240 bits - * - * _Available since v4.7._ - */ - function toInt240(int256 value) internal pure returns (int240 downcasted) { - downcasted = int240(value); - require(downcasted == value, "SafeCast: value doesn't fit in 240 bits"); - } - - /** - * @dev Returns the downcasted int232 from int256, reverting on - * overflow (when the input is less than smallest int232 or - * greater than largest int232). - * - * Counterpart to Solidity's `int232` operator. - * - * Requirements: - * - * - input must fit into 232 bits - * - * _Available since v4.7._ - */ - function toInt232(int256 value) internal pure returns (int232 downcasted) { - downcasted = int232(value); - require(downcasted == value, "SafeCast: value doesn't fit in 232 bits"); - } - - /** - * @dev Returns the downcasted int224 from int256, reverting on - * overflow (when the input is less than smallest int224 or - * greater than largest int224). - * - * Counterpart to Solidity's `int224` operator. - * - * Requirements: - * - * - input must fit into 224 bits - * - * _Available since v4.7._ - */ - function toInt224(int256 value) internal pure returns (int224 downcasted) { - downcasted = int224(value); - require(downcasted == value, "SafeCast: value doesn't fit in 224 bits"); - } - - /** - * @dev Returns the downcasted int216 from int256, reverting on - * overflow (when the input is less than smallest int216 or - * greater than largest int216). - * - * Counterpart to Solidity's `int216` operator. - * - * Requirements: - * - * - input must fit into 216 bits - * - * _Available since v4.7._ - */ - function toInt216(int256 value) internal pure returns (int216 downcasted) { - downcasted = int216(value); - require(downcasted == value, "SafeCast: value doesn't fit in 216 bits"); - } - - /** - * @dev Returns the downcasted int208 from int256, reverting on - * overflow (when the input is less than smallest int208 or - * greater than largest int208). - * - * Counterpart to Solidity's `int208` operator. - * - * Requirements: - * - * - input must fit into 208 bits - * - * _Available since v4.7._ - */ - function toInt208(int256 value) internal pure returns (int208 downcasted) { - downcasted = int208(value); - require(downcasted == value, "SafeCast: value doesn't fit in 208 bits"); - } - - /** - * @dev Returns the downcasted int200 from int256, reverting on - * overflow (when the input is less than smallest int200 or - * greater than largest int200). - * - * Counterpart to Solidity's `int200` operator. - * - * Requirements: - * - * - input must fit into 200 bits - * - * _Available since v4.7._ - */ - function toInt200(int256 value) internal pure returns (int200 downcasted) { - downcasted = int200(value); - require(downcasted == value, "SafeCast: value doesn't fit in 200 bits"); - } - - /** - * @dev Returns the downcasted int192 from int256, reverting on - * overflow (when the input is less than smallest int192 or - * greater than largest int192). - * - * Counterpart to Solidity's `int192` operator. - * - * Requirements: - * - * - input must fit into 192 bits - * - * _Available since v4.7._ - */ - function toInt192(int256 value) internal pure returns (int192 downcasted) { - downcasted = int192(value); - require(downcasted == value, "SafeCast: value doesn't fit in 192 bits"); - } - - /** - * @dev Returns the downcasted int184 from int256, reverting on - * overflow (when the input is less than smallest int184 or - * greater than largest int184). - * - * Counterpart to Solidity's `int184` operator. - * - * Requirements: - * - * - input must fit into 184 bits - * - * _Available since v4.7._ - */ - function toInt184(int256 value) internal pure returns (int184 downcasted) { - downcasted = int184(value); - require(downcasted == value, "SafeCast: value doesn't fit in 184 bits"); - } - - /** - * @dev Returns the downcasted int176 from int256, reverting on - * overflow (when the input is less than smallest int176 or - * greater than largest int176). - * - * Counterpart to Solidity's `int176` operator. - * - * Requirements: - * - * - input must fit into 176 bits - * - * _Available since v4.7._ - */ - function toInt176(int256 value) internal pure returns (int176 downcasted) { - downcasted = int176(value); - require(downcasted == value, "SafeCast: value doesn't fit in 176 bits"); - } - - /** - * @dev Returns the downcasted int168 from int256, reverting on - * overflow (when the input is less than smallest int168 or - * greater than largest int168). - * - * Counterpart to Solidity's `int168` operator. - * - * Requirements: - * - * - input must fit into 168 bits - * - * _Available since v4.7._ - */ - function toInt168(int256 value) internal pure returns (int168 downcasted) { - downcasted = int168(value); - require(downcasted == value, "SafeCast: value doesn't fit in 168 bits"); - } - - /** - * @dev Returns the downcasted int160 from int256, reverting on - * overflow (when the input is less than smallest int160 or - * greater than largest int160). - * - * Counterpart to Solidity's `int160` operator. - * - * Requirements: - * - * - input must fit into 160 bits - * - * _Available since v4.7._ - */ - function toInt160(int256 value) internal pure returns (int160 downcasted) { - downcasted = int160(value); - require(downcasted == value, "SafeCast: value doesn't fit in 160 bits"); - } - - /** - * @dev Returns the downcasted int152 from int256, reverting on - * overflow (when the input is less than smallest int152 or - * greater than largest int152). - * - * Counterpart to Solidity's `int152` operator. - * - * Requirements: - * - * - input must fit into 152 bits - * - * _Available since v4.7._ - */ - function toInt152(int256 value) internal pure returns (int152 downcasted) { - downcasted = int152(value); - require(downcasted == value, "SafeCast: value doesn't fit in 152 bits"); - } - - /** - * @dev Returns the downcasted int144 from int256, reverting on - * overflow (when the input is less than smallest int144 or - * greater than largest int144). - * - * Counterpart to Solidity's `int144` operator. - * - * Requirements: - * - * - input must fit into 144 bits - * - * _Available since v4.7._ - */ - function toInt144(int256 value) internal pure returns (int144 downcasted) { - downcasted = int144(value); - require(downcasted == value, "SafeCast: value doesn't fit in 144 bits"); - } - - /** - * @dev Returns the downcasted int136 from int256, reverting on - * overflow (when the input is less than smallest int136 or - * greater than largest int136). - * - * Counterpart to Solidity's `int136` operator. - * - * Requirements: - * - * - input must fit into 136 bits - * - * _Available since v4.7._ - */ - function toInt136(int256 value) internal pure returns (int136 downcasted) { - downcasted = int136(value); - require(downcasted == value, "SafeCast: value doesn't fit in 136 bits"); - } - - /** - * @dev Returns the downcasted int128 from int256, reverting on - * overflow (when the input is less than smallest int128 or - * greater than largest int128). - * - * Counterpart to Solidity's `int128` operator. - * - * Requirements: - * - * - input must fit into 128 bits - * - * _Available since v3.1._ - */ - function toInt128(int256 value) internal pure returns (int128 downcasted) { - downcasted = int128(value); - require(downcasted == value, "SafeCast: value doesn't fit in 128 bits"); - } - - /** - * @dev Returns the downcasted int120 from int256, reverting on - * overflow (when the input is less than smallest int120 or - * greater than largest int120). - * - * Counterpart to Solidity's `int120` operator. - * - * Requirements: - * - * - input must fit into 120 bits - * - * _Available since v4.7._ - */ - function toInt120(int256 value) internal pure returns (int120 downcasted) { - downcasted = int120(value); - require(downcasted == value, "SafeCast: value doesn't fit in 120 bits"); - } - - /** - * @dev Returns the downcasted int112 from int256, reverting on - * overflow (when the input is less than smallest int112 or - * greater than largest int112). - * - * Counterpart to Solidity's `int112` operator. - * - * Requirements: - * - * - input must fit into 112 bits - * - * _Available since v4.7._ - */ - function toInt112(int256 value) internal pure returns (int112 downcasted) { - downcasted = int112(value); - require(downcasted == value, "SafeCast: value doesn't fit in 112 bits"); - } - - /** - * @dev Returns the downcasted int104 from int256, reverting on - * overflow (when the input is less than smallest int104 or - * greater than largest int104). - * - * Counterpart to Solidity's `int104` operator. - * - * Requirements: - * - * - input must fit into 104 bits - * - * _Available since v4.7._ - */ - function toInt104(int256 value) internal pure returns (int104 downcasted) { - downcasted = int104(value); - require(downcasted == value, "SafeCast: value doesn't fit in 104 bits"); - } - - /** - * @dev Returns the downcasted int96 from int256, reverting on - * overflow (when the input is less than smallest int96 or - * greater than largest int96). - * - * Counterpart to Solidity's `int96` operator. - * - * Requirements: - * - * - input must fit into 96 bits - * - * _Available since v4.7._ - */ - function toInt96(int256 value) internal pure returns (int96 downcasted) { - downcasted = int96(value); - require(downcasted == value, "SafeCast: value doesn't fit in 96 bits"); - } - - /** - * @dev Returns the downcasted int88 from int256, reverting on - * overflow (when the input is less than smallest int88 or - * greater than largest int88). - * - * Counterpart to Solidity's `int88` operator. - * - * Requirements: - * - * - input must fit into 88 bits - * - * _Available since v4.7._ - */ - function toInt88(int256 value) internal pure returns (int88 downcasted) { - downcasted = int88(value); - require(downcasted == value, "SafeCast: value doesn't fit in 88 bits"); - } - - /** - * @dev Returns the downcasted int80 from int256, reverting on - * overflow (when the input is less than smallest int80 or - * greater than largest int80). - * - * Counterpart to Solidity's `int80` operator. - * - * Requirements: - * - * - input must fit into 80 bits - * - * _Available since v4.7._ - */ - function toInt80(int256 value) internal pure returns (int80 downcasted) { - downcasted = int80(value); - require(downcasted == value, "SafeCast: value doesn't fit in 80 bits"); - } - - /** - * @dev Returns the downcasted int72 from int256, reverting on - * overflow (when the input is less than smallest int72 or - * greater than largest int72). - * - * Counterpart to Solidity's `int72` operator. - * - * Requirements: - * - * - input must fit into 72 bits - * - * _Available since v4.7._ - */ - function toInt72(int256 value) internal pure returns (int72 downcasted) { - downcasted = int72(value); - require(downcasted == value, "SafeCast: value doesn't fit in 72 bits"); - } - - /** - * @dev Returns the downcasted int64 from int256, reverting on - * overflow (when the input is less than smallest int64 or - * greater than largest int64). - * - * Counterpart to Solidity's `int64` operator. - * - * Requirements: - * - * - input must fit into 64 bits - * - * _Available since v3.1._ - */ - function toInt64(int256 value) internal pure returns (int64 downcasted) { - downcasted = int64(value); - require(downcasted == value, "SafeCast: value doesn't fit in 64 bits"); - } - - /** - * @dev Returns the downcasted int56 from int256, reverting on - * overflow (when the input is less than smallest int56 or - * greater than largest int56). - * - * Counterpart to Solidity's `int56` operator. - * - * Requirements: - * - * - input must fit into 56 bits - * - * _Available since v4.7._ - */ - function toInt56(int256 value) internal pure returns (int56 downcasted) { - downcasted = int56(value); - require(downcasted == value, "SafeCast: value doesn't fit in 56 bits"); - } - - /** - * @dev Returns the downcasted int48 from int256, reverting on - * overflow (when the input is less than smallest int48 or - * greater than largest int48). - * - * Counterpart to Solidity's `int48` operator. - * - * Requirements: - * - * - input must fit into 48 bits - * - * _Available since v4.7._ - */ - function toInt48(int256 value) internal pure returns (int48 downcasted) { - downcasted = int48(value); - require(downcasted == value, "SafeCast: value doesn't fit in 48 bits"); - } - - /** - * @dev Returns the downcasted int40 from int256, reverting on - * overflow (when the input is less than smallest int40 or - * greater than largest int40). - * - * Counterpart to Solidity's `int40` operator. - * - * Requirements: - * - * - input must fit into 40 bits - * - * _Available since v4.7._ - */ - function toInt40(int256 value) internal pure returns (int40 downcasted) { - downcasted = int40(value); - require(downcasted == value, "SafeCast: value doesn't fit in 40 bits"); - } - - /** - * @dev Returns the downcasted int32 from int256, reverting on - * overflow (when the input is less than smallest int32 or - * greater than largest int32). - * - * Counterpart to Solidity's `int32` operator. - * - * Requirements: - * - * - input must fit into 32 bits - * - * _Available since v3.1._ - */ - function toInt32(int256 value) internal pure returns (int32 downcasted) { - downcasted = int32(value); - require(downcasted == value, "SafeCast: value doesn't fit in 32 bits"); - } - - /** - * @dev Returns the downcasted int24 from int256, reverting on - * overflow (when the input is less than smallest int24 or - * greater than largest int24). - * - * Counterpart to Solidity's `int24` operator. - * - * Requirements: - * - * - input must fit into 24 bits - * - * _Available since v4.7._ - */ - function toInt24(int256 value) internal pure returns (int24 downcasted) { - downcasted = int24(value); - require(downcasted == value, "SafeCast: value doesn't fit in 24 bits"); - } - - /** - * @dev Returns the downcasted int16 from int256, reverting on - * overflow (when the input is less than smallest int16 or - * greater than largest int16). - * - * Counterpart to Solidity's `int16` operator. - * - * Requirements: - * - * - input must fit into 16 bits - * - * _Available since v3.1._ - */ - function toInt16(int256 value) internal pure returns (int16 downcasted) { - downcasted = int16(value); - require(downcasted == value, "SafeCast: value doesn't fit in 16 bits"); - } - - /** - * @dev Returns the downcasted int8 from int256, reverting on - * overflow (when the input is less than smallest int8 or - * greater than largest int8). - * - * Counterpart to Solidity's `int8` operator. - * - * Requirements: - * - * - input must fit into 8 bits - * - * _Available since v3.1._ - */ - function toInt8(int256 value) internal pure returns (int8 downcasted) { - downcasted = int8(value); - require(downcasted == value, "SafeCast: value doesn't fit in 8 bits"); - } - - /** - * @dev Converts an unsigned uint256 into a signed int256. - * - * Requirements: - * - * - input must be less than or equal to maxInt256. - * - * _Available since v3.0._ - */ - function toInt256(uint256 value) internal pure returns (int256) { - // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive - require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); - return int256(value); - } -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/math/SafeMathUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/math/SafeMathUpgradeable.sol deleted file mode 100644 index a31ea2b..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/math/SafeMathUpgradeable.sol +++ /dev/null @@ -1,227 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) - -pragma solidity ^0.8.0; - -// CAUTION -// This version of SafeMath should only be used with Solidity 0.8 or later, -// because it relies on the compiler's built in overflow checks. - -/** - * @dev Wrappers over Solidity's arithmetic operations. - * - * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler - * now has built in overflow checking. - */ -library SafeMathUpgradeable { - /** - * @dev Returns the addition of two unsigned integers, with an overflow flag. - * - * _Available since v3.4._ - */ - function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { - unchecked { - uint256 c = a + b; - if (c < a) return (false, 0); - return (true, c); - } - } - - /** - * @dev Returns the subtraction of two unsigned integers, with an overflow flag. - * - * _Available since v3.4._ - */ - function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { - unchecked { - if (b > a) return (false, 0); - return (true, a - b); - } - } - - /** - * @dev Returns the multiplication of two unsigned integers, with an overflow flag. - * - * _Available since v3.4._ - */ - function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { - unchecked { - // Gas optimization: this is cheaper than requiring 'a' not being zero, but the - // benefit is lost if 'b' is also tested. - // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 - if (a == 0) return (true, 0); - uint256 c = a * b; - if (c / a != b) return (false, 0); - return (true, c); - } - } - - /** - * @dev Returns the division of two unsigned integers, with a division by zero flag. - * - * _Available since v3.4._ - */ - function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { - unchecked { - if (b == 0) return (false, 0); - return (true, a / b); - } - } - - /** - * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. - * - * _Available since v3.4._ - */ - function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { - unchecked { - if (b == 0) return (false, 0); - return (true, a % b); - } - } - - /** - * @dev Returns the addition of two unsigned integers, reverting on - * overflow. - * - * Counterpart to Solidity's `+` operator. - * - * Requirements: - * - * - Addition cannot overflow. - */ - function add(uint256 a, uint256 b) internal pure returns (uint256) { - return a + b; - } - - /** - * @dev Returns the subtraction of two unsigned integers, reverting on - * overflow (when the result is negative). - * - * Counterpart to Solidity's `-` operator. - * - * Requirements: - * - * - Subtraction cannot overflow. - */ - function sub(uint256 a, uint256 b) internal pure returns (uint256) { - return a - b; - } - - /** - * @dev Returns the multiplication of two unsigned integers, reverting on - * overflow. - * - * Counterpart to Solidity's `*` operator. - * - * Requirements: - * - * - Multiplication cannot overflow. - */ - function mul(uint256 a, uint256 b) internal pure returns (uint256) { - return a * b; - } - - /** - * @dev Returns the integer division of two unsigned integers, reverting on - * division by zero. The result is rounded towards zero. - * - * Counterpart to Solidity's `/` operator. - * - * Requirements: - * - * - The divisor cannot be zero. - */ - function div(uint256 a, uint256 b) internal pure returns (uint256) { - return a / b; - } - - /** - * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), - * reverting when dividing by zero. - * - * Counterpart to Solidity's `%` operator. This function uses a `revert` - * opcode (which leaves remaining gas untouched) while Solidity uses an - * invalid opcode to revert (consuming all remaining gas). - * - * Requirements: - * - * - The divisor cannot be zero. - */ - function mod(uint256 a, uint256 b) internal pure returns (uint256) { - return a % b; - } - - /** - * @dev Returns the subtraction of two unsigned integers, reverting with custom message on - * overflow (when the result is negative). - * - * CAUTION: This function is deprecated because it requires allocating memory for the error - * message unnecessarily. For custom revert reasons use {trySub}. - * - * Counterpart to Solidity's `-` operator. - * - * Requirements: - * - * - Subtraction cannot overflow. - */ - function sub( - uint256 a, - uint256 b, - string memory errorMessage - ) internal pure returns (uint256) { - unchecked { - require(b <= a, errorMessage); - return a - b; - } - } - - /** - * @dev Returns the integer division of two unsigned integers, reverting with custom message on - * division by zero. The result is rounded towards zero. - * - * Counterpart to Solidity's `/` operator. Note: this function uses a - * `revert` opcode (which leaves remaining gas untouched) while Solidity - * uses an invalid opcode to revert (consuming all remaining gas). - * - * Requirements: - * - * - The divisor cannot be zero. - */ - function div( - uint256 a, - uint256 b, - string memory errorMessage - ) internal pure returns (uint256) { - unchecked { - require(b > 0, errorMessage); - return a / b; - } - } - - /** - * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), - * reverting with custom message when dividing by zero. - * - * CAUTION: This function is deprecated because it requires allocating memory for the error - * message unnecessarily. For custom revert reasons use {tryMod}. - * - * Counterpart to Solidity's `%` operator. This function uses a `revert` - * opcode (which leaves remaining gas untouched) while Solidity uses an - * invalid opcode to revert (consuming all remaining gas). - * - * Requirements: - * - * - The divisor cannot be zero. - */ - function mod( - uint256 a, - uint256 b, - string memory errorMessage - ) internal pure returns (uint256) { - unchecked { - require(b > 0, errorMessage); - return a % b; - } - } -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/math/SignedMathUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/math/SignedMathUpgradeable.sol deleted file mode 100644 index bc78956..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/math/SignedMathUpgradeable.sol +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.5.0) (utils/math/SignedMath.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Standard signed math utilities missing in the Solidity language. - */ -library SignedMathUpgradeable { - /** - * @dev Returns the largest of two signed numbers. - */ - function max(int256 a, int256 b) internal pure returns (int256) { - return a > b ? a : b; - } - - /** - * @dev Returns the smallest of two signed numbers. - */ - function min(int256 a, int256 b) internal pure returns (int256) { - return a < b ? a : b; - } - - /** - * @dev Returns the average of two signed numbers without overflow. - * The result is rounded towards zero. - */ - function average(int256 a, int256 b) internal pure returns (int256) { - // Formula from the book "Hacker's Delight" - int256 x = (a & b) + ((a ^ b) >> 1); - return x + (int256(uint256(x) >> 255) & (a ^ b)); - } - - /** - * @dev Returns the absolute unsigned value of a signed value. - */ - function abs(int256 n) internal pure returns (uint256) { - unchecked { - // must be unchecked in order to support `n = type(int256).min` - return uint256(n >= 0 ? n : -n); - } - } -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/math/SignedSafeMathUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/math/SignedSafeMathUpgradeable.sol deleted file mode 100644 index 4d9ee8b..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/math/SignedSafeMathUpgradeable.sol +++ /dev/null @@ -1,68 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/math/SignedSafeMath.sol) - -pragma solidity ^0.8.0; - -/** - * @dev Wrappers over Solidity's arithmetic operations. - * - * NOTE: `SignedSafeMath` is no longer needed starting with Solidity 0.8. The compiler - * now has built in overflow checking. - */ -library SignedSafeMathUpgradeable { - /** - * @dev Returns the multiplication of two signed integers, reverting on - * overflow. - * - * Counterpart to Solidity's `*` operator. - * - * Requirements: - * - * - Multiplication cannot overflow. - */ - function mul(int256 a, int256 b) internal pure returns (int256) { - return a * b; - } - - /** - * @dev Returns the integer division of two signed integers. Reverts on - * division by zero. The result is rounded towards zero. - * - * Counterpart to Solidity's `/` operator. - * - * Requirements: - * - * - The divisor cannot be zero. - */ - function div(int256 a, int256 b) internal pure returns (int256) { - return a / b; - } - - /** - * @dev Returns the subtraction of two signed integers, reverting on - * overflow. - * - * Counterpart to Solidity's `-` operator. - * - * Requirements: - * - * - Subtraction cannot overflow. - */ - function sub(int256 a, int256 b) internal pure returns (int256) { - return a - b; - } - - /** - * @dev Returns the addition of two signed integers, reverting on - * overflow. - * - * Counterpart to Solidity's `+` operator. - * - * Requirements: - * - * - Addition cannot overflow. - */ - function add(int256 a, int256 b) internal pure returns (int256) { - return a + b; - } -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/structs/BitMapsUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/structs/BitMapsUpgradeable.sol deleted file mode 100644 index f38116e..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/structs/BitMapsUpgradeable.sol +++ /dev/null @@ -1,55 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (utils/structs/BitMaps.sol) -pragma solidity ^0.8.0; - -/** - * @dev Library for managing uint256 to bool mapping in a compact and efficient way, providing the keys are sequential. - * Largely inspired by Uniswap's https://github.com/Uniswap/merkle-distributor/blob/master/contracts/MerkleDistributor.sol[merkle-distributor]. - */ -library BitMapsUpgradeable { - struct BitMap { - mapping(uint256 => uint256) _data; - } - - /** - * @dev Returns whether the bit at `index` is set. - */ - function get(BitMap storage bitmap, uint256 index) internal view returns (bool) { - uint256 bucket = index >> 8; - uint256 mask = 1 << (index & 0xff); - return bitmap._data[bucket] & mask != 0; - } - - /** - * @dev Sets the bit at `index` to the boolean `value`. - */ - function setTo( - BitMap storage bitmap, - uint256 index, - bool value - ) internal { - if (value) { - set(bitmap, index); - } else { - unset(bitmap, index); - } - } - - /** - * @dev Sets the bit at `index`. - */ - function set(BitMap storage bitmap, uint256 index) internal { - uint256 bucket = index >> 8; - uint256 mask = 1 << (index & 0xff); - bitmap._data[bucket] |= mask; - } - - /** - * @dev Unsets the bit at `index`. - */ - function unset(BitMap storage bitmap, uint256 index) internal { - uint256 bucket = index >> 8; - uint256 mask = 1 << (index & 0xff); - bitmap._data[bucket] &= ~mask; - } -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/structs/DoubleEndedQueueUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/structs/DoubleEndedQueueUpgradeable.sol deleted file mode 100644 index 32040ba..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/structs/DoubleEndedQueueUpgradeable.sol +++ /dev/null @@ -1,170 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (utils/structs/DoubleEndedQueue.sol) -pragma solidity ^0.8.4; - -import "../math/SafeCastUpgradeable.sol"; - -/** - * @dev A sequence of items with the ability to efficiently push and pop items (i.e. insert and remove) on both ends of - * the sequence (called front and back). Among other access patterns, it can be used to implement efficient LIFO and - * FIFO queues. Storage use is optimized, and all operations are O(1) constant time. This includes {clear}, given that - * the existing queue contents are left in storage. - * - * The struct is called `Bytes32Deque`. Other types can be cast to and from `bytes32`. This data structure can only be - * used in storage, and not in memory. - * ``` - * DoubleEndedQueue.Bytes32Deque queue; - * ``` - * - * _Available since v4.6._ - */ -library DoubleEndedQueueUpgradeable { - /** - * @dev An operation (e.g. {front}) couldn't be completed due to the queue being empty. - */ - error Empty(); - - /** - * @dev An operation (e.g. {at}) couldn't be completed due to an index being out of bounds. - */ - error OutOfBounds(); - - /** - * @dev Indices are signed integers because the queue can grow in any direction. They are 128 bits so begin and end - * are packed in a single storage slot for efficient access. Since the items are added one at a time we can safely - * assume that these 128-bit indices will not overflow, and use unchecked arithmetic. - * - * Struct members have an underscore prefix indicating that they are "private" and should not be read or written to - * directly. Use the functions provided below instead. Modifying the struct manually may violate assumptions and - * lead to unexpected behavior. - * - * Indices are in the range [begin, end) which means the first item is at data[begin] and the last item is at - * data[end - 1]. - */ - struct Bytes32Deque { - int128 _begin; - int128 _end; - mapping(int128 => bytes32) _data; - } - - /** - * @dev Inserts an item at the end of the queue. - */ - function pushBack(Bytes32Deque storage deque, bytes32 value) internal { - int128 backIndex = deque._end; - deque._data[backIndex] = value; - unchecked { - deque._end = backIndex + 1; - } - } - - /** - * @dev Removes the item at the end of the queue and returns it. - * - * Reverts with `Empty` if the queue is empty. - */ - function popBack(Bytes32Deque storage deque) internal returns (bytes32 value) { - if (empty(deque)) revert Empty(); - int128 backIndex; - unchecked { - backIndex = deque._end - 1; - } - value = deque._data[backIndex]; - delete deque._data[backIndex]; - deque._end = backIndex; - } - - /** - * @dev Inserts an item at the beginning of the queue. - */ - function pushFront(Bytes32Deque storage deque, bytes32 value) internal { - int128 frontIndex; - unchecked { - frontIndex = deque._begin - 1; - } - deque._data[frontIndex] = value; - deque._begin = frontIndex; - } - - /** - * @dev Removes the item at the beginning of the queue and returns it. - * - * Reverts with `Empty` if the queue is empty. - */ - function popFront(Bytes32Deque storage deque) internal returns (bytes32 value) { - if (empty(deque)) revert Empty(); - int128 frontIndex = deque._begin; - value = deque._data[frontIndex]; - delete deque._data[frontIndex]; - unchecked { - deque._begin = frontIndex + 1; - } - } - - /** - * @dev Returns the item at the beginning of the queue. - * - * Reverts with `Empty` if the queue is empty. - */ - function front(Bytes32Deque storage deque) internal view returns (bytes32 value) { - if (empty(deque)) revert Empty(); - int128 frontIndex = deque._begin; - return deque._data[frontIndex]; - } - - /** - * @dev Returns the item at the end of the queue. - * - * Reverts with `Empty` if the queue is empty. - */ - function back(Bytes32Deque storage deque) internal view returns (bytes32 value) { - if (empty(deque)) revert Empty(); - int128 backIndex; - unchecked { - backIndex = deque._end - 1; - } - return deque._data[backIndex]; - } - - /** - * @dev Return the item at a position in the queue given by `index`, with the first item at 0 and last item at - * `length(deque) - 1`. - * - * Reverts with `OutOfBounds` if the index is out of bounds. - */ - function at(Bytes32Deque storage deque, uint256 index) internal view returns (bytes32 value) { - // int256(deque._begin) is a safe upcast - int128 idx = SafeCastUpgradeable.toInt128(int256(deque._begin) + SafeCastUpgradeable.toInt256(index)); - if (idx >= deque._end) revert OutOfBounds(); - return deque._data[idx]; - } - - /** - * @dev Resets the queue back to being empty. - * - * NOTE: The current items are left behind in storage. This does not affect the functioning of the queue, but misses - * out on potential gas refunds. - */ - function clear(Bytes32Deque storage deque) internal { - deque._begin = 0; - deque._end = 0; - } - - /** - * @dev Returns the number of items in the queue. - */ - function length(Bytes32Deque storage deque) internal view returns (uint256) { - // The interface preserves the invariant that begin <= end so we assume this will not overflow. - // We also assume there are at most int256.max items in the queue. - unchecked { - return uint256(int256(deque._end) - int256(deque._begin)); - } - } - - /** - * @dev Returns true if the queue is empty. - */ - function empty(Bytes32Deque storage deque) internal view returns (bool) { - return deque._end <= deque._begin; - } -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/structs/EnumerableMapUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/structs/EnumerableMapUpgradeable.sol deleted file mode 100644 index 17b6ae2..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/structs/EnumerableMapUpgradeable.sol +++ /dev/null @@ -1,530 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (utils/structs/EnumerableMap.sol) -// This file was procedurally generated from scripts/generate/templates/EnumerableMap.js. - -pragma solidity ^0.8.0; - -import "./EnumerableSetUpgradeable.sol"; - -/** - * @dev Library for managing an enumerable variant of Solidity's - * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`] - * type. - * - * Maps have the following properties: - * - * - Entries are added, removed, and checked for existence in constant time - * (O(1)). - * - Entries are enumerated in O(n). No guarantees are made on the ordering. - * - * ``` - * contract Example { - * // Add the library methods - * using EnumerableMap for EnumerableMap.UintToAddressMap; - * - * // Declare a set state variable - * EnumerableMap.UintToAddressMap private myMap; - * } - * ``` - * - * The following map types are supported: - * - * - `uint256 -> address` (`UintToAddressMap`) since v3.0.0 - * - `address -> uint256` (`AddressToUintMap`) since v4.6.0 - * - `bytes32 -> bytes32` (`Bytes32ToBytes32Map`) since v4.6.0 - * - `uint256 -> uint256` (`UintToUintMap`) since v4.7.0 - * - `bytes32 -> uint256` (`Bytes32ToUintMap`) since v4.7.0 - * - * [WARNING] - * ==== - * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure - * unusable. - * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. - * - * In order to clean an EnumerableMap, you can either remove all elements one by one or create a fresh instance using an - * array of EnumerableMap. - * ==== - */ -library EnumerableMapUpgradeable { - using EnumerableSetUpgradeable for EnumerableSetUpgradeable.Bytes32Set; - - // To implement this library for multiple types with as little code - // repetition as possible, we write it in terms of a generic Map type with - // bytes32 keys and values. - // The Map implementation uses private functions, and user-facing - // implementations (such as Uint256ToAddressMap) are just wrappers around - // the underlying Map. - // This means that we can only create new EnumerableMaps for types that fit - // in bytes32. - - struct Bytes32ToBytes32Map { - // Storage of keys - EnumerableSetUpgradeable.Bytes32Set _keys; - mapping(bytes32 => bytes32) _values; - } - - /** - * @dev Adds a key-value pair to a map, or updates the value for an existing - * key. O(1). - * - * Returns true if the key was added to the map, that is if it was not - * already present. - */ - function set( - Bytes32ToBytes32Map storage map, - bytes32 key, - bytes32 value - ) internal returns (bool) { - map._values[key] = value; - return map._keys.add(key); - } - - /** - * @dev Removes a key-value pair from a map. O(1). - * - * Returns true if the key was removed from the map, that is if it was present. - */ - function remove(Bytes32ToBytes32Map storage map, bytes32 key) internal returns (bool) { - delete map._values[key]; - return map._keys.remove(key); - } - - /** - * @dev Returns true if the key is in the map. O(1). - */ - function contains(Bytes32ToBytes32Map storage map, bytes32 key) internal view returns (bool) { - return map._keys.contains(key); - } - - /** - * @dev Returns the number of key-value pairs in the map. O(1). - */ - function length(Bytes32ToBytes32Map storage map) internal view returns (uint256) { - return map._keys.length(); - } - - /** - * @dev Returns the key-value pair stored at position `index` in the map. O(1). - * - * Note that there are no guarantees on the ordering of entries inside the - * array, and it may change when more entries are added or removed. - * - * Requirements: - * - * - `index` must be strictly less than {length}. - */ - function at(Bytes32ToBytes32Map storage map, uint256 index) internal view returns (bytes32, bytes32) { - bytes32 key = map._keys.at(index); - return (key, map._values[key]); - } - - /** - * @dev Tries to returns the value associated with `key`. O(1). - * Does not revert if `key` is not in the map. - */ - function tryGet(Bytes32ToBytes32Map storage map, bytes32 key) internal view returns (bool, bytes32) { - bytes32 value = map._values[key]; - if (value == bytes32(0)) { - return (contains(map, key), bytes32(0)); - } else { - return (true, value); - } - } - - /** - * @dev Returns the value associated with `key`. O(1). - * - * Requirements: - * - * - `key` must be in the map. - */ - function get(Bytes32ToBytes32Map storage map, bytes32 key) internal view returns (bytes32) { - bytes32 value = map._values[key]; - require(value != 0 || contains(map, key), "EnumerableMap: nonexistent key"); - return value; - } - - /** - * @dev Same as {get}, with a custom error message when `key` is not in the map. - * - * CAUTION: This function is deprecated because it requires allocating memory for the error - * message unnecessarily. For custom revert reasons use {tryGet}. - */ - function get( - Bytes32ToBytes32Map storage map, - bytes32 key, - string memory errorMessage - ) internal view returns (bytes32) { - bytes32 value = map._values[key]; - require(value != 0 || contains(map, key), errorMessage); - return value; - } - - // UintToUintMap - - struct UintToUintMap { - Bytes32ToBytes32Map _inner; - } - - /** - * @dev Adds a key-value pair to a map, or updates the value for an existing - * key. O(1). - * - * Returns true if the key was added to the map, that is if it was not - * already present. - */ - function set( - UintToUintMap storage map, - uint256 key, - uint256 value - ) internal returns (bool) { - return set(map._inner, bytes32(key), bytes32(value)); - } - - /** - * @dev Removes a value from a set. O(1). - * - * Returns true if the key was removed from the map, that is if it was present. - */ - function remove(UintToUintMap storage map, uint256 key) internal returns (bool) { - return remove(map._inner, bytes32(key)); - } - - /** - * @dev Returns true if the key is in the map. O(1). - */ - function contains(UintToUintMap storage map, uint256 key) internal view returns (bool) { - return contains(map._inner, bytes32(key)); - } - - /** - * @dev Returns the number of elements in the map. O(1). - */ - function length(UintToUintMap storage map) internal view returns (uint256) { - return length(map._inner); - } - - /** - * @dev Returns the element stored at position `index` in the set. O(1). - * Note that there are no guarantees on the ordering of values inside the - * array, and it may change when more values are added or removed. - * - * Requirements: - * - * - `index` must be strictly less than {length}. - */ - function at(UintToUintMap storage map, uint256 index) internal view returns (uint256, uint256) { - (bytes32 key, bytes32 value) = at(map._inner, index); - return (uint256(key), uint256(value)); - } - - /** - * @dev Tries to returns the value associated with `key`. O(1). - * Does not revert if `key` is not in the map. - */ - function tryGet(UintToUintMap storage map, uint256 key) internal view returns (bool, uint256) { - (bool success, bytes32 value) = tryGet(map._inner, bytes32(key)); - return (success, uint256(value)); - } - - /** - * @dev Returns the value associated with `key`. O(1). - * - * Requirements: - * - * - `key` must be in the map. - */ - function get(UintToUintMap storage map, uint256 key) internal view returns (uint256) { - return uint256(get(map._inner, bytes32(key))); - } - - /** - * @dev Same as {get}, with a custom error message when `key` is not in the map. - * - * CAUTION: This function is deprecated because it requires allocating memory for the error - * message unnecessarily. For custom revert reasons use {tryGet}. - */ - function get( - UintToUintMap storage map, - uint256 key, - string memory errorMessage - ) internal view returns (uint256) { - return uint256(get(map._inner, bytes32(key), errorMessage)); - } - - // UintToAddressMap - - struct UintToAddressMap { - Bytes32ToBytes32Map _inner; - } - - /** - * @dev Adds a key-value pair to a map, or updates the value for an existing - * key. O(1). - * - * Returns true if the key was added to the map, that is if it was not - * already present. - */ - function set( - UintToAddressMap storage map, - uint256 key, - address value - ) internal returns (bool) { - return set(map._inner, bytes32(key), bytes32(uint256(uint160(value)))); - } - - /** - * @dev Removes a value from a set. O(1). - * - * Returns true if the key was removed from the map, that is if it was present. - */ - function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) { - return remove(map._inner, bytes32(key)); - } - - /** - * @dev Returns true if the key is in the map. O(1). - */ - function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) { - return contains(map._inner, bytes32(key)); - } - - /** - * @dev Returns the number of elements in the map. O(1). - */ - function length(UintToAddressMap storage map) internal view returns (uint256) { - return length(map._inner); - } - - /** - * @dev Returns the element stored at position `index` in the set. O(1). - * Note that there are no guarantees on the ordering of values inside the - * array, and it may change when more values are added or removed. - * - * Requirements: - * - * - `index` must be strictly less than {length}. - */ - function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) { - (bytes32 key, bytes32 value) = at(map._inner, index); - return (uint256(key), address(uint160(uint256(value)))); - } - - /** - * @dev Tries to returns the value associated with `key`. O(1). - * Does not revert if `key` is not in the map. - */ - function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) { - (bool success, bytes32 value) = tryGet(map._inner, bytes32(key)); - return (success, address(uint160(uint256(value)))); - } - - /** - * @dev Returns the value associated with `key`. O(1). - * - * Requirements: - * - * - `key` must be in the map. - */ - function get(UintToAddressMap storage map, uint256 key) internal view returns (address) { - return address(uint160(uint256(get(map._inner, bytes32(key))))); - } - - /** - * @dev Same as {get}, with a custom error message when `key` is not in the map. - * - * CAUTION: This function is deprecated because it requires allocating memory for the error - * message unnecessarily. For custom revert reasons use {tryGet}. - */ - function get( - UintToAddressMap storage map, - uint256 key, - string memory errorMessage - ) internal view returns (address) { - return address(uint160(uint256(get(map._inner, bytes32(key), errorMessage)))); - } - - // AddressToUintMap - - struct AddressToUintMap { - Bytes32ToBytes32Map _inner; - } - - /** - * @dev Adds a key-value pair to a map, or updates the value for an existing - * key. O(1). - * - * Returns true if the key was added to the map, that is if it was not - * already present. - */ - function set( - AddressToUintMap storage map, - address key, - uint256 value - ) internal returns (bool) { - return set(map._inner, bytes32(uint256(uint160(key))), bytes32(value)); - } - - /** - * @dev Removes a value from a set. O(1). - * - * Returns true if the key was removed from the map, that is if it was present. - */ - function remove(AddressToUintMap storage map, address key) internal returns (bool) { - return remove(map._inner, bytes32(uint256(uint160(key)))); - } - - /** - * @dev Returns true if the key is in the map. O(1). - */ - function contains(AddressToUintMap storage map, address key) internal view returns (bool) { - return contains(map._inner, bytes32(uint256(uint160(key)))); - } - - /** - * @dev Returns the number of elements in the map. O(1). - */ - function length(AddressToUintMap storage map) internal view returns (uint256) { - return length(map._inner); - } - - /** - * @dev Returns the element stored at position `index` in the set. O(1). - * Note that there are no guarantees on the ordering of values inside the - * array, and it may change when more values are added or removed. - * - * Requirements: - * - * - `index` must be strictly less than {length}. - */ - function at(AddressToUintMap storage map, uint256 index) internal view returns (address, uint256) { - (bytes32 key, bytes32 value) = at(map._inner, index); - return (address(uint160(uint256(key))), uint256(value)); - } - - /** - * @dev Tries to returns the value associated with `key`. O(1). - * Does not revert if `key` is not in the map. - */ - function tryGet(AddressToUintMap storage map, address key) internal view returns (bool, uint256) { - (bool success, bytes32 value) = tryGet(map._inner, bytes32(uint256(uint160(key)))); - return (success, uint256(value)); - } - - /** - * @dev Returns the value associated with `key`. O(1). - * - * Requirements: - * - * - `key` must be in the map. - */ - function get(AddressToUintMap storage map, address key) internal view returns (uint256) { - return uint256(get(map._inner, bytes32(uint256(uint160(key))))); - } - - /** - * @dev Same as {get}, with a custom error message when `key` is not in the map. - * - * CAUTION: This function is deprecated because it requires allocating memory for the error - * message unnecessarily. For custom revert reasons use {tryGet}. - */ - function get( - AddressToUintMap storage map, - address key, - string memory errorMessage - ) internal view returns (uint256) { - return uint256(get(map._inner, bytes32(uint256(uint160(key))), errorMessage)); - } - - // Bytes32ToUintMap - - struct Bytes32ToUintMap { - Bytes32ToBytes32Map _inner; - } - - /** - * @dev Adds a key-value pair to a map, or updates the value for an existing - * key. O(1). - * - * Returns true if the key was added to the map, that is if it was not - * already present. - */ - function set( - Bytes32ToUintMap storage map, - bytes32 key, - uint256 value - ) internal returns (bool) { - return set(map._inner, key, bytes32(value)); - } - - /** - * @dev Removes a value from a set. O(1). - * - * Returns true if the key was removed from the map, that is if it was present. - */ - function remove(Bytes32ToUintMap storage map, bytes32 key) internal returns (bool) { - return remove(map._inner, key); - } - - /** - * @dev Returns true if the key is in the map. O(1). - */ - function contains(Bytes32ToUintMap storage map, bytes32 key) internal view returns (bool) { - return contains(map._inner, key); - } - - /** - * @dev Returns the number of elements in the map. O(1). - */ - function length(Bytes32ToUintMap storage map) internal view returns (uint256) { - return length(map._inner); - } - - /** - * @dev Returns the element stored at position `index` in the set. O(1). - * Note that there are no guarantees on the ordering of values inside the - * array, and it may change when more values are added or removed. - * - * Requirements: - * - * - `index` must be strictly less than {length}. - */ - function at(Bytes32ToUintMap storage map, uint256 index) internal view returns (bytes32, uint256) { - (bytes32 key, bytes32 value) = at(map._inner, index); - return (key, uint256(value)); - } - - /** - * @dev Tries to returns the value associated with `key`. O(1). - * Does not revert if `key` is not in the map. - */ - function tryGet(Bytes32ToUintMap storage map, bytes32 key) internal view returns (bool, uint256) { - (bool success, bytes32 value) = tryGet(map._inner, key); - return (success, uint256(value)); - } - - /** - * @dev Returns the value associated with `key`. O(1). - * - * Requirements: - * - * - `key` must be in the map. - */ - function get(Bytes32ToUintMap storage map, bytes32 key) internal view returns (uint256) { - return uint256(get(map._inner, key)); - } - - /** - * @dev Same as {get}, with a custom error message when `key` is not in the map. - * - * CAUTION: This function is deprecated because it requires allocating memory for the error - * message unnecessarily. For custom revert reasons use {tryGet}. - */ - function get( - Bytes32ToUintMap storage map, - bytes32 key, - string memory errorMessage - ) internal view returns (uint256) { - return uint256(get(map._inner, key, errorMessage)); - } -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/structs/EnumerableSetUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/structs/EnumerableSetUpgradeable.sol deleted file mode 100644 index da10810..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/utils/structs/EnumerableSetUpgradeable.sol +++ /dev/null @@ -1,378 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.7.0) (utils/structs/EnumerableSet.sol) -// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. - -pragma solidity ^0.8.0; - -/** - * @dev Library for managing - * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive - * types. - * - * Sets have the following properties: - * - * - Elements are added, removed, and checked for existence in constant time - * (O(1)). - * - Elements are enumerated in O(n). No guarantees are made on the ordering. - * - * ``` - * contract Example { - * // Add the library methods - * using EnumerableSet for EnumerableSet.AddressSet; - * - * // Declare a set state variable - * EnumerableSet.AddressSet private mySet; - * } - * ``` - * - * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) - * and `uint256` (`UintSet`) are supported. - * - * [WARNING] - * ==== - * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure - * unusable. - * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. - * - * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an - * array of EnumerableSet. - * ==== - */ -library EnumerableSetUpgradeable { - // To implement this library for multiple types with as little code - // repetition as possible, we write it in terms of a generic Set type with - // bytes32 values. - // The Set implementation uses private functions, and user-facing - // implementations (such as AddressSet) are just wrappers around the - // underlying Set. - // This means that we can only create new EnumerableSets for types that fit - // in bytes32. - - struct Set { - // Storage of set values - bytes32[] _values; - // Position of the value in the `values` array, plus 1 because index 0 - // means a value is not in the set. - mapping(bytes32 => uint256) _indexes; - } - - /** - * @dev Add a value to a set. O(1). - * - * Returns true if the value was added to the set, that is if it was not - * already present. - */ - function _add(Set storage set, bytes32 value) private returns (bool) { - if (!_contains(set, value)) { - set._values.push(value); - // The value is stored at length-1, but we add 1 to all indexes - // and use 0 as a sentinel value - set._indexes[value] = set._values.length; - return true; - } else { - return false; - } - } - - /** - * @dev Removes a value from a set. O(1). - * - * Returns true if the value was removed from the set, that is if it was - * present. - */ - function _remove(Set storage set, bytes32 value) private returns (bool) { - // We read and store the value's index to prevent multiple reads from the same storage slot - uint256 valueIndex = set._indexes[value]; - - if (valueIndex != 0) { - // Equivalent to contains(set, value) - // To delete an element from the _values array in O(1), we swap the element to delete with the last one in - // the array, and then remove the last element (sometimes called as 'swap and pop'). - // This modifies the order of the array, as noted in {at}. - - uint256 toDeleteIndex = valueIndex - 1; - uint256 lastIndex = set._values.length - 1; - - if (lastIndex != toDeleteIndex) { - bytes32 lastValue = set._values[lastIndex]; - - // Move the last value to the index where the value to delete is - set._values[toDeleteIndex] = lastValue; - // Update the index for the moved value - set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex - } - - // Delete the slot where the moved value was stored - set._values.pop(); - - // Delete the index for the deleted slot - delete set._indexes[value]; - - return true; - } else { - return false; - } - } - - /** - * @dev Returns true if the value is in the set. O(1). - */ - function _contains(Set storage set, bytes32 value) private view returns (bool) { - return set._indexes[value] != 0; - } - - /** - * @dev Returns the number of values on the set. O(1). - */ - function _length(Set storage set) private view returns (uint256) { - return set._values.length; - } - - /** - * @dev Returns the value stored at position `index` in the set. O(1). - * - * Note that there are no guarantees on the ordering of values inside the - * array, and it may change when more values are added or removed. - * - * Requirements: - * - * - `index` must be strictly less than {length}. - */ - function _at(Set storage set, uint256 index) private view returns (bytes32) { - return set._values[index]; - } - - /** - * @dev Return the entire set in an array - * - * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed - * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that - * this function has an unbounded cost, and using it as part of a state-changing function may render the function - * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. - */ - function _values(Set storage set) private view returns (bytes32[] memory) { - return set._values; - } - - // Bytes32Set - - struct Bytes32Set { - Set _inner; - } - - /** - * @dev Add a value to a set. O(1). - * - * Returns true if the value was added to the set, that is if it was not - * already present. - */ - function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { - return _add(set._inner, value); - } - - /** - * @dev Removes a value from a set. O(1). - * - * Returns true if the value was removed from the set, that is if it was - * present. - */ - function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { - return _remove(set._inner, value); - } - - /** - * @dev Returns true if the value is in the set. O(1). - */ - function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { - return _contains(set._inner, value); - } - - /** - * @dev Returns the number of values in the set. O(1). - */ - function length(Bytes32Set storage set) internal view returns (uint256) { - return _length(set._inner); - } - - /** - * @dev Returns the value stored at position `index` in the set. O(1). - * - * Note that there are no guarantees on the ordering of values inside the - * array, and it may change when more values are added or removed. - * - * Requirements: - * - * - `index` must be strictly less than {length}. - */ - function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { - return _at(set._inner, index); - } - - /** - * @dev Return the entire set in an array - * - * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed - * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that - * this function has an unbounded cost, and using it as part of a state-changing function may render the function - * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. - */ - function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { - bytes32[] memory store = _values(set._inner); - bytes32[] memory result; - - /// @solidity memory-safe-assembly - assembly { - result := store - } - - return result; - } - - // AddressSet - - struct AddressSet { - Set _inner; - } - - /** - * @dev Add a value to a set. O(1). - * - * Returns true if the value was added to the set, that is if it was not - * already present. - */ - function add(AddressSet storage set, address value) internal returns (bool) { - return _add(set._inner, bytes32(uint256(uint160(value)))); - } - - /** - * @dev Removes a value from a set. O(1). - * - * Returns true if the value was removed from the set, that is if it was - * present. - */ - function remove(AddressSet storage set, address value) internal returns (bool) { - return _remove(set._inner, bytes32(uint256(uint160(value)))); - } - - /** - * @dev Returns true if the value is in the set. O(1). - */ - function contains(AddressSet storage set, address value) internal view returns (bool) { - return _contains(set._inner, bytes32(uint256(uint160(value)))); - } - - /** - * @dev Returns the number of values in the set. O(1). - */ - function length(AddressSet storage set) internal view returns (uint256) { - return _length(set._inner); - } - - /** - * @dev Returns the value stored at position `index` in the set. O(1). - * - * Note that there are no guarantees on the ordering of values inside the - * array, and it may change when more values are added or removed. - * - * Requirements: - * - * - `index` must be strictly less than {length}. - */ - function at(AddressSet storage set, uint256 index) internal view returns (address) { - return address(uint160(uint256(_at(set._inner, index)))); - } - - /** - * @dev Return the entire set in an array - * - * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed - * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that - * this function has an unbounded cost, and using it as part of a state-changing function may render the function - * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. - */ - function values(AddressSet storage set) internal view returns (address[] memory) { - bytes32[] memory store = _values(set._inner); - address[] memory result; - - /// @solidity memory-safe-assembly - assembly { - result := store - } - - return result; - } - - // UintSet - - struct UintSet { - Set _inner; - } - - /** - * @dev Add a value to a set. O(1). - * - * Returns true if the value was added to the set, that is if it was not - * already present. - */ - function add(UintSet storage set, uint256 value) internal returns (bool) { - return _add(set._inner, bytes32(value)); - } - - /** - * @dev Removes a value from a set. O(1). - * - * Returns true if the value was removed from the set, that is if it was - * present. - */ - function remove(UintSet storage set, uint256 value) internal returns (bool) { - return _remove(set._inner, bytes32(value)); - } - - /** - * @dev Returns true if the value is in the set. O(1). - */ - function contains(UintSet storage set, uint256 value) internal view returns (bool) { - return _contains(set._inner, bytes32(value)); - } - - /** - * @dev Returns the number of values in the set. O(1). - */ - function length(UintSet storage set) internal view returns (uint256) { - return _length(set._inner); - } - - /** - * @dev Returns the value stored at position `index` in the set. O(1). - * - * Note that there are no guarantees on the ordering of values inside the - * array, and it may change when more values are added or removed. - * - * Requirements: - * - * - `index` must be strictly less than {length}. - */ - function at(UintSet storage set, uint256 index) internal view returns (uint256) { - return uint256(_at(set._inner, index)); - } - - /** - * @dev Return the entire set in an array - * - * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed - * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that - * this function has an unbounded cost, and using it as part of a state-changing function may render the function - * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. - */ - function values(UintSet storage set) internal view returns (uint256[] memory) { - bytes32[] memory store = _values(set._inner); - uint256[] memory result; - - /// @solidity memory-safe-assembly - assembly { - result := store - } - - return result; - } -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/vendor/amb/IAMBUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/vendor/amb/IAMBUpgradeable.sol deleted file mode 100644 index 486232a..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/vendor/amb/IAMBUpgradeable.sol +++ /dev/null @@ -1,49 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (vendor/amb/IAMB.sol) -pragma solidity ^0.8.0; - -interface IAMBUpgradeable { - event UserRequestForAffirmation(bytes32 indexed messageId, bytes encodedData); - event UserRequestForSignature(bytes32 indexed messageId, bytes encodedData); - event AffirmationCompleted( - address indexed sender, - address indexed executor, - bytes32 indexed messageId, - bool status - ); - event RelayedMessage(address indexed sender, address indexed executor, bytes32 indexed messageId, bool status); - - function messageSender() external view returns (address); - - function maxGasPerTx() external view returns (uint256); - - function transactionHash() external view returns (bytes32); - - function messageId() external view returns (bytes32); - - function messageSourceChainId() external view returns (bytes32); - - function messageCallStatus(bytes32 _messageId) external view returns (bool); - - function failedMessageDataHash(bytes32 _messageId) external view returns (bytes32); - - function failedMessageReceiver(bytes32 _messageId) external view returns (address); - - function failedMessageSender(bytes32 _messageId) external view returns (address); - - function requireToPassMessage( - address _contract, - bytes calldata _data, - uint256 _gas - ) external returns (bytes32); - - function requireToConfirmMessage( - address _contract, - bytes calldata _data, - uint256 _gas - ) external returns (bytes32); - - function sourceChainId() external view returns (uint256); - - function destinationChainId() external view returns (uint256); -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/vendor/arbitrum/IArbSysUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/vendor/arbitrum/IArbSysUpgradeable.sol deleted file mode 100644 index c6177ac..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/vendor/arbitrum/IArbSysUpgradeable.sol +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright 2021-2022, Offchain Labs, Inc. -// For license information, see https://github.com/OffchainLabs/nitro/blob/master/LICENSE -// SPDX-License-Identifier: BUSL-1.1 - -pragma solidity >=0.4.21 <0.9.0; - -/** - * @title System level functionality - * @notice For use by contracts to interact with core L2-specific functionality. - * Precompiled contract that exists in every Arbitrum chain at address(100), 0x0000000000000000000000000000000000000064. - */ -interface IArbSysUpgradeable { - /** - * @notice Get Arbitrum block number (distinct from L1 block number; Arbitrum genesis block has block number 0) - * @return block number as int - */ - function arbBlockNumber() external view returns (uint256); - - /** - * @notice Get Arbitrum block hash (reverts unless currentBlockNum-256 <= arbBlockNum < currentBlockNum) - * @return block hash - */ - function arbBlockHash(uint256 arbBlockNum) external view returns (bytes32); - - /** - * @notice Gets the rollup's unique chain identifier - * @return Chain identifier as int - */ - function arbChainID() external view returns (uint256); - - /** - * @notice Get internal version number identifying an ArbOS build - * @return version number as int - */ - function arbOSVersion() external view returns (uint256); - - /** - * @notice Returns 0 since Nitro has no concept of storage gas - * @return uint 0 - */ - function getStorageGasAvailable() external view returns (uint256); - - /** - * @notice (deprecated) check if current call is top level (meaning it was triggered by an EoA or a L1 contract) - * @dev this call has been deprecated and may be removed in a future release - * @return true if current execution frame is not a call by another L2 contract - */ - function isTopLevelCall() external view returns (bool); - - /** - * @notice map L1 sender contract address to its L2 alias - * @param sender sender address - * @param unused argument no longer used - * @return aliased sender address - */ - function mapL1SenderContractAddressToL2Alias(address sender, address unused) external pure returns (address); - - /** - * @notice check if the caller (of this caller of this) is an aliased L1 contract address - * @return true iff the caller's address is an alias for an L1 contract address - */ - function wasMyCallersAddressAliased() external view returns (bool); - - /** - * @notice return the address of the caller (of this caller of this), without applying L1 contract address aliasing - * @return address of the caller's caller, without applying L1 contract address aliasing - */ - function myCallersAddressWithoutAliasing() external view returns (address); - - /** - * @notice Send given amount of Eth to dest from sender. - * This is a convenience function, which is equivalent to calling sendTxToL1 with empty data. - * @param destination recipient address on L1 - * @return unique identifier for this L2-to-L1 transaction. - */ - function withdrawEth(address destination) external payable returns (uint256); - - /** - * @notice Send a transaction to L1 - * @dev it is not possible to execute on the L1 any L2-to-L1 transaction which contains data - * to a contract address without any code (as enforced by the Bridge contract). - * @param destination recipient address on L1 - * @param data (optional) calldata for L1 contract call - * @return a unique identifier for this L2-to-L1 transaction. - */ - function sendTxToL1(address destination, bytes calldata data) external payable returns (uint256); - - /** - * @notice Get send Merkle tree state - * @return size number of sends in the history - * @return root root hash of the send history - * @return partials hashes of partial subtrees in the send history tree - */ - function sendMerkleTreeState() - external - view - returns ( - uint256 size, - bytes32 root, - bytes32[] memory partials - ); - - /** - * @notice creates a send txn from L2 to L1 - * @param position = (level << 192) + leaf = (0 << 192) + leaf = leaf - */ - event L2ToL1Tx( - address caller, - address indexed destination, - uint256 indexed hash, - uint256 indexed position, - uint256 arbBlockNum, - uint256 ethBlockNum, - uint256 timestamp, - uint256 callvalue, - bytes data - ); - - /// @dev DEPRECATED in favour of the new L2ToL1Tx event above after the nitro upgrade - event L2ToL1Transaction( - address caller, - address indexed destination, - uint256 indexed uniqueId, - uint256 indexed batchNumber, - uint256 indexInBatch, - uint256 arbBlockNum, - uint256 ethBlockNum, - uint256 timestamp, - uint256 callvalue, - bytes data - ); - - /** - * @notice logs a merkle branch for proof synthesis - * @param reserved an index meant only to align the 4th index with L2ToL1Transaction's 4th event - * @param hash the merkle hash - * @param position = (level << 192) + leaf - */ - event SendMerkleUpdate(uint256 indexed reserved, bytes32 indexed hash, uint256 indexed position); -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/vendor/arbitrum/IBridgeUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/vendor/arbitrum/IBridgeUpgradeable.sol deleted file mode 100644 index e50b386..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/vendor/arbitrum/IBridgeUpgradeable.sol +++ /dev/null @@ -1,108 +0,0 @@ -// Copyright 2021-2022, Offchain Labs, Inc. -// For license information, see https://github.com/nitro/blob/master/LICENSE -// SPDX-License-Identifier: BUSL-1.1 - -// solhint-disable-next-line compiler-version -pragma solidity >=0.6.9 <0.9.0; - -interface IBridgeUpgradeable { - event MessageDelivered( - uint256 indexed messageIndex, - bytes32 indexed beforeInboxAcc, - address inbox, - uint8 kind, - address sender, - bytes32 messageDataHash, - uint256 baseFeeL1, - uint64 timestamp - ); - - event BridgeCallTriggered(address indexed outbox, address indexed to, uint256 value, bytes data); - - event InboxToggle(address indexed inbox, bool enabled); - - event OutboxToggle(address indexed outbox, bool enabled); - - event SequencerInboxUpdated(address newSequencerInbox); - - function allowedDelayedInboxList(uint256) external returns (address); - - function allowedOutboxList(uint256) external returns (address); - - /// @dev Accumulator for delayed inbox messages; tail represents hash of the current state; each element represents the inclusion of a new message. - function delayedInboxAccs(uint256) external view returns (bytes32); - - /// @dev Accumulator for sequencer inbox messages; tail represents hash of the current state; each element represents the inclusion of a new message. - function sequencerInboxAccs(uint256) external view returns (bytes32); - - // OpenZeppelin: changed return type from IOwnable - function rollup() external view returns (address); - - function sequencerInbox() external view returns (address); - - function activeOutbox() external view returns (address); - - function allowedDelayedInboxes(address inbox) external view returns (bool); - - function allowedOutboxes(address outbox) external view returns (bool); - - function sequencerReportedSubMessageCount() external view returns (uint256); - - /** - * @dev Enqueue a message in the delayed inbox accumulator. - * These messages are later sequenced in the SequencerInbox, either - * by the sequencer as part of a normal batch, or by force inclusion. - */ - function enqueueDelayedMessage( - uint8 kind, - address sender, - bytes32 messageDataHash - ) external payable returns (uint256); - - function executeCall( - address to, - uint256 value, - bytes calldata data - ) external returns (bool success, bytes memory returnData); - - function delayedMessageCount() external view returns (uint256); - - function sequencerMessageCount() external view returns (uint256); - - // ---------- onlySequencerInbox functions ---------- - - function enqueueSequencerMessage( - bytes32 dataHash, - uint256 afterDelayedMessagesRead, - uint256 prevMessageCount, - uint256 newMessageCount - ) - external - returns ( - uint256 seqMessageIndex, - bytes32 beforeAcc, - bytes32 delayedAcc, - bytes32 acc - ); - - /** - * @dev Allows the sequencer inbox to submit a delayed message of the batchPostingReport type - * This is done through a separate function entrypoint instead of allowing the sequencer inbox - * to call `enqueueDelayedMessage` to avoid the gas overhead of an extra SLOAD in either - * every delayed inbox or every sequencer inbox call. - */ - function submitBatchSpendingReport(address batchPoster, bytes32 dataHash) external returns (uint256 msgNum); - - // ---------- onlyRollupOrOwner functions ---------- - - function setSequencerInbox(address _sequencerInbox) external; - - function setDelayedInbox(address inbox, bool enabled) external; - - function setOutbox(address inbox, bool enabled) external; - - // ---------- initializer ---------- - - // OpenZeppelin: changed rollup_ type from IOwnable - function initialize(address rollup_) external; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/vendor/arbitrum/IDelayedMessageProviderUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/vendor/arbitrum/IDelayedMessageProviderUpgradeable.sol deleted file mode 100644 index 000f008..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/vendor/arbitrum/IDelayedMessageProviderUpgradeable.sol +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2021-2022, Offchain Labs, Inc. -// For license information, see https://github.com/nitro/blob/master/LICENSE -// SPDX-License-Identifier: BUSL-1.1 - -// solhint-disable-next-line compiler-version -pragma solidity >=0.6.9 <0.9.0; - -interface IDelayedMessageProviderUpgradeable { - /// @dev event emitted when a inbox message is added to the Bridge's delayed accumulator - event InboxMessageDelivered(uint256 indexed messageNum, bytes data); - - /// @dev event emitted when a inbox message is added to the Bridge's delayed accumulator - /// same as InboxMessageDelivered but the batch data is available in tx.input - event InboxMessageDeliveredFromOrigin(uint256 indexed messageNum); -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/vendor/arbitrum/IInboxUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/vendor/arbitrum/IInboxUpgradeable.sol deleted file mode 100644 index 1a6052e..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/vendor/arbitrum/IInboxUpgradeable.sol +++ /dev/null @@ -1,151 +0,0 @@ -// Copyright 2021-2022, Offchain Labs, Inc. -// For license information, see https://github.com/nitro/blob/master/LICENSE -// SPDX-License-Identifier: BUSL-1.1 - -// solhint-disable-next-line compiler-version -pragma solidity >=0.6.9 <0.9.0; - -import "./IBridgeUpgradeable.sol"; -import "./IDelayedMessageProviderUpgradeable.sol"; - -interface IInboxUpgradeable is IDelayedMessageProviderUpgradeable { - function bridge() external view returns (IBridgeUpgradeable); - - // OpenZeppelin: changed return type from ISequencerInbox - function sequencerInbox() external view returns (address); - - /** - * @notice Send a generic L2 message to the chain - * @dev This method is an optimization to avoid having to emit the entirety of the messageData in a log. Instead validators are expected to be able to parse the data from the transaction's input - * @param messageData Data of the message being sent - */ - function sendL2MessageFromOrigin(bytes calldata messageData) external returns (uint256); - - /** - * @notice Send a generic L2 message to the chain - * @dev This method can be used to send any type of message that doesn't require L1 validation - * @param messageData Data of the message being sent - */ - function sendL2Message(bytes calldata messageData) external returns (uint256); - - function sendL1FundedUnsignedTransaction( - uint256 gasLimit, - uint256 maxFeePerGas, - uint256 nonce, - address to, - bytes calldata data - ) external payable returns (uint256); - - function sendL1FundedContractTransaction( - uint256 gasLimit, - uint256 maxFeePerGas, - address to, - bytes calldata data - ) external payable returns (uint256); - - function sendUnsignedTransaction( - uint256 gasLimit, - uint256 maxFeePerGas, - uint256 nonce, - address to, - uint256 value, - bytes calldata data - ) external returns (uint256); - - function sendContractTransaction( - uint256 gasLimit, - uint256 maxFeePerGas, - address to, - uint256 value, - bytes calldata data - ) external returns (uint256); - - /** - * @notice Get the L1 fee for submitting a retryable - * @dev This fee can be paid by funds already in the L2 aliased address or by the current message value - * @dev This formula may change in the future, to future proof your code query this method instead of inlining!! - * @param dataLength The length of the retryable's calldata, in bytes - * @param baseFee The block basefee when the retryable is included in the chain, if 0 current block.basefee will be used - */ - function calculateRetryableSubmissionFee(uint256 dataLength, uint256 baseFee) external view returns (uint256); - - /** - * @notice Deposit eth from L1 to L2 to address of the sender if sender is an EOA, and to its aliased address if the sender is a contract - * @dev This does not trigger the fallback function when receiving in the L2 side. - * Look into retryable tickets if you are interested in this functionality. - * @dev This function should not be called inside contract constructors - */ - function depositEth() external payable returns (uint256); - - /** - * @notice Put a message in the L2 inbox that can be reexecuted for some fixed amount of time if it reverts - * @dev all msg.value will deposited to callValueRefundAddress on L2 - * @dev Gas limit and maxFeePerGas should not be set to 1 as that is used to trigger the RetryableData error - * @param to destination L2 contract address - * @param l2CallValue call value for retryable L2 message - * @param maxSubmissionCost Max gas deducted from user's L2 balance to cover base submission fee - * @param excessFeeRefundAddress gasLimit x maxFeePerGas - execution cost gets credited here on L2 balance - * @param callValueRefundAddress l2Callvalue gets credited here on L2 if retryable txn times out or gets cancelled - * @param gasLimit Max gas deducted from user's L2 balance to cover L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) - * @param maxFeePerGas price bid for L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) - * @param data ABI encoded data of L2 message - * @return unique message number of the retryable transaction - */ - function createRetryableTicket( - address to, - uint256 l2CallValue, - uint256 maxSubmissionCost, - address excessFeeRefundAddress, - address callValueRefundAddress, - uint256 gasLimit, - uint256 maxFeePerGas, - bytes calldata data - ) external payable returns (uint256); - - /** - * @notice Put a message in the L2 inbox that can be reexecuted for some fixed amount of time if it reverts - * @dev Same as createRetryableTicket, but does not guarantee that submission will succeed by requiring the needed funds - * come from the deposit alone, rather than falling back on the user's L2 balance - * @dev Advanced usage only (does not rewrite aliases for excessFeeRefundAddress and callValueRefundAddress). - * createRetryableTicket method is the recommended standard. - * @dev Gas limit and maxFeePerGas should not be set to 1 as that is used to trigger the RetryableData error - * @param to destination L2 contract address - * @param l2CallValue call value for retryable L2 message - * @param maxSubmissionCost Max gas deducted from user's L2 balance to cover base submission fee - * @param excessFeeRefundAddress gasLimit x maxFeePerGas - execution cost gets credited here on L2 balance - * @param callValueRefundAddress l2Callvalue gets credited here on L2 if retryable txn times out or gets cancelled - * @param gasLimit Max gas deducted from user's L2 balance to cover L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) - * @param maxFeePerGas price bid for L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) - * @param data ABI encoded data of L2 message - * @return unique message number of the retryable transaction - */ - function unsafeCreateRetryableTicket( - address to, - uint256 l2CallValue, - uint256 maxSubmissionCost, - address excessFeeRefundAddress, - address callValueRefundAddress, - uint256 gasLimit, - uint256 maxFeePerGas, - bytes calldata data - ) external payable returns (uint256); - - // ---------- onlyRollupOrOwner functions ---------- - - /// @notice pauses all inbox functionality - function pause() external; - - /// @notice unpauses all inbox functionality - function unpause() external; - - // ---------- initializer ---------- - - /** - * @dev function to be called one time during the inbox upgrade process - * this is used to fix the storage slots - */ - function postUpgradeInit(IBridgeUpgradeable _bridge) external; - - // OpenZeppelin: changed _sequencerInbox type from ISequencerInbox - function initialize(IBridgeUpgradeable _bridge, address _sequencerInbox) external; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/vendor/arbitrum/IOutboxUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/vendor/arbitrum/IOutboxUpgradeable.sol deleted file mode 100644 index 05aa7d2..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/vendor/arbitrum/IOutboxUpgradeable.sol +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright 2021-2022, Offchain Labs, Inc. -// For license information, see https://github.com/nitro/blob/master/LICENSE -// SPDX-License-Identifier: BUSL-1.1 - -// solhint-disable-next-line compiler-version -pragma solidity >=0.6.9 <0.9.0; - -import "./IBridgeUpgradeable.sol"; - -interface IOutboxUpgradeable { - event SendRootUpdated(bytes32 indexed blockHash, bytes32 indexed outputRoot); - event OutBoxTransactionExecuted( - address indexed to, - address indexed l2Sender, - uint256 indexed zero, - uint256 transactionIndex - ); - - function rollup() external view returns (address); // the rollup contract - - function bridge() external view returns (IBridgeUpgradeable); // the bridge contract - - function spent(uint256) external view returns (bytes32); // packed spent bitmap - - function roots(bytes32) external view returns (bytes32); // maps root hashes => L2 block hash - - // solhint-disable-next-line func-name-mixedcase - function OUTBOX_VERSION() external view returns (uint128); // the outbox version - - function updateSendRoot(bytes32 sendRoot, bytes32 l2BlockHash) external; - - /// @notice When l2ToL1Sender returns a nonzero address, the message was originated by an L2 account - /// When the return value is zero, that means this is a system message - /// @dev the l2ToL1Sender behaves as the tx.origin, the msg.sender should be validated to protect against reentrancies - function l2ToL1Sender() external view returns (address); - - /// @return l2Block return L2 block when the L2 tx was initiated or 0 if no L2 to L1 transaction is active - function l2ToL1Block() external view returns (uint256); - - /// @return l1Block return L1 block when the L2 tx was initiated or 0 if no L2 to L1 transaction is active - function l2ToL1EthBlock() external view returns (uint256); - - /// @return timestamp return L2 timestamp when the L2 tx was initiated or 0 if no L2 to L1 transaction is active - function l2ToL1Timestamp() external view returns (uint256); - - /// @return outputId returns the unique output identifier of the L2 to L1 tx or 0 if no L2 to L1 transaction is active - function l2ToL1OutputId() external view returns (bytes32); - - /** - * @notice Executes a messages in an Outbox entry. - * @dev Reverts if dispute period hasn't expired, since the outbox entry - * is only created once the rollup confirms the respective assertion. - * @dev it is not possible to execute any L2-to-L1 transaction which contains data - * to a contract address without any code (as enforced by the Bridge contract). - * @param proof Merkle proof of message inclusion in send root - * @param index Merkle path to message - * @param l2Sender sender if original message (i.e., caller of ArbSys.sendTxToL1) - * @param to destination address for L1 contract call - * @param l2Block l2 block number at which sendTxToL1 call was made - * @param l1Block l1 block number at which sendTxToL1 call was made - * @param l2Timestamp l2 Timestamp at which sendTxToL1 call was made - * @param value wei in L1 message - * @param data abi-encoded L1 message data - */ - function executeTransaction( - bytes32[] calldata proof, - uint256 index, - address l2Sender, - address to, - uint256 l2Block, - uint256 l1Block, - uint256 l2Timestamp, - uint256 value, - bytes calldata data - ) external; - - /** - * @dev function used to simulate the result of a particular function call from the outbox - * it is useful for things such as gas estimates. This function includes all costs except for - * proof validation (which can be considered offchain as a somewhat of a fixed cost - it's - * not really a fixed cost, but can be treated as so with a fixed overhead for gas estimation). - * We can't include the cost of proof validation since this is intended to be used to simulate txs - * that are included in yet-to-be confirmed merkle roots. The simulation entrypoint could instead pretend - * to confirm a pending merkle root, but that would be less practical for integrating with tooling. - * It is only possible to trigger it when the msg sender is address zero, which should be impossible - * unless under simulation in an eth_call or eth_estimateGas - */ - function executeTransactionSimulation( - uint256 index, - address l2Sender, - address to, - uint256 l2Block, - uint256 l1Block, - uint256 l2Timestamp, - uint256 value, - bytes calldata data - ) external; - - /** - * @param index Merkle path to message - * @return true if the message has been spent - */ - function isSpent(uint256 index) external view returns (bool); - - function calculateItemHash( - address l2Sender, - address to, - uint256 l2Block, - uint256 l1Block, - uint256 l2Timestamp, - uint256 value, - bytes calldata data - ) external pure returns (bytes32); - - function calculateMerkleRoot( - bytes32[] memory proof, - uint256 path, - bytes32 item - ) external pure returns (bytes32); -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/vendor/compound/ICompoundTimelockUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/vendor/compound/ICompoundTimelockUpgradeable.sol deleted file mode 100644 index 250b831..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/vendor/compound/ICompoundTimelockUpgradeable.sol +++ /dev/null @@ -1,86 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (vendor/compound/ICompoundTimelock.sol) - -pragma solidity ^0.8.0; - -/** - * https://github.com/compound-finance/compound-protocol/blob/master/contracts/Timelock.sol[Compound's timelock] interface - */ -interface ICompoundTimelockUpgradeable { - event NewAdmin(address indexed newAdmin); - event NewPendingAdmin(address indexed newPendingAdmin); - event NewDelay(uint256 indexed newDelay); - event CancelTransaction( - bytes32 indexed txHash, - address indexed target, - uint256 value, - string signature, - bytes data, - uint256 eta - ); - event ExecuteTransaction( - bytes32 indexed txHash, - address indexed target, - uint256 value, - string signature, - bytes data, - uint256 eta - ); - event QueueTransaction( - bytes32 indexed txHash, - address indexed target, - uint256 value, - string signature, - bytes data, - uint256 eta - ); - - receive() external payable; - - // solhint-disable-next-line func-name-mixedcase - function GRACE_PERIOD() external view returns (uint256); - - // solhint-disable-next-line func-name-mixedcase - function MINIMUM_DELAY() external view returns (uint256); - - // solhint-disable-next-line func-name-mixedcase - function MAXIMUM_DELAY() external view returns (uint256); - - function admin() external view returns (address); - - function pendingAdmin() external view returns (address); - - function delay() external view returns (uint256); - - function queuedTransactions(bytes32) external view returns (bool); - - function setDelay(uint256) external; - - function acceptAdmin() external; - - function setPendingAdmin(address) external; - - function queueTransaction( - address target, - uint256 value, - string memory signature, - bytes memory data, - uint256 eta - ) external returns (bytes32); - - function cancelTransaction( - address target, - uint256 value, - string memory signature, - bytes memory data, - uint256 eta - ) external; - - function executeTransaction( - address target, - uint256 value, - string memory signature, - bytes memory data, - uint256 eta - ) external payable returns (bytes memory); -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/vendor/compound/LICENSE b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/vendor/compound/LICENSE deleted file mode 100644 index 7da2324..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/vendor/compound/LICENSE +++ /dev/null @@ -1,11 +0,0 @@ -Copyright 2020 Compound Labs, Inc. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/vendor/optimism/ICrossDomainMessengerUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/vendor/optimism/ICrossDomainMessengerUpgradeable.sol deleted file mode 100644 index 96f3b14..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/vendor/optimism/ICrossDomainMessengerUpgradeable.sol +++ /dev/null @@ -1,38 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (vendor/optimism/ICrossDomainMessenger.sol) -pragma solidity >0.5.0 <0.9.0; - -/** - * @title ICrossDomainMessenger - */ -interface ICrossDomainMessengerUpgradeable { - /********** - * Events * - **********/ - - event SentMessage(address indexed target, address sender, bytes message, uint256 messageNonce, uint256 gasLimit); - event RelayedMessage(bytes32 indexed msgHash); - event FailedRelayedMessage(bytes32 indexed msgHash); - - /************* - * Variables * - *************/ - - function xDomainMessageSender() external view returns (address); - - /******************** - * Public Functions * - ********************/ - - /** - * Sends a cross domain message to the target messenger. - * @param _target Target contract address. - * @param _message Message to send to the target. - * @param _gasLimit Gas limit for the provided message. - */ - function sendMessage( - address _target, - bytes calldata _message, - uint32 _gasLimit - ) external; -} diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/vendor/optimism/LICENSE b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/vendor/optimism/LICENSE deleted file mode 100644 index 6a7da52..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/vendor/optimism/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright 2020-2021 Optimism - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/vendor/polygon/IFxMessageProcessorUpgradeable.sol b/contracts/lib/openzeppelin-contracts-upgradeable/contracts/vendor/polygon/IFxMessageProcessorUpgradeable.sol deleted file mode 100644 index 8cc8396..0000000 --- a/contracts/lib/openzeppelin-contracts-upgradeable/contracts/vendor/polygon/IFxMessageProcessorUpgradeable.sol +++ /dev/null @@ -1,11 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.6.0) (vendor/polygon/IFxMessageProcessor.sol) -pragma solidity ^0.8.0; - -interface IFxMessageProcessorUpgradeable { - function processMessageFromRoot( - uint256 stateId, - address rootMessageSender, - bytes calldata data - ) external; -} diff --git a/contracts/package.json b/contracts/package.json deleted file mode 100644 index 527599b..0000000 --- a/contracts/package.json +++ /dev/null @@ -1,119 +0,0 @@ -{ - "name": "@hypercerts-org/contracts", - "description": "EVM compatible protocol for managing impact claims", - "version": "2.0.0-alpha.11", - "author": { - "name": "Hypercerts Foundation", - "url": "https://github.com/hypercerts-org/hypercerts" - }, - "homepage": "https://hypercerts.org", - "bugs": "https://github.com/hypercerts-org/hypercerts/issues/new", - "repository": { - "directory": "contracts", - "url": "https://github.com/hypercerts-org/hypercerts", - "type": "git" - }, - "main": "./dist/cjs/index.cjs", - "module": "./dist/esm/index.mjs", - "types": "./dist/index.d.ts", - "exports": { - ".": { - "types": "./dist/index.d.ts", - "require": "./dist/cjs/index.cjs", - "import": "./dist/esm/index.mjs" - } - }, - "files": [ - "dist", - "README.md", - "package.json" - ], - "devDependencies": { - "@chainlink/contracts": "^0.8.0", - "@commitlint/cli": "^17.1.2", - "@commitlint/config-conventional": "^17.1.0", - "@looksrare/contracts-libs": "^3.4.0", - "@nomicfoundation/hardhat-ethers": "^3.0.8", - "@nomicfoundation/hardhat-toolbox": "^5.0.0", - "@nomicfoundation/hardhat-viem": "^2.0.6", - "@openzeppelin/contracts": "^4.9.3", - "@openzeppelin/hardhat-upgrades": "3.9.0", - "@primitivefi/hardhat-dodoc": "^0.2.3", - "@rollup/plugin-commonjs": "^24.0.1", - "@rollup/plugin-json": "^6.0.0", - "@rollup/plugin-node-resolve": "^15.0.1", - "@trivago/prettier-plugin-sort-imports": "^3.3.0", - "@typechain/hardhat": "^9.1.0", - "@types/node": "^18.18.1", - "@typescript-eslint/eslint-plugin": "^7.12.0", - "@typescript-eslint/parser": "^7.12.0", - "chai": "^4.5.0", - "commitizen": "^4.2.5", - "cross-env": "^7.0.3", - "cz-conventional-changelog": "^3.3.0", - "dotenv": "^16.0.2", - "eslint": "^8.23.1", - "eslint-config-prettier": "^8.5.0", - "ethers": "^6.8.0", - "hardhat-abi-exporter": "^2.10.1", - "hardhat-preprocessor": "^0.1.5", - "husky": "^8.0.1", - "lint-staged": "^13.0.3", - "prettier": "^2.8.8", - "prettier-plugin-solidity": "^1.1.3", - "rimraf": "^5.0.5", - "rollup": "^4.0.2", - "rollup-plugin-auto-external": "^2.0.0", - "rollup-plugin-dts": "^6.1.1", - "rollup-plugin-esbuild": "^6.1.0", - "rollup-plugin-node-polyfills": "^0.2.1", - "rollup-plugin-swc3": "^0.11.2", - "shx": "^0.3.4", - "solhint": "^3.6.2", - "solhint-plugin-prettier": "^0.0.5", - "solmate": "^6.2.0", - "ts-node": "^10.9.1", - "typechain": "^8.3.2", - "typescript": "^5.5.3", - "viem": "^2.19.7", - "xdeployer": "^2.1.13" - }, - "keywords": [ - "blockchain", - "ethereum", - "forge", - "foundry", - "hypercerts", - "smart-contracts", - "solidity", - "template" - ], - "scripts": { - "build": "pnpm clean && forge compile && hardhat compile && pnpm tsc -p tsconfig.build.json && rollup -c", - "build:forge": "pnpm clean && forge build", - "clean": "rimraf abi artifacts build cache cache_hardhat dist out types", - "deploy:create2-factory": "NODE_OPTIONS='--experimental-loader ts-node/esm/transpile-only --no-warnings=ExperimentalWarning' hardhat deploy-create2-factory", - "deploy:marketplace:celo": "NODE_OPTIONS='--experimental-loader ts-node/esm/transpile-only --no-warnings=ExperimentalWarning' hardhat deploy-marketplace-celo", - "deploy:marketplace:dryrun": "NODE_OPTIONS='--experimental-loader ts-node/esm/transpile-only --no-warnings=ExperimentalWarning' hardhat deploy-marketplace", - "deploy:marketplace": "NODE_OPTIONS='--experimental-loader ts-node/esm/transpile-only --no-warnings=ExperimentalWarning' hardhat deploy-marketplace", - "deploy:protocol:dryrun": "pnpm hardhat deploy-minter", - "deploy:protocol": "pnpm hardhat deploy-minter", - "docs": "hardhat dodoc", - "lint": "pnpm lint:sol && pnpm prettier:check", - "lint:sol": "forge fmt && solhint \"./{src,test/foundry/protocol,test/foundry/marketplace}/**/*.sol\"", - "prepublish": "pnpm build", - "prettier": "prettier --config \"./.prettierrc.yml\" --write \"**/*.{json,md,ts,yml}\"", - "prettier:check": "prettier --config \"./.prettierrc.yml\" --check \"**/*.{json,md,ts,yml}\"", - "slither": "slither ./src", - "test": "pnpm test:hardhat && pnpm test:forge", - "test:forge": "forge test", - "test:hardhat": "hardhat test", - "test:gas": "forge test --match-path test/foundry/PerformanceTesting.t.sol --gas-report", - "hardhat": "hardhat" - }, - "dependencies": { - "@starboardventures/hardhat-verify": "^1.0.1", - "@tenderly/hardhat-tenderly": "^2.3.0", - "hardhat": "^2.22.18" - } -} diff --git a/contracts/pnpm-lock.yaml b/contracts/pnpm-lock.yaml deleted file mode 100644 index 3672b16..0000000 --- a/contracts/pnpm-lock.yaml +++ /dev/null @@ -1,9219 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@starboardventures/hardhat-verify': - specifier: ^1.0.1 - version: 1.0.1(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) - '@tenderly/hardhat-tenderly': - specifier: ^2.3.0 - version: 2.3.0(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@swc/core@1.7.26)(@types/node@18.19.50)(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) - hardhat: - specifier: ^2.22.16 - version: 2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) - devDependencies: - '@chainlink/contracts': - specifier: ^0.8.0 - version: 0.8.0(ethers@6.13.2) - '@commitlint/cli': - specifier: ^17.1.2 - version: 17.8.1(@swc/core@1.7.26) - '@commitlint/config-conventional': - specifier: ^17.1.0 - version: 17.8.1 - '@looksrare/contracts-libs': - specifier: ^3.4.0 - version: 3.5.1 - '@nomicfoundation/hardhat-ethers': - specifier: ^3.0.8 - version: 3.0.8(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) - '@nomicfoundation/hardhat-toolbox': - specifier: ^5.0.0 - version: 5.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(chai@4.5.0)(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@nomicfoundation/hardhat-ignition-ethers@0.15.5(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.10(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@nomicfoundation/ignition-core@0.15.5)(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@nomicfoundation/hardhat-network-helpers@1.0.11(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@nomicfoundation/hardhat-verify@2.0.10(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.6.2))(typescript@5.6.2))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.6.2))(typescript@5.6.2))(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))(typechain@8.3.2(typescript@5.6.2)))(@types/chai@4.3.19)(@types/mocha@10.0.7)(@types/node@18.19.50)(chai@4.5.0)(ethers@6.13.2)(hardhat-gas-reporter@1.0.10(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))(solidity-coverage@0.8.13(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typechain@8.3.2(typescript@5.6.2))(typescript@5.6.2) - '@nomicfoundation/hardhat-viem': - specifier: ^2.0.6 - version: 2.0.6(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))(typescript@5.6.2)(viem@2.21.5(typescript@5.6.2)) - '@openzeppelin/contracts': - specifier: ^4.9.3 - version: 4.9.6 - '@openzeppelin/hardhat-upgrades': - specifier: 3.2.1 - version: 3.2.1(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@nomicfoundation/hardhat-verify@2.0.10(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) - '@primitivefi/hardhat-dodoc': - specifier: ^0.2.3 - version: 0.2.3(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))(squirrelly@8.0.8) - '@rollup/plugin-commonjs': - specifier: ^24.0.1 - version: 24.1.0(rollup@4.21.2) - '@rollup/plugin-json': - specifier: ^6.0.0 - version: 6.1.0(rollup@4.21.2) - '@rollup/plugin-node-resolve': - specifier: ^15.0.1 - version: 15.2.3(rollup@4.21.2) - '@trivago/prettier-plugin-sort-imports': - specifier: ^3.3.0 - version: 3.4.0(prettier@2.8.8) - '@typechain/hardhat': - specifier: ^9.1.0 - version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.6.2))(typescript@5.6.2))(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))(typechain@8.3.2(typescript@5.6.2)) - '@types/node': - specifier: ^18.18.1 - version: 18.19.50 - '@typescript-eslint/eslint-plugin': - specifier: ^7.12.0 - version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2) - '@typescript-eslint/parser': - specifier: ^7.12.0 - version: 7.18.0(eslint@8.57.0)(typescript@5.6.2) - chai: - specifier: ^4.3.7 - version: 4.5.0 - commitizen: - specifier: ^4.2.5 - version: 4.3.0(@types/node@18.19.50)(typescript@5.6.2) - cross-env: - specifier: ^7.0.3 - version: 7.0.3 - cz-conventional-changelog: - specifier: ^3.3.0 - version: 3.3.0(@types/node@18.19.50)(typescript@5.6.2) - dotenv: - specifier: ^16.0.2 - version: 16.4.5 - eslint: - specifier: ^8.23.1 - version: 8.57.0 - eslint-config-prettier: - specifier: ^8.5.0 - version: 8.10.0(eslint@8.57.0) - ethers: - specifier: ^6.8.0 - version: 6.13.2 - hardhat-abi-exporter: - specifier: ^2.10.1 - version: 2.10.1(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) - hardhat-preprocessor: - specifier: ^0.1.5 - version: 0.1.5(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) - husky: - specifier: ^8.0.1 - version: 8.0.3 - lint-staged: - specifier: ^13.0.3 - version: 13.3.0(enquirer@2.4.1) - prettier: - specifier: ^2.8.8 - version: 2.8.8 - prettier-plugin-solidity: - specifier: ^1.1.3 - version: 1.4.1(prettier@2.8.8) - rimraf: - specifier: ^5.0.5 - version: 5.0.10 - rollup: - specifier: ^4.0.2 - version: 4.21.2 - rollup-plugin-auto-external: - specifier: ^2.0.0 - version: 2.0.0(rollup@4.21.2) - rollup-plugin-dts: - specifier: ^6.1.1 - version: 6.1.1(rollup@4.21.2)(typescript@5.6.2) - rollup-plugin-esbuild: - specifier: ^6.1.0 - version: 6.1.1(esbuild@0.23.1)(rollup@4.21.2) - rollup-plugin-node-polyfills: - specifier: ^0.2.1 - version: 0.2.1 - rollup-plugin-swc3: - specifier: ^0.11.2 - version: 0.11.2(@swc/core@1.7.26)(rollup@4.21.2) - shx: - specifier: ^0.3.4 - version: 0.3.4 - solhint: - specifier: ^3.6.2 - version: 3.6.2(typescript@5.6.2) - solhint-plugin-prettier: - specifier: ^0.0.5 - version: 0.0.5(prettier-plugin-solidity@1.4.1(prettier@2.8.8))(prettier@2.8.8) - solmate: - specifier: ^6.2.0 - version: 6.2.0 - ts-node: - specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2) - typechain: - specifier: ^8.3.2 - version: 8.3.2(typescript@5.6.2) - typescript: - specifier: ^5.5.3 - version: 5.6.2 - viem: - specifier: ^2.19.7 - version: 2.21.5(typescript@5.6.2) - xdeployer: - specifier: ^2.1.13 - version: 2.2.2(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) - -packages: - - '@adraffy/ens-normalize@1.10.0': - resolution: {integrity: sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==} - - '@adraffy/ens-normalize@1.10.1': - resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} - - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - - '@aws-crypto/sha256-js@1.2.2': - resolution: {integrity: sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g==} - - '@aws-crypto/util@1.2.2': - resolution: {integrity: sha512-H8PjG5WJ4wz0UXAFXeJjWCW1vkvIJ3qUUD+rGRwJ2/hj+xT58Qle2MTql/2MGzkU+1JLAFuR6aJpLAjHwhmwwg==} - - '@aws-sdk/types@3.649.0': - resolution: {integrity: sha512-PuPw8RysbhJNlaD2d/PzOTf8sbf4Dsn2b7hwyGh7YVG3S75yTpxSAZxrnhKsz9fStgqFmnw/jUfV/G+uQAeTVw==} - engines: {node: '>=16.0.0'} - - '@aws-sdk/util-utf8-browser@3.259.0': - resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} - - '@babel/code-frame@7.24.7': - resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.25.4': - resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.17.8': - resolution: {integrity: sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.17.7': - resolution: {integrity: sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.25.6': - resolution: {integrity: sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-compilation-targets@7.25.2': - resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-environment-visitor@7.24.7': - resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-function-name@7.24.7': - resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-hoist-variables@7.24.7': - resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.24.7': - resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-transforms@7.25.2': - resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-simple-access@7.24.7': - resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-split-export-declaration@7.24.7': - resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.24.8': - resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.24.7': - resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-option@7.24.8': - resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.25.6': - resolution: {integrity: sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==} - engines: {node: '>=6.9.0'} - - '@babel/highlight@7.24.7': - resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.18.9': - resolution: {integrity: sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/parser@7.25.6': - resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/template@7.25.0': - resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.17.3': - resolution: {integrity: sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.25.6': - resolution: {integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.17.0': - resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.25.6': - resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} - engines: {node: '>=6.9.0'} - - '@chainlink/contracts@0.8.0': - resolution: {integrity: sha512-nUv1Uxw5Mn92wgLs2bgPYmo8hpdQ3s9jB/lcbdU0LmNOVu0hbfmouVnqwRLa28Ll50q6GczUA+eO0ikNIKLZsA==} - - '@colors/colors@1.5.0': - resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} - engines: {node: '>=0.1.90'} - - '@commitlint/cli@17.8.1': - resolution: {integrity: sha512-ay+WbzQesE0Rv4EQKfNbSMiJJ12KdKTDzIt0tcK4k11FdsWmtwP0Kp1NWMOUswfIWo6Eb7p7Ln721Nx9FLNBjg==} - engines: {node: '>=v14'} - hasBin: true - - '@commitlint/config-conventional@17.8.1': - resolution: {integrity: sha512-NxCOHx1kgneig3VLauWJcDWS40DVjg7nKOpBEEK9E5fjJpQqLCilcnKkIIjdBH98kEO1q3NpE5NSrZ2kl/QGJg==} - engines: {node: '>=v14'} - - '@commitlint/config-validator@17.8.1': - resolution: {integrity: sha512-UUgUC+sNiiMwkyiuIFR7JG2cfd9t/7MV8VB4TZ+q02ZFkHoduUS4tJGsCBWvBOGD9Btev6IecPMvlWUfJorkEA==} - engines: {node: '>=v14'} - - '@commitlint/config-validator@19.5.0': - resolution: {integrity: sha512-CHtj92H5rdhKt17RmgALhfQt95VayrUo2tSqY9g2w+laAXyk7K/Ef6uPm9tn5qSIwSmrLjKaXK9eiNuxmQrDBw==} - engines: {node: '>=v18'} - - '@commitlint/ensure@17.8.1': - resolution: {integrity: sha512-xjafwKxid8s1K23NFpL8JNo6JnY/ysetKo8kegVM7c8vs+kWLP8VrQq+NbhgVlmCojhEDbzQKp4eRXSjVOGsow==} - engines: {node: '>=v14'} - - '@commitlint/execute-rule@17.8.1': - resolution: {integrity: sha512-JHVupQeSdNI6xzA9SqMF+p/JjrHTcrJdI02PwesQIDCIGUrv04hicJgCcws5nzaoZbROapPs0s6zeVHoxpMwFQ==} - engines: {node: '>=v14'} - - '@commitlint/execute-rule@19.5.0': - resolution: {integrity: sha512-aqyGgytXhl2ejlk+/rfgtwpPexYyri4t8/n4ku6rRJoRhGZpLFMqrZ+YaubeGysCP6oz4mMA34YSTaSOKEeNrg==} - engines: {node: '>=v18'} - - '@commitlint/format@17.8.1': - resolution: {integrity: sha512-f3oMTyZ84M9ht7fb93wbCKmWxO5/kKSbwuYvS867duVomoOsgrgljkGGIztmT/srZnaiGbaK8+Wf8Ik2tSr5eg==} - engines: {node: '>=v14'} - - '@commitlint/is-ignored@17.8.1': - resolution: {integrity: sha512-UshMi4Ltb4ZlNn4F7WtSEugFDZmctzFpmbqvpyxD3la510J+PLcnyhf9chs7EryaRFJMdAKwsEKfNK0jL/QM4g==} - engines: {node: '>=v14'} - - '@commitlint/lint@17.8.1': - resolution: {integrity: sha512-aQUlwIR1/VMv2D4GXSk7PfL5hIaFSfy6hSHV94O8Y27T5q+DlDEgd/cZ4KmVI+MWKzFfCTiTuWqjfRSfdRllCA==} - engines: {node: '>=v14'} - - '@commitlint/load@17.8.1': - resolution: {integrity: sha512-iF4CL7KDFstP1kpVUkT8K2Wl17h2yx9VaR1ztTc8vzByWWcbO/WaKwxsnCOqow9tVAlzPfo1ywk9m2oJ9ucMqA==} - engines: {node: '>=v14'} - - '@commitlint/load@19.5.0': - resolution: {integrity: sha512-INOUhkL/qaKqwcTUvCE8iIUf5XHsEPCLY9looJ/ipzi7jtGhgmtH7OOFiNvwYgH7mA8osUWOUDV8t4E2HAi4xA==} - engines: {node: '>=v18'} - - '@commitlint/message@17.8.1': - resolution: {integrity: sha512-6bYL1GUQsD6bLhTH3QQty8pVFoETfFQlMn2Nzmz3AOLqRVfNNtXBaSY0dhZ0dM6A2MEq4+2d7L/2LP8TjqGRkA==} - engines: {node: '>=v14'} - - '@commitlint/parse@17.8.1': - resolution: {integrity: sha512-/wLUickTo0rNpQgWwLPavTm7WbwkZoBy3X8PpkUmlSmQJyWQTj0m6bDjiykMaDt41qcUbfeFfaCvXfiR4EGnfw==} - engines: {node: '>=v14'} - - '@commitlint/read@17.8.1': - resolution: {integrity: sha512-Fd55Oaz9irzBESPCdMd8vWWgxsW3OWR99wOntBDHgf9h7Y6OOHjWEdS9Xzen1GFndqgyoaFplQS5y7KZe0kO2w==} - engines: {node: '>=v14'} - - '@commitlint/resolve-extends@17.8.1': - resolution: {integrity: sha512-W/ryRoQ0TSVXqJrx5SGkaYuAaE/BUontL1j1HsKckvM6e5ZaG0M9126zcwL6peKSuIetJi7E87PRQF8O86EW0Q==} - engines: {node: '>=v14'} - - '@commitlint/resolve-extends@19.5.0': - resolution: {integrity: sha512-CU/GscZhCUsJwcKTJS9Ndh3AKGZTNFIOoQB2n8CmFnizE0VnEuJoum+COW+C1lNABEeqk6ssfc1Kkalm4bDklA==} - engines: {node: '>=v18'} - - '@commitlint/rules@17.8.1': - resolution: {integrity: sha512-2b7OdVbN7MTAt9U0vKOYKCDsOvESVXxQmrvuVUZ0rGFMCrCPJWWP1GJ7f0lAypbDAhaGb8zqtdOr47192LBrIA==} - engines: {node: '>=v14'} - - '@commitlint/to-lines@17.8.1': - resolution: {integrity: sha512-LE0jb8CuR/mj6xJyrIk8VLz03OEzXFgLdivBytoooKO5xLt5yalc8Ma5guTWobw998sbR3ogDd+2jed03CFmJA==} - engines: {node: '>=v14'} - - '@commitlint/top-level@17.8.1': - resolution: {integrity: sha512-l6+Z6rrNf5p333SHfEte6r+WkOxGlWK4bLuZKbtf/2TXRN+qhrvn1XE63VhD8Oe9oIHQ7F7W1nG2k/TJFhx2yA==} - engines: {node: '>=v14'} - - '@commitlint/types@17.8.1': - resolution: {integrity: sha512-PXDQXkAmiMEG162Bqdh9ChML/GJZo6vU+7F03ALKDK8zYc6SuAr47LjG7hGYRqUOz+WK0dU7bQ0xzuqFMdxzeQ==} - engines: {node: '>=v14'} - - '@commitlint/types@19.5.0': - resolution: {integrity: sha512-DSHae2obMSMkAtTBSOulg5X7/z+rGLxcXQIkg3OmWvY6wifojge5uVMydfhUvs7yQj+V7jNmRZ2Xzl8GJyqRgg==} - engines: {node: '>=v18'} - - '@cspotcode/source-map-support@0.8.1': - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} - - '@esbuild/aix-ppc64@0.23.1': - resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.23.1': - resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.23.1': - resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.23.1': - resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.23.1': - resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.23.1': - resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.23.1': - resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.23.1': - resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.23.1': - resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.23.1': - resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.23.1': - resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.23.1': - resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.23.1': - resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.23.1': - resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.23.1': - resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.23.1': - resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.23.1': - resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-x64@0.23.1': - resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.23.1': - resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.23.1': - resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/sunos-x64@0.23.1': - resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.23.1': - resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.23.1': - resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.23.1': - resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - - '@eslint-community/regexpp@4.11.0': - resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@eslint/js@8.57.0': - resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@eth-optimism/contracts@0.5.40': - resolution: {integrity: sha512-MrzV0nvsymfO/fursTB7m/KunkPsCndltVgfdHaT1Aj5Vi6R/doKIGGkOofHX+8B6VMZpuZosKCMQ5lQuqjt8w==} - peerDependencies: - ethers: ^5 - - '@eth-optimism/core-utils@0.12.0': - resolution: {integrity: sha512-qW+7LZYCz7i8dRa7SRlUKIo1VBU8lvN0HeXCxJR+z+xtMzMQpPds20XJNCMclszxYQHkXY00fOT6GvFw9ZL6nw==} - - '@ethereumjs/rlp@4.0.1': - resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} - engines: {node: '>=14'} - hasBin: true - - '@ethereumjs/util@8.1.0': - resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} - engines: {node: '>=14'} - - '@ethersproject/abi@5.7.0': - resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} - - '@ethersproject/abstract-provider@5.7.0': - resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} - - '@ethersproject/abstract-signer@5.7.0': - resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} - - '@ethersproject/address@5.6.1': - resolution: {integrity: sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q==} - - '@ethersproject/address@5.7.0': - resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} - - '@ethersproject/base64@5.7.0': - resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} - - '@ethersproject/basex@5.7.0': - resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} - - '@ethersproject/bignumber@5.7.0': - resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} - - '@ethersproject/bytes@5.7.0': - resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} - - '@ethersproject/constants@5.7.0': - resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} - - '@ethersproject/contracts@5.7.0': - resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} - - '@ethersproject/hash@5.7.0': - resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} - - '@ethersproject/hdnode@5.7.0': - resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} - - '@ethersproject/json-wallets@5.7.0': - resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} - - '@ethersproject/keccak256@5.7.0': - resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} - - '@ethersproject/logger@5.7.0': - resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} - - '@ethersproject/networks@5.7.1': - resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} - - '@ethersproject/pbkdf2@5.7.0': - resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} - - '@ethersproject/properties@5.7.0': - resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} - - '@ethersproject/providers@5.7.2': - resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} - - '@ethersproject/random@5.7.0': - resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} - - '@ethersproject/rlp@5.7.0': - resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} - - '@ethersproject/sha2@5.7.0': - resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} - - '@ethersproject/signing-key@5.7.0': - resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} - - '@ethersproject/solidity@5.7.0': - resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} - - '@ethersproject/strings@5.7.0': - resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} - - '@ethersproject/transactions@5.7.0': - resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} - - '@ethersproject/units@5.7.0': - resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} - - '@ethersproject/wallet@5.7.0': - resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} - - '@ethersproject/web@5.7.1': - resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} - - '@ethersproject/wordlists@5.7.0': - resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} - - '@fastify/busboy@2.1.1': - resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} - engines: {node: '>=14'} - - '@fastify/deepmerge@1.3.0': - resolution: {integrity: sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==} - - '@humanwhocodes/config-array@0.11.14': - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead - - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - - '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - - '@jridgewell/trace-mapping@0.3.9': - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - - '@looksrare/contracts-libs@3.5.1': - resolution: {integrity: sha512-grKSOYJS6iSwS3zrrR3v/RWUbJW+y7P0gg3GakA5A0kfQrzxK8wYpOqaOyAAOzS7/Yy9ToWnGpzYTr6YXz7olQ==} - engines: {node: '>=8.3.0'} - - '@metamask/eth-sig-util@4.0.1': - resolution: {integrity: sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==} - engines: {node: '>=12.0.0'} - - '@noble/curves@1.2.0': - resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} - - '@noble/curves@1.4.0': - resolution: {integrity: sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==} - - '@noble/curves@1.4.2': - resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} - - '@noble/hashes@1.2.0': - resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} - - '@noble/hashes@1.3.2': - resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} - engines: {node: '>= 16'} - - '@noble/hashes@1.4.0': - resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} - engines: {node: '>= 16'} - - '@noble/hashes@1.5.0': - resolution: {integrity: sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==} - engines: {node: ^14.21.3 || >=16} - - '@noble/secp256k1@1.7.1': - resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@nomicfoundation/edr-darwin-arm64@0.6.5': - resolution: {integrity: sha512-A9zCCbbNxBpLgjS1kEJSpqxIvGGAX4cYbpDYCU2f3jVqOwaZ/NU761y1SvuCRVpOwhoCXqByN9b7HPpHi0L4hw==} - engines: {node: '>= 18'} - - '@nomicfoundation/edr-darwin-x64@0.6.5': - resolution: {integrity: sha512-x3zBY/v3R0modR5CzlL6qMfFMdgwd6oHrWpTkuuXnPFOX8SU31qq87/230f4szM+ukGK8Hi+mNq7Ro2VF4Fj+w==} - engines: {node: '>= 18'} - - '@nomicfoundation/edr-linux-arm64-gnu@0.6.5': - resolution: {integrity: sha512-HGpB8f1h8ogqPHTyUpyPRKZxUk2lu061g97dOQ/W4CxevI0s/qiw5DB3U3smLvSnBHKOzYS1jkxlMeGN01ky7A==} - engines: {node: '>= 18'} - - '@nomicfoundation/edr-linux-arm64-musl@0.6.5': - resolution: {integrity: sha512-ESvJM5Y9XC03fZg9KaQg3Hl+mbx7dsSkTIAndoJS7X2SyakpL9KZpOSYrDk135o8s9P9lYJdPOyiq+Sh+XoCbQ==} - engines: {node: '>= 18'} - - '@nomicfoundation/edr-linux-x64-gnu@0.6.5': - resolution: {integrity: sha512-HCM1usyAR1Ew6RYf5AkMYGvHBy64cPA5NMbaeY72r0mpKaH3txiMyydcHibByOGdQ8iFLWpyUdpl1egotw+Tgg==} - engines: {node: '>= 18'} - - '@nomicfoundation/edr-linux-x64-musl@0.6.5': - resolution: {integrity: sha512-nB2uFRyczhAvWUH7NjCsIO6rHnQrof3xcCe6Mpmnzfl2PYcGyxN7iO4ZMmRcQS7R1Y670VH6+8ZBiRn8k43m7A==} - engines: {node: '>= 18'} - - '@nomicfoundation/edr-win32-x64-msvc@0.6.5': - resolution: {integrity: sha512-B9QD/4DSSCFtWicO8A3BrsnitO1FPv7axB62wq5Q+qeJ50yJlTmyeGY3cw62gWItdvy2mh3fRM6L1LpnHiB77A==} - engines: {node: '>= 18'} - - '@nomicfoundation/edr@0.6.5': - resolution: {integrity: sha512-tAqMslLP+/2b2sZP4qe9AuGxG3OkQ5gGgHE4isUuq6dUVjwCRPFhAOhpdFl+OjY5P3yEv3hmq9HjUGRa2VNjng==} - engines: {node: '>= 18'} - - '@nomicfoundation/ethereumjs-common@4.0.4': - resolution: {integrity: sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==} - - '@nomicfoundation/ethereumjs-rlp@5.0.4': - resolution: {integrity: sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==} - engines: {node: '>=18'} - hasBin: true - - '@nomicfoundation/ethereumjs-tx@5.0.4': - resolution: {integrity: sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw==} - engines: {node: '>=18'} - peerDependencies: - c-kzg: ^2.1.2 - peerDependenciesMeta: - c-kzg: - optional: true - - '@nomicfoundation/ethereumjs-util@9.0.4': - resolution: {integrity: sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q==} - engines: {node: '>=18'} - peerDependencies: - c-kzg: ^2.1.2 - peerDependenciesMeta: - c-kzg: - optional: true - - '@nomicfoundation/hardhat-chai-matchers@2.0.7': - resolution: {integrity: sha512-RQfsiTwdf0SP+DtuNYvm4921X6VirCQq0Xyh+mnuGlTwEFSPZ/o27oQC+l+3Y/l48DDU7+ZcYBR+Fp+Rp94LfQ==} - peerDependencies: - '@nomicfoundation/hardhat-ethers': ^3.0.0 - chai: ^4.2.0 - ethers: ^6.1.0 - hardhat: ^2.9.4 - - '@nomicfoundation/hardhat-ethers@3.0.8': - resolution: {integrity: sha512-zhOZ4hdRORls31DTOqg+GmEZM0ujly8GGIuRY7t7szEk2zW/arY1qDug/py8AEktT00v5K+b6RvbVog+va51IA==} - peerDependencies: - ethers: ^6.1.0 - hardhat: ^2.0.0 - - '@nomicfoundation/hardhat-ignition-ethers@0.15.5': - resolution: {integrity: sha512-W6s1QN9CFxzSVZS6w9Jcj3WLaK32z2FP5MxNU2OKY1Fn9ZzLr+miXbUbWYuRHl6dxrrl6sE8cv33Cybv19pmCg==} - peerDependencies: - '@nomicfoundation/hardhat-ethers': ^3.0.4 - '@nomicfoundation/hardhat-ignition': ^0.15.5 - '@nomicfoundation/ignition-core': ^0.15.5 - ethers: ^6.7.0 - hardhat: ^2.18.0 - - '@nomicfoundation/hardhat-ignition@0.15.5': - resolution: {integrity: sha512-Y5nhFXFqt4owA6Ooag8ZBFDF2RAZElMXViknVIsi3m45pbQimS50ti6FU8HxfRkDnBARa40CIn7UGV0hrelzDw==} - peerDependencies: - '@nomicfoundation/hardhat-verify': ^2.0.1 - hardhat: ^2.18.0 - - '@nomicfoundation/hardhat-network-helpers@1.0.11': - resolution: {integrity: sha512-uGPL7QSKvxrHRU69dx8jzoBvuztlLCtyFsbgfXIwIjnO3dqZRz2GNMHJoO3C3dIiUNM6jdNF4AUnoQKDscdYrA==} - peerDependencies: - hardhat: ^2.9.5 - - '@nomicfoundation/hardhat-toolbox@5.0.0': - resolution: {integrity: sha512-FnUtUC5PsakCbwiVNsqlXVIWG5JIb5CEZoSXbJUsEBun22Bivx2jhF1/q9iQbzuaGpJKFQyOhemPB2+XlEE6pQ==} - peerDependencies: - '@nomicfoundation/hardhat-chai-matchers': ^2.0.0 - '@nomicfoundation/hardhat-ethers': ^3.0.0 - '@nomicfoundation/hardhat-ignition-ethers': ^0.15.0 - '@nomicfoundation/hardhat-network-helpers': ^1.0.0 - '@nomicfoundation/hardhat-verify': ^2.0.0 - '@typechain/ethers-v6': ^0.5.0 - '@typechain/hardhat': ^9.0.0 - '@types/chai': ^4.2.0 - '@types/mocha': '>=9.1.0' - '@types/node': '>=18.0.0' - chai: ^4.2.0 - ethers: ^6.4.0 - hardhat: ^2.11.0 - hardhat-gas-reporter: ^1.0.8 - solidity-coverage: ^0.8.1 - ts-node: '>=8.0.0' - typechain: ^8.3.0 - typescript: '>=4.5.0' - - '@nomicfoundation/hardhat-verify@2.0.10': - resolution: {integrity: sha512-3zoTZGQhpeOm6piJDdsGb6euzZAd7N5Tk0zPQvGnfKQ0+AoxKz/7i4if12goi8IDTuUGElAUuZyQB8PMQoXA5g==} - peerDependencies: - hardhat: ^2.0.4 - - '@nomicfoundation/hardhat-viem@2.0.6': - resolution: {integrity: sha512-Pl5pvYK5VYKflfoUk4fVBESqKMNBtAIGPIT4j+Q8KNFueAe1vB2PsbRESeNJyW5YLL9pqKaD1RVqLmgIa1yvDg==} - peerDependencies: - hardhat: ^2.17.0 - viem: ^2.7.6 - - '@nomicfoundation/ignition-core@0.15.5': - resolution: {integrity: sha512-FgvuoIXhakRSP524JzNQ4BviyzBBKpsFaOWubPZ4XACLT4/7vGqlJ/7DIn0D2NL2anQ2qs98/BNBY9WccXUX1Q==} - - '@nomicfoundation/ignition-ui@0.15.5': - resolution: {integrity: sha512-ZcE4rIn10qKahR4OqS8rl8NM2Fbg2QYiBXgMgj74ZI0++LlCcZgB5HyaBbX+lsnKHjTXtjYD3b+2mtg7jFbAMQ==} - - '@nomicfoundation/slang-darwin-arm64@0.17.0': - resolution: {integrity: sha512-O0q94EUtoWy9A5kOTOa9/khtxXDYnLqmuda9pQELurSiwbQEVCPQL8kb34VbOW+ifdre66JM/05Xw9JWhIZ9sA==} - engines: {node: '>= 10'} - - '@nomicfoundation/slang-darwin-x64@0.17.0': - resolution: {integrity: sha512-IaDbHzvT08sBK2HyGzonWhq1uu8IxdjmTqAWHr25Oh/PYnamdi8u4qchZXXYKz/DHLoYN3vIpBXoqLQIomhD/g==} - engines: {node: '>= 10'} - - '@nomicfoundation/slang-linux-arm64-gnu@0.17.0': - resolution: {integrity: sha512-Lj4anvOsQZxs1SycG8VyT2Rl2oqIhyLSUCgGepTt3CiJ/bM+8r8bLJIgh8vKkki4BWz49YsYIgaJB2IPv8FFTw==} - engines: {node: '>= 10'} - - '@nomicfoundation/slang-linux-arm64-musl@0.17.0': - resolution: {integrity: sha512-/xkTCa9d5SIWUBQE3BmLqDFfJRr4yUBwbl4ynPiGUpRXrD69cs6pWKkwjwz/FdBpXqVo36I+zY95qzoTj/YhOA==} - engines: {node: '>= 10'} - - '@nomicfoundation/slang-linux-x64-gnu@0.17.0': - resolution: {integrity: sha512-oe5IO5vntOqYvTd67deCHPIWuSuWm6aYtT2/0Kqz2/VLtGz4ClEulBSRwfnNzBVtw2nksWipE1w8BzhImI7Syg==} - engines: {node: '>= 10'} - - '@nomicfoundation/slang-linux-x64-musl@0.17.0': - resolution: {integrity: sha512-PpYCI5K/kgLAMXaPY0V4VST5gCDprEOh7z/47tbI8kJQumI5odjsj/Cs8MpTo7/uRH6flKYbVNgUzcocWVYrAQ==} - engines: {node: '>= 10'} - - '@nomicfoundation/slang-win32-arm64-msvc@0.17.0': - resolution: {integrity: sha512-u/Mkf7OjokdBilP7QOJj6QYJU4/mjkbKnTX21wLyCIzeVWS7yafRPYpBycKIBj2pRRZ6ceAY5EqRpb0aiCq+0Q==} - engines: {node: '>= 10'} - - '@nomicfoundation/slang-win32-ia32-msvc@0.17.0': - resolution: {integrity: sha512-XJBVQfNnZQUv0tP2JSJ573S+pmgrLWgqSZOGaMllnB/TL1gRci4Z7dYRJUF2s82GlRJE+FHSI2Ro6JISKmlXCg==} - engines: {node: '>= 10'} - - '@nomicfoundation/slang-win32-x64-msvc@0.17.0': - resolution: {integrity: sha512-zPGsAeiTfqfPNYHD8BfrahQmYzA78ZraoHKTGraq/1xwJwzBK4bu/NtvVA4pJjBV+B4L6DCxVhSbpn40q26JQA==} - engines: {node: '>= 10'} - - '@nomicfoundation/slang@0.17.0': - resolution: {integrity: sha512-1GlkGRcGpVnjFw9Z1vvDKOKo2mzparFt7qrl2pDxWp+jrVtlvej98yCMX52pVyrYE7ZeOSZFnx/DtsSgoukStQ==} - engines: {node: '>= 10'} - - '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': - resolution: {integrity: sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw==} - engines: {node: '>= 12'} - - '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2': - resolution: {integrity: sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw==} - engines: {node: '>= 12'} - - '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2': - resolution: {integrity: sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA==} - engines: {node: '>= 12'} - - '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2': - resolution: {integrity: sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA==} - engines: {node: '>= 12'} - - '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2': - resolution: {integrity: sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g==} - engines: {node: '>= 12'} - - '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2': - resolution: {integrity: sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg==} - engines: {node: '>= 12'} - - '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2': - resolution: {integrity: sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA==} - engines: {node: '>= 12'} - - '@nomicfoundation/solidity-analyzer@0.1.2': - resolution: {integrity: sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA==} - engines: {node: '>= 12'} - - '@openzeppelin/contracts-upgradeable@4.7.3': - resolution: {integrity: sha512-+wuegAMaLcZnLCJIvrVUDzA9z/Wp93f0Dla/4jJvIhijRrPabjQbZe6fWiECLaJyfn5ci9fqf9vTw3xpQOad2A==} - - '@openzeppelin/contracts@3.4.2': - resolution: {integrity: sha512-z0zMCjyhhp4y7XKAcDAi3Vgms4T2PstwBdahiO0+9NaGICQKjynK3wduSRplTgk4LXmoO1yfDGO5RbjKYxtuxA==} - - '@openzeppelin/contracts@4.3.3': - resolution: {integrity: sha512-tDBopO1c98Yk7Cv/PZlHqrvtVjlgK5R4J6jxLwoO7qxK4xqOiZG+zSkIvGFpPZ0ikc3QOED3plgdqjgNTnBc7g==} - - '@openzeppelin/contracts@4.9.6': - resolution: {integrity: sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA==} - - '@openzeppelin/defender-sdk-base-client@1.14.4': - resolution: {integrity: sha512-tOePVQLKpqfGQ1GMzHvSBNd2psPYd86LDNpvdl5gjD0Y2kW/zNh5qBXy29RraGtk/qc8zs9hzS5pAOh0vhGkGQ==} - - '@openzeppelin/defender-sdk-deploy-client@1.14.4': - resolution: {integrity: sha512-+diSoz1zid37LMsY2RDxI+uAsYx9Eryg8Vz+yfvuyd56fXrzjQEln7BBtYQw+2zp9yvyAByOL5XSQdrQga9OBQ==} - - '@openzeppelin/defender-sdk-network-client@1.14.4': - resolution: {integrity: sha512-OS0H5b0vgYacJcwkvUFJUaRuyUaXhIRl916W5xLvGia5H6i/qn3dP8MZ7oLcPwKc8jB+ucRytO4H/AHsea0aVA==} - - '@openzeppelin/hardhat-upgrades@3.2.1': - resolution: {integrity: sha512-Zy5M3QhkzwGdpzQmk+xbWdYOGJWjoTvwbBKYLhctu9B91DoprlhDRaZUwCtunwTdynkTDGdVfGr0kIkvycyKjw==} - hasBin: true - peerDependencies: - '@nomicfoundation/hardhat-ethers': ^3.0.0 - '@nomicfoundation/hardhat-verify': ^2.0.0 - ethers: ^6.6.0 - hardhat: ^2.0.2 - peerDependenciesMeta: - '@nomicfoundation/hardhat-verify': - optional: true - - '@openzeppelin/upgrades-core@1.37.1': - resolution: {integrity: sha512-dMQPDoMn1OUZXsCHT1thnAmkZ14v0FNlst5Ej8MIfujOv0k74kUok5XeuNF42fYewnNUYMkkz3PhXU1OIwSeyg==} - hasBin: true - - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@primitivefi/hardhat-dodoc@0.2.3': - resolution: {integrity: sha512-ver9uHa79LTDTeebOKZ/eOVRL/FP1k0s0x/5Bo/8ZaDdLWFVClKqZyZYVjjW4CJqTPCt8uU9b9p71P2vzH4O9A==} - peerDependencies: - hardhat: ^2.6.4 - squirrelly: ^8.0.8 - - '@rollup/plugin-commonjs@24.1.0': - resolution: {integrity: sha512-eSL45hjhCWI0jCCXcNtLVqM5N1JlBGvlFfY0m6oOYnLCJ6N0qEXoZql4sY2MOUArzhH4SA/qBpTxvvZp2Sc+DQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.68.0||^3.0.0 - peerDependenciesMeta: - rollup: - optional: true - - '@rollup/plugin-json@6.1.0': - resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - - '@rollup/plugin-node-resolve@15.2.3': - resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.78.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - - '@rollup/pluginutils@5.1.0': - resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - - '@rollup/rollup-android-arm-eabi@4.21.2': - resolution: {integrity: sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==} - cpu: [arm] - os: [android] - - '@rollup/rollup-android-arm64@4.21.2': - resolution: {integrity: sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==} - cpu: [arm64] - os: [android] - - '@rollup/rollup-darwin-arm64@4.21.2': - resolution: {integrity: sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==} - cpu: [arm64] - os: [darwin] - - '@rollup/rollup-darwin-x64@4.21.2': - resolution: {integrity: sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==} - cpu: [x64] - os: [darwin] - - '@rollup/rollup-linux-arm-gnueabihf@4.21.2': - resolution: {integrity: sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm-musleabihf@4.21.2': - resolution: {integrity: sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm64-gnu@4.21.2': - resolution: {integrity: sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-arm64-musl@4.21.2': - resolution: {integrity: sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-powerpc64le-gnu@4.21.2': - resolution: {integrity: sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==} - cpu: [ppc64] - os: [linux] - - '@rollup/rollup-linux-riscv64-gnu@4.21.2': - resolution: {integrity: sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-s390x-gnu@4.21.2': - resolution: {integrity: sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==} - cpu: [s390x] - os: [linux] - - '@rollup/rollup-linux-x64-gnu@4.21.2': - resolution: {integrity: sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-linux-x64-musl@4.21.2': - resolution: {integrity: sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-win32-arm64-msvc@4.21.2': - resolution: {integrity: sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==} - cpu: [arm64] - os: [win32] - - '@rollup/rollup-win32-ia32-msvc@4.21.2': - resolution: {integrity: sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-x64-msvc@4.21.2': - resolution: {integrity: sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==} - cpu: [x64] - os: [win32] - - '@scure/base@1.1.8': - resolution: {integrity: sha512-6CyAclxj3Nb0XT7GHK6K4zK6k2xJm6E4Ft0Ohjt4WgegiFUHEtFb2CGzmPmGBwoIhrLsqNLYfLr04Y1GePrzZg==} - - '@scure/bip32@1.1.5': - resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} - - '@scure/bip32@1.4.0': - resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} - - '@scure/bip39@1.1.1': - resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} - - '@scure/bip39@1.3.0': - resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==} - - '@scure/bip39@1.4.0': - resolution: {integrity: sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw==} - - '@sentry/core@5.30.0': - resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} - engines: {node: '>=6'} - - '@sentry/hub@5.30.0': - resolution: {integrity: sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==} - engines: {node: '>=6'} - - '@sentry/minimal@5.30.0': - resolution: {integrity: sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==} - engines: {node: '>=6'} - - '@sentry/node@5.30.0': - resolution: {integrity: sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==} - engines: {node: '>=6'} - - '@sentry/tracing@5.30.0': - resolution: {integrity: sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==} - engines: {node: '>=6'} - - '@sentry/types@5.30.0': - resolution: {integrity: sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==} - engines: {node: '>=6'} - - '@sentry/utils@5.30.0': - resolution: {integrity: sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==} - engines: {node: '>=6'} - - '@smithy/types@3.4.0': - resolution: {integrity: sha512-0shOWSg/pnFXPcsSU8ZbaJ4JBHZJPPzLCJxafJvbMVFo9l1w81CqpgUqjlKGNHVrVB7fhIs+WS82JDTyzaLyLA==} - engines: {node: '>=16.0.0'} - - '@solidity-parser/parser@0.14.5': - resolution: {integrity: sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==} - - '@solidity-parser/parser@0.16.2': - resolution: {integrity: sha512-PI9NfoA3P8XK2VBkK5oIfRgKDsicwDZfkVq9ZTBCQYGOP1N2owgY2dyLGyU5/J/hQs8KRk55kdmvTLjy3Mu3vg==} - - '@solidity-parser/parser@0.18.0': - resolution: {integrity: sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==} - - '@starboardventures/hardhat-verify@1.0.1': - resolution: {integrity: sha512-/FO3wMmUSrL8PsYwuxA233+3iwLzmjI2z39MiZCgki0uJXtDELhO9YXDI9qoUR2jHxvHiBa1gKd/ZIpC9tpuKw==} - peerDependencies: - hardhat: ^2.0.0 - - '@swc/core-darwin-arm64@1.7.26': - resolution: {integrity: sha512-FF3CRYTg6a7ZVW4yT9mesxoVVZTrcSWtmZhxKCYJX9brH4CS/7PRPjAKNk6kzWgWuRoglP7hkjQcd6EpMcZEAw==} - engines: {node: '>=10'} - cpu: [arm64] - os: [darwin] - - '@swc/core-darwin-x64@1.7.26': - resolution: {integrity: sha512-az3cibZdsay2HNKmc4bjf62QVukuiMRh5sfM5kHR/JMTrLyS6vSw7Ihs3UTkZjUxkLTT8ro54LI6sV6sUQUbLQ==} - engines: {node: '>=10'} - cpu: [x64] - os: [darwin] - - '@swc/core-linux-arm-gnueabihf@1.7.26': - resolution: {integrity: sha512-VYPFVJDO5zT5U3RpCdHE5v1gz4mmR8BfHecUZTmD2v1JeFY6fv9KArJUpjrHEEsjK/ucXkQFmJ0jaiWXmpOV9Q==} - engines: {node: '>=10'} - cpu: [arm] - os: [linux] - - '@swc/core-linux-arm64-gnu@1.7.26': - resolution: {integrity: sha512-YKevOV7abpjcAzXrhsl+W48Z9mZvgoVs2eP5nY+uoMAdP2b3GxC0Df1Co0I90o2lkzO4jYBpTMcZlmUXLdXn+Q==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] - - '@swc/core-linux-arm64-musl@1.7.26': - resolution: {integrity: sha512-3w8iZICMkQQON0uIcvz7+Q1MPOW6hJ4O5ETjA0LSP/tuKqx30hIniCGOgPDnv3UTMruLUnQbtBwVCZTBKR3Rkg==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] - - '@swc/core-linux-x64-gnu@1.7.26': - resolution: {integrity: sha512-c+pp9Zkk2lqb06bNGkR2Looxrs7FtGDMA4/aHjZcCqATgp348hOKH5WPvNLBl+yPrISuWjbKDVn3NgAvfvpH4w==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] - - '@swc/core-linux-x64-musl@1.7.26': - resolution: {integrity: sha512-PgtyfHBF6xG87dUSSdTJHwZ3/8vWZfNIXQV2GlwEpslrOkGqy+WaiiyE7Of7z9AvDILfBBBcJvJ/r8u980wAfQ==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] - - '@swc/core-win32-arm64-msvc@1.7.26': - resolution: {integrity: sha512-9TNXPIJqFynlAOrRD6tUQjMq7KApSklK3R/tXgIxc7Qx+lWu8hlDQ/kVPLpU7PWvMMwC/3hKBW+p5f+Tms1hmA==} - engines: {node: '>=10'} - cpu: [arm64] - os: [win32] - - '@swc/core-win32-ia32-msvc@1.7.26': - resolution: {integrity: sha512-9YngxNcG3177GYdsTum4V98Re+TlCeJEP4kEwEg9EagT5s3YejYdKwVAkAsJszzkXuyRDdnHUpYbTrPG6FiXrQ==} - engines: {node: '>=10'} - cpu: [ia32] - os: [win32] - - '@swc/core-win32-x64-msvc@1.7.26': - resolution: {integrity: sha512-VR+hzg9XqucgLjXxA13MtV5O3C0bK0ywtLIBw/+a+O+Oc6mxFWHtdUeXDbIi5AiPbn0fjgVJMqYnyjGyyX8u0w==} - engines: {node: '>=10'} - cpu: [x64] - os: [win32] - - '@swc/core@1.7.26': - resolution: {integrity: sha512-f5uYFf+TmMQyYIoxkn/evWhNGuUzC730dFwAKGwBVHHVoPyak1/GvJUm6i1SKl+2Hrj9oN0i3WSoWWZ4pgI8lw==} - engines: {node: '>=10'} - peerDependencies: - '@swc/helpers': '*' - peerDependenciesMeta: - '@swc/helpers': - optional: true - - '@swc/counter@0.1.3': - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - - '@swc/types@0.1.12': - resolution: {integrity: sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA==} - - '@tenderly/hardhat-tenderly@2.3.0': - resolution: {integrity: sha512-Q21HeQofncnrH33Ys4Xd2HRgxl+4E/HgUqUIu6l734Cpw07KMwlsTicEML0nlVPgLDmtNrJv4cnFn4SypwioaA==} - peerDependencies: - ethers: ^6.8.1 - hardhat: ^2.22.6 - - '@trivago/prettier-plugin-sort-imports@3.4.0': - resolution: {integrity: sha512-485Iailw8X5f7KetzRka20RF1kPBEINR5LJMNwlBZWY1gRAlVnv5dZzyNPnLxSP0Qcia8HETa9Cdd8LlX9o+pg==} - peerDependencies: - prettier: 2.x - - '@tsconfig/node10@1.0.11': - resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} - - '@tsconfig/node12@1.0.11': - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - - '@tsconfig/node14@1.0.3': - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - - '@tsconfig/node16@1.0.4': - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - - '@typechain/ethers-v6@0.5.1': - resolution: {integrity: sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA==} - peerDependencies: - ethers: 6.x - typechain: ^8.3.2 - typescript: '>=4.7.0' - - '@typechain/hardhat@9.1.0': - resolution: {integrity: sha512-mtaUlzLlkqTlfPwB3FORdejqBskSnh+Jl8AIJGjXNAQfRQ4ofHADPl1+oU7Z3pAJzmZbUXII8MhOLQltcHgKnA==} - peerDependencies: - '@typechain/ethers-v6': ^0.5.1 - ethers: ^6.1.0 - hardhat: ^2.9.9 - typechain: ^8.3.2 - - '@types/bn.js@4.11.6': - resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} - - '@types/bn.js@5.1.5': - resolution: {integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==} - - '@types/chai-as-promised@7.1.8': - resolution: {integrity: sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==} - - '@types/chai@4.3.19': - resolution: {integrity: sha512-2hHHvQBVE2FiSK4eN0Br6snX9MtolHaTo/batnLjlGRhoQzlCL61iVpxoqO7SfFyOw+P/pwv+0zNHzKoGWz9Cw==} - - '@types/concat-stream@1.6.1': - resolution: {integrity: sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==} - - '@types/conventional-commits-parser@5.0.0': - resolution: {integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==} - - '@types/estree@1.0.5': - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - - '@types/form-data@0.0.33': - resolution: {integrity: sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==} - - '@types/glob@7.2.0': - resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} - - '@types/lru-cache@5.1.1': - resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==} - - '@types/minimatch@5.1.2': - resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} - - '@types/minimist@1.2.5': - resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} - - '@types/mocha@10.0.7': - resolution: {integrity: sha512-GN8yJ1mNTcFcah/wKEFIJckJx9iJLoMSzWcfRRuxz/Jk+U6KQNnml+etbtxFK8lPjzOw3zp4Ha/kjSst9fsHYw==} - - '@types/node@10.17.60': - resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==} - - '@types/node@18.15.13': - resolution: {integrity: sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==} - - '@types/node@18.19.50': - resolution: {integrity: sha512-xonK+NRrMBRtkL1hVCc3G+uXtjh1Al4opBLjqVmipe5ZAaBYWW6cNAiBVZ1BvmkBhep698rP3UM3aRAdSALuhg==} - - '@types/node@20.5.1': - resolution: {integrity: sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==} - - '@types/node@8.10.66': - resolution: {integrity: sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==} - - '@types/normalize-package-data@2.4.4': - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - - '@types/pbkdf2@3.1.2': - resolution: {integrity: sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==} - - '@types/prettier@2.7.3': - resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} - - '@types/qs@6.9.15': - resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} - - '@types/resolve@1.20.2': - resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} - - '@types/secp256k1@4.0.6': - resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} - - '@typescript-eslint/eslint-plugin@7.18.0': - resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - '@typescript-eslint/parser': ^7.0.0 - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/parser@7.18.0': - resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/scope-manager@7.18.0': - resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@typescript-eslint/type-utils@7.18.0': - resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/types@7.18.0': - resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@typescript-eslint/typescript-estree@7.18.0': - resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/utils@7.18.0': - resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - - '@typescript-eslint/visitor-keys@7.18.0': - resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - - '@vue/compiler-core@3.5.4': - resolution: {integrity: sha512-oNwn+BAt3n9dK9uAYvI+XGlutwuTq/wfj4xCBaZCqwwVIGtD7D6ViihEbyYZrDHIHTDE3Q6oL3/hqmAyFEy9DQ==} - - '@vue/compiler-dom@3.5.4': - resolution: {integrity: sha512-yP9RRs4BDLOLfldn6ah+AGCNovGjMbL9uHvhDHf5wan4dAHLnFGOkqtfE7PPe4HTXIqE7l/NILdYw53bo1C8jw==} - - '@vue/compiler-sfc@3.5.4': - resolution: {integrity: sha512-P+yiPhL+NYH7m0ZgCq7AQR2q7OIE+mpAEgtkqEeH9oHSdIRvUO+4X6MPvblJIWcoe4YC5a2Gdf/RsoyP8FFiPQ==} - - '@vue/compiler-ssr@3.5.4': - resolution: {integrity: sha512-acESdTXsxPnYr2C4Blv0ggx5zIFMgOzZmYU2UgvIff9POdRGbRNBHRyzHAnizcItvpgerSKQbllUc9USp3V7eg==} - - '@vue/shared@3.5.4': - resolution: {integrity: sha512-L2MCDD8l7yC62Te5UUyPVpmexhL9ipVnYRw9CsWfm/BGRL5FwDX4a25bcJ/OJSD3+Hx+k/a8LDKcG2AFdJV3BA==} - - JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} - hasBin: true - - abbrev@1.0.9: - resolution: {integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==} - - abitype@0.9.10: - resolution: {integrity: sha512-FIS7U4n7qwAT58KibwYig5iFG4K61rbhAqaQh/UWj8v1Y8mjX3F8TC9gd8cz9yT1TYel9f8nS5NO5kZp2RW0jQ==} - peerDependencies: - typescript: '>=5.0.4' - zod: ^3 >=3.22.0 - peerDependenciesMeta: - typescript: - optional: true - zod: - optional: true - - abitype@1.0.5: - resolution: {integrity: sha512-YzDhti7cjlfaBhHutMaboYB21Ha3rXR9QTkNJFzYC4kC8YclaiwPBBBJY8ejFdu2wnJeZCVZSMlQJ7fi8S6hsw==} - peerDependencies: - typescript: '>=5.0.4' - zod: ^3 >=3.22.0 - peerDependenciesMeta: - typescript: - optional: true - zod: - optional: true - - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - - acorn-walk@8.3.4: - resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} - engines: {node: '>=0.4.0'} - - acorn@8.12.1: - resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} - engines: {node: '>=0.4.0'} - hasBin: true - - adm-zip@0.4.16: - resolution: {integrity: sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==} - engines: {node: '>=0.3.0'} - - aes-js@3.0.0: - resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} - - aes-js@4.0.0-beta.5: - resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} - - agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - - aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} - - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - - ajv@8.17.1: - resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - - amazon-cognito-identity-js@6.3.12: - resolution: {integrity: sha512-s7NKDZgx336cp+oDeUtB2ZzT8jWJp/v2LWuYl+LQtMEODe22RF1IJ4nRiDATp+rp1pTffCZcm44Quw4jx2bqNg==} - - amdefine@1.0.1: - resolution: {integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==} - engines: {node: '>=0.4.2'} - - ansi-align@3.0.1: - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} - - ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - - ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - - ansi-escapes@5.0.0: - resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} - engines: {node: '>=12'} - - ansi-regex@3.0.1: - resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} - engines: {node: '>=4'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} - engines: {node: '>=12'} - - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - - antlr4@4.13.2: - resolution: {integrity: sha512-QiVbZhyy4xAZ17UPEuG3YTOt8ZaoeOR1CvEAqrEsDBsOqINslaB147i9xqljZqoyf5S+EUlGStaj+t22LT9MOg==} - engines: {node: '>=16'} - - antlr4ts@0.5.0-alpha.4: - resolution: {integrity: sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - array-back@3.1.0: - resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} - engines: {node: '>=6'} - - array-back@4.0.2: - resolution: {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==} - engines: {node: '>=8'} - - array-ify@1.0.0: - resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} - - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - - array-uniq@1.0.3: - resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} - engines: {node: '>=0.10.0'} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - asap@2.0.6: - resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - ast-parents@0.0.1: - resolution: {integrity: sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA==} - - astral-regex@2.0.0: - resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} - engines: {node: '>=8'} - - async-retry@1.3.3: - resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} - - async@1.5.2: - resolution: {integrity: sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==} - - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - - at-least-node@1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} - - axios@0.21.4: - resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} - - axios@0.27.2: - resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} - - axios@1.7.7: - resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.10: - resolution: {integrity: sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - bech32@1.1.4: - resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - - blakejs@1.2.1: - resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} - - bn.js@4.11.6: - resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} - - bn.js@4.12.0: - resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} - - bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - - boxen@5.1.2: - resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} - engines: {node: '>=10'} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - brorand@1.1.0: - resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - browserify-aes@1.2.0: - resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} - - browserslist@4.23.3: - resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - bs58check@2.1.2: - resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer-xor@1.0.3: - resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} - - buffer@4.9.2: - resolution: {integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==} - - buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - - bufio@1.2.1: - resolution: {integrity: sha512-9oR3zNdupcg/Ge2sSHQF3GX+kmvL/fTPvD0nd5AGLq8SjUYnTz+SlFjK/GXidndbZtIj+pVKXiWeR9w6e9wKCA==} - engines: {node: '>=14.0.0'} - - builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} - - builtins@2.0.1: - resolution: {integrity: sha512-XkkVe5QAb6guWPXTzpSrYpSlN3nqEmrrE2TkAr/tp7idSF6+MONh9WvKrAuR3HiKLvoSgmbs8l1U9IPmMrIoLw==} - - bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - - cachedir@2.3.0: - resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==} - engines: {node: '>=6'} - - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} - - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - camelcase-keys@6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} - engines: {node: '>=8'} - - camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - caniuse-lite@1.0.30001660: - resolution: {integrity: sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg==} - - caseless@0.12.0: - resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} - - cbor@8.1.0: - resolution: {integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==} - engines: {node: '>=12.19'} - - cbor@9.0.2: - resolution: {integrity: sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ==} - engines: {node: '>=16'} - - chai-as-promised@7.1.2: - resolution: {integrity: sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw==} - peerDependencies: - chai: '>= 2.1.2 < 6' - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - - charenc@0.0.2: - resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} - - chokidar@4.0.1: - resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} - engines: {node: '>= 14.16.0'} - - ci-info@2.0.0: - resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} - - cipher-base@1.0.4: - resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} - - clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - - cli-boxes@2.2.1: - resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} - engines: {node: '>=6'} - - cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} - - cli-cursor@4.0.0: - resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} - - cli-table3@0.5.1: - resolution: {integrity: sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==} - engines: {node: '>=6'} - - cli-table3@0.6.5: - resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} - engines: {node: 10.* || >= 12.*} - - cli-truncate@3.1.0: - resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - cli-width@3.0.0: - resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} - engines: {node: '>= 10'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - - clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - - colors@1.4.0: - resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} - engines: {node: '>=0.1.90'} - - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - - command-exists@1.2.9: - resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} - - command-line-args@5.2.1: - resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} - engines: {node: '>=4.0.0'} - - command-line-usage@6.1.3: - resolution: {integrity: sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==} - engines: {node: '>=8.0.0'} - - commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} - - commander@11.0.0: - resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} - engines: {node: '>=16'} - - commander@8.3.0: - resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} - engines: {node: '>= 12'} - - commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} - - commitizen@4.3.0: - resolution: {integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==} - engines: {node: '>= 12'} - hasBin: true - - commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - - compare-func@2.0.0: - resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} - - compare-versions@6.1.1: - resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - concat-stream@1.6.2: - resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} - engines: {'0': node >= 0.8} - - conventional-changelog-angular@6.0.0: - resolution: {integrity: sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg==} - engines: {node: '>=14'} - - conventional-changelog-conventionalcommits@6.1.0: - resolution: {integrity: sha512-3cS3GEtR78zTfMzk0AizXKKIdN4OvSh7ibNz6/DPbhWWQu7LqE/8+/GqSodV+sywUR2gpJAdP/1JFf4XtN7Zpw==} - engines: {node: '>=14'} - - conventional-commit-types@3.0.0: - resolution: {integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==} - - conventional-commits-parser@4.0.0: - resolution: {integrity: sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==} - engines: {node: '>=14'} - hasBin: true - - convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - - cookie@0.4.2: - resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} - engines: {node: '>= 0.6'} - - core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - - cosmiconfig-typescript-loader@4.4.0: - resolution: {integrity: sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw==} - engines: {node: '>=v14.21.3'} - peerDependencies: - '@types/node': '*' - cosmiconfig: '>=7' - ts-node: '>=10' - typescript: '>=4' - - cosmiconfig-typescript-loader@5.0.0: - resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} - engines: {node: '>=v16'} - peerDependencies: - '@types/node': '*' - cosmiconfig: '>=8.2' - typescript: '>=4' - - cosmiconfig@8.3.6: - resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true - - cosmiconfig@9.0.0: - resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true - - create-hash@1.2.0: - resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} - - create-hmac@1.1.7: - resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} - - create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - - cross-env@7.0.3: - resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} - engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} - hasBin: true - - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - - crypt@0.0.2: - resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} - - cz-conventional-changelog@3.3.0: - resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==} - engines: {node: '>= 10'} - - dargs@7.0.0: - resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} - engines: {node: '>=8'} - - death@1.1.0: - resolution: {integrity: sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==} - - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} - - decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - dedent@0.7.0: - resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - - deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - - defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - - delete-empty@3.0.0: - resolution: {integrity: sha512-ZUyiwo76W+DYnKsL3Kim6M/UOavPdBJgDYWOmuQhYaZvJH0AXAHbUNyEDtRbBra8wqqr686+63/0azfEk1ebUQ==} - engines: {node: '>=10'} - hasBin: true - - depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - - detect-file@1.0.0: - resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} - engines: {node: '>=0.10.0'} - - detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} - - diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - - diff@5.2.0: - resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} - engines: {node: '>=0.3.1'} - - difflib@0.2.4: - resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} - - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - - dot-prop@5.3.0: - resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} - engines: {node: '>=8'} - - dotenv@16.4.5: - resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} - engines: {node: '>=12'} - - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - - electron-to-chromium@1.5.19: - resolution: {integrity: sha512-kpLJJi3zxTR1U828P+LIUDZ5ohixyo68/IcYOHLqnbTPr/wdgn4i1ECvmALN9E16JPA6cvCG5UG79gVwVdEK5w==} - - elliptic@6.5.4: - resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} - - elliptic@6.5.7: - resolution: {integrity: sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - - encode-utf8@1.0.3: - resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} - - enquirer@2.4.1: - resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} - engines: {node: '>=8.6'} - - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - - env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-module-lexer@1.5.4: - resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} - - esbuild@0.23.1: - resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} - engines: {node: '>=18'} - hasBin: true - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - escodegen@1.8.1: - resolution: {integrity: sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==} - engines: {node: '>=0.12.0'} - hasBin: true - - eslint-config-prettier@8.10.0: - resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint@8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - esprima@2.7.3: - resolution: {integrity: sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==} - engines: {node: '>=0.10.0'} - hasBin: true - - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@1.9.3: - resolution: {integrity: sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==} - engines: {node: '>=0.10.0'} - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - estree-walker@0.6.1: - resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} - - estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - - eth-gas-reporter@0.2.27: - resolution: {integrity: sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw==} - peerDependencies: - '@codechecks/client': ^0.1.0 - peerDependenciesMeta: - '@codechecks/client': - optional: true - - ethereum-bloom-filters@1.2.0: - resolution: {integrity: sha512-28hyiE7HVsWubqhpVLVmZXFd4ITeHi+BUu05o9isf0GUpMtzBUi+8/gFrGaGYzvGAJQmJ3JKj77Mk9G98T84rA==} - - ethereum-cryptography@0.1.3: - resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} - - ethereum-cryptography@1.2.0: - resolution: {integrity: sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==} - - ethereum-cryptography@2.2.1: - resolution: {integrity: sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==} - - ethereumjs-abi@0.6.8: - resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} - deprecated: This library has been deprecated and usage is discouraged. - - ethereumjs-util@6.2.1: - resolution: {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==} - - ethereumjs-util@7.1.5: - resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} - engines: {node: '>=10.0.0'} - - ethers@5.7.2: - resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} - - ethers@6.13.2: - resolution: {integrity: sha512-9VkriTTed+/27BGuY1s0hf441kqwHJ1wtN2edksEtiRvXx+soxRX3iSXTfFqq2+YwrOqbDoTHjIhQnjJRlzKmg==} - engines: {node: '>=14.0.0'} - - ethjs-unit@0.1.6: - resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} - engines: {node: '>=6.5.0', npm: '>=3'} - - ethjs-util@0.1.6: - resolution: {integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==} - engines: {node: '>=6.5.0', npm: '>=3'} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - evp_bytestokey@1.0.3: - resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} - - execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - - execa@7.2.0: - resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} - engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} - - expand-tilde@2.0.2: - resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} - engines: {node: '>=0.10.0'} - - external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} - - fast-base64-decode@1.0.0: - resolution: {integrity: sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==} - - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} - - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - fast-uri@3.0.1: - resolution: {integrity: sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==} - - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - - fdir@6.4.2: - resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - - figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} - - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-node-modules@2.1.3: - resolution: {integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==} - - find-replace@3.0.0: - resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} - engines: {node: '>=4.0.0'} - - find-root@1.1.0: - resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - - find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - findup-sync@4.0.0: - resolution: {integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==} - engines: {node: '>= 8'} - - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - - fmix@0.1.0: - resolution: {integrity: sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w==} - - follow-redirects@1.15.9: - resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - - foreground-child@3.3.0: - resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} - engines: {node: '>=14'} - - form-data@2.5.1: - resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} - engines: {node: '>= 0.12'} - - form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} - - fp-ts@1.19.3: - resolution: {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==} - - fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} - - fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} - engines: {node: '>=14.14'} - - fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} - - fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} - - fs-extra@9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} - - fs-readdir-recursive@1.1.0: - resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} - - get-port@3.2.0: - resolution: {integrity: sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==} - engines: {node: '>=4'} - - get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - - get-tsconfig@4.8.0: - resolution: {integrity: sha512-Pgba6TExTZ0FJAn1qkJAjIeKoDJ3CsI2ChuLohJnZl/tTU8MVrq3b+2t5UOPfRa4RMsorClBjJALkJUMjG1PAw==} - - ghost-testrpc@0.0.2: - resolution: {integrity: sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==} - hasBin: true - - git-raw-commits@2.0.11: - resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} - engines: {node: '>=10'} - hasBin: true - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - - glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} - hasBin: true - - glob@5.0.15: - resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} - deprecated: Glob versions prior to v9 are no longer supported - - glob@7.1.7: - resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} - deprecated: Glob versions prior to v9 are no longer supported - - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - - glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported - - global-directory@4.0.1: - resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} - engines: {node: '>=18'} - - global-dirs@0.1.1: - resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} - engines: {node: '>=4'} - - global-modules@1.0.0: - resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} - engines: {node: '>=0.10.0'} - - global-modules@2.0.0: - resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} - engines: {node: '>=6'} - - global-prefix@1.0.2: - resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} - engines: {node: '>=0.10.0'} - - global-prefix@3.0.0: - resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} - engines: {node: '>=6'} - - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - - globby@10.0.2: - resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} - engines: {node: '>=8'} - - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - - handlebars@4.7.8: - resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} - engines: {node: '>=0.4.7'} - hasBin: true - - hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - - hardhat-abi-exporter@2.10.1: - resolution: {integrity: sha512-X8GRxUTtebMAd2k4fcPyVnCdPa6dYK4lBsrwzKP5yiSq4i+WadWPIumaLfce53TUf/o2TnLpLOduyO1ylE2NHQ==} - engines: {node: '>=14.14.0'} - peerDependencies: - hardhat: ^2.0.0 - - hardhat-deploy@0.11.45: - resolution: {integrity: sha512-aC8UNaq3JcORnEUIwV945iJuvBwi65tjHVDU3v6mOcqik7WAzHVCJ7cwmkkipsHrWysrB5YvGF1q9S1vIph83w==} - - hardhat-gas-reporter@1.0.10: - resolution: {integrity: sha512-02N4+So/fZrzJ88ci54GqwVA3Zrf0C9duuTyGt0CFRIh/CdNwbnTgkXkRfojOMLBQ+6t+lBIkgbsOtqMvNwikA==} - peerDependencies: - hardhat: ^2.0.2 - - hardhat-preprocessor@0.1.5: - resolution: {integrity: sha512-j8m44mmPxpxAAd0G8fPHRHOas/INZdzptSur0TNJvMEGcFdLDhbHHxBcqZVQ/bmiW42q4gC60AP4CXn9EF018g==} - peerDependencies: - hardhat: ^2.0.5 - - hardhat@2.22.16: - resolution: {integrity: sha512-d52yQZ09u0roL6GlgJSvtknsBtIuj9JrJ/U8VMzr/wue+gO5v2tQayvOX6llerlR57Zw2EOTQjLAt6RpHvjwHA==} - hasBin: true - peerDependencies: - ts-node: '*' - typescript: '*' - peerDependenciesMeta: - ts-node: - optional: true - typescript: - optional: true - - has-flag@1.0.0: - resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} - engines: {node: '>=0.10.0'} - - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - - hash-base@3.1.0: - resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} - engines: {node: '>=4'} - - hash.js@1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - heap@0.2.7: - resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} - - hmac-drbg@1.0.1: - resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} - - homedir-polyfill@1.0.3: - resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} - engines: {node: '>=0.10.0'} - - hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - - hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} - - http-basic@8.1.3: - resolution: {integrity: sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==} - engines: {node: '>=6.0.0'} - - http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} - - http-response-object@3.0.2: - resolution: {integrity: sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==} - - https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - - human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - - human-signals@4.3.1: - resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} - engines: {node: '>=14.18.0'} - - husky@8.0.3: - resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} - engines: {node: '>=14'} - hasBin: true - - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} - - immer@10.0.2: - resolution: {integrity: sha512-Rx3CqeqQ19sxUtYV9CU911Vhy8/721wRFnJv3REVGWUmoAcIwzifTsdmJte/MV+0/XpM35LZdQMBGkRIoLPwQA==} - - immutable@4.3.7: - resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} - - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - - import-meta-resolve@4.1.0: - resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} - - imul@1.0.1: - resolution: {integrity: sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA==} - engines: {node: '>=0.10.0'} - - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - - ini@4.1.1: - resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - inquirer@8.2.5: - resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==} - engines: {node: '>=12.0.0'} - - interpret@1.4.0: - resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} - engines: {node: '>= 0.10'} - - io-ts@1.10.4: - resolution: {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==} - - is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-builtin-module@3.2.1: - resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} - engines: {node: '>=6'} - - is-core-module@2.15.1: - resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} - engines: {node: '>= 0.4'} - - is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@2.0.0: - resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} - engines: {node: '>=4'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-fullwidth-code-point@4.0.0: - resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} - engines: {node: '>=12'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-hex-prefixed@1.0.0: - resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} - engines: {node: '>=6.5.0', npm: '>=3'} - - is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} - - is-module@1.0.0: - resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - - is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-reference@1.2.1: - resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} - - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - - is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - is-text-path@1.0.1: - resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} - engines: {node: '>=0.10.0'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - is-utf8@0.2.1: - resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} - - is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - - is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - - isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-unfetch@3.1.0: - resolution: {integrity: sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==} - - isows@1.0.4: - resolution: {integrity: sha512-hEzjY+x9u9hPmBom9IIAqdJCwNLax+xrPb51vEPpERoFlIxgmZcHzsT5jKG06nvInKOBGvReAVz80Umed5CczQ==} - peerDependencies: - ws: '*' - - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - - javascript-natural-sort@0.7.1: - resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==} - - jiti@1.21.6: - resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} - hasBin: true - - js-cookie@2.2.1: - resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} - - js-sha3@0.8.0: - resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} - - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - - json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - json-stream-stringify@3.1.6: - resolution: {integrity: sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog==} - engines: {node: '>=7.10.1'} - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - - jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - - jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - - jsonschema@1.4.1: - resolution: {integrity: sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==} - - keccak@3.0.4: - resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} - engines: {node: '>=10.0.0'} - - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - - kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - - kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - - levn@0.3.0: - resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} - engines: {node: '>= 0.8.0'} - - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - - lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} - - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - - lint-staged@13.3.0: - resolution: {integrity: sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ==} - engines: {node: ^16.14.0 || >=18.0.0} - hasBin: true - - listr2@6.6.1: - resolution: {integrity: sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==} - engines: {node: '>=16.0.0'} - peerDependencies: - enquirer: '>= 2.3.0 < 3' - peerDependenciesMeta: - enquirer: - optional: true - - load-json-file@4.0.0: - resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} - engines: {node: '>=4'} - - locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - - lodash.clonedeep@4.5.0: - resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} - - lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - - lodash.isfunction@3.0.9: - resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} - - lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - - lodash.kebabcase@4.1.1: - resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} - - lodash.map@4.6.0: - resolution: {integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==} - - lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - - lodash.mergewith@4.6.2: - resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} - - lodash.snakecase@4.1.1: - resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} - - lodash.startcase@4.4.0: - resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - - lodash.truncate@4.4.2: - resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} - - lodash.uniq@4.5.0: - resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} - - lodash.upperfirst@4.3.1: - resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} - - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - log-update@5.0.1: - resolution: {integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - longest@2.0.1: - resolution: {integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==} - engines: {node: '>=0.10.0'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - - lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - - lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - - lru_map@0.3.3: - resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} - - magic-string@0.25.9: - resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} - - magic-string@0.27.0: - resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} - engines: {node: '>=12'} - - magic-string@0.30.11: - resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - - map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} - - markdown-table@1.1.3: - resolution: {integrity: sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==} - - match-all@1.2.6: - resolution: {integrity: sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ==} - - md5.js@1.3.5: - resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} - - memorystream@0.3.1: - resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} - engines: {node: '>= 0.10.0'} - - meow@8.1.2: - resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} - engines: {node: '>=10'} - - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - merge@2.1.1: - resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} - - micro-ftch@0.3.1: - resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} - - micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - - mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - - min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - - minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - - minimalistic-crypto-utils@1.0.1: - resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} - - minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} - - minimist@1.2.7: - resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - - mnemonist@0.38.5: - resolution: {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==} - - mocha@10.7.3: - resolution: {integrity: sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==} - engines: {node: '>= 14.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - murmur-128@0.2.1: - resolution: {integrity: sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg==} - - mute-stream@0.0.8: - resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - - ndjson@2.0.0: - resolution: {integrity: sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ==} - engines: {node: '>=10'} - hasBin: true - - neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - - node-addon-api@2.0.2: - resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} - - node-emoji@1.11.0: - resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} - - node-fetch@2.0.0: - resolution: {integrity: sha512-bici2HCWFnAghTYMcy12WPxrEwJ5qK7GQJOTwTfyEZjyL99ECWxbYQfabZ2U1zrHMKkOBE97Z9iHIuKQfCMdzQ==} - engines: {node: 4.x || >=6.0.0} - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.2: - resolution: {integrity: sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==} - hasBin: true - - node-releases@2.0.18: - resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} - - nofilter@3.1.0: - resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} - engines: {node: '>=12.19'} - - nopt@3.0.6: - resolution: {integrity: sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==} - hasBin: true - - normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - - normalize-package-data@3.0.3: - resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} - engines: {node: '>=10'} - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - - npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - number-to-bn@1.7.0: - resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} - engines: {node: '>=6.5.0', npm: '>=3'} - - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - - object-inspect@1.13.2: - resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} - engines: {node: '>= 0.4'} - - obliterator@2.0.4: - resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - - onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - - open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} - - optionator@0.8.3: - resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} - engines: {node: '>= 0.8.0'} - - optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} - - ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} - - ordinal@1.0.3: - resolution: {integrity: sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==} - - os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - - p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} - - p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - - package-json-from-dist@1.0.0: - resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} - - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - - parse-cache-control@1.0.1: - resolution: {integrity: sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==} - - parse-json@4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} - - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - - parse-passwd@1.0.0: - resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} - engines: {node: '>=0.10.0'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - - path-starts-with@2.0.1: - resolution: {integrity: sha512-wZ3AeiRBRlNwkdUxvBANh0+esnt38DLffHDujZyRHkqkaKHTglnY2EP5UX3b8rdeiSutgO4y9NEJwXezNP5vHg==} - engines: {node: '>=8'} - - path-type@3.0.0: - resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} - engines: {node: '>=4'} - - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - pbkdf2@3.1.2: - resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} - engines: {node: '>=0.12'} - - picocolors@1.1.0: - resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} - - pidtree@0.6.0: - resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} - engines: {node: '>=0.10'} - hasBin: true - - pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} - - pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - - pluralize@8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} - engines: {node: '>=4'} - - postcss@8.4.45: - resolution: {integrity: sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==} - engines: {node: ^10 || ^12 || >=14} - - prelude-ls@1.1.2: - resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} - engines: {node: '>= 0.8.0'} - - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} - - prettier-plugin-solidity@1.4.1: - resolution: {integrity: sha512-Mq8EtfacVZ/0+uDKTtHZGW3Aa7vEbX/BNx63hmVg6YTiTXSiuKP0amj0G6pGwjmLaOfymWh3QgXEZkjQbU8QRg==} - engines: {node: '>=16'} - peerDependencies: - prettier: '>=2.3.0' - - prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - - process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - - promise@8.3.0: - resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} - - prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - - proper-lockfile@4.1.2: - resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} - - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - - qs@6.13.0: - resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} - engines: {node: '>=0.6'} - - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} - - read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} - - read-pkg@3.0.0: - resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} - engines: {node: '>=4'} - - read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} - - readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - readdirp@4.0.2: - resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} - engines: {node: '>= 14.16.0'} - - rechoir@0.6.2: - resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} - engines: {node: '>= 0.10'} - - recursive-readdir@2.2.3: - resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} - engines: {node: '>=6.0.0'} - - redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} - - reduce-flatten@2.0.0: - resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} - engines: {node: '>=6'} - - req-cwd@2.0.0: - resolution: {integrity: sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==} - engines: {node: '>=4'} - - req-from@2.0.0: - resolution: {integrity: sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==} - engines: {node: '>=4'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - - resolve-dir@1.0.1: - resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} - engines: {node: '>=0.10.0'} - - resolve-from@3.0.0: - resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} - engines: {node: '>=4'} - - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - - resolve-global@1.0.0: - resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} - engines: {node: '>=8'} - - resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - - resolve@1.1.7: - resolution: {integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==} - - resolve@1.17.0: - resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} - - resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true - - restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} - - restore-cursor@4.0.0: - resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} - - retry@0.13.1: - resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} - engines: {node: '>= 4'} - - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - rfdc@1.4.1: - resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - - rimraf@2.7.1: - resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - - rimraf@5.0.10: - resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} - hasBin: true - - ripemd160@2.0.2: - resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} - - rlp@2.2.7: - resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} - hasBin: true - - rollup-plugin-auto-external@2.0.0: - resolution: {integrity: sha512-HQM3ZkZYfSam1uoZtAB9sK26EiAsfs1phrkf91c/YX+S07wugyRXSigBxrIwiLr5EPPilKYmoMxsrnlGBsXnuQ==} - engines: {node: '>=6'} - peerDependencies: - rollup: '>=0.45.2' - - rollup-plugin-dts@6.1.1: - resolution: {integrity: sha512-aSHRcJ6KG2IHIioYlvAOcEq6U99sVtqDDKVhnwt70rW6tsz3tv5OSjEiWcgzfsHdLyGXZ/3b/7b/+Za3Y6r1XA==} - engines: {node: '>=16'} - peerDependencies: - rollup: ^3.29.4 || ^4 - typescript: ^4.5 || ^5.0 - - rollup-plugin-esbuild@6.1.1: - resolution: {integrity: sha512-CehMY9FAqJD5OUaE/Mi1r5z0kNeYxItmRO2zG4Qnv2qWKF09J2lTy5GUzjJR354ZPrLkCj4fiBN41lo8PzBUhw==} - engines: {node: '>=14.18.0'} - peerDependencies: - esbuild: '>=0.18.0' - rollup: ^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 - - rollup-plugin-inject@3.0.2: - resolution: {integrity: sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==} - deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject. - - rollup-plugin-node-polyfills@0.2.1: - resolution: {integrity: sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==} - - rollup-plugin-swc3@0.11.2: - resolution: {integrity: sha512-o1ih9B806fV2wBSNk46T0cYfTF2eiiKmYXRpWw3K4j/Cp3tCAt10UCVsTqvUhGP58pcB3/GZcAVl5e7TCSKN6Q==} - engines: {node: '>=12'} - peerDependencies: - '@swc/core': '>=1.2.165' - rollup: ^2.0.0 || ^3.0.0 || ^4.0.0 - - rollup-pluginutils@2.8.2: - resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} - - rollup-preserve-directives@1.1.1: - resolution: {integrity: sha512-+eQafbuEfDPfxQ9hQPlwaROfin4yiVRxap8hnrvvvcSGoukv1tTiYpAW9mvm3uR8J+fe4xd8FdVd5rz9q7jZ+Q==} - peerDependencies: - rollup: ^2.0.0 || ^3.0.0 || ^4.0.0 - - rollup@4.21.2: - resolution: {integrity: sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - - run-async@2.4.1: - resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} - engines: {node: '>=0.12.0'} - - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} - - safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - safe-resolve@1.0.0: - resolution: {integrity: sha512-aQpRvfxoi1y0UxKEU0tNO327kb0/LMo8Xrk64M2u172UqOOLCCM0khxN2OTClDiTqTJz5864GMD1X92j4YiHTg==} - - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - sc-istanbul@0.4.6: - resolution: {integrity: sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==} - hasBin: true - - scrypt-js@3.0.1: - resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} - - secp256k1@4.0.3: - resolution: {integrity: sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==} - engines: {node: '>=10.0.0'} - - semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - - semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - - semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} - engines: {node: '>=10'} - hasBin: true - - serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - - setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - - sha.js@2.4.11: - resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} - hasBin: true - - sha1@1.1.1: - resolution: {integrity: sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==} - - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - shelljs@0.8.5: - resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} - engines: {node: '>=4'} - hasBin: true - - shx@0.3.4: - resolution: {integrity: sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==} - engines: {node: '>=6'} - hasBin: true - - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} - - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - - sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - - slice-ansi@4.0.0: - resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} - engines: {node: '>=10'} - - slice-ansi@5.0.0: - resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} - engines: {node: '>=12'} - - solc@0.8.26: - resolution: {integrity: sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g==} - engines: {node: '>=10.0.0'} - hasBin: true - - solhint-plugin-prettier@0.0.5: - resolution: {integrity: sha512-7jmWcnVshIrO2FFinIvDQmhQpfpS2rRRn3RejiYgnjIE68xO2bvrYvjqVNfrio4xH9ghOqn83tKuTzLjEbmGIA==} - peerDependencies: - prettier: ^1.15.0 || ^2.0.0 - prettier-plugin-solidity: ^1.0.0-alpha.14 - - solhint@3.6.2: - resolution: {integrity: sha512-85EeLbmkcPwD+3JR7aEMKsVC9YrRSxd4qkXuMzrlf7+z2Eqdfm1wHWq1ffTuo5aDhoZxp2I9yF3QkxZOxOL7aQ==} - hasBin: true - - solidity-ast@0.4.59: - resolution: {integrity: sha512-I+CX0wrYUN9jDfYtcgWSe+OAowaXy8/1YQy7NS4ni5IBDmIYBq7ZzaP/7QqouLjzZapmQtvGLqCaYgoUWqBo5g==} - - solidity-coverage@0.8.13: - resolution: {integrity: sha512-RiBoI+kF94V3Rv0+iwOj3HQVSqNzA9qm/qDP1ZDXK5IX0Cvho1qiz8hAXTsAo6KOIUeP73jfscq0KlLqVxzGWA==} - hasBin: true - peerDependencies: - hardhat: ^2.11.0 - - solmate@6.2.0: - resolution: {integrity: sha512-AM38ioQ2P8zRsA42zenb9or6OybRjOLXIu3lhIT8rhddUuduCt76pUEuLxOIg9GByGojGz+EbpFdCB6B+QZVVA==} - - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.2.0: - resolution: {integrity: sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==} - engines: {node: '>=0.8.0'} - - source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - sourcemap-codec@1.4.8: - resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} - deprecated: Please use @jridgewell/sourcemap-codec instead - - spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - - spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - - spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - - spdx-license-ids@3.0.20: - resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==} - - split2@3.2.2: - resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} - - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - - squirrelly@8.0.8: - resolution: {integrity: sha512-7dyZJ9Gw86MmH0dYLiESsjGOTj6KG8IWToTaqBuB6LwPI+hyNb6mbQaZwrfnAQ4cMDnSWMUvX/zAYDLTSWLk/w==} - engines: {node: '>=6.0.0'} - - stacktrace-parser@0.1.10: - resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} - engines: {node: '>=6'} - - statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - - string-argv@0.3.2: - resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} - engines: {node: '>=0.6.19'} - - string-format@2.0.0: - resolution: {integrity: sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==} - - string-width@2.1.1: - resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} - engines: {node: '>=4'} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - - string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - - strip-ansi@4.0.0: - resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} - engines: {node: '>=4'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - - strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - - strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - - strip-hex-prefix@1.0.0: - resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} - engines: {node: '>=6.5.0', npm: '>=3'} - - strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - supports-color@3.2.3: - resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} - engines: {node: '>=0.8.0'} - - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - - sync-request@6.1.0: - resolution: {integrity: sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==} - engines: {node: '>=8.0.0'} - - sync-rpc@1.3.6: - resolution: {integrity: sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==} - - table-layout@1.0.2: - resolution: {integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==} - engines: {node: '>=8.0.0'} - - table@6.8.2: - resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==} - engines: {node: '>=10.0.0'} - - tenderly@0.9.1: - resolution: {integrity: sha512-EGhYYbOgIC0EUebrMIwCRIL9NrGrC8q3gTY/3JNSqvQrNX4RLUgMHungTG4bkgGAwJoehC57vsAeKqR1PVIyjw==} - peerDependencies: - ts-node: '*' - typescript: '*' - peerDependenciesMeta: - ts-node: - optional: true - typescript: - optional: true - - text-extensions@1.9.0: - resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} - engines: {node: '>=0.10'} - - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - - then-request@6.0.2: - resolution: {integrity: sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==} - engines: {node: '>=6.0.0'} - - through2@4.0.2: - resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} - - through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - - tinyglobby@0.2.10: - resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} - engines: {node: '>=12.0.0'} - - tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} - - to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - trim-newlines@3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} - - ts-api-utils@1.3.0: - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' - - ts-command-line-args@2.5.1: - resolution: {integrity: sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==} - hasBin: true - - ts-essentials@7.0.3: - resolution: {integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==} - peerDependencies: - typescript: '>=3.7.0' - - ts-node@10.9.2: - resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - - tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - - tslib@2.4.0: - resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} - - tslib@2.7.0: - resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} - - tslog@4.9.3: - resolution: {integrity: sha512-oDWuGVONxhVEBtschLf2cs/Jy8i7h1T+CpdkTNWQgdAF7DhRo2G8vMCgILKe7ojdEkLhICWgI1LYSSKaJsRgcw==} - engines: {node: '>=16'} - - tsort@0.0.1: - resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} - - tweetnacl-util@0.15.1: - resolution: {integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==} - - tweetnacl@1.0.3: - resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} - - type-check@0.3.2: - resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} - engines: {node: '>= 0.8.0'} - - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - type-fest@0.18.1: - resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} - engines: {node: '>=10'} - - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - - type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - - type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - - type-fest@0.7.1: - resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} - engines: {node: '>=8'} - - type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - - type-fest@1.4.0: - resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} - engines: {node: '>=10'} - - typechain@8.3.2: - resolution: {integrity: sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==} - hasBin: true - peerDependencies: - typescript: '>=4.3.0' - - typedarray@0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - - typescript@5.6.2: - resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} - engines: {node: '>=14.17'} - hasBin: true - - typical@4.0.0: - resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} - engines: {node: '>=8'} - - typical@5.2.0: - resolution: {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==} - engines: {node: '>=8'} - - uglify-js@3.19.3: - resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} - engines: {node: '>=0.8.0'} - hasBin: true - - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - - undici@5.28.4: - resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} - engines: {node: '>=14.0'} - - undici@6.19.8: - resolution: {integrity: sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==} - engines: {node: '>=18.17'} - - unfetch@4.2.0: - resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} - - universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - - universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - - unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - - update-browserslist-db@1.1.0: - resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - - utf8@3.0.0: - resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} - - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - - validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - - viem@2.21.5: - resolution: {integrity: sha512-MFuoeGA8hRJJ0CknSuKYZjVaxSy5hyzu9MCArOANz3Iq5RITBJNIhM+m6TNvO9I2AxCSF3+PZObjbrLVg7cX2w==} - peerDependencies: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true - - wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - - web3-utils@1.10.4: - resolution: {integrity: sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==} - engines: {node: '>=8.0.0'} - - webauthn-p256@0.0.5: - resolution: {integrity: sha512-drMGNWKdaixZNobeORVIqq7k5DsRC9FnG201K2QjeOoQLmtSDaSsVZdkg6n5jUALJKcAG++zBPJXmv6hy0nWFg==} - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - widest-line@3.1.0: - resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} - engines: {node: '>=8'} - - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - - wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - - wordwrapjs@4.0.1: - resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} - engines: {node: '>=8.0.0'} - - workerpool@6.5.1: - resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.4.6: - resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.17.1: - resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - xdeployer@2.2.2: - resolution: {integrity: sha512-CmkADnwn9M7J33Rrb1sbaI5mBaXrRr2kLEw5W6QMeTJkXw57ae7/IIBYHDbuFLu7L60J3ZF21KdpHjmSMkUsVQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - '@nomicfoundation/hardhat-ethers': ^3.0.5 - ethers: ^6.9.0 - hardhat: ^2.19.2 - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - - yaml@2.3.1: - resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} - engines: {node: '>= 14'} - - yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - - yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - zksync-web3@0.14.4: - resolution: {integrity: sha512-kYehMD/S6Uhe1g434UnaMN+sBr9nQm23Ywn0EUP5BfQCsbjcr3ORuS68PosZw8xUTu3pac7G6YMSnNHk+fwzvg==} - deprecated: This package has been deprecated in favor of zksync-ethers@5.0.0 - peerDependencies: - ethers: ^5.7.0 - -snapshots: - - '@adraffy/ens-normalize@1.10.0': {} - - '@adraffy/ens-normalize@1.10.1': {} - - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - - '@aws-crypto/sha256-js@1.2.2': - dependencies: - '@aws-crypto/util': 1.2.2 - '@aws-sdk/types': 3.649.0 - tslib: 1.14.1 - - '@aws-crypto/util@1.2.2': - dependencies: - '@aws-sdk/types': 3.649.0 - '@aws-sdk/util-utf8-browser': 3.259.0 - tslib: 1.14.1 - - '@aws-sdk/types@3.649.0': - dependencies: - '@smithy/types': 3.4.0 - tslib: 2.7.0 - - '@aws-sdk/util-utf8-browser@3.259.0': - dependencies: - tslib: 2.7.0 - - '@babel/code-frame@7.24.7': - dependencies: - '@babel/highlight': 7.24.7 - picocolors: 1.1.0 - - '@babel/compat-data@7.25.4': {} - - '@babel/core@7.17.8': - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.17.7 - '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.17.8) - '@babel/helpers': 7.25.6 - '@babel/parser': 7.18.9 - '@babel/template': 7.25.0 - '@babel/traverse': 7.17.3 - '@babel/types': 7.17.0 - convert-source-map: 1.9.0 - debug: 4.3.7(supports-color@8.1.1) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/generator@7.17.7': - dependencies: - '@babel/types': 7.17.0 - jsesc: 2.5.2 - source-map: 0.5.7 - - '@babel/generator@7.25.6': - dependencies: - '@babel/types': 7.25.6 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 - - '@babel/helper-compilation-targets@7.25.2': - dependencies: - '@babel/compat-data': 7.25.4 - '@babel/helper-validator-option': 7.24.8 - browserslist: 4.23.3 - lru-cache: 5.1.1 - semver: 6.3.1 - - '@babel/helper-environment-visitor@7.24.7': - dependencies: - '@babel/types': 7.25.6 - - '@babel/helper-function-name@7.24.7': - dependencies: - '@babel/template': 7.25.0 - '@babel/types': 7.25.6 - - '@babel/helper-hoist-variables@7.24.7': - dependencies: - '@babel/types': 7.25.6 - - '@babel/helper-module-imports@7.24.7': - dependencies: - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.25.2(@babel/core@7.17.8)': - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-module-imports': 7.24.7 - '@babel/helper-simple-access': 7.24.7 - '@babel/helper-validator-identifier': 7.24.7 - '@babel/traverse': 7.25.6 - transitivePeerDependencies: - - supports-color - - '@babel/helper-simple-access@7.24.7': - dependencies: - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 - transitivePeerDependencies: - - supports-color - - '@babel/helper-split-export-declaration@7.24.7': - dependencies: - '@babel/types': 7.25.6 - - '@babel/helper-string-parser@7.24.8': {} - - '@babel/helper-validator-identifier@7.24.7': {} - - '@babel/helper-validator-option@7.24.8': {} - - '@babel/helpers@7.25.6': - dependencies: - '@babel/template': 7.25.0 - '@babel/types': 7.25.6 - - '@babel/highlight@7.24.7': - dependencies: - '@babel/helper-validator-identifier': 7.24.7 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.1.0 - - '@babel/parser@7.18.9': - dependencies: - '@babel/types': 7.17.0 - - '@babel/parser@7.25.6': - dependencies: - '@babel/types': 7.25.6 - - '@babel/template@7.25.0': - dependencies: - '@babel/code-frame': 7.24.7 - '@babel/parser': 7.25.6 - '@babel/types': 7.25.6 - - '@babel/traverse@7.17.3': - dependencies: - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.17.7 - '@babel/helper-environment-visitor': 7.24.7 - '@babel/helper-function-name': 7.24.7 - '@babel/helper-hoist-variables': 7.24.7 - '@babel/helper-split-export-declaration': 7.24.7 - '@babel/parser': 7.18.9 - '@babel/types': 7.17.0 - debug: 4.3.7(supports-color@8.1.1) - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - - '@babel/traverse@7.25.6': - dependencies: - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.6 - '@babel/parser': 7.25.6 - '@babel/template': 7.25.0 - '@babel/types': 7.25.6 - debug: 4.3.7(supports-color@8.1.1) - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - - '@babel/types@7.17.0': - dependencies: - '@babel/helper-validator-identifier': 7.24.7 - to-fast-properties: 2.0.0 - - '@babel/types@7.25.6': - dependencies: - '@babel/helper-string-parser': 7.24.8 - '@babel/helper-validator-identifier': 7.24.7 - to-fast-properties: 2.0.0 - - '@chainlink/contracts@0.8.0(ethers@6.13.2)': - dependencies: - '@eth-optimism/contracts': 0.5.40(ethers@6.13.2) - '@openzeppelin/contracts': 4.3.3 - '@openzeppelin/contracts-upgradeable-4.7.3': '@openzeppelin/contracts-upgradeable@4.7.3' - '@openzeppelin/contracts-v0.7': '@openzeppelin/contracts@3.4.2' - transitivePeerDependencies: - - bufferutil - - ethers - - utf-8-validate - - '@colors/colors@1.5.0': - optional: true - - '@commitlint/cli@17.8.1(@swc/core@1.7.26)': - dependencies: - '@commitlint/format': 17.8.1 - '@commitlint/lint': 17.8.1 - '@commitlint/load': 17.8.1(@swc/core@1.7.26) - '@commitlint/read': 17.8.1 - '@commitlint/types': 17.8.1 - execa: 5.1.1 - lodash.isfunction: 3.0.9 - resolve-from: 5.0.0 - resolve-global: 1.0.0 - yargs: 17.7.2 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - '@commitlint/config-conventional@17.8.1': - dependencies: - conventional-changelog-conventionalcommits: 6.1.0 - - '@commitlint/config-validator@17.8.1': - dependencies: - '@commitlint/types': 17.8.1 - ajv: 8.17.1 - - '@commitlint/config-validator@19.5.0': - dependencies: - '@commitlint/types': 19.5.0 - ajv: 8.17.1 - optional: true - - '@commitlint/ensure@17.8.1': - dependencies: - '@commitlint/types': 17.8.1 - lodash.camelcase: 4.3.0 - lodash.kebabcase: 4.1.1 - lodash.snakecase: 4.1.1 - lodash.startcase: 4.4.0 - lodash.upperfirst: 4.3.1 - - '@commitlint/execute-rule@17.8.1': {} - - '@commitlint/execute-rule@19.5.0': - optional: true - - '@commitlint/format@17.8.1': - dependencies: - '@commitlint/types': 17.8.1 - chalk: 4.1.2 - - '@commitlint/is-ignored@17.8.1': - dependencies: - '@commitlint/types': 17.8.1 - semver: 7.5.4 - - '@commitlint/lint@17.8.1': - dependencies: - '@commitlint/is-ignored': 17.8.1 - '@commitlint/parse': 17.8.1 - '@commitlint/rules': 17.8.1 - '@commitlint/types': 17.8.1 - - '@commitlint/load@17.8.1(@swc/core@1.7.26)': - dependencies: - '@commitlint/config-validator': 17.8.1 - '@commitlint/execute-rule': 17.8.1 - '@commitlint/resolve-extends': 17.8.1 - '@commitlint/types': 17.8.1 - '@types/node': 20.5.1 - chalk: 4.1.2 - cosmiconfig: 8.3.6(typescript@5.6.2) - cosmiconfig-typescript-loader: 4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6(typescript@5.6.2))(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@20.5.1)(typescript@5.6.2))(typescript@5.6.2) - lodash.isplainobject: 4.0.6 - lodash.merge: 4.6.2 - lodash.uniq: 4.5.0 - resolve-from: 5.0.0 - ts-node: 10.9.2(@swc/core@1.7.26)(@types/node@20.5.1)(typescript@5.6.2) - typescript: 5.6.2 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - '@commitlint/load@19.5.0(@types/node@18.19.50)(typescript@5.6.2)': - dependencies: - '@commitlint/config-validator': 19.5.0 - '@commitlint/execute-rule': 19.5.0 - '@commitlint/resolve-extends': 19.5.0 - '@commitlint/types': 19.5.0 - chalk: 5.3.0 - cosmiconfig: 9.0.0(typescript@5.6.2) - cosmiconfig-typescript-loader: 5.0.0(@types/node@18.19.50)(cosmiconfig@9.0.0(typescript@5.6.2))(typescript@5.6.2) - lodash.isplainobject: 4.0.6 - lodash.merge: 4.6.2 - lodash.uniq: 4.5.0 - transitivePeerDependencies: - - '@types/node' - - typescript - optional: true - - '@commitlint/message@17.8.1': {} - - '@commitlint/parse@17.8.1': - dependencies: - '@commitlint/types': 17.8.1 - conventional-changelog-angular: 6.0.0 - conventional-commits-parser: 4.0.0 - - '@commitlint/read@17.8.1': - dependencies: - '@commitlint/top-level': 17.8.1 - '@commitlint/types': 17.8.1 - fs-extra: 11.2.0 - git-raw-commits: 2.0.11 - minimist: 1.2.8 - - '@commitlint/resolve-extends@17.8.1': - dependencies: - '@commitlint/config-validator': 17.8.1 - '@commitlint/types': 17.8.1 - import-fresh: 3.3.0 - lodash.mergewith: 4.6.2 - resolve-from: 5.0.0 - resolve-global: 1.0.0 - - '@commitlint/resolve-extends@19.5.0': - dependencies: - '@commitlint/config-validator': 19.5.0 - '@commitlint/types': 19.5.0 - global-directory: 4.0.1 - import-meta-resolve: 4.1.0 - lodash.mergewith: 4.6.2 - resolve-from: 5.0.0 - optional: true - - '@commitlint/rules@17.8.1': - dependencies: - '@commitlint/ensure': 17.8.1 - '@commitlint/message': 17.8.1 - '@commitlint/to-lines': 17.8.1 - '@commitlint/types': 17.8.1 - execa: 5.1.1 - - '@commitlint/to-lines@17.8.1': {} - - '@commitlint/top-level@17.8.1': - dependencies: - find-up: 5.0.0 - - '@commitlint/types@17.8.1': - dependencies: - chalk: 4.1.2 - - '@commitlint/types@19.5.0': - dependencies: - '@types/conventional-commits-parser': 5.0.0 - chalk: 5.3.0 - optional: true - - '@cspotcode/source-map-support@0.8.1': - dependencies: - '@jridgewell/trace-mapping': 0.3.9 - - '@esbuild/aix-ppc64@0.23.1': - optional: true - - '@esbuild/android-arm64@0.23.1': - optional: true - - '@esbuild/android-arm@0.23.1': - optional: true - - '@esbuild/android-x64@0.23.1': - optional: true - - '@esbuild/darwin-arm64@0.23.1': - optional: true - - '@esbuild/darwin-x64@0.23.1': - optional: true - - '@esbuild/freebsd-arm64@0.23.1': - optional: true - - '@esbuild/freebsd-x64@0.23.1': - optional: true - - '@esbuild/linux-arm64@0.23.1': - optional: true - - '@esbuild/linux-arm@0.23.1': - optional: true - - '@esbuild/linux-ia32@0.23.1': - optional: true - - '@esbuild/linux-loong64@0.23.1': - optional: true - - '@esbuild/linux-mips64el@0.23.1': - optional: true - - '@esbuild/linux-ppc64@0.23.1': - optional: true - - '@esbuild/linux-riscv64@0.23.1': - optional: true - - '@esbuild/linux-s390x@0.23.1': - optional: true - - '@esbuild/linux-x64@0.23.1': - optional: true - - '@esbuild/netbsd-x64@0.23.1': - optional: true - - '@esbuild/openbsd-arm64@0.23.1': - optional: true - - '@esbuild/openbsd-x64@0.23.1': - optional: true - - '@esbuild/sunos-x64@0.23.1': - optional: true - - '@esbuild/win32-arm64@0.23.1': - optional: true - - '@esbuild/win32-ia32@0.23.1': - optional: true - - '@esbuild/win32-x64@0.23.1': - optional: true - - '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': - dependencies: - eslint: 8.57.0 - eslint-visitor-keys: 3.4.3 - - '@eslint-community/regexpp@4.11.0': {} - - '@eslint/eslintrc@2.1.4': - dependencies: - ajv: 6.12.6 - debug: 4.3.7(supports-color@8.1.1) - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.2 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - '@eslint/js@8.57.0': {} - - '@eth-optimism/contracts@0.5.40(ethers@6.13.2)': - dependencies: - '@eth-optimism/core-utils': 0.12.0 - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 - ethers: 6.13.2 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - '@eth-optimism/core-utils@0.12.0': - dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/contracts': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/providers': 5.7.2 - '@ethersproject/rlp': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/web': 5.7.1 - bufio: 1.2.1 - chai: 4.5.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - '@ethereumjs/rlp@4.0.1': {} - - '@ethereumjs/util@8.1.0': - dependencies: - '@ethereumjs/rlp': 4.0.1 - ethereum-cryptography: 2.2.1 - micro-ftch: 0.3.1 - - '@ethersproject/abi@5.7.0': - dependencies: - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/strings': 5.7.0 - - '@ethersproject/abstract-provider@5.7.0': - dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/networks': 5.7.1 - '@ethersproject/properties': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/web': 5.7.1 - - '@ethersproject/abstract-signer@5.7.0': - dependencies: - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - - '@ethersproject/address@5.6.1': - dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/rlp': 5.7.0 - - '@ethersproject/address@5.7.0': - dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/rlp': 5.7.0 - - '@ethersproject/base64@5.7.0': - dependencies: - '@ethersproject/bytes': 5.7.0 - - '@ethersproject/basex@5.7.0': - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/properties': 5.7.0 - - '@ethersproject/bignumber@5.7.0': - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - bn.js: 5.2.1 - - '@ethersproject/bytes@5.7.0': - dependencies: - '@ethersproject/logger': 5.7.0 - - '@ethersproject/constants@5.7.0': - dependencies: - '@ethersproject/bignumber': 5.7.0 - - '@ethersproject/contracts@5.7.0': - dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/transactions': 5.7.0 - - '@ethersproject/hash@5.7.0': - dependencies: - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/base64': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/strings': 5.7.0 - - '@ethersproject/hdnode@5.7.0': - dependencies: - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/basex': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/pbkdf2': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/sha2': 5.7.0 - '@ethersproject/signing-key': 5.7.0 - '@ethersproject/strings': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/wordlists': 5.7.0 - - '@ethersproject/json-wallets@5.7.0': - dependencies: - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/hdnode': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/pbkdf2': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/random': 5.7.0 - '@ethersproject/strings': 5.7.0 - '@ethersproject/transactions': 5.7.0 - aes-js: 3.0.0 - scrypt-js: 3.0.1 - - '@ethersproject/keccak256@5.7.0': - dependencies: - '@ethersproject/bytes': 5.7.0 - js-sha3: 0.8.0 - - '@ethersproject/logger@5.7.0': {} - - '@ethersproject/networks@5.7.1': - dependencies: - '@ethersproject/logger': 5.7.0 - - '@ethersproject/pbkdf2@5.7.0': - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/sha2': 5.7.0 - - '@ethersproject/properties@5.7.0': - dependencies: - '@ethersproject/logger': 5.7.0 - - '@ethersproject/providers@5.7.2': - dependencies: - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/base64': 5.7.0 - '@ethersproject/basex': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/networks': 5.7.1 - '@ethersproject/properties': 5.7.0 - '@ethersproject/random': 5.7.0 - '@ethersproject/rlp': 5.7.0 - '@ethersproject/sha2': 5.7.0 - '@ethersproject/strings': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/web': 5.7.1 - bech32: 1.1.4 - ws: 7.4.6 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - '@ethersproject/random@5.7.0': - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - - '@ethersproject/rlp@5.7.0': - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - - '@ethersproject/sha2@5.7.0': - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - hash.js: 1.1.7 - - '@ethersproject/signing-key@5.7.0': - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - bn.js: 5.2.1 - elliptic: 6.5.4 - hash.js: 1.1.7 - - '@ethersproject/solidity@5.7.0': - dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/sha2': 5.7.0 - '@ethersproject/strings': 5.7.0 - - '@ethersproject/strings@5.7.0': - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/logger': 5.7.0 - - '@ethersproject/transactions@5.7.0': - dependencies: - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/rlp': 5.7.0 - '@ethersproject/signing-key': 5.7.0 - - '@ethersproject/units@5.7.0': - dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/logger': 5.7.0 - - '@ethersproject/wallet@5.7.0': - dependencies: - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/hdnode': 5.7.0 - '@ethersproject/json-wallets': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/random': 5.7.0 - '@ethersproject/signing-key': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/wordlists': 5.7.0 - - '@ethersproject/web@5.7.1': - dependencies: - '@ethersproject/base64': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/strings': 5.7.0 - - '@ethersproject/wordlists@5.7.0': - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/strings': 5.7.0 - - '@fastify/busboy@2.1.1': {} - - '@fastify/deepmerge@1.3.0': {} - - '@humanwhocodes/config-array@0.11.14': - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.7(supports-color@8.1.1) - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - '@humanwhocodes/module-importer@1.0.1': {} - - '@humanwhocodes/object-schema@2.0.3': {} - - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - - '@jridgewell/gen-mapping@0.3.5': - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/set-array@1.2.1': {} - - '@jridgewell/sourcemap-codec@1.5.0': {} - - '@jridgewell/trace-mapping@0.3.25': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 - - '@jridgewell/trace-mapping@0.3.9': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 - - '@looksrare/contracts-libs@3.5.1': {} - - '@metamask/eth-sig-util@4.0.1': - dependencies: - ethereumjs-abi: 0.6.8 - ethereumjs-util: 6.2.1 - ethjs-util: 0.1.6 - tweetnacl: 1.0.3 - tweetnacl-util: 0.15.1 - - '@noble/curves@1.2.0': - dependencies: - '@noble/hashes': 1.3.2 - - '@noble/curves@1.4.0': - dependencies: - '@noble/hashes': 1.4.0 - - '@noble/curves@1.4.2': - dependencies: - '@noble/hashes': 1.4.0 - - '@noble/hashes@1.2.0': {} - - '@noble/hashes@1.3.2': {} - - '@noble/hashes@1.4.0': {} - - '@noble/hashes@1.5.0': {} - - '@noble/secp256k1@1.7.1': {} - - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 - - '@nomicfoundation/edr-darwin-arm64@0.6.5': {} - - '@nomicfoundation/edr-darwin-x64@0.6.5': {} - - '@nomicfoundation/edr-linux-arm64-gnu@0.6.5': {} - - '@nomicfoundation/edr-linux-arm64-musl@0.6.5': {} - - '@nomicfoundation/edr-linux-x64-gnu@0.6.5': {} - - '@nomicfoundation/edr-linux-x64-musl@0.6.5': {} - - '@nomicfoundation/edr-win32-x64-msvc@0.6.5': {} - - '@nomicfoundation/edr@0.6.5': - dependencies: - '@nomicfoundation/edr-darwin-arm64': 0.6.5 - '@nomicfoundation/edr-darwin-x64': 0.6.5 - '@nomicfoundation/edr-linux-arm64-gnu': 0.6.5 - '@nomicfoundation/edr-linux-arm64-musl': 0.6.5 - '@nomicfoundation/edr-linux-x64-gnu': 0.6.5 - '@nomicfoundation/edr-linux-x64-musl': 0.6.5 - '@nomicfoundation/edr-win32-x64-msvc': 0.6.5 - - '@nomicfoundation/ethereumjs-common@4.0.4': - dependencies: - '@nomicfoundation/ethereumjs-util': 9.0.4 - transitivePeerDependencies: - - c-kzg - - '@nomicfoundation/ethereumjs-rlp@5.0.4': {} - - '@nomicfoundation/ethereumjs-tx@5.0.4': - dependencies: - '@nomicfoundation/ethereumjs-common': 4.0.4 - '@nomicfoundation/ethereumjs-rlp': 5.0.4 - '@nomicfoundation/ethereumjs-util': 9.0.4 - ethereum-cryptography: 0.1.3 - - '@nomicfoundation/ethereumjs-util@9.0.4': - dependencies: - '@nomicfoundation/ethereumjs-rlp': 5.0.4 - ethereum-cryptography: 0.1.3 - - '@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(chai@4.5.0)(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))': - dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) - '@types/chai-as-promised': 7.1.8 - chai: 4.5.0 - chai-as-promised: 7.1.2(chai@4.5.0) - deep-eql: 4.1.4 - ethers: 6.13.2 - hardhat: 2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) - ordinal: 1.0.3 - - '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))': - dependencies: - debug: 4.3.7(supports-color@8.1.1) - ethers: 6.13.2 - hardhat: 2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) - lodash.isequal: 4.5.0 - transitivePeerDependencies: - - supports-color - - '@nomicfoundation/hardhat-ignition-ethers@0.15.5(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.10(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@nomicfoundation/ignition-core@0.15.5)(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))': - dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) - '@nomicfoundation/hardhat-ignition': 0.15.5(@nomicfoundation/hardhat-verify@2.0.10(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) - '@nomicfoundation/ignition-core': 0.15.5 - ethers: 6.13.2 - hardhat: 2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) - - '@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.10(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))': - dependencies: - '@nomicfoundation/hardhat-verify': 2.0.10(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) - '@nomicfoundation/ignition-core': 0.15.5 - '@nomicfoundation/ignition-ui': 0.15.5 - chalk: 4.1.2 - debug: 4.3.7(supports-color@8.1.1) - fs-extra: 10.1.0 - hardhat: 2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) - prompts: 2.4.2 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - '@nomicfoundation/hardhat-network-helpers@1.0.11(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))': - dependencies: - ethereumjs-util: 7.1.5 - hardhat: 2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) - - ? '@nomicfoundation/hardhat-toolbox@5.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(chai@4.5.0)(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@nomicfoundation/hardhat-ignition-ethers@0.15.5(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.10(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@nomicfoundation/ignition-core@0.15.5)(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@nomicfoundation/hardhat-network-helpers@1.0.11(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@nomicfoundation/hardhat-verify@2.0.10(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.6.2))(typescript@5.6.2))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.6.2))(typescript@5.6.2))(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))(typechain@8.3.2(typescript@5.6.2)))(@types/chai@4.3.19)(@types/mocha@10.0.7)(@types/node@18.19.50)(chai@4.5.0)(ethers@6.13.2)(hardhat-gas-reporter@1.0.10(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))(solidity-coverage@0.8.13(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typechain@8.3.2(typescript@5.6.2))(typescript@5.6.2)' - : dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.0.7(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(chai@4.5.0)(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) - '@nomicfoundation/hardhat-ignition-ethers': 0.15.5(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.10(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@nomicfoundation/ignition-core@0.15.5)(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) - '@nomicfoundation/hardhat-network-helpers': 1.0.11(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) - '@nomicfoundation/hardhat-verify': 2.0.10(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) - '@typechain/ethers-v6': 0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.6.2))(typescript@5.6.2) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.6.2))(typescript@5.6.2))(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))(typechain@8.3.2(typescript@5.6.2)) - '@types/chai': 4.3.19 - '@types/mocha': 10.0.7 - '@types/node': 18.19.50 - chai: 4.5.0 - ethers: 6.13.2 - hardhat: 2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) - hardhat-gas-reporter: 1.0.10(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) - solidity-coverage: 0.8.13(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) - ts-node: 10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2) - typechain: 8.3.2(typescript@5.6.2) - typescript: 5.6.2 - - '@nomicfoundation/hardhat-verify@2.0.10(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))': - dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/address': 5.7.0 - cbor: 8.1.0 - chalk: 2.4.2 - debug: 4.3.7(supports-color@8.1.1) - hardhat: 2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) - lodash.clonedeep: 4.5.0 - semver: 6.3.1 - table: 6.8.2 - undici: 5.28.4 - transitivePeerDependencies: - - supports-color - - '@nomicfoundation/hardhat-viem@2.0.6(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))(typescript@5.6.2)(viem@2.21.5(typescript@5.6.2))': - dependencies: - abitype: 0.9.10(typescript@5.6.2) - hardhat: 2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) - lodash.memoize: 4.1.2 - viem: 2.21.5(typescript@5.6.2) - transitivePeerDependencies: - - typescript - - zod - - '@nomicfoundation/ignition-core@0.15.5': - dependencies: - '@ethersproject/address': 5.6.1 - '@nomicfoundation/solidity-analyzer': 0.1.2 - cbor: 9.0.2 - debug: 4.3.7(supports-color@8.1.1) - ethers: 6.13.2 - fs-extra: 10.1.0 - immer: 10.0.2 - lodash: 4.17.21 - ndjson: 2.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - '@nomicfoundation/ignition-ui@0.15.5': {} - - '@nomicfoundation/slang-darwin-arm64@0.17.0': {} - - '@nomicfoundation/slang-darwin-x64@0.17.0': {} - - '@nomicfoundation/slang-linux-arm64-gnu@0.17.0': {} - - '@nomicfoundation/slang-linux-arm64-musl@0.17.0': {} - - '@nomicfoundation/slang-linux-x64-gnu@0.17.0': {} - - '@nomicfoundation/slang-linux-x64-musl@0.17.0': {} - - '@nomicfoundation/slang-win32-arm64-msvc@0.17.0': {} - - '@nomicfoundation/slang-win32-ia32-msvc@0.17.0': {} - - '@nomicfoundation/slang-win32-x64-msvc@0.17.0': {} - - '@nomicfoundation/slang@0.17.0': - dependencies: - '@nomicfoundation/slang-darwin-arm64': 0.17.0 - '@nomicfoundation/slang-darwin-x64': 0.17.0 - '@nomicfoundation/slang-linux-arm64-gnu': 0.17.0 - '@nomicfoundation/slang-linux-arm64-musl': 0.17.0 - '@nomicfoundation/slang-linux-x64-gnu': 0.17.0 - '@nomicfoundation/slang-linux-x64-musl': 0.17.0 - '@nomicfoundation/slang-win32-arm64-msvc': 0.17.0 - '@nomicfoundation/slang-win32-ia32-msvc': 0.17.0 - '@nomicfoundation/slang-win32-x64-msvc': 0.17.0 - - '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': - optional: true - - '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2': - optional: true - - '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2': - optional: true - - '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2': - optional: true - - '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2': - optional: true - - '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2': - optional: true - - '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2': - optional: true - - '@nomicfoundation/solidity-analyzer@0.1.2': - optionalDependencies: - '@nomicfoundation/solidity-analyzer-darwin-arm64': 0.1.2 - '@nomicfoundation/solidity-analyzer-darwin-x64': 0.1.2 - '@nomicfoundation/solidity-analyzer-linux-arm64-gnu': 0.1.2 - '@nomicfoundation/solidity-analyzer-linux-arm64-musl': 0.1.2 - '@nomicfoundation/solidity-analyzer-linux-x64-gnu': 0.1.2 - '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.2 - '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.2 - - '@openzeppelin/contracts-upgradeable@4.7.3': {} - - '@openzeppelin/contracts@3.4.2': {} - - '@openzeppelin/contracts@4.3.3': {} - - '@openzeppelin/contracts@4.9.6': {} - - '@openzeppelin/defender-sdk-base-client@1.14.4': - dependencies: - amazon-cognito-identity-js: 6.3.12 - async-retry: 1.3.3 - transitivePeerDependencies: - - encoding - - '@openzeppelin/defender-sdk-deploy-client@1.14.4(debug@4.3.7)': - dependencies: - '@openzeppelin/defender-sdk-base-client': 1.14.4 - axios: 1.7.7(debug@4.3.7) - lodash: 4.17.21 - transitivePeerDependencies: - - debug - - encoding - - '@openzeppelin/defender-sdk-network-client@1.14.4(debug@4.3.7)': - dependencies: - '@openzeppelin/defender-sdk-base-client': 1.14.4 - axios: 1.7.7(debug@4.3.7) - lodash: 4.17.21 - transitivePeerDependencies: - - debug - - encoding - - '@openzeppelin/hardhat-upgrades@3.2.1(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@nomicfoundation/hardhat-verify@2.0.10(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))': - dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) - '@openzeppelin/defender-sdk-base-client': 1.14.4 - '@openzeppelin/defender-sdk-deploy-client': 1.14.4(debug@4.3.7) - '@openzeppelin/defender-sdk-network-client': 1.14.4(debug@4.3.7) - '@openzeppelin/upgrades-core': 1.37.1 - chalk: 4.1.2 - debug: 4.3.7(supports-color@8.1.1) - ethereumjs-util: 7.1.5 - ethers: 6.13.2 - hardhat: 2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) - proper-lockfile: 4.1.2 - undici: 6.19.8 - optionalDependencies: - '@nomicfoundation/hardhat-verify': 2.0.10(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) - transitivePeerDependencies: - - encoding - - supports-color - - '@openzeppelin/upgrades-core@1.37.1': - dependencies: - '@nomicfoundation/slang': 0.17.0 - cbor: 9.0.2 - chalk: 4.1.2 - compare-versions: 6.1.1 - debug: 4.3.7(supports-color@8.1.1) - ethereumjs-util: 7.1.5 - minimatch: 9.0.5 - minimist: 1.2.8 - proper-lockfile: 4.1.2 - solidity-ast: 0.4.59 - transitivePeerDependencies: - - supports-color - - '@pkgjs/parseargs@0.11.0': - optional: true - - '@primitivefi/hardhat-dodoc@0.2.3(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))(squirrelly@8.0.8)': - dependencies: - hardhat: 2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) - squirrelly: 8.0.8 - - '@rollup/plugin-commonjs@24.1.0(rollup@4.21.2)': - dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.21.2) - commondir: 1.0.1 - estree-walker: 2.0.2 - glob: 8.1.0 - is-reference: 1.2.1 - magic-string: 0.27.0 - optionalDependencies: - rollup: 4.21.2 - - '@rollup/plugin-json@6.1.0(rollup@4.21.2)': - dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.21.2) - optionalDependencies: - rollup: 4.21.2 - - '@rollup/plugin-node-resolve@15.2.3(rollup@4.21.2)': - dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.21.2) - '@types/resolve': 1.20.2 - deepmerge: 4.3.1 - is-builtin-module: 3.2.1 - is-module: 1.0.0 - resolve: 1.22.8 - optionalDependencies: - rollup: 4.21.2 - - '@rollup/pluginutils@5.1.0(rollup@4.21.2)': - dependencies: - '@types/estree': 1.0.5 - estree-walker: 2.0.2 - picomatch: 2.3.1 - optionalDependencies: - rollup: 4.21.2 - - '@rollup/rollup-android-arm-eabi@4.21.2': - optional: true - - '@rollup/rollup-android-arm64@4.21.2': - optional: true - - '@rollup/rollup-darwin-arm64@4.21.2': - optional: true - - '@rollup/rollup-darwin-x64@4.21.2': - optional: true - - '@rollup/rollup-linux-arm-gnueabihf@4.21.2': - optional: true - - '@rollup/rollup-linux-arm-musleabihf@4.21.2': - optional: true - - '@rollup/rollup-linux-arm64-gnu@4.21.2': - optional: true - - '@rollup/rollup-linux-arm64-musl@4.21.2': - optional: true - - '@rollup/rollup-linux-powerpc64le-gnu@4.21.2': - optional: true - - '@rollup/rollup-linux-riscv64-gnu@4.21.2': - optional: true - - '@rollup/rollup-linux-s390x-gnu@4.21.2': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.21.2': - optional: true - - '@rollup/rollup-linux-x64-musl@4.21.2': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.21.2': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.21.2': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.21.2': - optional: true - - '@scure/base@1.1.8': {} - - '@scure/bip32@1.1.5': - dependencies: - '@noble/hashes': 1.2.0 - '@noble/secp256k1': 1.7.1 - '@scure/base': 1.1.8 - - '@scure/bip32@1.4.0': - dependencies: - '@noble/curves': 1.4.0 - '@noble/hashes': 1.4.0 - '@scure/base': 1.1.8 - - '@scure/bip39@1.1.1': - dependencies: - '@noble/hashes': 1.2.0 - '@scure/base': 1.1.8 - - '@scure/bip39@1.3.0': - dependencies: - '@noble/hashes': 1.4.0 - '@scure/base': 1.1.8 - - '@scure/bip39@1.4.0': - dependencies: - '@noble/hashes': 1.5.0 - '@scure/base': 1.1.8 - - '@sentry/core@5.30.0': - dependencies: - '@sentry/hub': 5.30.0 - '@sentry/minimal': 5.30.0 - '@sentry/types': 5.30.0 - '@sentry/utils': 5.30.0 - tslib: 1.14.1 - - '@sentry/hub@5.30.0': - dependencies: - '@sentry/types': 5.30.0 - '@sentry/utils': 5.30.0 - tslib: 1.14.1 - - '@sentry/minimal@5.30.0': - dependencies: - '@sentry/hub': 5.30.0 - '@sentry/types': 5.30.0 - tslib: 1.14.1 - - '@sentry/node@5.30.0': - dependencies: - '@sentry/core': 5.30.0 - '@sentry/hub': 5.30.0 - '@sentry/tracing': 5.30.0 - '@sentry/types': 5.30.0 - '@sentry/utils': 5.30.0 - cookie: 0.4.2 - https-proxy-agent: 5.0.1 - lru_map: 0.3.3 - tslib: 1.14.1 - transitivePeerDependencies: - - supports-color - - '@sentry/tracing@5.30.0': - dependencies: - '@sentry/hub': 5.30.0 - '@sentry/minimal': 5.30.0 - '@sentry/types': 5.30.0 - '@sentry/utils': 5.30.0 - tslib: 1.14.1 - - '@sentry/types@5.30.0': {} - - '@sentry/utils@5.30.0': - dependencies: - '@sentry/types': 5.30.0 - tslib: 1.14.1 - - '@smithy/types@3.4.0': - dependencies: - tslib: 2.7.0 - - '@solidity-parser/parser@0.14.5': - dependencies: - antlr4ts: 0.5.0-alpha.4 - - '@solidity-parser/parser@0.16.2': - dependencies: - antlr4ts: 0.5.0-alpha.4 - - '@solidity-parser/parser@0.18.0': {} - - '@starboardventures/hardhat-verify@1.0.1(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))': - dependencies: - fs-extra: 11.2.0 - hardhat: 2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) - node-fetch: 2.0.0 - - '@swc/core-darwin-arm64@1.7.26': - optional: true - - '@swc/core-darwin-x64@1.7.26': - optional: true - - '@swc/core-linux-arm-gnueabihf@1.7.26': - optional: true - - '@swc/core-linux-arm64-gnu@1.7.26': - optional: true - - '@swc/core-linux-arm64-musl@1.7.26': - optional: true - - '@swc/core-linux-x64-gnu@1.7.26': - optional: true - - '@swc/core-linux-x64-musl@1.7.26': - optional: true - - '@swc/core-win32-arm64-msvc@1.7.26': - optional: true - - '@swc/core-win32-ia32-msvc@1.7.26': - optional: true - - '@swc/core-win32-x64-msvc@1.7.26': - optional: true - - '@swc/core@1.7.26': - dependencies: - '@swc/counter': 0.1.3 - '@swc/types': 0.1.12 - optionalDependencies: - '@swc/core-darwin-arm64': 1.7.26 - '@swc/core-darwin-x64': 1.7.26 - '@swc/core-linux-arm-gnueabihf': 1.7.26 - '@swc/core-linux-arm64-gnu': 1.7.26 - '@swc/core-linux-arm64-musl': 1.7.26 - '@swc/core-linux-x64-gnu': 1.7.26 - '@swc/core-linux-x64-musl': 1.7.26 - '@swc/core-win32-arm64-msvc': 1.7.26 - '@swc/core-win32-ia32-msvc': 1.7.26 - '@swc/core-win32-x64-msvc': 1.7.26 - - '@swc/counter@0.1.3': {} - - '@swc/types@0.1.12': - dependencies: - '@swc/counter': 0.1.3 - - '@tenderly/hardhat-tenderly@2.3.0(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@swc/core@1.7.26)(@types/node@18.19.50)(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))': - dependencies: - '@ethersproject/bignumber': 5.7.0 - '@nomicfoundation/hardhat-ignition': 0.15.5(@nomicfoundation/hardhat-verify@2.0.10(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) - '@nomicfoundation/hardhat-verify': 2.0.10(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) - '@openzeppelin/hardhat-upgrades': 3.2.1(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@nomicfoundation/hardhat-verify@2.0.10(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) - '@openzeppelin/upgrades-core': 1.37.1 - axios: 1.7.7(debug@4.3.7) - ethers: 6.13.2 - fs-extra: 10.1.0 - hardhat: 2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) - hardhat-deploy: 0.11.45 - tenderly: 0.9.1(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) - ts-node: 10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2) - tslog: 4.9.3 - typescript: 5.6.2 - transitivePeerDependencies: - - '@nomicfoundation/hardhat-ethers' - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - bufferutil - - debug - - encoding - - supports-color - - utf-8-validate - - '@trivago/prettier-plugin-sort-imports@3.4.0(prettier@2.8.8)': - dependencies: - '@babel/core': 7.17.8 - '@babel/generator': 7.17.7 - '@babel/parser': 7.18.9 - '@babel/traverse': 7.17.3 - '@babel/types': 7.17.0 - '@vue/compiler-sfc': 3.5.4 - javascript-natural-sort: 0.7.1 - lodash: 4.17.21 - prettier: 2.8.8 - transitivePeerDependencies: - - supports-color - - '@tsconfig/node10@1.0.11': {} - - '@tsconfig/node12@1.0.11': {} - - '@tsconfig/node14@1.0.3': {} - - '@tsconfig/node16@1.0.4': {} - - '@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.6.2))(typescript@5.6.2)': - dependencies: - ethers: 6.13.2 - lodash: 4.17.21 - ts-essentials: 7.0.3(typescript@5.6.2) - typechain: 8.3.2(typescript@5.6.2) - typescript: 5.6.2 - - '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.6.2))(typescript@5.6.2))(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))(typechain@8.3.2(typescript@5.6.2))': - dependencies: - '@typechain/ethers-v6': 0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.6.2))(typescript@5.6.2) - ethers: 6.13.2 - fs-extra: 9.1.0 - hardhat: 2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) - typechain: 8.3.2(typescript@5.6.2) - - '@types/bn.js@4.11.6': - dependencies: - '@types/node': 18.19.50 - - '@types/bn.js@5.1.5': - dependencies: - '@types/node': 18.19.50 - - '@types/chai-as-promised@7.1.8': - dependencies: - '@types/chai': 4.3.19 - - '@types/chai@4.3.19': {} - - '@types/concat-stream@1.6.1': - dependencies: - '@types/node': 18.19.50 - - '@types/conventional-commits-parser@5.0.0': - dependencies: - '@types/node': 18.19.50 - optional: true - - '@types/estree@1.0.5': {} - - '@types/form-data@0.0.33': - dependencies: - '@types/node': 18.19.50 - - '@types/glob@7.2.0': - dependencies: - '@types/minimatch': 5.1.2 - '@types/node': 18.19.50 - - '@types/lru-cache@5.1.1': {} - - '@types/minimatch@5.1.2': {} - - '@types/minimist@1.2.5': {} - - '@types/mocha@10.0.7': {} - - '@types/node@10.17.60': {} - - '@types/node@18.15.13': {} - - '@types/node@18.19.50': - dependencies: - undici-types: 5.26.5 - - '@types/node@20.5.1': {} - - '@types/node@8.10.66': {} - - '@types/normalize-package-data@2.4.4': {} - - '@types/pbkdf2@3.1.2': - dependencies: - '@types/node': 18.19.50 - - '@types/prettier@2.7.3': {} - - '@types/qs@6.9.15': {} - - '@types/resolve@1.20.2': {} - - '@types/secp256k1@4.0.6': - dependencies: - '@types/node': 18.19.50 - - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2)': - dependencies: - '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.6.2) - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.0)(typescript@5.6.2) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.6.2) - '@typescript-eslint/visitor-keys': 7.18.0 - eslint: 8.57.0 - graphemer: 1.4.0 - ignore: 5.3.2 - natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.6.2) - optionalDependencies: - typescript: 5.6.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.6.2)': - dependencies: - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.2) - '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.3.7(supports-color@8.1.1) - eslint: 8.57.0 - optionalDependencies: - typescript: 5.6.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/scope-manager@7.18.0': - dependencies: - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/visitor-keys': 7.18.0 - - '@typescript-eslint/type-utils@7.18.0(eslint@8.57.0)(typescript@5.6.2)': - dependencies: - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.2) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.6.2) - debug: 4.3.7(supports-color@8.1.1) - eslint: 8.57.0 - ts-api-utils: 1.3.0(typescript@5.6.2) - optionalDependencies: - typescript: 5.6.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/types@7.18.0': {} - - '@typescript-eslint/typescript-estree@7.18.0(typescript@5.6.2)': - dependencies: - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.3.7(supports-color@8.1.1) - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.6.2) - optionalDependencies: - typescript: 5.6.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@7.18.0(eslint@8.57.0)(typescript@5.6.2)': - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.2) - eslint: 8.57.0 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/visitor-keys@7.18.0': - dependencies: - '@typescript-eslint/types': 7.18.0 - eslint-visitor-keys: 3.4.3 - - '@ungap/structured-clone@1.2.0': {} - - '@vue/compiler-core@3.5.4': - dependencies: - '@babel/parser': 7.25.6 - '@vue/shared': 3.5.4 - entities: 4.5.0 - estree-walker: 2.0.2 - source-map-js: 1.2.1 - - '@vue/compiler-dom@3.5.4': - dependencies: - '@vue/compiler-core': 3.5.4 - '@vue/shared': 3.5.4 - - '@vue/compiler-sfc@3.5.4': - dependencies: - '@babel/parser': 7.25.6 - '@vue/compiler-core': 3.5.4 - '@vue/compiler-dom': 3.5.4 - '@vue/compiler-ssr': 3.5.4 - '@vue/shared': 3.5.4 - estree-walker: 2.0.2 - magic-string: 0.30.11 - postcss: 8.4.45 - source-map-js: 1.2.1 - - '@vue/compiler-ssr@3.5.4': - dependencies: - '@vue/compiler-dom': 3.5.4 - '@vue/shared': 3.5.4 - - '@vue/shared@3.5.4': {} - - JSONStream@1.3.5: - dependencies: - jsonparse: 1.3.1 - through: 2.3.8 - - abbrev@1.0.9: {} - - abitype@0.9.10(typescript@5.6.2): - optionalDependencies: - typescript: 5.6.2 - - abitype@1.0.5(typescript@5.6.2): - optionalDependencies: - typescript: 5.6.2 - - acorn-jsx@5.3.2(acorn@8.12.1): - dependencies: - acorn: 8.12.1 - - acorn-walk@8.3.4: - dependencies: - acorn: 8.12.1 - - acorn@8.12.1: {} - - adm-zip@0.4.16: {} - - aes-js@3.0.0: {} - - aes-js@4.0.0-beta.5: {} - - agent-base@6.0.2: - dependencies: - debug: 4.3.7(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - aggregate-error@3.1.0: - dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 - - ajv@6.12.6: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - - ajv@8.17.1: - dependencies: - fast-deep-equal: 3.1.3 - fast-uri: 3.0.1 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - - amazon-cognito-identity-js@6.3.12: - dependencies: - '@aws-crypto/sha256-js': 1.2.2 - buffer: 4.9.2 - fast-base64-decode: 1.0.0 - isomorphic-unfetch: 3.1.0 - js-cookie: 2.2.1 - transitivePeerDependencies: - - encoding - - amdefine@1.0.1: - optional: true - - ansi-align@3.0.1: - dependencies: - string-width: 4.2.3 - - ansi-colors@4.1.3: {} - - ansi-escapes@4.3.2: - dependencies: - type-fest: 0.21.3 - - ansi-escapes@5.0.0: - dependencies: - type-fest: 1.4.0 - - ansi-regex@3.0.1: {} - - ansi-regex@5.0.1: {} - - ansi-regex@6.1.0: {} - - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansi-styles@6.2.1: {} - - antlr4@4.13.2: {} - - antlr4ts@0.5.0-alpha.4: {} - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - arg@4.1.3: {} - - argparse@1.0.10: - dependencies: - sprintf-js: 1.0.3 - - argparse@2.0.1: {} - - array-back@3.1.0: {} - - array-back@4.0.2: {} - - array-ify@1.0.0: {} - - array-union@2.1.0: {} - - array-uniq@1.0.3: {} - - arrify@1.0.1: {} - - asap@2.0.6: {} - - assertion-error@1.1.0: {} - - ast-parents@0.0.1: {} - - astral-regex@2.0.0: {} - - async-retry@1.3.3: - dependencies: - retry: 0.13.1 - - async@1.5.2: {} - - asynckit@0.4.0: {} - - at-least-node@1.0.0: {} - - axios@0.21.4(debug@4.3.7): - dependencies: - follow-redirects: 1.15.9(debug@4.3.7) - transitivePeerDependencies: - - debug - - axios@0.27.2: - dependencies: - follow-redirects: 1.15.9(debug@4.3.7) - form-data: 4.0.0 - transitivePeerDependencies: - - debug - - axios@1.7.7(debug@4.3.7): - dependencies: - follow-redirects: 1.15.9(debug@4.3.7) - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - - balanced-match@1.0.2: {} - - base-x@3.0.10: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - - bech32@1.1.4: {} - - binary-extensions@2.3.0: {} - - bl@4.1.0: - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - - blakejs@1.2.1: {} - - bn.js@4.11.6: {} - - bn.js@4.12.0: {} - - bn.js@5.2.1: {} - - boxen@5.1.2: - dependencies: - ansi-align: 3.0.1 - camelcase: 6.3.0 - chalk: 4.1.2 - cli-boxes: 2.2.1 - string-width: 4.2.3 - type-fest: 0.20.2 - widest-line: 3.1.0 - wrap-ansi: 7.0.0 - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - brace-expansion@2.0.1: - dependencies: - balanced-match: 1.0.2 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - brorand@1.1.0: {} - - browser-stdout@1.3.1: {} - - browserify-aes@1.2.0: - dependencies: - buffer-xor: 1.0.3 - cipher-base: 1.0.4 - create-hash: 1.2.0 - evp_bytestokey: 1.0.3 - inherits: 2.0.4 - safe-buffer: 5.2.1 - - browserslist@4.23.3: - dependencies: - caniuse-lite: 1.0.30001660 - electron-to-chromium: 1.5.19 - node-releases: 2.0.18 - update-browserslist-db: 1.1.0(browserslist@4.23.3) - - bs58@4.0.1: - dependencies: - base-x: 3.0.10 - - bs58check@2.1.2: - dependencies: - bs58: 4.0.1 - create-hash: 1.2.0 - safe-buffer: 5.2.1 - - buffer-from@1.1.2: {} - - buffer-xor@1.0.3: {} - - buffer@4.9.2: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - isarray: 1.0.0 - - buffer@5.7.1: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufio@1.2.1: {} - - builtin-modules@3.3.0: {} - - builtins@2.0.1: - dependencies: - semver: 6.3.1 - - bytes@3.1.2: {} - - cachedir@2.3.0: {} - - call-bind@1.0.7: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.2 - - callsites@3.1.0: {} - - camelcase-keys@6.2.2: - dependencies: - camelcase: 5.3.1 - map-obj: 4.3.0 - quick-lru: 4.0.1 - - camelcase@5.3.1: {} - - camelcase@6.3.0: {} - - caniuse-lite@1.0.30001660: {} - - caseless@0.12.0: {} - - cbor@8.1.0: - dependencies: - nofilter: 3.1.0 - - cbor@9.0.2: - dependencies: - nofilter: 3.1.0 - - chai-as-promised@7.1.2(chai@4.5.0): - dependencies: - chai: 4.5.0 - check-error: 1.0.3 - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@2.4.2: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.3.0: {} - - chardet@0.7.0: {} - - charenc@0.0.2: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.6.0: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - chokidar@4.0.1: - dependencies: - readdirp: 4.0.2 - - ci-info@2.0.0: {} - - cipher-base@1.0.4: - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - - clean-stack@2.2.0: {} - - cli-boxes@2.2.1: {} - - cli-cursor@3.1.0: - dependencies: - restore-cursor: 3.1.0 - - cli-cursor@4.0.0: - dependencies: - restore-cursor: 4.0.0 - - cli-spinners@2.9.2: {} - - cli-table3@0.5.1: - dependencies: - object-assign: 4.1.1 - string-width: 2.1.1 - optionalDependencies: - colors: 1.4.0 - - cli-table3@0.6.5: - dependencies: - string-width: 4.2.3 - optionalDependencies: - '@colors/colors': 1.5.0 - - cli-truncate@3.1.0: - dependencies: - slice-ansi: 5.0.0 - string-width: 5.1.2 - - cli-width@3.0.0: {} - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - cliui@8.0.1: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - clone@1.0.4: {} - - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.3: {} - - color-name@1.1.4: {} - - colorette@2.0.20: {} - - colors@1.4.0: {} - - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - - command-exists@1.2.9: {} - - command-line-args@5.2.1: - dependencies: - array-back: 3.1.0 - find-replace: 3.0.0 - lodash.camelcase: 4.3.0 - typical: 4.0.0 - - command-line-usage@6.1.3: - dependencies: - array-back: 4.0.2 - chalk: 2.4.2 - table-layout: 1.0.2 - typical: 5.2.0 - - commander@10.0.1: {} - - commander@11.0.0: {} - - commander@8.3.0: {} - - commander@9.5.0: {} - - commitizen@4.3.0(@types/node@18.19.50)(typescript@5.6.2): - dependencies: - cachedir: 2.3.0 - cz-conventional-changelog: 3.3.0(@types/node@18.19.50)(typescript@5.6.2) - dedent: 0.7.0 - detect-indent: 6.1.0 - find-node-modules: 2.1.3 - find-root: 1.1.0 - fs-extra: 9.1.0 - glob: 7.2.3 - inquirer: 8.2.5 - is-utf8: 0.2.1 - lodash: 4.17.21 - minimist: 1.2.7 - strip-bom: 4.0.0 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - '@types/node' - - typescript - - commondir@1.0.1: {} - - compare-func@2.0.0: - dependencies: - array-ify: 1.0.0 - dot-prop: 5.3.0 - - compare-versions@6.1.1: {} - - concat-map@0.0.1: {} - - concat-stream@1.6.2: - dependencies: - buffer-from: 1.1.2 - inherits: 2.0.4 - readable-stream: 2.3.8 - typedarray: 0.0.6 - - conventional-changelog-angular@6.0.0: - dependencies: - compare-func: 2.0.0 - - conventional-changelog-conventionalcommits@6.1.0: - dependencies: - compare-func: 2.0.0 - - conventional-commit-types@3.0.0: {} - - conventional-commits-parser@4.0.0: - dependencies: - JSONStream: 1.3.5 - is-text-path: 1.0.1 - meow: 8.1.2 - split2: 3.2.2 - - convert-source-map@1.9.0: {} - - cookie@0.4.2: {} - - core-util-is@1.0.3: {} - - cosmiconfig-typescript-loader@4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6(typescript@5.6.2))(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@20.5.1)(typescript@5.6.2))(typescript@5.6.2): - dependencies: - '@types/node': 20.5.1 - cosmiconfig: 8.3.6(typescript@5.6.2) - ts-node: 10.9.2(@swc/core@1.7.26)(@types/node@20.5.1)(typescript@5.6.2) - typescript: 5.6.2 - - cosmiconfig-typescript-loader@5.0.0(@types/node@18.19.50)(cosmiconfig@9.0.0(typescript@5.6.2))(typescript@5.6.2): - dependencies: - '@types/node': 18.19.50 - cosmiconfig: 9.0.0(typescript@5.6.2) - jiti: 1.21.6 - typescript: 5.6.2 - optional: true - - cosmiconfig@8.3.6(typescript@5.6.2): - dependencies: - import-fresh: 3.3.0 - js-yaml: 4.1.0 - parse-json: 5.2.0 - path-type: 4.0.0 - optionalDependencies: - typescript: 5.6.2 - - cosmiconfig@9.0.0(typescript@5.6.2): - dependencies: - env-paths: 2.2.1 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - parse-json: 5.2.0 - optionalDependencies: - typescript: 5.6.2 - optional: true - - create-hash@1.2.0: - dependencies: - cipher-base: 1.0.4 - inherits: 2.0.4 - md5.js: 1.3.5 - ripemd160: 2.0.2 - sha.js: 2.4.11 - - create-hmac@1.1.7: - dependencies: - cipher-base: 1.0.4 - create-hash: 1.2.0 - inherits: 2.0.4 - ripemd160: 2.0.2 - safe-buffer: 5.2.1 - sha.js: 2.4.11 - - create-require@1.1.1: {} - - cross-env@7.0.3: - dependencies: - cross-spawn: 7.0.3 - - cross-spawn@7.0.3: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - crypt@0.0.2: {} - - cz-conventional-changelog@3.3.0(@types/node@18.19.50)(typescript@5.6.2): - dependencies: - chalk: 2.4.2 - commitizen: 4.3.0(@types/node@18.19.50)(typescript@5.6.2) - conventional-commit-types: 3.0.0 - lodash.map: 4.6.0 - longest: 2.0.1 - word-wrap: 1.2.5 - optionalDependencies: - '@commitlint/load': 19.5.0(@types/node@18.19.50)(typescript@5.6.2) - transitivePeerDependencies: - - '@types/node' - - typescript - - dargs@7.0.0: {} - - death@1.1.0: {} - - debug@4.3.4: - dependencies: - ms: 2.1.2 - - debug@4.3.7(supports-color@8.1.1): - dependencies: - ms: 2.1.3 - optionalDependencies: - supports-color: 8.1.1 - - decamelize-keys@1.1.1: - dependencies: - decamelize: 1.2.0 - map-obj: 1.0.1 - - decamelize@1.2.0: {} - - decamelize@4.0.0: {} - - dedent@0.7.0: {} - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - deep-extend@0.6.0: {} - - deep-is@0.1.4: {} - - deepmerge@4.3.1: {} - - defaults@1.0.4: - dependencies: - clone: 1.0.4 - - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - gopd: 1.0.1 - - define-lazy-prop@2.0.0: {} - - delayed-stream@1.0.0: {} - - delete-empty@3.0.0: - dependencies: - ansi-colors: 4.1.3 - minimist: 1.2.8 - path-starts-with: 2.0.1 - rimraf: 2.7.1 - - depd@2.0.0: {} - - detect-file@1.0.0: {} - - detect-indent@6.1.0: {} - - diff@4.0.2: {} - - diff@5.2.0: {} - - difflib@0.2.4: - dependencies: - heap: 0.2.7 - - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - - dot-prop@5.3.0: - dependencies: - is-obj: 2.0.0 - - dotenv@16.4.5: {} - - eastasianwidth@0.2.0: {} - - electron-to-chromium@1.5.19: {} - - elliptic@6.5.4: - dependencies: - bn.js: 4.12.0 - brorand: 1.1.0 - hash.js: 1.1.7 - hmac-drbg: 1.0.1 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 - - elliptic@6.5.7: - dependencies: - bn.js: 4.12.0 - brorand: 1.1.0 - hash.js: 1.1.7 - hmac-drbg: 1.0.1 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 - - emoji-regex@8.0.0: {} - - emoji-regex@9.2.2: {} - - encode-utf8@1.0.3: {} - - enquirer@2.4.1: - dependencies: - ansi-colors: 4.1.3 - strip-ansi: 6.0.1 - - entities@4.5.0: {} - - env-paths@2.2.1: {} - - error-ex@1.3.2: - dependencies: - is-arrayish: 0.2.1 - - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 - - es-errors@1.3.0: {} - - es-module-lexer@1.5.4: {} - - esbuild@0.23.1: - optionalDependencies: - '@esbuild/aix-ppc64': 0.23.1 - '@esbuild/android-arm': 0.23.1 - '@esbuild/android-arm64': 0.23.1 - '@esbuild/android-x64': 0.23.1 - '@esbuild/darwin-arm64': 0.23.1 - '@esbuild/darwin-x64': 0.23.1 - '@esbuild/freebsd-arm64': 0.23.1 - '@esbuild/freebsd-x64': 0.23.1 - '@esbuild/linux-arm': 0.23.1 - '@esbuild/linux-arm64': 0.23.1 - '@esbuild/linux-ia32': 0.23.1 - '@esbuild/linux-loong64': 0.23.1 - '@esbuild/linux-mips64el': 0.23.1 - '@esbuild/linux-ppc64': 0.23.1 - '@esbuild/linux-riscv64': 0.23.1 - '@esbuild/linux-s390x': 0.23.1 - '@esbuild/linux-x64': 0.23.1 - '@esbuild/netbsd-x64': 0.23.1 - '@esbuild/openbsd-arm64': 0.23.1 - '@esbuild/openbsd-x64': 0.23.1 - '@esbuild/sunos-x64': 0.23.1 - '@esbuild/win32-arm64': 0.23.1 - '@esbuild/win32-ia32': 0.23.1 - '@esbuild/win32-x64': 0.23.1 - - escalade@3.2.0: {} - - escape-string-regexp@1.0.5: {} - - escape-string-regexp@4.0.0: {} - - escodegen@1.8.1: - dependencies: - esprima: 2.7.3 - estraverse: 1.9.3 - esutils: 2.0.3 - optionator: 0.8.3 - optionalDependencies: - source-map: 0.2.0 - - eslint-config-prettier@8.10.0(eslint@8.57.0): - dependencies: - eslint: 8.57.0 - - eslint-scope@7.2.2: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-visitor-keys@3.4.3: {} - - eslint@8.57.0: - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.11.0 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.0 - '@humanwhocodes/config-array': 0.11.14 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.7(supports-color@8.1.1) - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.6.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - espree@9.6.1: - dependencies: - acorn: 8.12.1 - acorn-jsx: 5.3.2(acorn@8.12.1) - eslint-visitor-keys: 3.4.3 - - esprima@2.7.3: {} - - esprima@4.0.1: {} - - esquery@1.6.0: - dependencies: - estraverse: 5.3.0 - - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 - - estraverse@1.9.3: {} - - estraverse@5.3.0: {} - - estree-walker@0.6.1: {} - - estree-walker@2.0.2: {} - - esutils@2.0.3: {} - - eth-gas-reporter@0.2.27: - dependencies: - '@solidity-parser/parser': 0.14.5 - axios: 1.7.7(debug@4.3.7) - cli-table3: 0.5.1 - colors: 1.4.0 - ethereum-cryptography: 1.2.0 - ethers: 5.7.2 - fs-readdir-recursive: 1.1.0 - lodash: 4.17.21 - markdown-table: 1.1.3 - mocha: 10.7.3 - req-cwd: 2.0.0 - sha1: 1.1.1 - sync-request: 6.1.0 - transitivePeerDependencies: - - bufferutil - - debug - - utf-8-validate - - ethereum-bloom-filters@1.2.0: - dependencies: - '@noble/hashes': 1.5.0 - - ethereum-cryptography@0.1.3: - dependencies: - '@types/pbkdf2': 3.1.2 - '@types/secp256k1': 4.0.6 - blakejs: 1.2.1 - browserify-aes: 1.2.0 - bs58check: 2.1.2 - create-hash: 1.2.0 - create-hmac: 1.1.7 - hash.js: 1.1.7 - keccak: 3.0.4 - pbkdf2: 3.1.2 - randombytes: 2.1.0 - safe-buffer: 5.2.1 - scrypt-js: 3.0.1 - secp256k1: 4.0.3 - setimmediate: 1.0.5 - - ethereum-cryptography@1.2.0: - dependencies: - '@noble/hashes': 1.2.0 - '@noble/secp256k1': 1.7.1 - '@scure/bip32': 1.1.5 - '@scure/bip39': 1.1.1 - - ethereum-cryptography@2.2.1: - dependencies: - '@noble/curves': 1.4.2 - '@noble/hashes': 1.4.0 - '@scure/bip32': 1.4.0 - '@scure/bip39': 1.3.0 - - ethereumjs-abi@0.6.8: - dependencies: - bn.js: 4.12.0 - ethereumjs-util: 6.2.1 - - ethereumjs-util@6.2.1: - dependencies: - '@types/bn.js': 4.11.6 - bn.js: 4.12.0 - create-hash: 1.2.0 - elliptic: 6.5.7 - ethereum-cryptography: 0.1.3 - ethjs-util: 0.1.6 - rlp: 2.2.7 - - ethereumjs-util@7.1.5: - dependencies: - '@types/bn.js': 5.1.5 - bn.js: 5.2.1 - create-hash: 1.2.0 - ethereum-cryptography: 0.1.3 - rlp: 2.2.7 - - ethers@5.7.2: - dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/base64': 5.7.0 - '@ethersproject/basex': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/contracts': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/hdnode': 5.7.0 - '@ethersproject/json-wallets': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/networks': 5.7.1 - '@ethersproject/pbkdf2': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/providers': 5.7.2 - '@ethersproject/random': 5.7.0 - '@ethersproject/rlp': 5.7.0 - '@ethersproject/sha2': 5.7.0 - '@ethersproject/signing-key': 5.7.0 - '@ethersproject/solidity': 5.7.0 - '@ethersproject/strings': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/units': 5.7.0 - '@ethersproject/wallet': 5.7.0 - '@ethersproject/web': 5.7.1 - '@ethersproject/wordlists': 5.7.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - ethers@6.13.2: - dependencies: - '@adraffy/ens-normalize': 1.10.1 - '@noble/curves': 1.2.0 - '@noble/hashes': 1.3.2 - '@types/node': 18.15.13 - aes-js: 4.0.0-beta.5 - tslib: 2.4.0 - ws: 8.17.1 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - ethjs-unit@0.1.6: - dependencies: - bn.js: 4.11.6 - number-to-bn: 1.7.0 - - ethjs-util@0.1.6: - dependencies: - is-hex-prefixed: 1.0.0 - strip-hex-prefix: 1.0.0 - - eventemitter3@5.0.1: {} - - evp_bytestokey@1.0.3: - dependencies: - md5.js: 1.3.5 - safe-buffer: 5.2.1 - - execa@5.1.1: - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - - execa@7.2.0: - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 4.3.1 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 - signal-exit: 3.0.7 - strip-final-newline: 3.0.0 - - expand-tilde@2.0.2: - dependencies: - homedir-polyfill: 1.0.3 - - external-editor@3.1.0: - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - - fast-base64-decode@1.0.0: {} - - fast-deep-equal@3.1.3: {} - - fast-diff@1.3.0: {} - - fast-glob@3.3.2: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - - fast-json-stable-stringify@2.1.0: {} - - fast-levenshtein@2.0.6: {} - - fast-uri@3.0.1: {} - - fastq@1.17.1: - dependencies: - reusify: 1.0.4 - - fdir@6.4.2(picomatch@4.0.2): - optionalDependencies: - picomatch: 4.0.2 - - figures@3.2.0: - dependencies: - escape-string-regexp: 1.0.5 - - file-entry-cache@6.0.1: - dependencies: - flat-cache: 3.2.0 - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-node-modules@2.1.3: - dependencies: - findup-sync: 4.0.0 - merge: 2.1.1 - - find-replace@3.0.0: - dependencies: - array-back: 3.1.0 - - find-root@1.1.0: {} - - find-up@4.1.0: - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - findup-sync@4.0.0: - dependencies: - detect-file: 1.0.0 - is-glob: 4.0.3 - micromatch: 4.0.8 - resolve-dir: 1.0.1 - - flat-cache@3.2.0: - dependencies: - flatted: 3.3.1 - keyv: 4.5.4 - rimraf: 3.0.2 - - flat@5.0.2: {} - - flatted@3.3.1: {} - - fmix@0.1.0: - dependencies: - imul: 1.0.1 - - follow-redirects@1.15.9(debug@4.3.7): - optionalDependencies: - debug: 4.3.7(supports-color@8.1.1) - - foreground-child@3.3.0: - dependencies: - cross-spawn: 7.0.3 - signal-exit: 4.1.0 - - form-data@2.5.1: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - - form-data@4.0.0: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - - fp-ts@1.19.3: {} - - fs-extra@10.1.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - - fs-extra@11.2.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - - fs-extra@7.0.1: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - - fs-extra@8.1.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - - fs-extra@9.1.0: - dependencies: - at-least-node: 1.0.0 - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - - fs-readdir-recursive@1.1.0: {} - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - function-bind@1.1.2: {} - - gensync@1.0.0-beta.2: {} - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - get-intrinsic@1.2.4: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - - get-port@3.2.0: {} - - get-stream@6.0.1: {} - - get-tsconfig@4.8.0: - dependencies: - resolve-pkg-maps: 1.0.0 - - ghost-testrpc@0.0.2: - dependencies: - chalk: 2.4.2 - node-emoji: 1.11.0 - - git-raw-commits@2.0.11: - dependencies: - dargs: 7.0.0 - lodash: 4.17.21 - meow: 8.1.2 - split2: 3.2.2 - through2: 4.0.2 - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 - - glob@10.4.5: - dependencies: - foreground-child: 3.3.0 - jackspeak: 3.4.3 - minimatch: 9.0.5 - minipass: 7.1.2 - package-json-from-dist: 1.0.0 - path-scurry: 1.11.1 - - glob@5.0.15: - dependencies: - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - glob@7.1.7: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - glob@8.1.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - - global-directory@4.0.1: - dependencies: - ini: 4.1.1 - optional: true - - global-dirs@0.1.1: - dependencies: - ini: 1.3.8 - - global-modules@1.0.0: - dependencies: - global-prefix: 1.0.2 - is-windows: 1.0.2 - resolve-dir: 1.0.1 - - global-modules@2.0.0: - dependencies: - global-prefix: 3.0.0 - - global-prefix@1.0.2: - dependencies: - expand-tilde: 2.0.2 - homedir-polyfill: 1.0.3 - ini: 1.3.8 - is-windows: 1.0.2 - which: 1.3.1 - - global-prefix@3.0.0: - dependencies: - ini: 1.3.8 - kind-of: 6.0.3 - which: 1.3.1 - - globals@11.12.0: {} - - globals@13.24.0: - dependencies: - type-fest: 0.20.2 - - globby@10.0.2: - dependencies: - '@types/glob': 7.2.0 - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.2 - glob: 7.2.3 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 3.0.0 - - globby@11.1.0: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 3.0.0 - - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.4 - - graceful-fs@4.2.11: {} - - graphemer@1.4.0: {} - - handlebars@4.7.8: - dependencies: - minimist: 1.2.8 - neo-async: 2.6.2 - source-map: 0.6.1 - wordwrap: 1.0.0 - optionalDependencies: - uglify-js: 3.19.3 - - hard-rejection@2.1.0: {} - - hardhat-abi-exporter@2.10.1(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)): - dependencies: - '@ethersproject/abi': 5.7.0 - delete-empty: 3.0.0 - hardhat: 2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) - - hardhat-deploy@0.11.45: - dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/contracts': 5.7.0 - '@ethersproject/providers': 5.7.2 - '@ethersproject/solidity': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/wallet': 5.7.0 - '@types/qs': 6.9.15 - axios: 0.21.4(debug@4.3.7) - chalk: 4.1.2 - chokidar: 3.6.0 - debug: 4.3.7(supports-color@8.1.1) - enquirer: 2.4.1 - ethers: 5.7.2 - form-data: 4.0.0 - fs-extra: 10.1.0 - match-all: 1.2.6 - murmur-128: 0.2.1 - qs: 6.13.0 - zksync-web3: 0.14.4(ethers@5.7.2) - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - hardhat-gas-reporter@1.0.10(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)): - dependencies: - array-uniq: 1.0.3 - eth-gas-reporter: 0.2.27 - hardhat: 2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) - sha1: 1.1.1 - transitivePeerDependencies: - - '@codechecks/client' - - bufferutil - - debug - - utf-8-validate - - hardhat-preprocessor@0.1.5(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)): - dependencies: - hardhat: 2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) - murmur-128: 0.2.1 - - hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2): - dependencies: - '@ethersproject/abi': 5.7.0 - '@metamask/eth-sig-util': 4.0.1 - '@nomicfoundation/edr': 0.6.5 - '@nomicfoundation/ethereumjs-common': 4.0.4 - '@nomicfoundation/ethereumjs-tx': 5.0.4 - '@nomicfoundation/ethereumjs-util': 9.0.4 - '@nomicfoundation/solidity-analyzer': 0.1.2 - '@sentry/node': 5.30.0 - '@types/bn.js': 5.1.5 - '@types/lru-cache': 5.1.1 - adm-zip: 0.4.16 - aggregate-error: 3.1.0 - ansi-escapes: 4.3.2 - boxen: 5.1.2 - chokidar: 4.0.1 - ci-info: 2.0.0 - debug: 4.3.7(supports-color@8.1.1) - enquirer: 2.4.1 - env-paths: 2.2.1 - ethereum-cryptography: 1.2.0 - ethereumjs-abi: 0.6.8 - find-up: 5.0.0 - fp-ts: 1.19.3 - fs-extra: 7.0.1 - immutable: 4.3.7 - io-ts: 1.10.4 - json-stream-stringify: 3.1.6 - keccak: 3.0.4 - lodash: 4.17.21 - mnemonist: 0.38.5 - mocha: 10.7.3 - p-map: 4.0.0 - picocolors: 1.1.0 - raw-body: 2.5.2 - resolve: 1.17.0 - semver: 6.3.1 - solc: 0.8.26(debug@4.3.7) - source-map-support: 0.5.21 - stacktrace-parser: 0.1.10 - tinyglobby: 0.2.10 - tsort: 0.0.1 - undici: 5.28.4 - uuid: 8.3.2 - ws: 7.5.10 - optionalDependencies: - ts-node: 10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2) - typescript: 5.6.2 - transitivePeerDependencies: - - bufferutil - - c-kzg - - supports-color - - utf-8-validate - - has-flag@1.0.0: {} - - has-flag@3.0.0: {} - - has-flag@4.0.0: {} - - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.0 - - has-proto@1.0.3: {} - - has-symbols@1.0.3: {} - - hash-base@3.1.0: - dependencies: - inherits: 2.0.4 - readable-stream: 3.6.2 - safe-buffer: 5.2.1 - - hash.js@1.1.7: - dependencies: - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - he@1.2.0: {} - - heap@0.2.7: {} - - hmac-drbg@1.0.1: - dependencies: - hash.js: 1.1.7 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 - - homedir-polyfill@1.0.3: - dependencies: - parse-passwd: 1.0.0 - - hosted-git-info@2.8.9: {} - - hosted-git-info@4.1.0: - dependencies: - lru-cache: 6.0.0 - - http-basic@8.1.3: - dependencies: - caseless: 0.12.0 - concat-stream: 1.6.2 - http-response-object: 3.0.2 - parse-cache-control: 1.0.1 - - http-errors@2.0.0: - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - - http-response-object@3.0.2: - dependencies: - '@types/node': 10.17.60 - - https-proxy-agent@5.0.1: - dependencies: - agent-base: 6.0.2 - debug: 4.3.7(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - human-signals@2.1.0: {} - - human-signals@4.3.1: {} - - husky@8.0.3: {} - - iconv-lite@0.4.24: - dependencies: - safer-buffer: 2.1.2 - - ieee754@1.2.1: {} - - ignore@5.3.2: {} - - immer@10.0.2: {} - - immutable@4.3.7: {} - - import-fresh@3.3.0: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - import-meta-resolve@4.1.0: - optional: true - - imul@1.0.1: {} - - imurmurhash@0.1.4: {} - - indent-string@4.0.0: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - ini@1.3.8: {} - - ini@4.1.1: - optional: true - - inquirer@8.2.5: - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-width: 3.0.0 - external-editor: 3.1.0 - figures: 3.2.0 - lodash: 4.17.21 - mute-stream: 0.0.8 - ora: 5.4.1 - run-async: 2.4.1 - rxjs: 7.8.1 - string-width: 4.2.3 - strip-ansi: 6.0.1 - through: 2.3.8 - wrap-ansi: 7.0.0 - - interpret@1.4.0: {} - - io-ts@1.10.4: - dependencies: - fp-ts: 1.19.3 - - is-arrayish@0.2.1: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-builtin-module@3.2.1: - dependencies: - builtin-modules: 3.3.0 - - is-core-module@2.15.1: - dependencies: - hasown: 2.0.2 - - is-docker@2.2.1: {} - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@2.0.0: {} - - is-fullwidth-code-point@3.0.0: {} - - is-fullwidth-code-point@4.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-hex-prefixed@1.0.0: {} - - is-interactive@1.0.0: {} - - is-module@1.0.0: {} - - is-number@7.0.0: {} - - is-obj@2.0.0: {} - - is-path-inside@3.0.3: {} - - is-plain-obj@1.1.0: {} - - is-plain-obj@2.1.0: {} - - is-reference@1.2.1: - dependencies: - '@types/estree': 1.0.5 - - is-stream@2.0.1: {} - - is-stream@3.0.0: {} - - is-text-path@1.0.1: - dependencies: - text-extensions: 1.9.0 - - is-unicode-supported@0.1.0: {} - - is-utf8@0.2.1: {} - - is-windows@1.0.2: {} - - is-wsl@2.2.0: - dependencies: - is-docker: 2.2.1 - - isarray@1.0.0: {} - - isexe@2.0.0: {} - - isomorphic-unfetch@3.1.0: - dependencies: - node-fetch: 2.7.0 - unfetch: 4.2.0 - transitivePeerDependencies: - - encoding - - isows@1.0.4(ws@8.17.1): - dependencies: - ws: 8.17.1 - - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - - javascript-natural-sort@0.7.1: {} - - jiti@1.21.6: - optional: true - - js-cookie@2.2.1: {} - - js-sha3@0.8.0: {} - - js-tokens@4.0.0: {} - - js-yaml@3.14.1: - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - jsesc@2.5.2: {} - - json-buffer@3.0.1: {} - - json-parse-better-errors@1.0.2: {} - - json-parse-even-better-errors@2.3.1: {} - - json-schema-traverse@0.4.1: {} - - json-schema-traverse@1.0.0: {} - - json-stable-stringify-without-jsonify@1.0.1: {} - - json-stream-stringify@3.1.6: {} - - json-stringify-safe@5.0.1: {} - - json5@2.2.3: {} - - jsonfile@4.0.0: - optionalDependencies: - graceful-fs: 4.2.11 - - jsonfile@6.1.0: - dependencies: - universalify: 2.0.1 - optionalDependencies: - graceful-fs: 4.2.11 - - jsonparse@1.3.1: {} - - jsonschema@1.4.1: {} - - keccak@3.0.4: - dependencies: - node-addon-api: 2.0.2 - node-gyp-build: 4.8.2 - readable-stream: 3.6.2 - - keyv@4.5.4: - dependencies: - json-buffer: 3.0.1 - - kind-of@6.0.3: {} - - kleur@3.0.3: {} - - levn@0.3.0: - dependencies: - prelude-ls: 1.1.2 - type-check: 0.3.2 - - levn@0.4.1: - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - - lilconfig@2.1.0: {} - - lines-and-columns@1.2.4: {} - - lint-staged@13.3.0(enquirer@2.4.1): - dependencies: - chalk: 5.3.0 - commander: 11.0.0 - debug: 4.3.4 - execa: 7.2.0 - lilconfig: 2.1.0 - listr2: 6.6.1(enquirer@2.4.1) - micromatch: 4.0.5 - pidtree: 0.6.0 - string-argv: 0.3.2 - yaml: 2.3.1 - transitivePeerDependencies: - - enquirer - - supports-color - - listr2@6.6.1(enquirer@2.4.1): - dependencies: - cli-truncate: 3.1.0 - colorette: 2.0.20 - eventemitter3: 5.0.1 - log-update: 5.0.1 - rfdc: 1.4.1 - wrap-ansi: 8.1.0 - optionalDependencies: - enquirer: 2.4.1 - - load-json-file@4.0.0: - dependencies: - graceful-fs: 4.2.11 - parse-json: 4.0.0 - pify: 3.0.0 - strip-bom: 3.0.0 - - locate-path@5.0.0: - dependencies: - p-locate: 4.1.0 - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - lodash.camelcase@4.3.0: {} - - lodash.clonedeep@4.5.0: {} - - lodash.isequal@4.5.0: {} - - lodash.isfunction@3.0.9: {} - - lodash.isplainobject@4.0.6: {} - - lodash.kebabcase@4.1.1: {} - - lodash.map@4.6.0: {} - - lodash.memoize@4.1.2: {} - - lodash.merge@4.6.2: {} - - lodash.mergewith@4.6.2: {} - - lodash.snakecase@4.1.1: {} - - lodash.startcase@4.4.0: {} - - lodash.truncate@4.4.2: {} - - lodash.uniq@4.5.0: {} - - lodash.upperfirst@4.3.1: {} - - lodash@4.17.21: {} - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - log-update@5.0.1: - dependencies: - ansi-escapes: 5.0.0 - cli-cursor: 4.0.0 - slice-ansi: 5.0.0 - strip-ansi: 7.1.0 - wrap-ansi: 8.1.0 - - longest@2.0.1: {} - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - lru-cache@10.4.3: {} - - lru-cache@5.1.1: - dependencies: - yallist: 3.1.1 - - lru-cache@6.0.0: - dependencies: - yallist: 4.0.0 - - lru_map@0.3.3: {} - - magic-string@0.25.9: - dependencies: - sourcemap-codec: 1.4.8 - - magic-string@0.27.0: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 - - magic-string@0.30.11: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 - - make-error@1.3.6: {} - - map-obj@1.0.1: {} - - map-obj@4.3.0: {} - - markdown-table@1.1.3: {} - - match-all@1.2.6: {} - - md5.js@1.3.5: - dependencies: - hash-base: 3.1.0 - inherits: 2.0.4 - safe-buffer: 5.2.1 - - memorystream@0.3.1: {} - - meow@8.1.2: - dependencies: - '@types/minimist': 1.2.5 - camelcase-keys: 6.2.2 - decamelize-keys: 1.1.1 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 3.0.3 - read-pkg-up: 7.0.1 - redent: 3.0.0 - trim-newlines: 3.0.1 - type-fest: 0.18.1 - yargs-parser: 20.2.9 - - merge-stream@2.0.0: {} - - merge2@1.4.1: {} - - merge@2.1.1: {} - - micro-ftch@0.3.1: {} - - micromatch@4.0.5: - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - - mime-db@1.52.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - - mimic-fn@2.1.0: {} - - mimic-fn@4.0.0: {} - - min-indent@1.0.1: {} - - minimalistic-assert@1.0.1: {} - - minimalistic-crypto-utils@1.0.1: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@5.1.6: - dependencies: - brace-expansion: 2.0.1 - - minimatch@9.0.5: - dependencies: - brace-expansion: 2.0.1 - - minimist-options@4.1.0: - dependencies: - arrify: 1.0.1 - is-plain-obj: 1.1.0 - kind-of: 6.0.3 - - minimist@1.2.7: {} - - minimist@1.2.8: {} - - minipass@7.1.2: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mkdirp@1.0.4: {} - - mnemonist@0.38.5: - dependencies: - obliterator: 2.0.4 - - mocha@10.7.3: - dependencies: - ansi-colors: 4.1.3 - browser-stdout: 1.3.1 - chokidar: 3.6.0 - debug: 4.3.7(supports-color@8.1.1) - diff: 5.2.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 8.1.0 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 5.1.6 - ms: 2.1.3 - serialize-javascript: 6.0.2 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - workerpool: 6.5.1 - yargs: 16.2.0 - yargs-parser: 20.2.9 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - murmur-128@0.2.1: - dependencies: - encode-utf8: 1.0.3 - fmix: 0.1.0 - imul: 1.0.1 - - mute-stream@0.0.8: {} - - nanoid@3.3.7: {} - - natural-compare@1.4.0: {} - - ndjson@2.0.0: - dependencies: - json-stringify-safe: 5.0.1 - minimist: 1.2.8 - readable-stream: 3.6.2 - split2: 3.2.2 - through2: 4.0.2 - - neo-async@2.6.2: {} - - node-addon-api@2.0.2: {} - - node-emoji@1.11.0: - dependencies: - lodash: 4.17.21 - - node-fetch@2.0.0: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.2: {} - - node-releases@2.0.18: {} - - nofilter@3.1.0: {} - - nopt@3.0.6: - dependencies: - abbrev: 1.0.9 - - normalize-package-data@2.5.0: - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.8 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 - - normalize-package-data@3.0.3: - dependencies: - hosted-git-info: 4.1.0 - is-core-module: 2.15.1 - semver: 7.6.3 - validate-npm-package-license: 3.0.4 - - normalize-path@3.0.0: {} - - npm-run-path@4.0.1: - dependencies: - path-key: 3.1.1 - - npm-run-path@5.3.0: - dependencies: - path-key: 4.0.0 - - number-to-bn@1.7.0: - dependencies: - bn.js: 4.11.6 - strip-hex-prefix: 1.0.0 - - object-assign@4.1.1: {} - - object-inspect@1.13.2: {} - - obliterator@2.0.4: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - onetime@5.1.2: - dependencies: - mimic-fn: 2.1.0 - - onetime@6.0.0: - dependencies: - mimic-fn: 4.0.0 - - open@8.4.2: - dependencies: - define-lazy-prop: 2.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 - - optionator@0.8.3: - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.3.0 - prelude-ls: 1.1.2 - type-check: 0.3.2 - word-wrap: 1.2.5 - - optionator@0.9.4: - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.5 - - ora@5.4.1: - dependencies: - bl: 4.1.0 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.9.2 - is-interactive: 1.0.0 - is-unicode-supported: 0.1.0 - log-symbols: 4.1.0 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - - ordinal@1.0.3: {} - - os-tmpdir@1.0.2: {} - - p-limit@2.3.0: - dependencies: - p-try: 2.2.0 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@4.1.0: - dependencies: - p-limit: 2.3.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - p-map@4.0.0: - dependencies: - aggregate-error: 3.1.0 - - p-try@2.2.0: {} - - package-json-from-dist@1.0.0: {} - - parent-module@1.0.1: - dependencies: - callsites: 3.1.0 - - parse-cache-control@1.0.1: {} - - parse-json@4.0.0: - dependencies: - error-ex: 1.3.2 - json-parse-better-errors: 1.0.2 - - parse-json@5.2.0: - dependencies: - '@babel/code-frame': 7.24.7 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - - parse-passwd@1.0.0: {} - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - path-key@3.1.1: {} - - path-key@4.0.0: {} - - path-parse@1.0.7: {} - - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.2 - - path-starts-with@2.0.1: {} - - path-type@3.0.0: - dependencies: - pify: 3.0.0 - - path-type@4.0.0: {} - - pathval@1.1.1: {} - - pbkdf2@3.1.2: - dependencies: - create-hash: 1.2.0 - create-hmac: 1.1.7 - ripemd160: 2.0.2 - safe-buffer: 5.2.1 - sha.js: 2.4.11 - - picocolors@1.1.0: {} - - picomatch@2.3.1: {} - - picomatch@4.0.2: {} - - pidtree@0.6.0: {} - - pify@3.0.0: {} - - pify@4.0.1: {} - - pluralize@8.0.0: {} - - postcss@8.4.45: - dependencies: - nanoid: 3.3.7 - picocolors: 1.1.0 - source-map-js: 1.2.1 - - prelude-ls@1.1.2: {} - - prelude-ls@1.2.1: {} - - prettier-linter-helpers@1.0.0: - dependencies: - fast-diff: 1.3.0 - - prettier-plugin-solidity@1.4.1(prettier@2.8.8): - dependencies: - '@solidity-parser/parser': 0.18.0 - prettier: 2.8.8 - semver: 7.6.3 - - prettier@2.8.8: {} - - process-nextick-args@2.0.1: {} - - promise@8.3.0: - dependencies: - asap: 2.0.6 - - prompts@2.4.2: - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - - proper-lockfile@4.1.2: - dependencies: - graceful-fs: 4.2.11 - retry: 0.12.0 - signal-exit: 3.0.7 - - proxy-from-env@1.1.0: {} - - punycode@2.3.1: {} - - qs@6.13.0: - dependencies: - side-channel: 1.0.6 - - queue-microtask@1.2.3: {} - - quick-lru@4.0.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - raw-body@2.5.2: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - - read-pkg-up@7.0.1: - dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 - - read-pkg@3.0.0: - dependencies: - load-json-file: 4.0.0 - normalize-package-data: 2.5.0 - path-type: 3.0.0 - - read-pkg@5.2.0: - dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 - - readable-stream@2.3.8: - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - readdirp@4.0.2: {} - - rechoir@0.6.2: - dependencies: - resolve: 1.22.8 - - recursive-readdir@2.2.3: - dependencies: - minimatch: 3.1.2 - - redent@3.0.0: - dependencies: - indent-string: 4.0.0 - strip-indent: 3.0.0 - - reduce-flatten@2.0.0: {} - - req-cwd@2.0.0: - dependencies: - req-from: 2.0.0 - - req-from@2.0.0: - dependencies: - resolve-from: 3.0.0 - - require-directory@2.1.1: {} - - require-from-string@2.0.2: {} - - resolve-dir@1.0.1: - dependencies: - expand-tilde: 2.0.2 - global-modules: 1.0.0 - - resolve-from@3.0.0: {} - - resolve-from@4.0.0: {} - - resolve-from@5.0.0: {} - - resolve-global@1.0.0: - dependencies: - global-dirs: 0.1.1 - - resolve-pkg-maps@1.0.0: {} - - resolve@1.1.7: {} - - resolve@1.17.0: - dependencies: - path-parse: 1.0.7 - - resolve@1.22.8: - dependencies: - is-core-module: 2.15.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - restore-cursor@3.1.0: - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - - restore-cursor@4.0.0: - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - - retry@0.12.0: {} - - retry@0.13.1: {} - - reusify@1.0.4: {} - - rfdc@1.4.1: {} - - rimraf@2.7.1: - dependencies: - glob: 7.2.3 - - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - - rimraf@5.0.10: - dependencies: - glob: 10.4.5 - - ripemd160@2.0.2: - dependencies: - hash-base: 3.1.0 - inherits: 2.0.4 - - rlp@2.2.7: - dependencies: - bn.js: 5.2.1 - - rollup-plugin-auto-external@2.0.0(rollup@4.21.2): - dependencies: - builtins: 2.0.1 - read-pkg: 3.0.0 - rollup: 4.21.2 - safe-resolve: 1.0.0 - semver: 5.7.2 - - rollup-plugin-dts@6.1.1(rollup@4.21.2)(typescript@5.6.2): - dependencies: - magic-string: 0.30.11 - rollup: 4.21.2 - typescript: 5.6.2 - optionalDependencies: - '@babel/code-frame': 7.24.7 - - rollup-plugin-esbuild@6.1.1(esbuild@0.23.1)(rollup@4.21.2): - dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.21.2) - debug: 4.3.7(supports-color@8.1.1) - es-module-lexer: 1.5.4 - esbuild: 0.23.1 - get-tsconfig: 4.8.0 - rollup: 4.21.2 - transitivePeerDependencies: - - supports-color - - rollup-plugin-inject@3.0.2: - dependencies: - estree-walker: 0.6.1 - magic-string: 0.25.9 - rollup-pluginutils: 2.8.2 - - rollup-plugin-node-polyfills@0.2.1: - dependencies: - rollup-plugin-inject: 3.0.2 - - rollup-plugin-swc3@0.11.2(@swc/core@1.7.26)(rollup@4.21.2): - dependencies: - '@fastify/deepmerge': 1.3.0 - '@rollup/pluginutils': 5.1.0(rollup@4.21.2) - '@swc/core': 1.7.26 - get-tsconfig: 4.8.0 - rollup: 4.21.2 - rollup-preserve-directives: 1.1.1(rollup@4.21.2) - - rollup-pluginutils@2.8.2: - dependencies: - estree-walker: 0.6.1 - - rollup-preserve-directives@1.1.1(rollup@4.21.2): - dependencies: - magic-string: 0.30.11 - rollup: 4.21.2 - - rollup@4.21.2: - dependencies: - '@types/estree': 1.0.5 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.21.2 - '@rollup/rollup-android-arm64': 4.21.2 - '@rollup/rollup-darwin-arm64': 4.21.2 - '@rollup/rollup-darwin-x64': 4.21.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.21.2 - '@rollup/rollup-linux-arm-musleabihf': 4.21.2 - '@rollup/rollup-linux-arm64-gnu': 4.21.2 - '@rollup/rollup-linux-arm64-musl': 4.21.2 - '@rollup/rollup-linux-powerpc64le-gnu': 4.21.2 - '@rollup/rollup-linux-riscv64-gnu': 4.21.2 - '@rollup/rollup-linux-s390x-gnu': 4.21.2 - '@rollup/rollup-linux-x64-gnu': 4.21.2 - '@rollup/rollup-linux-x64-musl': 4.21.2 - '@rollup/rollup-win32-arm64-msvc': 4.21.2 - '@rollup/rollup-win32-ia32-msvc': 4.21.2 - '@rollup/rollup-win32-x64-msvc': 4.21.2 - fsevents: 2.3.3 - - run-async@2.4.1: {} - - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - - rxjs@7.8.1: - dependencies: - tslib: 2.7.0 - - safe-buffer@5.1.2: {} - - safe-buffer@5.2.1: {} - - safe-resolve@1.0.0: {} - - safer-buffer@2.1.2: {} - - sc-istanbul@0.4.6: - dependencies: - abbrev: 1.0.9 - async: 1.5.2 - escodegen: 1.8.1 - esprima: 2.7.3 - glob: 5.0.15 - handlebars: 4.7.8 - js-yaml: 3.14.1 - mkdirp: 0.5.6 - nopt: 3.0.6 - once: 1.4.0 - resolve: 1.1.7 - supports-color: 3.2.3 - which: 1.3.1 - wordwrap: 1.0.0 - - scrypt-js@3.0.1: {} - - secp256k1@4.0.3: - dependencies: - elliptic: 6.5.7 - node-addon-api: 2.0.2 - node-gyp-build: 4.8.2 - - semver@5.7.2: {} - - semver@6.3.1: {} - - semver@7.5.4: - dependencies: - lru-cache: 6.0.0 - - semver@7.6.3: {} - - serialize-javascript@6.0.2: - dependencies: - randombytes: 2.1.0 - - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - - setimmediate@1.0.5: {} - - setprototypeof@1.2.0: {} - - sha.js@2.4.11: - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - - sha1@1.1.1: - dependencies: - charenc: 0.0.2 - crypt: 0.0.2 - - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 - - shebang-regex@3.0.0: {} - - shelljs@0.8.5: - dependencies: - glob: 7.2.3 - interpret: 1.4.0 - rechoir: 0.6.2 - - shx@0.3.4: - dependencies: - minimist: 1.2.8 - shelljs: 0.8.5 - - side-channel@1.0.6: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.2 - - signal-exit@3.0.7: {} - - signal-exit@4.1.0: {} - - sisteransi@1.0.5: {} - - slash@3.0.0: {} - - slice-ansi@4.0.0: - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - - slice-ansi@5.0.0: - dependencies: - ansi-styles: 6.2.1 - is-fullwidth-code-point: 4.0.0 - - solc@0.8.26(debug@4.3.7): - dependencies: - command-exists: 1.2.9 - commander: 8.3.0 - follow-redirects: 1.15.9(debug@4.3.7) - js-sha3: 0.8.0 - memorystream: 0.3.1 - semver: 5.7.2 - tmp: 0.0.33 - transitivePeerDependencies: - - debug - - solhint-plugin-prettier@0.0.5(prettier-plugin-solidity@1.4.1(prettier@2.8.8))(prettier@2.8.8): - dependencies: - prettier: 2.8.8 - prettier-linter-helpers: 1.0.0 - prettier-plugin-solidity: 1.4.1(prettier@2.8.8) - - solhint@3.6.2(typescript@5.6.2): - dependencies: - '@solidity-parser/parser': 0.16.2 - ajv: 6.12.6 - antlr4: 4.13.2 - ast-parents: 0.0.1 - chalk: 4.1.2 - commander: 10.0.1 - cosmiconfig: 8.3.6(typescript@5.6.2) - fast-diff: 1.3.0 - glob: 8.1.0 - ignore: 5.3.2 - js-yaml: 4.1.0 - lodash: 4.17.21 - pluralize: 8.0.0 - semver: 7.6.3 - strip-ansi: 6.0.1 - table: 6.8.2 - text-table: 0.2.0 - optionalDependencies: - prettier: 2.8.8 - transitivePeerDependencies: - - typescript - - solidity-ast@0.4.59: {} - - solidity-coverage@0.8.13(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)): - dependencies: - '@ethersproject/abi': 5.7.0 - '@solidity-parser/parser': 0.18.0 - chalk: 2.4.2 - death: 1.1.0 - difflib: 0.2.4 - fs-extra: 8.1.0 - ghost-testrpc: 0.0.2 - global-modules: 2.0.0 - globby: 10.0.2 - hardhat: 2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) - jsonschema: 1.4.1 - lodash: 4.17.21 - mocha: 10.7.3 - node-emoji: 1.11.0 - pify: 4.0.1 - recursive-readdir: 2.2.3 - sc-istanbul: 0.4.6 - semver: 7.6.3 - shelljs: 0.8.5 - web3-utils: 1.10.4 - - solmate@6.2.0: {} - - source-map-js@1.2.1: {} - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.2.0: - dependencies: - amdefine: 1.0.1 - optional: true - - source-map@0.5.7: {} - - source-map@0.6.1: {} - - sourcemap-codec@1.4.8: {} - - spdx-correct@3.2.0: - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.20 - - spdx-exceptions@2.5.0: {} - - spdx-expression-parse@3.0.1: - dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.20 - - spdx-license-ids@3.0.20: {} - - split2@3.2.2: - dependencies: - readable-stream: 3.6.2 - - sprintf-js@1.0.3: {} - - squirrelly@8.0.8: {} - - stacktrace-parser@0.1.10: - dependencies: - type-fest: 0.7.1 - - statuses@2.0.1: {} - - string-argv@0.3.2: {} - - string-format@2.0.0: {} - - string-width@2.1.1: - dependencies: - is-fullwidth-code-point: 2.0.0 - strip-ansi: 4.0.0 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - - string_decoder@1.1.1: - dependencies: - safe-buffer: 5.1.2 - - string_decoder@1.3.0: - dependencies: - safe-buffer: 5.2.1 - - strip-ansi@4.0.0: - dependencies: - ansi-regex: 3.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-ansi@7.1.0: - dependencies: - ansi-regex: 6.1.0 - - strip-bom@3.0.0: {} - - strip-bom@4.0.0: {} - - strip-final-newline@2.0.0: {} - - strip-final-newline@3.0.0: {} - - strip-hex-prefix@1.0.0: - dependencies: - is-hex-prefixed: 1.0.0 - - strip-indent@3.0.0: - dependencies: - min-indent: 1.0.1 - - strip-json-comments@3.1.1: {} - - supports-color@3.2.3: - dependencies: - has-flag: 1.0.0 - - supports-color@5.5.0: - dependencies: - has-flag: 3.0.0 - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - supports-preserve-symlinks-flag@1.0.0: {} - - sync-request@6.1.0: - dependencies: - http-response-object: 3.0.2 - sync-rpc: 1.3.6 - then-request: 6.0.2 - - sync-rpc@1.3.6: - dependencies: - get-port: 3.2.0 - - table-layout@1.0.2: - dependencies: - array-back: 4.0.2 - deep-extend: 0.6.0 - typical: 5.2.0 - wordwrapjs: 4.0.1 - - table@6.8.2: - dependencies: - ajv: 8.17.1 - lodash.truncate: 4.4.2 - slice-ansi: 4.0.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - tenderly@0.9.1(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2): - dependencies: - axios: 0.27.2 - cli-table3: 0.6.5 - commander: 9.5.0 - js-yaml: 4.1.0 - open: 8.4.2 - prompts: 2.4.2 - tslog: 4.9.3 - optionalDependencies: - ts-node: 10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2) - typescript: 5.6.2 - transitivePeerDependencies: - - debug - - text-extensions@1.9.0: {} - - text-table@0.2.0: {} - - then-request@6.0.2: - dependencies: - '@types/concat-stream': 1.6.1 - '@types/form-data': 0.0.33 - '@types/node': 8.10.66 - '@types/qs': 6.9.15 - caseless: 0.12.0 - concat-stream: 1.6.2 - form-data: 2.5.1 - http-basic: 8.1.3 - http-response-object: 3.0.2 - promise: 8.3.0 - qs: 6.13.0 - - through2@4.0.2: - dependencies: - readable-stream: 3.6.2 - - through@2.3.8: {} - - tinyglobby@0.2.10: - dependencies: - fdir: 6.4.2(picomatch@4.0.2) - picomatch: 4.0.2 - - tmp@0.0.33: - dependencies: - os-tmpdir: 1.0.2 - - to-fast-properties@2.0.0: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - toidentifier@1.0.1: {} - - tr46@0.0.3: {} - - trim-newlines@3.0.1: {} - - ts-api-utils@1.3.0(typescript@5.6.2): - dependencies: - typescript: 5.6.2 - - ts-command-line-args@2.5.1: - dependencies: - chalk: 4.1.2 - command-line-args: 5.2.1 - command-line-usage: 6.1.3 - string-format: 2.0.0 - - ts-essentials@7.0.3(typescript@5.6.2): - dependencies: - typescript: 5.6.2 - - ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 18.19.50 - acorn: 8.12.1 - acorn-walk: 8.3.4 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.6.2 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - optionalDependencies: - '@swc/core': 1.7.26 - - ts-node@10.9.2(@swc/core@1.7.26)(@types/node@20.5.1)(typescript@5.6.2): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 20.5.1 - acorn: 8.12.1 - acorn-walk: 8.3.4 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.6.2 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - optionalDependencies: - '@swc/core': 1.7.26 - - tslib@1.14.1: {} - - tslib@2.4.0: {} - - tslib@2.7.0: {} - - tslog@4.9.3: {} - - tsort@0.0.1: {} - - tweetnacl-util@0.15.1: {} - - tweetnacl@1.0.3: {} - - type-check@0.3.2: - dependencies: - prelude-ls: 1.1.2 - - type-check@0.4.0: - dependencies: - prelude-ls: 1.2.1 - - type-detect@4.1.0: {} - - type-fest@0.18.1: {} - - type-fest@0.20.2: {} - - type-fest@0.21.3: {} - - type-fest@0.6.0: {} - - type-fest@0.7.1: {} - - type-fest@0.8.1: {} - - type-fest@1.4.0: {} - - typechain@8.3.2(typescript@5.6.2): - dependencies: - '@types/prettier': 2.7.3 - debug: 4.3.7(supports-color@8.1.1) - fs-extra: 7.0.1 - glob: 7.1.7 - js-sha3: 0.8.0 - lodash: 4.17.21 - mkdirp: 1.0.4 - prettier: 2.8.8 - ts-command-line-args: 2.5.1 - ts-essentials: 7.0.3(typescript@5.6.2) - typescript: 5.6.2 - transitivePeerDependencies: - - supports-color - - typedarray@0.0.6: {} - - typescript@5.6.2: {} - - typical@4.0.0: {} - - typical@5.2.0: {} - - uglify-js@3.19.3: - optional: true - - undici-types@5.26.5: {} - - undici@5.28.4: - dependencies: - '@fastify/busboy': 2.1.1 - - undici@6.19.8: {} - - unfetch@4.2.0: {} - - universalify@0.1.2: {} - - universalify@2.0.1: {} - - unpipe@1.0.0: {} - - update-browserslist-db@1.1.0(browserslist@4.23.3): - dependencies: - browserslist: 4.23.3 - escalade: 3.2.0 - picocolors: 1.1.0 - - uri-js@4.4.1: - dependencies: - punycode: 2.3.1 - - utf8@3.0.0: {} - - util-deprecate@1.0.2: {} - - uuid@8.3.2: {} - - v8-compile-cache-lib@3.0.1: {} - - validate-npm-package-license@3.0.4: - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - - viem@2.21.5(typescript@5.6.2): - dependencies: - '@adraffy/ens-normalize': 1.10.0 - '@noble/curves': 1.4.0 - '@noble/hashes': 1.4.0 - '@scure/bip32': 1.4.0 - '@scure/bip39': 1.4.0 - abitype: 1.0.5(typescript@5.6.2) - isows: 1.0.4(ws@8.17.1) - webauthn-p256: 0.0.5 - ws: 8.17.1 - optionalDependencies: - typescript: 5.6.2 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - zod - - wcwidth@1.0.1: - dependencies: - defaults: 1.0.4 - - web3-utils@1.10.4: - dependencies: - '@ethereumjs/util': 8.1.0 - bn.js: 5.2.1 - ethereum-bloom-filters: 1.2.0 - ethereum-cryptography: 2.2.1 - ethjs-unit: 0.1.6 - number-to-bn: 1.7.0 - randombytes: 2.1.0 - utf8: 3.0.0 - - webauthn-p256@0.0.5: - dependencies: - '@noble/curves': 1.4.0 - '@noble/hashes': 1.4.0 - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@1.3.1: - dependencies: - isexe: 2.0.0 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - widest-line@3.1.0: - dependencies: - string-width: 4.2.3 - - word-wrap@1.2.5: {} - - wordwrap@1.0.0: {} - - wordwrapjs@4.0.1: - dependencies: - reduce-flatten: 2.0.0 - typical: 5.2.0 - - workerpool@6.5.1: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - - wrappy@1.0.2: {} - - ws@7.4.6: {} - - ws@7.5.10: {} - - ws@8.17.1: {} - - xdeployer@2.2.2(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)): - dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2)(hardhat@2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) - ethers: 6.13.2 - hardhat: 2.22.16(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) - - y18n@5.0.8: {} - - yallist@3.1.1: {} - - yallist@4.0.0: {} - - yaml@2.3.1: {} - - yargs-parser@20.2.9: {} - - yargs-parser@21.1.1: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - - yargs@17.7.2: - dependencies: - cliui: 8.0.1 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - - yn@3.1.1: {} - - yocto-queue@0.1.0: {} - - zksync-web3@0.14.4(ethers@5.7.2): - dependencies: - ethers: 5.7.2 diff --git a/contracts/examples/hypercert_metadata.json b/examples/hypercert_metadata.json similarity index 100% rename from contracts/examples/hypercert_metadata.json rename to examples/hypercert_metadata.json diff --git a/contracts/foundry.toml b/foundry.toml similarity index 100% rename from contracts/foundry.toml rename to foundry.toml diff --git a/contracts/hardhat.config.cts b/hardhat.config.cts similarity index 100% rename from contracts/hardhat.config.cts rename to hardhat.config.cts diff --git a/contracts/lib/forge-std/.github/workflows/ci.yml b/lib/forge-std/.github/workflows/ci.yml similarity index 100% rename from contracts/lib/forge-std/.github/workflows/ci.yml rename to lib/forge-std/.github/workflows/ci.yml diff --git a/contracts/lib/forge-std/.gitignore b/lib/forge-std/.gitignore similarity index 100% rename from contracts/lib/forge-std/.gitignore rename to lib/forge-std/.gitignore diff --git a/contracts/lib/forge-std/.gitmodules b/lib/forge-std/.gitmodules similarity index 100% rename from contracts/lib/forge-std/.gitmodules rename to lib/forge-std/.gitmodules diff --git a/contracts/lib/forge-std/LICENSE-APACHE b/lib/forge-std/LICENSE-APACHE similarity index 100% rename from contracts/lib/forge-std/LICENSE-APACHE rename to lib/forge-std/LICENSE-APACHE diff --git a/contracts/lib/forge-std/LICENSE-MIT b/lib/forge-std/LICENSE-MIT similarity index 100% rename from contracts/lib/forge-std/LICENSE-MIT rename to lib/forge-std/LICENSE-MIT diff --git a/contracts/lib/forge-std/README.md b/lib/forge-std/README.md similarity index 100% rename from contracts/lib/forge-std/README.md rename to lib/forge-std/README.md diff --git a/contracts/lib/forge-std/foundry.toml b/lib/forge-std/foundry.toml similarity index 100% rename from contracts/lib/forge-std/foundry.toml rename to lib/forge-std/foundry.toml diff --git a/contracts/lib/forge-std/lib/ds-test/.gitignore b/lib/forge-std/lib/ds-test/.gitignore similarity index 100% rename from contracts/lib/forge-std/lib/ds-test/.gitignore rename to lib/forge-std/lib/ds-test/.gitignore diff --git a/contracts/lib/forge-std/lib/ds-test/LICENSE b/lib/forge-std/lib/ds-test/LICENSE similarity index 100% rename from contracts/lib/forge-std/lib/ds-test/LICENSE rename to lib/forge-std/lib/ds-test/LICENSE diff --git a/contracts/lib/forge-std/lib/ds-test/Makefile b/lib/forge-std/lib/ds-test/Makefile similarity index 100% rename from contracts/lib/forge-std/lib/ds-test/Makefile rename to lib/forge-std/lib/ds-test/Makefile diff --git a/contracts/lib/forge-std/lib/ds-test/default.nix b/lib/forge-std/lib/ds-test/default.nix similarity index 100% rename from contracts/lib/forge-std/lib/ds-test/default.nix rename to lib/forge-std/lib/ds-test/default.nix diff --git a/contracts/lib/forge-std/lib/ds-test/demo/demo.sol b/lib/forge-std/lib/ds-test/demo/demo.sol similarity index 100% rename from contracts/lib/forge-std/lib/ds-test/demo/demo.sol rename to lib/forge-std/lib/ds-test/demo/demo.sol diff --git a/contracts/lib/forge-std/lib/ds-test/package.json b/lib/forge-std/lib/ds-test/package.json similarity index 100% rename from contracts/lib/forge-std/lib/ds-test/package.json rename to lib/forge-std/lib/ds-test/package.json diff --git a/contracts/lib/forge-std/lib/ds-test/src/test.sol b/lib/forge-std/lib/ds-test/src/test.sol similarity index 100% rename from contracts/lib/forge-std/lib/ds-test/src/test.sol rename to lib/forge-std/lib/ds-test/src/test.sol diff --git a/contracts/lib/forge-std/package.json b/lib/forge-std/package.json similarity index 100% rename from contracts/lib/forge-std/package.json rename to lib/forge-std/package.json diff --git a/contracts/lib/forge-std/src/Common.sol b/lib/forge-std/src/Common.sol similarity index 100% rename from contracts/lib/forge-std/src/Common.sol rename to lib/forge-std/src/Common.sol diff --git a/contracts/lib/forge-std/src/Components.sol b/lib/forge-std/src/Components.sol similarity index 100% rename from contracts/lib/forge-std/src/Components.sol rename to lib/forge-std/src/Components.sol diff --git a/contracts/lib/forge-std/src/Script.sol b/lib/forge-std/src/Script.sol similarity index 100% rename from contracts/lib/forge-std/src/Script.sol rename to lib/forge-std/src/Script.sol diff --git a/contracts/lib/forge-std/src/StdAssertions.sol b/lib/forge-std/src/StdAssertions.sol similarity index 100% rename from contracts/lib/forge-std/src/StdAssertions.sol rename to lib/forge-std/src/StdAssertions.sol diff --git a/contracts/lib/forge-std/src/StdChains.sol b/lib/forge-std/src/StdChains.sol similarity index 100% rename from contracts/lib/forge-std/src/StdChains.sol rename to lib/forge-std/src/StdChains.sol diff --git a/contracts/lib/forge-std/src/StdCheats.sol b/lib/forge-std/src/StdCheats.sol similarity index 100% rename from contracts/lib/forge-std/src/StdCheats.sol rename to lib/forge-std/src/StdCheats.sol diff --git a/contracts/lib/forge-std/src/StdError.sol b/lib/forge-std/src/StdError.sol similarity index 100% rename from contracts/lib/forge-std/src/StdError.sol rename to lib/forge-std/src/StdError.sol diff --git a/contracts/lib/forge-std/src/StdJson.sol b/lib/forge-std/src/StdJson.sol similarity index 100% rename from contracts/lib/forge-std/src/StdJson.sol rename to lib/forge-std/src/StdJson.sol diff --git a/contracts/lib/forge-std/src/StdMath.sol b/lib/forge-std/src/StdMath.sol similarity index 100% rename from contracts/lib/forge-std/src/StdMath.sol rename to lib/forge-std/src/StdMath.sol diff --git a/contracts/lib/forge-std/src/StdStorage.sol b/lib/forge-std/src/StdStorage.sol similarity index 100% rename from contracts/lib/forge-std/src/StdStorage.sol rename to lib/forge-std/src/StdStorage.sol diff --git a/contracts/lib/forge-std/src/StdUtils.sol b/lib/forge-std/src/StdUtils.sol similarity index 100% rename from contracts/lib/forge-std/src/StdUtils.sol rename to lib/forge-std/src/StdUtils.sol diff --git a/contracts/lib/forge-std/src/Test.sol b/lib/forge-std/src/Test.sol similarity index 100% rename from contracts/lib/forge-std/src/Test.sol rename to lib/forge-std/src/Test.sol diff --git a/contracts/lib/forge-std/src/Vm.sol b/lib/forge-std/src/Vm.sol similarity index 100% rename from contracts/lib/forge-std/src/Vm.sol rename to lib/forge-std/src/Vm.sol diff --git a/contracts/lib/forge-std/src/console.sol b/lib/forge-std/src/console.sol similarity index 100% rename from contracts/lib/forge-std/src/console.sol rename to lib/forge-std/src/console.sol diff --git a/contracts/lib/forge-std/src/console2.sol b/lib/forge-std/src/console2.sol similarity index 100% rename from contracts/lib/forge-std/src/console2.sol rename to lib/forge-std/src/console2.sol diff --git a/contracts/lib/forge-std/src/interfaces/IERC1155.sol b/lib/forge-std/src/interfaces/IERC1155.sol similarity index 100% rename from contracts/lib/forge-std/src/interfaces/IERC1155.sol rename to lib/forge-std/src/interfaces/IERC1155.sol diff --git a/contracts/lib/forge-std/src/interfaces/IERC165.sol b/lib/forge-std/src/interfaces/IERC165.sol similarity index 100% rename from contracts/lib/forge-std/src/interfaces/IERC165.sol rename to lib/forge-std/src/interfaces/IERC165.sol diff --git a/contracts/lib/forge-std/src/interfaces/IERC20.sol b/lib/forge-std/src/interfaces/IERC20.sol similarity index 100% rename from contracts/lib/forge-std/src/interfaces/IERC20.sol rename to lib/forge-std/src/interfaces/IERC20.sol diff --git a/contracts/lib/forge-std/src/interfaces/IERC4626.sol b/lib/forge-std/src/interfaces/IERC4626.sol similarity index 100% rename from contracts/lib/forge-std/src/interfaces/IERC4626.sol rename to lib/forge-std/src/interfaces/IERC4626.sol diff --git a/contracts/lib/forge-std/src/interfaces/IERC721.sol b/lib/forge-std/src/interfaces/IERC721.sol similarity index 100% rename from contracts/lib/forge-std/src/interfaces/IERC721.sol rename to lib/forge-std/src/interfaces/IERC721.sol diff --git a/contracts/lib/forge-std/test/StdAssertions.t.sol b/lib/forge-std/test/StdAssertions.t.sol similarity index 100% rename from contracts/lib/forge-std/test/StdAssertions.t.sol rename to lib/forge-std/test/StdAssertions.t.sol diff --git a/contracts/lib/forge-std/test/StdChains.t.sol b/lib/forge-std/test/StdChains.t.sol similarity index 100% rename from contracts/lib/forge-std/test/StdChains.t.sol rename to lib/forge-std/test/StdChains.t.sol diff --git a/contracts/lib/forge-std/test/StdCheats.t.sol b/lib/forge-std/test/StdCheats.t.sol similarity index 100% rename from contracts/lib/forge-std/test/StdCheats.t.sol rename to lib/forge-std/test/StdCheats.t.sol diff --git a/contracts/lib/forge-std/test/StdError.t.sol b/lib/forge-std/test/StdError.t.sol similarity index 100% rename from contracts/lib/forge-std/test/StdError.t.sol rename to lib/forge-std/test/StdError.t.sol diff --git a/contracts/lib/forge-std/test/StdMath.t.sol b/lib/forge-std/test/StdMath.t.sol similarity index 100% rename from contracts/lib/forge-std/test/StdMath.t.sol rename to lib/forge-std/test/StdMath.t.sol diff --git a/contracts/lib/forge-std/test/StdStorage.t.sol b/lib/forge-std/test/StdStorage.t.sol similarity index 100% rename from contracts/lib/forge-std/test/StdStorage.t.sol rename to lib/forge-std/test/StdStorage.t.sol diff --git a/contracts/lib/forge-std/test/StdUtils.t.sol b/lib/forge-std/test/StdUtils.t.sol similarity index 100% rename from contracts/lib/forge-std/test/StdUtils.t.sol rename to lib/forge-std/test/StdUtils.t.sol diff --git a/contracts/lib/forge-std/test/compilation/CompilationScript.sol b/lib/forge-std/test/compilation/CompilationScript.sol similarity index 100% rename from contracts/lib/forge-std/test/compilation/CompilationScript.sol rename to lib/forge-std/test/compilation/CompilationScript.sol diff --git a/contracts/lib/forge-std/test/compilation/CompilationScriptBase.sol b/lib/forge-std/test/compilation/CompilationScriptBase.sol similarity index 100% rename from contracts/lib/forge-std/test/compilation/CompilationScriptBase.sol rename to lib/forge-std/test/compilation/CompilationScriptBase.sol diff --git a/contracts/lib/forge-std/test/compilation/CompilationTest.sol b/lib/forge-std/test/compilation/CompilationTest.sol similarity index 100% rename from contracts/lib/forge-std/test/compilation/CompilationTest.sol rename to lib/forge-std/test/compilation/CompilationTest.sol diff --git a/contracts/lib/forge-std/test/compilation/CompilationTestBase.sol b/lib/forge-std/test/compilation/CompilationTestBase.sol similarity index 100% rename from contracts/lib/forge-std/test/compilation/CompilationTestBase.sol rename to lib/forge-std/test/compilation/CompilationTestBase.sol diff --git a/contracts/lib/forge-std/test/fixtures/broadcast.log.json b/lib/forge-std/test/fixtures/broadcast.log.json similarity index 100% rename from contracts/lib/forge-std/test/fixtures/broadcast.log.json rename to lib/forge-std/test/fixtures/broadcast.log.json diff --git a/contracts/lib/murky/.dockerignore b/lib/murky/.dockerignore similarity index 100% rename from contracts/lib/murky/.dockerignore rename to lib/murky/.dockerignore diff --git a/contracts/lib/murky/.gas-snapshot b/lib/murky/.gas-snapshot similarity index 100% rename from contracts/lib/murky/.gas-snapshot rename to lib/murky/.gas-snapshot diff --git a/contracts/lib/murky/.github/workflows/run_tests.yml b/lib/murky/.github/workflows/run_tests.yml similarity index 100% rename from contracts/lib/murky/.github/workflows/run_tests.yml rename to lib/murky/.github/workflows/run_tests.yml diff --git a/contracts/lib/murky/.github/workflows/slither.yml b/lib/murky/.github/workflows/slither.yml similarity index 100% rename from contracts/lib/murky/.github/workflows/slither.yml rename to lib/murky/.github/workflows/slither.yml diff --git a/contracts/lib/murky/.gitignore b/lib/murky/.gitignore similarity index 100% rename from contracts/lib/murky/.gitignore rename to lib/murky/.gitignore diff --git a/contracts/lib/murky/.gitmodules b/lib/murky/.gitmodules similarity index 100% rename from contracts/lib/murky/.gitmodules rename to lib/murky/.gitmodules diff --git a/contracts/lib/murky/Dockerfile.deploy b/lib/murky/Dockerfile.deploy similarity index 100% rename from contracts/lib/murky/Dockerfile.deploy rename to lib/murky/Dockerfile.deploy diff --git a/contracts/lib/murky/README.md b/lib/murky/README.md similarity index 100% rename from contracts/lib/murky/README.md rename to lib/murky/README.md diff --git a/contracts/lib/murky/differential_testing/README.md b/lib/murky/differential_testing/README.md similarity index 100% rename from contracts/lib/murky/differential_testing/README.md rename to lib/murky/differential_testing/README.md diff --git a/contracts/lib/murky/differential_testing/scripts/generate_root.ts b/lib/murky/differential_testing/scripts/generate_root.ts similarity index 100% rename from contracts/lib/murky/differential_testing/scripts/generate_root.ts rename to lib/murky/differential_testing/scripts/generate_root.ts diff --git a/contracts/lib/murky/differential_testing/scripts/generate_root_cli.ts b/lib/murky/differential_testing/scripts/generate_root_cli.ts similarity index 100% rename from contracts/lib/murky/differential_testing/scripts/generate_root_cli.ts rename to lib/murky/differential_testing/scripts/generate_root_cli.ts diff --git a/contracts/lib/murky/differential_testing/scripts/merkle-tree.ts b/lib/murky/differential_testing/scripts/merkle-tree.ts similarity index 100% rename from contracts/lib/murky/differential_testing/scripts/merkle-tree.ts rename to lib/murky/differential_testing/scripts/merkle-tree.ts diff --git a/contracts/lib/murky/differential_testing/scripts/package-lock.json b/lib/murky/differential_testing/scripts/package-lock.json similarity index 100% rename from contracts/lib/murky/differential_testing/scripts/package-lock.json rename to lib/murky/differential_testing/scripts/package-lock.json diff --git a/contracts/lib/murky/differential_testing/scripts/package.json b/lib/murky/differential_testing/scripts/package.json similarity index 100% rename from contracts/lib/murky/differential_testing/scripts/package.json rename to lib/murky/differential_testing/scripts/package.json diff --git a/contracts/lib/murky/differential_testing/test/DifferentialTests.t.sol b/lib/murky/differential_testing/test/DifferentialTests.t.sol similarity index 100% rename from contracts/lib/murky/differential_testing/test/DifferentialTests.t.sol rename to lib/murky/differential_testing/test/DifferentialTests.t.sol diff --git a/contracts/lib/murky/differential_testing/test/utils/Strings2.sol b/lib/murky/differential_testing/test/utils/Strings2.sol similarity index 100% rename from contracts/lib/murky/differential_testing/test/utils/Strings2.sol rename to lib/murky/differential_testing/test/utils/Strings2.sol diff --git a/contracts/lib/murky/foundry.toml b/lib/murky/foundry.toml similarity index 100% rename from contracts/lib/murky/foundry.toml rename to lib/murky/foundry.toml diff --git a/contracts/lib/murky/lib/forge-std/.github/workflows/tests.yml b/lib/murky/lib/forge-std/.github/workflows/tests.yml similarity index 100% rename from contracts/lib/murky/lib/forge-std/.github/workflows/tests.yml rename to lib/murky/lib/forge-std/.github/workflows/tests.yml diff --git a/contracts/lib/murky/lib/forge-std/.gitignore b/lib/murky/lib/forge-std/.gitignore similarity index 100% rename from contracts/lib/murky/lib/forge-std/.gitignore rename to lib/murky/lib/forge-std/.gitignore diff --git a/contracts/lib/murky/lib/forge-std/.gitmodules b/lib/murky/lib/forge-std/.gitmodules similarity index 100% rename from contracts/lib/murky/lib/forge-std/.gitmodules rename to lib/murky/lib/forge-std/.gitmodules diff --git a/contracts/lib/murky/lib/forge-std/LICENSE-APACHE b/lib/murky/lib/forge-std/LICENSE-APACHE similarity index 100% rename from contracts/lib/murky/lib/forge-std/LICENSE-APACHE rename to lib/murky/lib/forge-std/LICENSE-APACHE diff --git a/contracts/lib/murky/lib/forge-std/LICENSE-MIT b/lib/murky/lib/forge-std/LICENSE-MIT similarity index 100% rename from contracts/lib/murky/lib/forge-std/LICENSE-MIT rename to lib/murky/lib/forge-std/LICENSE-MIT diff --git a/contracts/lib/murky/lib/forge-std/README.md b/lib/murky/lib/forge-std/README.md similarity index 100% rename from contracts/lib/murky/lib/forge-std/README.md rename to lib/murky/lib/forge-std/README.md diff --git a/contracts/lib/murky/lib/forge-std/lib/ds-test/.gitignore b/lib/murky/lib/forge-std/lib/ds-test/.gitignore similarity index 100% rename from contracts/lib/murky/lib/forge-std/lib/ds-test/.gitignore rename to lib/murky/lib/forge-std/lib/ds-test/.gitignore diff --git a/contracts/lib/murky/lib/forge-std/lib/ds-test/LICENSE b/lib/murky/lib/forge-std/lib/ds-test/LICENSE similarity index 100% rename from contracts/lib/murky/lib/forge-std/lib/ds-test/LICENSE rename to lib/murky/lib/forge-std/lib/ds-test/LICENSE diff --git a/contracts/lib/murky/lib/forge-std/lib/ds-test/Makefile b/lib/murky/lib/forge-std/lib/ds-test/Makefile similarity index 100% rename from contracts/lib/murky/lib/forge-std/lib/ds-test/Makefile rename to lib/murky/lib/forge-std/lib/ds-test/Makefile diff --git a/contracts/lib/murky/lib/forge-std/lib/ds-test/default.nix b/lib/murky/lib/forge-std/lib/ds-test/default.nix similarity index 100% rename from contracts/lib/murky/lib/forge-std/lib/ds-test/default.nix rename to lib/murky/lib/forge-std/lib/ds-test/default.nix diff --git a/contracts/lib/murky/lib/forge-std/lib/ds-test/demo/demo.sol b/lib/murky/lib/forge-std/lib/ds-test/demo/demo.sol similarity index 100% rename from contracts/lib/murky/lib/forge-std/lib/ds-test/demo/demo.sol rename to lib/murky/lib/forge-std/lib/ds-test/demo/demo.sol diff --git a/contracts/lib/murky/lib/forge-std/lib/ds-test/src/test.sol b/lib/murky/lib/forge-std/lib/ds-test/src/test.sol similarity index 100% rename from contracts/lib/murky/lib/forge-std/lib/ds-test/src/test.sol rename to lib/murky/lib/forge-std/lib/ds-test/src/test.sol diff --git a/contracts/lib/murky/lib/forge-std/src/Test.sol b/lib/murky/lib/forge-std/src/Test.sol similarity index 100% rename from contracts/lib/murky/lib/forge-std/src/Test.sol rename to lib/murky/lib/forge-std/src/Test.sol diff --git a/contracts/lib/murky/lib/forge-std/src/Vm.sol b/lib/murky/lib/forge-std/src/Vm.sol similarity index 100% rename from contracts/lib/murky/lib/forge-std/src/Vm.sol rename to lib/murky/lib/forge-std/src/Vm.sol diff --git a/contracts/lib/murky/lib/forge-std/src/console.sol b/lib/murky/lib/forge-std/src/console.sol similarity index 100% rename from contracts/lib/murky/lib/forge-std/src/console.sol rename to lib/murky/lib/forge-std/src/console.sol diff --git a/contracts/lib/murky/lib/forge-std/src/test/StdCheats.t.sol b/lib/murky/lib/forge-std/src/test/StdCheats.t.sol similarity index 100% rename from contracts/lib/murky/lib/forge-std/src/test/StdCheats.t.sol rename to lib/murky/lib/forge-std/src/test/StdCheats.t.sol diff --git a/contracts/lib/murky/lib/forge-std/src/test/StdError.t.sol b/lib/murky/lib/forge-std/src/test/StdError.t.sol similarity index 100% rename from contracts/lib/murky/lib/forge-std/src/test/StdError.t.sol rename to lib/murky/lib/forge-std/src/test/StdError.t.sol diff --git a/contracts/lib/murky/lib/forge-std/src/test/StdStorage.t.sol b/lib/murky/lib/forge-std/src/test/StdStorage.t.sol similarity index 100% rename from contracts/lib/murky/lib/forge-std/src/test/StdStorage.t.sol rename to lib/murky/lib/forge-std/src/test/StdStorage.t.sol diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/.codecov.yml b/lib/murky/lib/openzeppelin-contracts/.codecov.yml similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/.codecov.yml rename to lib/murky/lib/openzeppelin-contracts/.codecov.yml diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/.editorconfig b/lib/murky/lib/openzeppelin-contracts/.editorconfig similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/.editorconfig rename to lib/murky/lib/openzeppelin-contracts/.editorconfig diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/.eslintrc b/lib/murky/lib/openzeppelin-contracts/.eslintrc similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/.eslintrc rename to lib/murky/lib/openzeppelin-contracts/.eslintrc diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/.gitattributes b/lib/murky/lib/openzeppelin-contracts/.gitattributes similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/.gitattributes rename to lib/murky/lib/openzeppelin-contracts/.gitattributes diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/.github/ISSUE_TEMPLATE/bug_report.md b/lib/murky/lib/openzeppelin-contracts/.github/ISSUE_TEMPLATE/bug_report.md similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/.github/ISSUE_TEMPLATE/bug_report.md rename to lib/murky/lib/openzeppelin-contracts/.github/ISSUE_TEMPLATE/bug_report.md diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/.github/ISSUE_TEMPLATE/config.yml b/lib/murky/lib/openzeppelin-contracts/.github/ISSUE_TEMPLATE/config.yml similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/.github/ISSUE_TEMPLATE/config.yml rename to lib/murky/lib/openzeppelin-contracts/.github/ISSUE_TEMPLATE/config.yml diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/.github/ISSUE_TEMPLATE/feature_request.md b/lib/murky/lib/openzeppelin-contracts/.github/ISSUE_TEMPLATE/feature_request.md similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/.github/ISSUE_TEMPLATE/feature_request.md rename to lib/murky/lib/openzeppelin-contracts/.github/ISSUE_TEMPLATE/feature_request.md diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/.github/PULL_REQUEST_TEMPLATE.md b/lib/murky/lib/openzeppelin-contracts/.github/PULL_REQUEST_TEMPLATE.md similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/.github/PULL_REQUEST_TEMPLATE.md rename to lib/murky/lib/openzeppelin-contracts/.github/PULL_REQUEST_TEMPLATE.md diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/.github/workflows/docs.yml b/lib/murky/lib/openzeppelin-contracts/.github/workflows/docs.yml similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/.github/workflows/docs.yml rename to lib/murky/lib/openzeppelin-contracts/.github/workflows/docs.yml diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/.github/workflows/slither.yml b/lib/murky/lib/openzeppelin-contracts/.github/workflows/slither.yml similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/.github/workflows/slither.yml rename to lib/murky/lib/openzeppelin-contracts/.github/workflows/slither.yml diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/.github/workflows/test.yml b/lib/murky/lib/openzeppelin-contracts/.github/workflows/test.yml similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/.github/workflows/test.yml rename to lib/murky/lib/openzeppelin-contracts/.github/workflows/test.yml diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/.github/workflows/upgradeable.yml b/lib/murky/lib/openzeppelin-contracts/.github/workflows/upgradeable.yml similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/.github/workflows/upgradeable.yml rename to lib/murky/lib/openzeppelin-contracts/.github/workflows/upgradeable.yml diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/.gitignore b/lib/murky/lib/openzeppelin-contracts/.gitignore similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/.gitignore rename to lib/murky/lib/openzeppelin-contracts/.gitignore diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/.mocharc.js b/lib/murky/lib/openzeppelin-contracts/.mocharc.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/.mocharc.js rename to lib/murky/lib/openzeppelin-contracts/.mocharc.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/.prettierrc b/lib/murky/lib/openzeppelin-contracts/.prettierrc similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/.prettierrc rename to lib/murky/lib/openzeppelin-contracts/.prettierrc diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/.solcover.js b/lib/murky/lib/openzeppelin-contracts/.solcover.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/.solcover.js rename to lib/murky/lib/openzeppelin-contracts/.solcover.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/.solhint.json b/lib/murky/lib/openzeppelin-contracts/.solhint.json similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/.solhint.json rename to lib/murky/lib/openzeppelin-contracts/.solhint.json diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/CHANGELOG.md b/lib/murky/lib/openzeppelin-contracts/CHANGELOG.md similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/CHANGELOG.md rename to lib/murky/lib/openzeppelin-contracts/CHANGELOG.md diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/CODE_OF_CONDUCT.md b/lib/murky/lib/openzeppelin-contracts/CODE_OF_CONDUCT.md similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/CODE_OF_CONDUCT.md rename to lib/murky/lib/openzeppelin-contracts/CODE_OF_CONDUCT.md diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/CONTRIBUTING.md b/lib/murky/lib/openzeppelin-contracts/CONTRIBUTING.md similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/CONTRIBUTING.md rename to lib/murky/lib/openzeppelin-contracts/CONTRIBUTING.md diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/DOCUMENTATION.md b/lib/murky/lib/openzeppelin-contracts/DOCUMENTATION.md similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/DOCUMENTATION.md rename to lib/murky/lib/openzeppelin-contracts/DOCUMENTATION.md diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/GUIDELINES.md b/lib/murky/lib/openzeppelin-contracts/GUIDELINES.md similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/GUIDELINES.md rename to lib/murky/lib/openzeppelin-contracts/GUIDELINES.md diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/LICENSE b/lib/murky/lib/openzeppelin-contracts/LICENSE similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/LICENSE rename to lib/murky/lib/openzeppelin-contracts/LICENSE diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/README.md b/lib/murky/lib/openzeppelin-contracts/README.md similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/README.md rename to lib/murky/lib/openzeppelin-contracts/README.md diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/RELEASING.md b/lib/murky/lib/openzeppelin-contracts/RELEASING.md similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/RELEASING.md rename to lib/murky/lib/openzeppelin-contracts/RELEASING.md diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/SECURITY.md b/lib/murky/lib/openzeppelin-contracts/SECURITY.md similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/SECURITY.md rename to lib/murky/lib/openzeppelin-contracts/SECURITY.md diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/audit/2017-03.md b/lib/murky/lib/openzeppelin-contracts/audit/2017-03.md similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/audit/2017-03.md rename to lib/murky/lib/openzeppelin-contracts/audit/2017-03.md diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/audit/2018-10.pdf b/lib/murky/lib/openzeppelin-contracts/audit/2018-10.pdf similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/audit/2018-10.pdf rename to lib/murky/lib/openzeppelin-contracts/audit/2018-10.pdf diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/certora/Makefile b/lib/murky/lib/openzeppelin-contracts/certora/Makefile similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/certora/Makefile rename to lib/murky/lib/openzeppelin-contracts/certora/Makefile diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/certora/README.md b/lib/murky/lib/openzeppelin-contracts/certora/README.md similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/certora/README.md rename to lib/murky/lib/openzeppelin-contracts/certora/README.md diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/certora/applyHarness.patch b/lib/murky/lib/openzeppelin-contracts/certora/applyHarness.patch similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/certora/applyHarness.patch rename to lib/murky/lib/openzeppelin-contracts/certora/applyHarness.patch diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/certora/harnesses/ERC20VotesHarness.sol b/lib/murky/lib/openzeppelin-contracts/certora/harnesses/ERC20VotesHarness.sol similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/certora/harnesses/ERC20VotesHarness.sol rename to lib/murky/lib/openzeppelin-contracts/certora/harnesses/ERC20VotesHarness.sol diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/certora/harnesses/WizardControlFirstPriority.sol b/lib/murky/lib/openzeppelin-contracts/certora/harnesses/WizardControlFirstPriority.sol similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/certora/harnesses/WizardControlFirstPriority.sol rename to lib/murky/lib/openzeppelin-contracts/certora/harnesses/WizardControlFirstPriority.sol diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/certora/harnesses/WizardFirstTry.sol b/lib/murky/lib/openzeppelin-contracts/certora/harnesses/WizardFirstTry.sol similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/certora/harnesses/WizardFirstTry.sol rename to lib/murky/lib/openzeppelin-contracts/certora/harnesses/WizardFirstTry.sol diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/certora/munged/.gitignore b/lib/murky/lib/openzeppelin-contracts/certora/munged/.gitignore similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/certora/munged/.gitignore rename to lib/murky/lib/openzeppelin-contracts/certora/munged/.gitignore diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/certora/scripts/Governor.sh b/lib/murky/lib/openzeppelin-contracts/certora/scripts/Governor.sh similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/certora/scripts/Governor.sh rename to lib/murky/lib/openzeppelin-contracts/certora/scripts/Governor.sh diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/certora/scripts/GovernorCountingSimple-counting.sh b/lib/murky/lib/openzeppelin-contracts/certora/scripts/GovernorCountingSimple-counting.sh similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/certora/scripts/GovernorCountingSimple-counting.sh rename to lib/murky/lib/openzeppelin-contracts/certora/scripts/GovernorCountingSimple-counting.sh diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/certora/scripts/WizardControlFirstPriority.sh b/lib/murky/lib/openzeppelin-contracts/certora/scripts/WizardControlFirstPriority.sh similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/certora/scripts/WizardControlFirstPriority.sh rename to lib/murky/lib/openzeppelin-contracts/certora/scripts/WizardControlFirstPriority.sh diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/certora/scripts/WizardFirstTry.sh b/lib/murky/lib/openzeppelin-contracts/certora/scripts/WizardFirstTry.sh similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/certora/scripts/WizardFirstTry.sh rename to lib/murky/lib/openzeppelin-contracts/certora/scripts/WizardFirstTry.sh diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/certora/scripts/sanity.sh b/lib/murky/lib/openzeppelin-contracts/certora/scripts/sanity.sh similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/certora/scripts/sanity.sh rename to lib/murky/lib/openzeppelin-contracts/certora/scripts/sanity.sh diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/certora/scripts/verifyAll.sh b/lib/murky/lib/openzeppelin-contracts/certora/scripts/verifyAll.sh similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/certora/scripts/verifyAll.sh rename to lib/murky/lib/openzeppelin-contracts/certora/scripts/verifyAll.sh diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/certora/specs/GovernorBase.spec b/lib/murky/lib/openzeppelin-contracts/certora/specs/GovernorBase.spec similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/certora/specs/GovernorBase.spec rename to lib/murky/lib/openzeppelin-contracts/certora/specs/GovernorBase.spec diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/certora/specs/GovernorCountingSimple.spec b/lib/murky/lib/openzeppelin-contracts/certora/specs/GovernorCountingSimple.spec similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/certora/specs/GovernorCountingSimple.spec rename to lib/murky/lib/openzeppelin-contracts/certora/specs/GovernorCountingSimple.spec diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/certora/specs/RulesInProgress.spec b/lib/murky/lib/openzeppelin-contracts/certora/specs/RulesInProgress.spec similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/certora/specs/RulesInProgress.spec rename to lib/murky/lib/openzeppelin-contracts/certora/specs/RulesInProgress.spec diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/certora/specs/sanity.spec b/lib/murky/lib/openzeppelin-contracts/certora/specs/sanity.spec similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/certora/specs/sanity.spec rename to lib/murky/lib/openzeppelin-contracts/certora/specs/sanity.spec diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/docs/antora.yml b/lib/murky/lib/openzeppelin-contracts/docs/antora.yml similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/docs/antora.yml rename to lib/murky/lib/openzeppelin-contracts/docs/antora.yml diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/docs/contract.hbs b/lib/murky/lib/openzeppelin-contracts/docs/contract.hbs similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/docs/contract.hbs rename to lib/murky/lib/openzeppelin-contracts/docs/contract.hbs diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/docs/helpers.js b/lib/murky/lib/openzeppelin-contracts/docs/helpers.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/docs/helpers.js rename to lib/murky/lib/openzeppelin-contracts/docs/helpers.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/images/tally-admin.png b/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/images/tally-admin.png similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/images/tally-admin.png rename to lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/images/tally-admin.png diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/images/tally-vote.png b/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/images/tally-vote.png similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/images/tally-vote.png rename to lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/images/tally-vote.png diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/nav.adoc b/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/nav.adoc similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/nav.adoc rename to lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/nav.adoc diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/access-control.adoc b/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/access-control.adoc similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/access-control.adoc rename to lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/access-control.adoc diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/crowdsales.adoc b/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/crowdsales.adoc similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/crowdsales.adoc rename to lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/crowdsales.adoc diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/drafts.adoc b/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/drafts.adoc similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/drafts.adoc rename to lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/drafts.adoc diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc1155.adoc b/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc1155.adoc similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc1155.adoc rename to lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc1155.adoc diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc20-supply.adoc b/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc20-supply.adoc similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc20-supply.adoc rename to lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc20-supply.adoc diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc20.adoc b/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc20.adoc similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc20.adoc rename to lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc20.adoc diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc721.adoc b/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc721.adoc similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc721.adoc rename to lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc721.adoc diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc777.adoc b/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc777.adoc similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc777.adoc rename to lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/erc777.adoc diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/extending-contracts.adoc b/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/extending-contracts.adoc similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/extending-contracts.adoc rename to lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/extending-contracts.adoc diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/governance.adoc b/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/governance.adoc similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/governance.adoc rename to lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/governance.adoc diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/index.adoc b/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/index.adoc similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/index.adoc rename to lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/index.adoc diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/releases-stability.adoc b/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/releases-stability.adoc similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/releases-stability.adoc rename to lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/releases-stability.adoc diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/tokens.adoc b/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/tokens.adoc similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/tokens.adoc rename to lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/tokens.adoc diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/upgradeable.adoc b/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/upgradeable.adoc similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/upgradeable.adoc rename to lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/upgradeable.adoc diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/utilities.adoc b/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/utilities.adoc similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/utilities.adoc rename to lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/utilities.adoc diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/wizard.adoc b/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/wizard.adoc similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/wizard.adoc rename to lib/murky/lib/openzeppelin-contracts/docs/modules/ROOT/pages/wizard.adoc diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/docs/prelude.hbs b/lib/murky/lib/openzeppelin-contracts/docs/prelude.hbs similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/docs/prelude.hbs rename to lib/murky/lib/openzeppelin-contracts/docs/prelude.hbs diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/hardhat.config.js b/lib/murky/lib/openzeppelin-contracts/hardhat.config.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/hardhat.config.js rename to lib/murky/lib/openzeppelin-contracts/hardhat.config.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/hardhat/env-contract.js b/lib/murky/lib/openzeppelin-contracts/hardhat/env-contract.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/hardhat/env-contract.js rename to lib/murky/lib/openzeppelin-contracts/hardhat/env-contract.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/logo.svg b/lib/murky/lib/openzeppelin-contracts/logo.svg similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/logo.svg rename to lib/murky/lib/openzeppelin-contracts/logo.svg diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/migrations/.gitkeep b/lib/murky/lib/openzeppelin-contracts/migrations/.gitkeep similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/migrations/.gitkeep rename to lib/murky/lib/openzeppelin-contracts/migrations/.gitkeep diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/netlify.toml b/lib/murky/lib/openzeppelin-contracts/netlify.toml similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/netlify.toml rename to lib/murky/lib/openzeppelin-contracts/netlify.toml diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/package-lock.json b/lib/murky/lib/openzeppelin-contracts/package-lock.json similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/package-lock.json rename to lib/murky/lib/openzeppelin-contracts/package-lock.json diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/package.json b/lib/murky/lib/openzeppelin-contracts/package.json similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/package.json rename to lib/murky/lib/openzeppelin-contracts/package.json diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/renovate.json b/lib/murky/lib/openzeppelin-contracts/renovate.json similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/renovate.json rename to lib/murky/lib/openzeppelin-contracts/renovate.json diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/scripts/gen-nav.js b/lib/murky/lib/openzeppelin-contracts/scripts/gen-nav.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/scripts/gen-nav.js rename to lib/murky/lib/openzeppelin-contracts/scripts/gen-nav.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/scripts/git-user-config.sh b/lib/murky/lib/openzeppelin-contracts/scripts/git-user-config.sh similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/scripts/git-user-config.sh rename to lib/murky/lib/openzeppelin-contracts/scripts/git-user-config.sh diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/scripts/inheritanceOrdering.js b/lib/murky/lib/openzeppelin-contracts/scripts/inheritanceOrdering.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/scripts/inheritanceOrdering.js rename to lib/murky/lib/openzeppelin-contracts/scripts/inheritanceOrdering.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/scripts/migrate-imports.js b/lib/murky/lib/openzeppelin-contracts/scripts/migrate-imports.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/scripts/migrate-imports.js rename to lib/murky/lib/openzeppelin-contracts/scripts/migrate-imports.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/scripts/prepack.sh b/lib/murky/lib/openzeppelin-contracts/scripts/prepack.sh similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/scripts/prepack.sh rename to lib/murky/lib/openzeppelin-contracts/scripts/prepack.sh diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/scripts/prepare-contracts-package.sh b/lib/murky/lib/openzeppelin-contracts/scripts/prepare-contracts-package.sh similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/scripts/prepare-contracts-package.sh rename to lib/murky/lib/openzeppelin-contracts/scripts/prepare-contracts-package.sh diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/scripts/prepare-docs-solc.js b/lib/murky/lib/openzeppelin-contracts/scripts/prepare-docs-solc.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/scripts/prepare-docs-solc.js rename to lib/murky/lib/openzeppelin-contracts/scripts/prepare-docs-solc.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/scripts/prepare-docs.sh b/lib/murky/lib/openzeppelin-contracts/scripts/prepare-docs.sh similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/scripts/prepare-docs.sh rename to lib/murky/lib/openzeppelin-contracts/scripts/prepare-docs.sh diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/scripts/release/release.sh b/lib/murky/lib/openzeppelin-contracts/scripts/release/release.sh similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/scripts/release/release.sh rename to lib/murky/lib/openzeppelin-contracts/scripts/release/release.sh diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/scripts/release/synchronize-versions.js b/lib/murky/lib/openzeppelin-contracts/scripts/release/synchronize-versions.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/scripts/release/synchronize-versions.js rename to lib/murky/lib/openzeppelin-contracts/scripts/release/synchronize-versions.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/scripts/release/update-changelog-release-date.js b/lib/murky/lib/openzeppelin-contracts/scripts/release/update-changelog-release-date.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/scripts/release/update-changelog-release-date.js rename to lib/murky/lib/openzeppelin-contracts/scripts/release/update-changelog-release-date.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/scripts/release/update-comment.js b/lib/murky/lib/openzeppelin-contracts/scripts/release/update-comment.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/scripts/release/update-comment.js rename to lib/murky/lib/openzeppelin-contracts/scripts/release/update-comment.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/scripts/release/version.sh b/lib/murky/lib/openzeppelin-contracts/scripts/release/version.sh similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/scripts/release/version.sh rename to lib/murky/lib/openzeppelin-contracts/scripts/release/version.sh diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/scripts/remove-ignored-artifacts.js b/lib/murky/lib/openzeppelin-contracts/scripts/remove-ignored-artifacts.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/scripts/remove-ignored-artifacts.js rename to lib/murky/lib/openzeppelin-contracts/scripts/remove-ignored-artifacts.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/scripts/update-docs-branch.js b/lib/murky/lib/openzeppelin-contracts/scripts/update-docs-branch.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/scripts/update-docs-branch.js rename to lib/murky/lib/openzeppelin-contracts/scripts/update-docs-branch.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/slither.config.json b/lib/murky/lib/openzeppelin-contracts/slither.config.json similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/slither.config.json rename to lib/murky/lib/openzeppelin-contracts/slither.config.json diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/TESTING.md b/lib/murky/lib/openzeppelin-contracts/test/TESTING.md similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/TESTING.md rename to lib/murky/lib/openzeppelin-contracts/test/TESTING.md diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/access/AccessControl.behavior.js b/lib/murky/lib/openzeppelin-contracts/test/access/AccessControl.behavior.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/access/AccessControl.behavior.js rename to lib/murky/lib/openzeppelin-contracts/test/access/AccessControl.behavior.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/access/AccessControl.test.js b/lib/murky/lib/openzeppelin-contracts/test/access/AccessControl.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/access/AccessControl.test.js rename to lib/murky/lib/openzeppelin-contracts/test/access/AccessControl.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/access/AccessControlCrossChain.test.js b/lib/murky/lib/openzeppelin-contracts/test/access/AccessControlCrossChain.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/access/AccessControlCrossChain.test.js rename to lib/murky/lib/openzeppelin-contracts/test/access/AccessControlCrossChain.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/access/AccessControlEnumerable.test.js b/lib/murky/lib/openzeppelin-contracts/test/access/AccessControlEnumerable.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/access/AccessControlEnumerable.test.js rename to lib/murky/lib/openzeppelin-contracts/test/access/AccessControlEnumerable.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/access/Ownable.test.js b/lib/murky/lib/openzeppelin-contracts/test/access/Ownable.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/access/Ownable.test.js rename to lib/murky/lib/openzeppelin-contracts/test/access/Ownable.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/crosschain/CrossChainEnabled.test.js b/lib/murky/lib/openzeppelin-contracts/test/crosschain/CrossChainEnabled.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/crosschain/CrossChainEnabled.test.js rename to lib/murky/lib/openzeppelin-contracts/test/crosschain/CrossChainEnabled.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/finance/PaymentSplitter.test.js b/lib/murky/lib/openzeppelin-contracts/test/finance/PaymentSplitter.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/finance/PaymentSplitter.test.js rename to lib/murky/lib/openzeppelin-contracts/test/finance/PaymentSplitter.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/finance/VestingWallet.behavior.js b/lib/murky/lib/openzeppelin-contracts/test/finance/VestingWallet.behavior.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/finance/VestingWallet.behavior.js rename to lib/murky/lib/openzeppelin-contracts/test/finance/VestingWallet.behavior.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/finance/VestingWallet.test.js b/lib/murky/lib/openzeppelin-contracts/test/finance/VestingWallet.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/finance/VestingWallet.test.js rename to lib/murky/lib/openzeppelin-contracts/test/finance/VestingWallet.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/governance/Governor.test.js b/lib/murky/lib/openzeppelin-contracts/test/governance/Governor.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/governance/Governor.test.js rename to lib/murky/lib/openzeppelin-contracts/test/governance/Governor.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/governance/TimelockController.test.js b/lib/murky/lib/openzeppelin-contracts/test/governance/TimelockController.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/governance/TimelockController.test.js rename to lib/murky/lib/openzeppelin-contracts/test/governance/TimelockController.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/governance/compatibility/GovernorCompatibilityBravo.test.js b/lib/murky/lib/openzeppelin-contracts/test/governance/compatibility/GovernorCompatibilityBravo.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/governance/compatibility/GovernorCompatibilityBravo.test.js rename to lib/murky/lib/openzeppelin-contracts/test/governance/compatibility/GovernorCompatibilityBravo.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/governance/extensions/GovernorComp.test.js b/lib/murky/lib/openzeppelin-contracts/test/governance/extensions/GovernorComp.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/governance/extensions/GovernorComp.test.js rename to lib/murky/lib/openzeppelin-contracts/test/governance/extensions/GovernorComp.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/governance/extensions/GovernorERC721.test.js b/lib/murky/lib/openzeppelin-contracts/test/governance/extensions/GovernorERC721.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/governance/extensions/GovernorERC721.test.js rename to lib/murky/lib/openzeppelin-contracts/test/governance/extensions/GovernorERC721.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/governance/extensions/GovernorPreventLateQuorum.test.js b/lib/murky/lib/openzeppelin-contracts/test/governance/extensions/GovernorPreventLateQuorum.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/governance/extensions/GovernorPreventLateQuorum.test.js rename to lib/murky/lib/openzeppelin-contracts/test/governance/extensions/GovernorPreventLateQuorum.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/governance/extensions/GovernorTimelockCompound.test.js b/lib/murky/lib/openzeppelin-contracts/test/governance/extensions/GovernorTimelockCompound.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/governance/extensions/GovernorTimelockCompound.test.js rename to lib/murky/lib/openzeppelin-contracts/test/governance/extensions/GovernorTimelockCompound.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/governance/extensions/GovernorTimelockControl.test.js b/lib/murky/lib/openzeppelin-contracts/test/governance/extensions/GovernorTimelockControl.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/governance/extensions/GovernorTimelockControl.test.js rename to lib/murky/lib/openzeppelin-contracts/test/governance/extensions/GovernorTimelockControl.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/governance/extensions/GovernorWeightQuorumFraction.test.js b/lib/murky/lib/openzeppelin-contracts/test/governance/extensions/GovernorWeightQuorumFraction.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/governance/extensions/GovernorWeightQuorumFraction.test.js rename to lib/murky/lib/openzeppelin-contracts/test/governance/extensions/GovernorWeightQuorumFraction.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/governance/extensions/GovernorWithParams.test.js b/lib/murky/lib/openzeppelin-contracts/test/governance/extensions/GovernorWithParams.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/governance/extensions/GovernorWithParams.test.js rename to lib/murky/lib/openzeppelin-contracts/test/governance/extensions/GovernorWithParams.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/governance/utils/Votes.behavior.js b/lib/murky/lib/openzeppelin-contracts/test/governance/utils/Votes.behavior.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/governance/utils/Votes.behavior.js rename to lib/murky/lib/openzeppelin-contracts/test/governance/utils/Votes.behavior.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/governance/utils/Votes.test.js b/lib/murky/lib/openzeppelin-contracts/test/governance/utils/Votes.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/governance/utils/Votes.test.js rename to lib/murky/lib/openzeppelin-contracts/test/governance/utils/Votes.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/helpers/crosschain.js b/lib/murky/lib/openzeppelin-contracts/test/helpers/crosschain.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/helpers/crosschain.js rename to lib/murky/lib/openzeppelin-contracts/test/helpers/crosschain.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/helpers/customError.js b/lib/murky/lib/openzeppelin-contracts/test/helpers/customError.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/helpers/customError.js rename to lib/murky/lib/openzeppelin-contracts/test/helpers/customError.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/helpers/eip712.js b/lib/murky/lib/openzeppelin-contracts/test/helpers/eip712.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/helpers/eip712.js rename to lib/murky/lib/openzeppelin-contracts/test/helpers/eip712.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/helpers/enums.js b/lib/murky/lib/openzeppelin-contracts/test/helpers/enums.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/helpers/enums.js rename to lib/murky/lib/openzeppelin-contracts/test/helpers/enums.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/helpers/erc1967.js b/lib/murky/lib/openzeppelin-contracts/test/helpers/erc1967.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/helpers/erc1967.js rename to lib/murky/lib/openzeppelin-contracts/test/helpers/erc1967.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/helpers/governance.js b/lib/murky/lib/openzeppelin-contracts/test/helpers/governance.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/helpers/governance.js rename to lib/murky/lib/openzeppelin-contracts/test/helpers/governance.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/helpers/sign.js b/lib/murky/lib/openzeppelin-contracts/test/helpers/sign.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/helpers/sign.js rename to lib/murky/lib/openzeppelin-contracts/test/helpers/sign.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/metatx/ERC2771Context.test.js b/lib/murky/lib/openzeppelin-contracts/test/metatx/ERC2771Context.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/metatx/ERC2771Context.test.js rename to lib/murky/lib/openzeppelin-contracts/test/metatx/ERC2771Context.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/metatx/MinimalForwarder.test.js b/lib/murky/lib/openzeppelin-contracts/test/metatx/MinimalForwarder.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/metatx/MinimalForwarder.test.js rename to lib/murky/lib/openzeppelin-contracts/test/metatx/MinimalForwarder.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/migrate-imports.test.js b/lib/murky/lib/openzeppelin-contracts/test/migrate-imports.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/migrate-imports.test.js rename to lib/murky/lib/openzeppelin-contracts/test/migrate-imports.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/proxy/Clones.behaviour.js b/lib/murky/lib/openzeppelin-contracts/test/proxy/Clones.behaviour.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/proxy/Clones.behaviour.js rename to lib/murky/lib/openzeppelin-contracts/test/proxy/Clones.behaviour.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/proxy/Clones.test.js b/lib/murky/lib/openzeppelin-contracts/test/proxy/Clones.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/proxy/Clones.test.js rename to lib/murky/lib/openzeppelin-contracts/test/proxy/Clones.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/proxy/ERC1967/ERC1967Proxy.test.js b/lib/murky/lib/openzeppelin-contracts/test/proxy/ERC1967/ERC1967Proxy.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/proxy/ERC1967/ERC1967Proxy.test.js rename to lib/murky/lib/openzeppelin-contracts/test/proxy/ERC1967/ERC1967Proxy.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/proxy/Proxy.behaviour.js b/lib/murky/lib/openzeppelin-contracts/test/proxy/Proxy.behaviour.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/proxy/Proxy.behaviour.js rename to lib/murky/lib/openzeppelin-contracts/test/proxy/Proxy.behaviour.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/proxy/beacon/BeaconProxy.test.js b/lib/murky/lib/openzeppelin-contracts/test/proxy/beacon/BeaconProxy.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/proxy/beacon/BeaconProxy.test.js rename to lib/murky/lib/openzeppelin-contracts/test/proxy/beacon/BeaconProxy.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/proxy/beacon/UpgradeableBeacon.test.js b/lib/murky/lib/openzeppelin-contracts/test/proxy/beacon/UpgradeableBeacon.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/proxy/beacon/UpgradeableBeacon.test.js rename to lib/murky/lib/openzeppelin-contracts/test/proxy/beacon/UpgradeableBeacon.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/proxy/transparent/ProxyAdmin.test.js b/lib/murky/lib/openzeppelin-contracts/test/proxy/transparent/ProxyAdmin.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/proxy/transparent/ProxyAdmin.test.js rename to lib/murky/lib/openzeppelin-contracts/test/proxy/transparent/ProxyAdmin.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/proxy/transparent/TransparentUpgradeableProxy.behaviour.js b/lib/murky/lib/openzeppelin-contracts/test/proxy/transparent/TransparentUpgradeableProxy.behaviour.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/proxy/transparent/TransparentUpgradeableProxy.behaviour.js rename to lib/murky/lib/openzeppelin-contracts/test/proxy/transparent/TransparentUpgradeableProxy.behaviour.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/proxy/transparent/TransparentUpgradeableProxy.test.js b/lib/murky/lib/openzeppelin-contracts/test/proxy/transparent/TransparentUpgradeableProxy.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/proxy/transparent/TransparentUpgradeableProxy.test.js rename to lib/murky/lib/openzeppelin-contracts/test/proxy/transparent/TransparentUpgradeableProxy.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/proxy/utils/Initializable.test.js b/lib/murky/lib/openzeppelin-contracts/test/proxy/utils/Initializable.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/proxy/utils/Initializable.test.js rename to lib/murky/lib/openzeppelin-contracts/test/proxy/utils/Initializable.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/proxy/utils/UUPSUpgradeable.test.js b/lib/murky/lib/openzeppelin-contracts/test/proxy/utils/UUPSUpgradeable.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/proxy/utils/UUPSUpgradeable.test.js rename to lib/murky/lib/openzeppelin-contracts/test/proxy/utils/UUPSUpgradeable.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/security/Pausable.test.js b/lib/murky/lib/openzeppelin-contracts/test/security/Pausable.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/security/Pausable.test.js rename to lib/murky/lib/openzeppelin-contracts/test/security/Pausable.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/security/PullPayment.test.js b/lib/murky/lib/openzeppelin-contracts/test/security/PullPayment.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/security/PullPayment.test.js rename to lib/murky/lib/openzeppelin-contracts/test/security/PullPayment.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/security/ReentrancyGuard.test.js b/lib/murky/lib/openzeppelin-contracts/test/security/ReentrancyGuard.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/security/ReentrancyGuard.test.js rename to lib/murky/lib/openzeppelin-contracts/test/security/ReentrancyGuard.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC1155/ERC1155.behavior.js b/lib/murky/lib/openzeppelin-contracts/test/token/ERC1155/ERC1155.behavior.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC1155/ERC1155.behavior.js rename to lib/murky/lib/openzeppelin-contracts/test/token/ERC1155/ERC1155.behavior.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC1155/ERC1155.test.js b/lib/murky/lib/openzeppelin-contracts/test/token/ERC1155/ERC1155.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC1155/ERC1155.test.js rename to lib/murky/lib/openzeppelin-contracts/test/token/ERC1155/ERC1155.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC1155/extensions/ERC1155Burnable.test.js b/lib/murky/lib/openzeppelin-contracts/test/token/ERC1155/extensions/ERC1155Burnable.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC1155/extensions/ERC1155Burnable.test.js rename to lib/murky/lib/openzeppelin-contracts/test/token/ERC1155/extensions/ERC1155Burnable.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC1155/extensions/ERC1155Pausable.test.js b/lib/murky/lib/openzeppelin-contracts/test/token/ERC1155/extensions/ERC1155Pausable.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC1155/extensions/ERC1155Pausable.test.js rename to lib/murky/lib/openzeppelin-contracts/test/token/ERC1155/extensions/ERC1155Pausable.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC1155/extensions/ERC1155Supply.test.js b/lib/murky/lib/openzeppelin-contracts/test/token/ERC1155/extensions/ERC1155Supply.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC1155/extensions/ERC1155Supply.test.js rename to lib/murky/lib/openzeppelin-contracts/test/token/ERC1155/extensions/ERC1155Supply.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC1155/extensions/ERC1155URIStorage.test.js b/lib/murky/lib/openzeppelin-contracts/test/token/ERC1155/extensions/ERC1155URIStorage.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC1155/extensions/ERC1155URIStorage.test.js rename to lib/murky/lib/openzeppelin-contracts/test/token/ERC1155/extensions/ERC1155URIStorage.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC1155/presets/ERC1155PresetMinterPauser.test.js b/lib/murky/lib/openzeppelin-contracts/test/token/ERC1155/presets/ERC1155PresetMinterPauser.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC1155/presets/ERC1155PresetMinterPauser.test.js rename to lib/murky/lib/openzeppelin-contracts/test/token/ERC1155/presets/ERC1155PresetMinterPauser.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC1155/utils/ERC1155Holder.test.js b/lib/murky/lib/openzeppelin-contracts/test/token/ERC1155/utils/ERC1155Holder.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC1155/utils/ERC1155Holder.test.js rename to lib/murky/lib/openzeppelin-contracts/test/token/ERC1155/utils/ERC1155Holder.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/ERC20.behavior.js b/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/ERC20.behavior.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/ERC20.behavior.js rename to lib/murky/lib/openzeppelin-contracts/test/token/ERC20/ERC20.behavior.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/ERC20.test.js b/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/ERC20.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/ERC20.test.js rename to lib/murky/lib/openzeppelin-contracts/test/token/ERC20/ERC20.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Burnable.behavior.js b/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Burnable.behavior.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Burnable.behavior.js rename to lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Burnable.behavior.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Burnable.test.js b/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Burnable.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Burnable.test.js rename to lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Burnable.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Capped.behavior.js b/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Capped.behavior.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Capped.behavior.js rename to lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Capped.behavior.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Capped.test.js b/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Capped.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Capped.test.js rename to lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Capped.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20FlashMint.test.js b/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20FlashMint.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20FlashMint.test.js rename to lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20FlashMint.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Pausable.test.js b/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Pausable.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Pausable.test.js rename to lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Pausable.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Snapshot.test.js b/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Snapshot.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Snapshot.test.js rename to lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Snapshot.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Votes.test.js b/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Votes.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Votes.test.js rename to lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Votes.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20VotesComp.test.js b/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20VotesComp.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20VotesComp.test.js rename to lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20VotesComp.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Wrapper.test.js b/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Wrapper.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Wrapper.test.js rename to lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC20Wrapper.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/draft-ERC20Permit.test.js b/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/draft-ERC20Permit.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/draft-ERC20Permit.test.js rename to lib/murky/lib/openzeppelin-contracts/test/token/ERC20/extensions/draft-ERC20Permit.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/presets/ERC20PresetFixedSupply.test.js b/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/presets/ERC20PresetFixedSupply.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/presets/ERC20PresetFixedSupply.test.js rename to lib/murky/lib/openzeppelin-contracts/test/token/ERC20/presets/ERC20PresetFixedSupply.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/presets/ERC20PresetMinterPauser.test.js b/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/presets/ERC20PresetMinterPauser.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/presets/ERC20PresetMinterPauser.test.js rename to lib/murky/lib/openzeppelin-contracts/test/token/ERC20/presets/ERC20PresetMinterPauser.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/utils/SafeERC20.test.js b/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/utils/SafeERC20.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/utils/SafeERC20.test.js rename to lib/murky/lib/openzeppelin-contracts/test/token/ERC20/utils/SafeERC20.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/utils/TokenTimelock.test.js b/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/utils/TokenTimelock.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC20/utils/TokenTimelock.test.js rename to lib/murky/lib/openzeppelin-contracts/test/token/ERC20/utils/TokenTimelock.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC721/ERC721.behavior.js b/lib/murky/lib/openzeppelin-contracts/test/token/ERC721/ERC721.behavior.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC721/ERC721.behavior.js rename to lib/murky/lib/openzeppelin-contracts/test/token/ERC721/ERC721.behavior.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC721/ERC721.test.js b/lib/murky/lib/openzeppelin-contracts/test/token/ERC721/ERC721.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC721/ERC721.test.js rename to lib/murky/lib/openzeppelin-contracts/test/token/ERC721/ERC721.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC721/ERC721Enumerable.test.js b/lib/murky/lib/openzeppelin-contracts/test/token/ERC721/ERC721Enumerable.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC721/ERC721Enumerable.test.js rename to lib/murky/lib/openzeppelin-contracts/test/token/ERC721/ERC721Enumerable.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Burnable.test.js b/lib/murky/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Burnable.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Burnable.test.js rename to lib/murky/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Burnable.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Pausable.test.js b/lib/murky/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Pausable.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Pausable.test.js rename to lib/murky/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Pausable.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Royalty.test.js b/lib/murky/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Royalty.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Royalty.test.js rename to lib/murky/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Royalty.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721URIStorage.test.js b/lib/murky/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721URIStorage.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721URIStorage.test.js rename to lib/murky/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721URIStorage.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Votes.test.js b/lib/murky/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Votes.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Votes.test.js rename to lib/murky/lib/openzeppelin-contracts/test/token/ERC721/extensions/ERC721Votes.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC721/presets/ERC721PresetMinterPauserAutoId.test.js b/lib/murky/lib/openzeppelin-contracts/test/token/ERC721/presets/ERC721PresetMinterPauserAutoId.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC721/presets/ERC721PresetMinterPauserAutoId.test.js rename to lib/murky/lib/openzeppelin-contracts/test/token/ERC721/presets/ERC721PresetMinterPauserAutoId.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC721/utils/ERC721Holder.test.js b/lib/murky/lib/openzeppelin-contracts/test/token/ERC721/utils/ERC721Holder.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC721/utils/ERC721Holder.test.js rename to lib/murky/lib/openzeppelin-contracts/test/token/ERC721/utils/ERC721Holder.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC777/ERC777.behavior.js b/lib/murky/lib/openzeppelin-contracts/test/token/ERC777/ERC777.behavior.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC777/ERC777.behavior.js rename to lib/murky/lib/openzeppelin-contracts/test/token/ERC777/ERC777.behavior.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC777/ERC777.test.js b/lib/murky/lib/openzeppelin-contracts/test/token/ERC777/ERC777.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC777/ERC777.test.js rename to lib/murky/lib/openzeppelin-contracts/test/token/ERC777/ERC777.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC777/presets/ERC777PresetFixedSupply.test.js b/lib/murky/lib/openzeppelin-contracts/test/token/ERC777/presets/ERC777PresetFixedSupply.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/ERC777/presets/ERC777PresetFixedSupply.test.js rename to lib/murky/lib/openzeppelin-contracts/test/token/ERC777/presets/ERC777PresetFixedSupply.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/token/common/ERC2981.behavior.js b/lib/murky/lib/openzeppelin-contracts/test/token/common/ERC2981.behavior.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/token/common/ERC2981.behavior.js rename to lib/murky/lib/openzeppelin-contracts/test/token/common/ERC2981.behavior.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/utils/Address.test.js b/lib/murky/lib/openzeppelin-contracts/test/utils/Address.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/utils/Address.test.js rename to lib/murky/lib/openzeppelin-contracts/test/utils/Address.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/utils/Arrays.test.js b/lib/murky/lib/openzeppelin-contracts/test/utils/Arrays.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/utils/Arrays.test.js rename to lib/murky/lib/openzeppelin-contracts/test/utils/Arrays.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/utils/Base64.test.js b/lib/murky/lib/openzeppelin-contracts/test/utils/Base64.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/utils/Base64.test.js rename to lib/murky/lib/openzeppelin-contracts/test/utils/Base64.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/utils/Checkpoints.test.js b/lib/murky/lib/openzeppelin-contracts/test/utils/Checkpoints.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/utils/Checkpoints.test.js rename to lib/murky/lib/openzeppelin-contracts/test/utils/Checkpoints.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/utils/Context.behavior.js b/lib/murky/lib/openzeppelin-contracts/test/utils/Context.behavior.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/utils/Context.behavior.js rename to lib/murky/lib/openzeppelin-contracts/test/utils/Context.behavior.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/utils/Context.test.js b/lib/murky/lib/openzeppelin-contracts/test/utils/Context.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/utils/Context.test.js rename to lib/murky/lib/openzeppelin-contracts/test/utils/Context.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/utils/Counters.test.js b/lib/murky/lib/openzeppelin-contracts/test/utils/Counters.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/utils/Counters.test.js rename to lib/murky/lib/openzeppelin-contracts/test/utils/Counters.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/utils/Create2.test.js b/lib/murky/lib/openzeppelin-contracts/test/utils/Create2.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/utils/Create2.test.js rename to lib/murky/lib/openzeppelin-contracts/test/utils/Create2.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/utils/Multicall.test.js b/lib/murky/lib/openzeppelin-contracts/test/utils/Multicall.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/utils/Multicall.test.js rename to lib/murky/lib/openzeppelin-contracts/test/utils/Multicall.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/utils/StorageSlot.test.js b/lib/murky/lib/openzeppelin-contracts/test/utils/StorageSlot.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/utils/StorageSlot.test.js rename to lib/murky/lib/openzeppelin-contracts/test/utils/StorageSlot.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/utils/Strings.test.js b/lib/murky/lib/openzeppelin-contracts/test/utils/Strings.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/utils/Strings.test.js rename to lib/murky/lib/openzeppelin-contracts/test/utils/Strings.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/utils/TimersBlockNumberImpl.test.js b/lib/murky/lib/openzeppelin-contracts/test/utils/TimersBlockNumberImpl.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/utils/TimersBlockNumberImpl.test.js rename to lib/murky/lib/openzeppelin-contracts/test/utils/TimersBlockNumberImpl.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/utils/TimersTimestamp.test.js b/lib/murky/lib/openzeppelin-contracts/test/utils/TimersTimestamp.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/utils/TimersTimestamp.test.js rename to lib/murky/lib/openzeppelin-contracts/test/utils/TimersTimestamp.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/utils/cryptography/ECDSA.test.js b/lib/murky/lib/openzeppelin-contracts/test/utils/cryptography/ECDSA.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/utils/cryptography/ECDSA.test.js rename to lib/murky/lib/openzeppelin-contracts/test/utils/cryptography/ECDSA.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/utils/cryptography/MerkleProof.test.js b/lib/murky/lib/openzeppelin-contracts/test/utils/cryptography/MerkleProof.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/utils/cryptography/MerkleProof.test.js rename to lib/murky/lib/openzeppelin-contracts/test/utils/cryptography/MerkleProof.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/utils/cryptography/SignatureChecker.test.js b/lib/murky/lib/openzeppelin-contracts/test/utils/cryptography/SignatureChecker.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/utils/cryptography/SignatureChecker.test.js rename to lib/murky/lib/openzeppelin-contracts/test/utils/cryptography/SignatureChecker.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/utils/cryptography/draft-EIP712.test.js b/lib/murky/lib/openzeppelin-contracts/test/utils/cryptography/draft-EIP712.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/utils/cryptography/draft-EIP712.test.js rename to lib/murky/lib/openzeppelin-contracts/test/utils/cryptography/draft-EIP712.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/utils/escrow/ConditionalEscrow.test.js b/lib/murky/lib/openzeppelin-contracts/test/utils/escrow/ConditionalEscrow.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/utils/escrow/ConditionalEscrow.test.js rename to lib/murky/lib/openzeppelin-contracts/test/utils/escrow/ConditionalEscrow.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/utils/escrow/Escrow.behavior.js b/lib/murky/lib/openzeppelin-contracts/test/utils/escrow/Escrow.behavior.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/utils/escrow/Escrow.behavior.js rename to lib/murky/lib/openzeppelin-contracts/test/utils/escrow/Escrow.behavior.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/utils/escrow/Escrow.test.js b/lib/murky/lib/openzeppelin-contracts/test/utils/escrow/Escrow.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/utils/escrow/Escrow.test.js rename to lib/murky/lib/openzeppelin-contracts/test/utils/escrow/Escrow.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/utils/escrow/RefundEscrow.test.js b/lib/murky/lib/openzeppelin-contracts/test/utils/escrow/RefundEscrow.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/utils/escrow/RefundEscrow.test.js rename to lib/murky/lib/openzeppelin-contracts/test/utils/escrow/RefundEscrow.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/utils/introspection/ERC165.test.js b/lib/murky/lib/openzeppelin-contracts/test/utils/introspection/ERC165.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/utils/introspection/ERC165.test.js rename to lib/murky/lib/openzeppelin-contracts/test/utils/introspection/ERC165.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/utils/introspection/ERC165Checker.test.js b/lib/murky/lib/openzeppelin-contracts/test/utils/introspection/ERC165Checker.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/utils/introspection/ERC165Checker.test.js rename to lib/murky/lib/openzeppelin-contracts/test/utils/introspection/ERC165Checker.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/utils/introspection/ERC165Storage.test.js b/lib/murky/lib/openzeppelin-contracts/test/utils/introspection/ERC165Storage.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/utils/introspection/ERC165Storage.test.js rename to lib/murky/lib/openzeppelin-contracts/test/utils/introspection/ERC165Storage.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/utils/introspection/ERC1820Implementer.test.js b/lib/murky/lib/openzeppelin-contracts/test/utils/introspection/ERC1820Implementer.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/utils/introspection/ERC1820Implementer.test.js rename to lib/murky/lib/openzeppelin-contracts/test/utils/introspection/ERC1820Implementer.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/utils/introspection/SupportsInterface.behavior.js b/lib/murky/lib/openzeppelin-contracts/test/utils/introspection/SupportsInterface.behavior.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/utils/introspection/SupportsInterface.behavior.js rename to lib/murky/lib/openzeppelin-contracts/test/utils/introspection/SupportsInterface.behavior.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/utils/math/Math.test.js b/lib/murky/lib/openzeppelin-contracts/test/utils/math/Math.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/utils/math/Math.test.js rename to lib/murky/lib/openzeppelin-contracts/test/utils/math/Math.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/utils/math/SafeCast.test.js b/lib/murky/lib/openzeppelin-contracts/test/utils/math/SafeCast.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/utils/math/SafeCast.test.js rename to lib/murky/lib/openzeppelin-contracts/test/utils/math/SafeCast.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/utils/math/SafeMath.test.js b/lib/murky/lib/openzeppelin-contracts/test/utils/math/SafeMath.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/utils/math/SafeMath.test.js rename to lib/murky/lib/openzeppelin-contracts/test/utils/math/SafeMath.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/utils/math/SignedMath.test.js b/lib/murky/lib/openzeppelin-contracts/test/utils/math/SignedMath.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/utils/math/SignedMath.test.js rename to lib/murky/lib/openzeppelin-contracts/test/utils/math/SignedMath.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/utils/math/SignedSafeMath.test.js b/lib/murky/lib/openzeppelin-contracts/test/utils/math/SignedSafeMath.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/utils/math/SignedSafeMath.test.js rename to lib/murky/lib/openzeppelin-contracts/test/utils/math/SignedSafeMath.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/utils/structs/BitMap.test.js b/lib/murky/lib/openzeppelin-contracts/test/utils/structs/BitMap.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/utils/structs/BitMap.test.js rename to lib/murky/lib/openzeppelin-contracts/test/utils/structs/BitMap.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/utils/structs/DoubleEndedQueue.test.js b/lib/murky/lib/openzeppelin-contracts/test/utils/structs/DoubleEndedQueue.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/utils/structs/DoubleEndedQueue.test.js rename to lib/murky/lib/openzeppelin-contracts/test/utils/structs/DoubleEndedQueue.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/utils/structs/EnumerableMap.behavior.js b/lib/murky/lib/openzeppelin-contracts/test/utils/structs/EnumerableMap.behavior.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/utils/structs/EnumerableMap.behavior.js rename to lib/murky/lib/openzeppelin-contracts/test/utils/structs/EnumerableMap.behavior.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/utils/structs/EnumerableMap.test.js b/lib/murky/lib/openzeppelin-contracts/test/utils/structs/EnumerableMap.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/utils/structs/EnumerableMap.test.js rename to lib/murky/lib/openzeppelin-contracts/test/utils/structs/EnumerableMap.test.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/utils/structs/EnumerableSet.behavior.js b/lib/murky/lib/openzeppelin-contracts/test/utils/structs/EnumerableSet.behavior.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/utils/structs/EnumerableSet.behavior.js rename to lib/murky/lib/openzeppelin-contracts/test/utils/structs/EnumerableSet.behavior.js diff --git a/contracts/lib/murky/lib/openzeppelin-contracts/test/utils/structs/EnumerableSet.test.js b/lib/murky/lib/openzeppelin-contracts/test/utils/structs/EnumerableSet.test.js similarity index 100% rename from contracts/lib/murky/lib/openzeppelin-contracts/test/utils/structs/EnumerableSet.test.js rename to lib/murky/lib/openzeppelin-contracts/test/utils/structs/EnumerableSet.test.js diff --git a/contracts/lib/murky/reports/murky_gas_report.png b/lib/murky/reports/murky_gas_report.png similarity index 100% rename from contracts/lib/murky/reports/murky_gas_report.png rename to lib/murky/reports/murky_gas_report.png diff --git a/contracts/lib/murky/src/Merkle.sol b/lib/murky/src/Merkle.sol similarity index 100% rename from contracts/lib/murky/src/Merkle.sol rename to lib/murky/src/Merkle.sol diff --git a/contracts/lib/murky/src/Xorkle.sol b/lib/murky/src/Xorkle.sol similarity index 100% rename from contracts/lib/murky/src/Xorkle.sol rename to lib/murky/src/Xorkle.sol diff --git a/contracts/lib/murky/src/common/MurkyBase.sol b/lib/murky/src/common/MurkyBase.sol similarity index 100% rename from contracts/lib/murky/src/common/MurkyBase.sol rename to lib/murky/src/common/MurkyBase.sol diff --git a/contracts/lib/murky/src/test/Merkle.t.sol b/lib/murky/src/test/Merkle.t.sol similarity index 100% rename from contracts/lib/murky/src/test/Merkle.t.sol rename to lib/murky/src/test/Merkle.t.sol diff --git a/contracts/lib/murky/src/test/MurkyBase.t.sol b/lib/murky/src/test/MurkyBase.t.sol similarity index 100% rename from contracts/lib/murky/src/test/MurkyBase.t.sol rename to lib/murky/src/test/MurkyBase.t.sol diff --git a/contracts/lib/murky/src/test/StandardInput.t.sol b/lib/murky/src/test/StandardInput.t.sol similarity index 100% rename from contracts/lib/murky/src/test/StandardInput.t.sol rename to lib/murky/src/test/StandardInput.t.sol diff --git a/contracts/lib/murky/src/test/Xorkle.t.sol b/lib/murky/src/test/Xorkle.t.sol similarity index 100% rename from contracts/lib/murky/src/test/Xorkle.t.sol rename to lib/murky/src/test/Xorkle.t.sol diff --git a/contracts/lib/murky/src/test/standard_data/README.md b/lib/murky/src/test/standard_data/README.md similarity index 100% rename from contracts/lib/murky/src/test/standard_data/README.md rename to lib/murky/src/test/standard_data/README.md diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/.codecov.yml b/lib/openzeppelin-contracts-upgradeable/.codecov.yml similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/.codecov.yml rename to lib/openzeppelin-contracts-upgradeable/.codecov.yml diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/.editorconfig b/lib/openzeppelin-contracts-upgradeable/.editorconfig similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/.editorconfig rename to lib/openzeppelin-contracts-upgradeable/.editorconfig diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/.eslintrc b/lib/openzeppelin-contracts-upgradeable/.eslintrc similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/.eslintrc rename to lib/openzeppelin-contracts-upgradeable/.eslintrc diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/.gitattributes b/lib/openzeppelin-contracts-upgradeable/.gitattributes similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/.gitattributes rename to lib/openzeppelin-contracts-upgradeable/.gitattributes diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/.github/ISSUE_TEMPLATE/bug_report.md b/lib/openzeppelin-contracts-upgradeable/.github/ISSUE_TEMPLATE/bug_report.md similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/.github/ISSUE_TEMPLATE/bug_report.md rename to lib/openzeppelin-contracts-upgradeable/.github/ISSUE_TEMPLATE/bug_report.md diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/.github/ISSUE_TEMPLATE/config.yml b/lib/openzeppelin-contracts-upgradeable/.github/ISSUE_TEMPLATE/config.yml similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/.github/ISSUE_TEMPLATE/config.yml rename to lib/openzeppelin-contracts-upgradeable/.github/ISSUE_TEMPLATE/config.yml diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/.github/ISSUE_TEMPLATE/feature_request.md b/lib/openzeppelin-contracts-upgradeable/.github/ISSUE_TEMPLATE/feature_request.md similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/.github/ISSUE_TEMPLATE/feature_request.md rename to lib/openzeppelin-contracts-upgradeable/.github/ISSUE_TEMPLATE/feature_request.md diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/.github/PULL_REQUEST_TEMPLATE.md b/lib/openzeppelin-contracts-upgradeable/.github/PULL_REQUEST_TEMPLATE.md similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/.github/PULL_REQUEST_TEMPLATE.md rename to lib/openzeppelin-contracts-upgradeable/.github/PULL_REQUEST_TEMPLATE.md diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/.github/actions/gas-compare/action.yml b/lib/openzeppelin-contracts-upgradeable/.github/actions/gas-compare/action.yml similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/.github/actions/gas-compare/action.yml rename to lib/openzeppelin-contracts-upgradeable/.github/actions/gas-compare/action.yml diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/.github/actions/setup/action.yml b/lib/openzeppelin-contracts-upgradeable/.github/actions/setup/action.yml similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/.github/actions/setup/action.yml rename to lib/openzeppelin-contracts-upgradeable/.github/actions/setup/action.yml diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/.github/workflows/changelog.yml b/lib/openzeppelin-contracts-upgradeable/.github/workflows/changelog.yml similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/.github/workflows/changelog.yml rename to lib/openzeppelin-contracts-upgradeable/.github/workflows/changelog.yml diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/.github/workflows/checks.yml b/lib/openzeppelin-contracts-upgradeable/.github/workflows/checks.yml similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/.github/workflows/checks.yml rename to lib/openzeppelin-contracts-upgradeable/.github/workflows/checks.yml diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/.github/workflows/docs.yml b/lib/openzeppelin-contracts-upgradeable/.github/workflows/docs.yml similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/.github/workflows/docs.yml rename to lib/openzeppelin-contracts-upgradeable/.github/workflows/docs.yml diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/.github/workflows/merge-upstream.yml b/lib/openzeppelin-contracts-upgradeable/.github/workflows/merge-upstream.yml similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/.github/workflows/merge-upstream.yml rename to lib/openzeppelin-contracts-upgradeable/.github/workflows/merge-upstream.yml diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/.github/workflows/transpile.yml b/lib/openzeppelin-contracts-upgradeable/.github/workflows/transpile.yml similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/.github/workflows/transpile.yml rename to lib/openzeppelin-contracts-upgradeable/.github/workflows/transpile.yml diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/.gitignore b/lib/openzeppelin-contracts-upgradeable/.gitignore similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/.gitignore rename to lib/openzeppelin-contracts-upgradeable/.gitignore diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/.gitmodules b/lib/openzeppelin-contracts-upgradeable/.gitmodules similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/.gitmodules rename to lib/openzeppelin-contracts-upgradeable/.gitmodules diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/.mocharc.js b/lib/openzeppelin-contracts-upgradeable/.mocharc.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/.mocharc.js rename to lib/openzeppelin-contracts-upgradeable/.mocharc.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/.prettierrc b/lib/openzeppelin-contracts-upgradeable/.prettierrc similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/.prettierrc rename to lib/openzeppelin-contracts-upgradeable/.prettierrc diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/.solcover.js b/lib/openzeppelin-contracts-upgradeable/.solcover.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/.solcover.js rename to lib/openzeppelin-contracts-upgradeable/.solcover.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/.solhint.json b/lib/openzeppelin-contracts-upgradeable/.solhint.json similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/.solhint.json rename to lib/openzeppelin-contracts-upgradeable/.solhint.json diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/CHANGELOG.md b/lib/openzeppelin-contracts-upgradeable/CHANGELOG.md similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/CHANGELOG.md rename to lib/openzeppelin-contracts-upgradeable/CHANGELOG.md diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/CODE_OF_CONDUCT.md b/lib/openzeppelin-contracts-upgradeable/CODE_OF_CONDUCT.md similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/CODE_OF_CONDUCT.md rename to lib/openzeppelin-contracts-upgradeable/CODE_OF_CONDUCT.md diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/CONTRIBUTING.md b/lib/openzeppelin-contracts-upgradeable/CONTRIBUTING.md similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/CONTRIBUTING.md rename to lib/openzeppelin-contracts-upgradeable/CONTRIBUTING.md diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/DOCUMENTATION.md b/lib/openzeppelin-contracts-upgradeable/DOCUMENTATION.md similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/DOCUMENTATION.md rename to lib/openzeppelin-contracts-upgradeable/DOCUMENTATION.md diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/GUIDELINES.md b/lib/openzeppelin-contracts-upgradeable/GUIDELINES.md similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/GUIDELINES.md rename to lib/openzeppelin-contracts-upgradeable/GUIDELINES.md diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/LICENSE b/lib/openzeppelin-contracts-upgradeable/LICENSE similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/LICENSE rename to lib/openzeppelin-contracts-upgradeable/LICENSE diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/README.md b/lib/openzeppelin-contracts-upgradeable/README.md similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/README.md rename to lib/openzeppelin-contracts-upgradeable/README.md diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/RELEASING.md b/lib/openzeppelin-contracts-upgradeable/RELEASING.md similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/RELEASING.md rename to lib/openzeppelin-contracts-upgradeable/RELEASING.md diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/SECURITY.md b/lib/openzeppelin-contracts-upgradeable/SECURITY.md similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/SECURITY.md rename to lib/openzeppelin-contracts-upgradeable/SECURITY.md diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/UPGRADEABLE.md b/lib/openzeppelin-contracts-upgradeable/UPGRADEABLE.md similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/UPGRADEABLE.md rename to lib/openzeppelin-contracts-upgradeable/UPGRADEABLE.md diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/audit/2017-03.md b/lib/openzeppelin-contracts-upgradeable/audit/2017-03.md similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/audit/2017-03.md rename to lib/openzeppelin-contracts-upgradeable/audit/2017-03.md diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/audit/2018-10.pdf b/lib/openzeppelin-contracts-upgradeable/audit/2018-10.pdf similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/audit/2018-10.pdf rename to lib/openzeppelin-contracts-upgradeable/audit/2018-10.pdf diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/certora/Makefile b/lib/openzeppelin-contracts-upgradeable/certora/Makefile similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/certora/Makefile rename to lib/openzeppelin-contracts-upgradeable/certora/Makefile diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/certora/README.md b/lib/openzeppelin-contracts-upgradeable/certora/README.md similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/certora/README.md rename to lib/openzeppelin-contracts-upgradeable/certora/README.md diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/certora/applyHarness.patch b/lib/openzeppelin-contracts-upgradeable/certora/applyHarness.patch similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/certora/applyHarness.patch rename to lib/openzeppelin-contracts-upgradeable/certora/applyHarness.patch diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/certora/harnesses/ERC20VotesHarness.sol b/lib/openzeppelin-contracts-upgradeable/certora/harnesses/ERC20VotesHarness.sol similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/certora/harnesses/ERC20VotesHarness.sol rename to lib/openzeppelin-contracts-upgradeable/certora/harnesses/ERC20VotesHarness.sol diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/certora/harnesses/WizardControlFirstPriority.sol b/lib/openzeppelin-contracts-upgradeable/certora/harnesses/WizardControlFirstPriority.sol similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/certora/harnesses/WizardControlFirstPriority.sol rename to lib/openzeppelin-contracts-upgradeable/certora/harnesses/WizardControlFirstPriority.sol diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/certora/harnesses/WizardFirstTry.sol b/lib/openzeppelin-contracts-upgradeable/certora/harnesses/WizardFirstTry.sol similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/certora/harnesses/WizardFirstTry.sol rename to lib/openzeppelin-contracts-upgradeable/certora/harnesses/WizardFirstTry.sol diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/certora/munged/.gitignore b/lib/openzeppelin-contracts-upgradeable/certora/munged/.gitignore similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/certora/munged/.gitignore rename to lib/openzeppelin-contracts-upgradeable/certora/munged/.gitignore diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/certora/scripts/Governor.sh b/lib/openzeppelin-contracts-upgradeable/certora/scripts/Governor.sh similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/certora/scripts/Governor.sh rename to lib/openzeppelin-contracts-upgradeable/certora/scripts/Governor.sh diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/certora/scripts/GovernorCountingSimple-counting.sh b/lib/openzeppelin-contracts-upgradeable/certora/scripts/GovernorCountingSimple-counting.sh similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/certora/scripts/GovernorCountingSimple-counting.sh rename to lib/openzeppelin-contracts-upgradeable/certora/scripts/GovernorCountingSimple-counting.sh diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/certora/scripts/WizardControlFirstPriority.sh b/lib/openzeppelin-contracts-upgradeable/certora/scripts/WizardControlFirstPriority.sh similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/certora/scripts/WizardControlFirstPriority.sh rename to lib/openzeppelin-contracts-upgradeable/certora/scripts/WizardControlFirstPriority.sh diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/certora/scripts/WizardFirstTry.sh b/lib/openzeppelin-contracts-upgradeable/certora/scripts/WizardFirstTry.sh similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/certora/scripts/WizardFirstTry.sh rename to lib/openzeppelin-contracts-upgradeable/certora/scripts/WizardFirstTry.sh diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/certora/scripts/sanity.sh b/lib/openzeppelin-contracts-upgradeable/certora/scripts/sanity.sh similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/certora/scripts/sanity.sh rename to lib/openzeppelin-contracts-upgradeable/certora/scripts/sanity.sh diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/certora/scripts/verifyAll.sh b/lib/openzeppelin-contracts-upgradeable/certora/scripts/verifyAll.sh similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/certora/scripts/verifyAll.sh rename to lib/openzeppelin-contracts-upgradeable/certora/scripts/verifyAll.sh diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/certora/specs/GovernorBase.spec b/lib/openzeppelin-contracts-upgradeable/certora/specs/GovernorBase.spec similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/certora/specs/GovernorBase.spec rename to lib/openzeppelin-contracts-upgradeable/certora/specs/GovernorBase.spec diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/certora/specs/GovernorCountingSimple.spec b/lib/openzeppelin-contracts-upgradeable/certora/specs/GovernorCountingSimple.spec similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/certora/specs/GovernorCountingSimple.spec rename to lib/openzeppelin-contracts-upgradeable/certora/specs/GovernorCountingSimple.spec diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/certora/specs/RulesInProgress.spec b/lib/openzeppelin-contracts-upgradeable/certora/specs/RulesInProgress.spec similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/certora/specs/RulesInProgress.spec rename to lib/openzeppelin-contracts-upgradeable/certora/specs/RulesInProgress.spec diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/certora/specs/sanity.spec b/lib/openzeppelin-contracts-upgradeable/certora/specs/sanity.spec similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/certora/specs/sanity.spec rename to lib/openzeppelin-contracts-upgradeable/certora/specs/sanity.spec diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/docs/antora.yml b/lib/openzeppelin-contracts-upgradeable/docs/antora.yml similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/docs/antora.yml rename to lib/openzeppelin-contracts-upgradeable/docs/antora.yml diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/docs/config.js b/lib/openzeppelin-contracts-upgradeable/docs/config.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/docs/config.js rename to lib/openzeppelin-contracts-upgradeable/docs/config.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/images/tally-admin.png b/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/images/tally-admin.png similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/images/tally-admin.png rename to lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/images/tally-admin.png diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/images/tally-vote.png b/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/images/tally-vote.png similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/images/tally-vote.png rename to lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/images/tally-vote.png diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/nav.adoc b/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/nav.adoc similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/nav.adoc rename to lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/nav.adoc diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/access-control.adoc b/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/access-control.adoc similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/access-control.adoc rename to lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/access-control.adoc diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/crosschain.adoc b/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/crosschain.adoc similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/crosschain.adoc rename to lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/crosschain.adoc diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/crowdsales.adoc b/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/crowdsales.adoc similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/crowdsales.adoc rename to lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/crowdsales.adoc diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/drafts.adoc b/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/drafts.adoc similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/drafts.adoc rename to lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/drafts.adoc diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/erc1155.adoc b/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/erc1155.adoc similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/erc1155.adoc rename to lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/erc1155.adoc diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/erc20-supply.adoc b/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/erc20-supply.adoc similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/erc20-supply.adoc rename to lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/erc20-supply.adoc diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/erc20.adoc b/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/erc20.adoc similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/erc20.adoc rename to lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/erc20.adoc diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/erc721.adoc b/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/erc721.adoc similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/erc721.adoc rename to lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/erc721.adoc diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/erc777.adoc b/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/erc777.adoc similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/erc777.adoc rename to lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/erc777.adoc diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/extending-contracts.adoc b/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/extending-contracts.adoc similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/extending-contracts.adoc rename to lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/extending-contracts.adoc diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/governance.adoc b/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/governance.adoc similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/governance.adoc rename to lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/governance.adoc diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/index.adoc b/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/index.adoc similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/index.adoc rename to lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/index.adoc diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/releases-stability.adoc b/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/releases-stability.adoc similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/releases-stability.adoc rename to lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/releases-stability.adoc diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/tokens.adoc b/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/tokens.adoc similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/tokens.adoc rename to lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/tokens.adoc diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/upgradeable.adoc b/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/upgradeable.adoc similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/upgradeable.adoc rename to lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/upgradeable.adoc diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/utilities.adoc b/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/utilities.adoc similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/utilities.adoc rename to lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/utilities.adoc diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/wizard.adoc b/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/wizard.adoc similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/wizard.adoc rename to lib/openzeppelin-contracts-upgradeable/docs/modules/ROOT/pages/wizard.adoc diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/docs/templates/contract.hbs b/lib/openzeppelin-contracts-upgradeable/docs/templates/contract.hbs similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/docs/templates/contract.hbs rename to lib/openzeppelin-contracts-upgradeable/docs/templates/contract.hbs diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/docs/templates/helpers.js b/lib/openzeppelin-contracts-upgradeable/docs/templates/helpers.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/docs/templates/helpers.js rename to lib/openzeppelin-contracts-upgradeable/docs/templates/helpers.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/docs/templates/page.hbs b/lib/openzeppelin-contracts-upgradeable/docs/templates/page.hbs similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/docs/templates/page.hbs rename to lib/openzeppelin-contracts-upgradeable/docs/templates/page.hbs diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/docs/templates/properties.js b/lib/openzeppelin-contracts-upgradeable/docs/templates/properties.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/docs/templates/properties.js rename to lib/openzeppelin-contracts-upgradeable/docs/templates/properties.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/foundry.toml b/lib/openzeppelin-contracts-upgradeable/foundry.toml similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/foundry.toml rename to lib/openzeppelin-contracts-upgradeable/foundry.toml diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/hardhat.config.js b/lib/openzeppelin-contracts-upgradeable/hardhat.config.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/hardhat.config.js rename to lib/openzeppelin-contracts-upgradeable/hardhat.config.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/hardhat/env-artifacts.js b/lib/openzeppelin-contracts-upgradeable/hardhat/env-artifacts.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/hardhat/env-artifacts.js rename to lib/openzeppelin-contracts-upgradeable/hardhat/env-artifacts.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/hardhat/env-contract.js b/lib/openzeppelin-contracts-upgradeable/hardhat/env-contract.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/hardhat/env-contract.js rename to lib/openzeppelin-contracts-upgradeable/hardhat/env-contract.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/hardhat/ignore-unreachable-warnings.js b/lib/openzeppelin-contracts-upgradeable/hardhat/ignore-unreachable-warnings.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/hardhat/ignore-unreachable-warnings.js rename to lib/openzeppelin-contracts-upgradeable/hardhat/ignore-unreachable-warnings.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/hardhat/skip-foundry-tests.js b/lib/openzeppelin-contracts-upgradeable/hardhat/skip-foundry-tests.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/hardhat/skip-foundry-tests.js rename to lib/openzeppelin-contracts-upgradeable/hardhat/skip-foundry-tests.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/hardhat/task-get-compiler-input.js b/lib/openzeppelin-contracts-upgradeable/hardhat/task-get-compiler-input.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/hardhat/task-get-compiler-input.js rename to lib/openzeppelin-contracts-upgradeable/hardhat/task-get-compiler-input.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/hardhat/task-test-get-files.js b/lib/openzeppelin-contracts-upgradeable/hardhat/task-test-get-files.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/hardhat/task-test-get-files.js rename to lib/openzeppelin-contracts-upgradeable/hardhat/task-test-get-files.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/icon.svg b/lib/openzeppelin-contracts-upgradeable/icon.svg similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/icon.svg rename to lib/openzeppelin-contracts-upgradeable/icon.svg diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/.github/workflows/tests.yml b/lib/openzeppelin-contracts-upgradeable/lib/forge-std/.github/workflows/tests.yml similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/.github/workflows/tests.yml rename to lib/openzeppelin-contracts-upgradeable/lib/forge-std/.github/workflows/tests.yml diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/.gitignore b/lib/openzeppelin-contracts-upgradeable/lib/forge-std/.gitignore similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/.gitignore rename to lib/openzeppelin-contracts-upgradeable/lib/forge-std/.gitignore diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/.gitmodules b/lib/openzeppelin-contracts-upgradeable/lib/forge-std/.gitmodules similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/.gitmodules rename to lib/openzeppelin-contracts-upgradeable/lib/forge-std/.gitmodules diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/LICENSE-APACHE b/lib/openzeppelin-contracts-upgradeable/lib/forge-std/LICENSE-APACHE similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/LICENSE-APACHE rename to lib/openzeppelin-contracts-upgradeable/lib/forge-std/LICENSE-APACHE diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/LICENSE-MIT b/lib/openzeppelin-contracts-upgradeable/lib/forge-std/LICENSE-MIT similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/LICENSE-MIT rename to lib/openzeppelin-contracts-upgradeable/lib/forge-std/LICENSE-MIT diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/README.md b/lib/openzeppelin-contracts-upgradeable/lib/forge-std/README.md similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/README.md rename to lib/openzeppelin-contracts-upgradeable/lib/forge-std/README.md diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/.gitignore b/lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/.gitignore similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/.gitignore rename to lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/.gitignore diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/LICENSE b/lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/LICENSE similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/LICENSE rename to lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/LICENSE diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/Makefile b/lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/Makefile similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/Makefile rename to lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/Makefile diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/default.nix b/lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/default.nix similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/default.nix rename to lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/default.nix diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/demo/demo.sol b/lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/demo/demo.sol similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/demo/demo.sol rename to lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/demo/demo.sol diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/test.sol b/lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/test.sol similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/test.sol rename to lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/test.sol diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/Script.sol b/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/Script.sol similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/Script.sol rename to lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/Script.sol diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/StdJson.sol b/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/StdJson.sol similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/StdJson.sol rename to lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/StdJson.sol diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/Test.sol b/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/Test.sol similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/Test.sol rename to lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/Test.sol diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/Vm.sol b/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/Vm.sol similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/Vm.sol rename to lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/Vm.sol diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/console.sol b/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/console.sol similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/console.sol rename to lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/console.sol diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/console2.sol b/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/console2.sol similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/console2.sol rename to lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/console2.sol diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/test/Script.t.sol b/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/test/Script.t.sol similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/test/Script.t.sol rename to lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/test/Script.t.sol diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/test/StdAssertions.t.sol b/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/test/StdAssertions.t.sol similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/test/StdAssertions.t.sol rename to lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/test/StdAssertions.t.sol diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/test/StdCheats.t.sol b/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/test/StdCheats.t.sol similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/test/StdCheats.t.sol rename to lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/test/StdCheats.t.sol diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/test/StdError.t.sol b/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/test/StdError.t.sol similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/test/StdError.t.sol rename to lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/test/StdError.t.sol diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/test/StdMath.t.sol b/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/test/StdMath.t.sol similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/test/StdMath.t.sol rename to lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/test/StdMath.t.sol diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/test/StdStorage.t.sol b/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/test/StdStorage.t.sol similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/test/StdStorage.t.sol rename to lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/test/StdStorage.t.sol diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/test/fixtures/broadcast.log.json b/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/test/fixtures/broadcast.log.json similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/test/fixtures/broadcast.log.json rename to lib/openzeppelin-contracts-upgradeable/lib/forge-std/src/test/fixtures/broadcast.log.json diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/logo.svg b/lib/openzeppelin-contracts-upgradeable/logo.svg similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/logo.svg rename to lib/openzeppelin-contracts-upgradeable/logo.svg diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/netlify.toml b/lib/openzeppelin-contracts-upgradeable/netlify.toml similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/netlify.toml rename to lib/openzeppelin-contracts-upgradeable/netlify.toml diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/package-lock.json b/lib/openzeppelin-contracts-upgradeable/package-lock.json similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/package-lock.json rename to lib/openzeppelin-contracts-upgradeable/package-lock.json diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/package.json b/lib/openzeppelin-contracts-upgradeable/package.json similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/package.json rename to lib/openzeppelin-contracts-upgradeable/package.json diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/renovate.json b/lib/openzeppelin-contracts-upgradeable/renovate.json similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/renovate.json rename to lib/openzeppelin-contracts-upgradeable/renovate.json diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/scripts/checks/compareGasReports.js b/lib/openzeppelin-contracts-upgradeable/scripts/checks/compareGasReports.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/scripts/checks/compareGasReports.js rename to lib/openzeppelin-contracts-upgradeable/scripts/checks/compareGasReports.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/scripts/checks/generation.sh b/lib/openzeppelin-contracts-upgradeable/scripts/checks/generation.sh similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/scripts/checks/generation.sh rename to lib/openzeppelin-contracts-upgradeable/scripts/checks/generation.sh diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/scripts/checks/inheritance-ordering.js b/lib/openzeppelin-contracts-upgradeable/scripts/checks/inheritance-ordering.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/scripts/checks/inheritance-ordering.js rename to lib/openzeppelin-contracts-upgradeable/scripts/checks/inheritance-ordering.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/scripts/gen-nav.js b/lib/openzeppelin-contracts-upgradeable/scripts/gen-nav.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/scripts/gen-nav.js rename to lib/openzeppelin-contracts-upgradeable/scripts/gen-nav.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/scripts/generate/format-lines.js b/lib/openzeppelin-contracts-upgradeable/scripts/generate/format-lines.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/scripts/generate/format-lines.js rename to lib/openzeppelin-contracts-upgradeable/scripts/generate/format-lines.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/scripts/generate/run.js b/lib/openzeppelin-contracts-upgradeable/scripts/generate/run.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/scripts/generate/run.js rename to lib/openzeppelin-contracts-upgradeable/scripts/generate/run.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/scripts/generate/templates/Checkpoints.js b/lib/openzeppelin-contracts-upgradeable/scripts/generate/templates/Checkpoints.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/scripts/generate/templates/Checkpoints.js rename to lib/openzeppelin-contracts-upgradeable/scripts/generate/templates/Checkpoints.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/scripts/generate/templates/CheckpointsMock.js b/lib/openzeppelin-contracts-upgradeable/scripts/generate/templates/CheckpointsMock.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/scripts/generate/templates/CheckpointsMock.js rename to lib/openzeppelin-contracts-upgradeable/scripts/generate/templates/CheckpointsMock.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/scripts/generate/templates/EnumerableMap.js b/lib/openzeppelin-contracts-upgradeable/scripts/generate/templates/EnumerableMap.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/scripts/generate/templates/EnumerableMap.js rename to lib/openzeppelin-contracts-upgradeable/scripts/generate/templates/EnumerableMap.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/scripts/generate/templates/EnumerableMapMock.js b/lib/openzeppelin-contracts-upgradeable/scripts/generate/templates/EnumerableMapMock.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/scripts/generate/templates/EnumerableMapMock.js rename to lib/openzeppelin-contracts-upgradeable/scripts/generate/templates/EnumerableMapMock.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/scripts/generate/templates/EnumerableSet.js b/lib/openzeppelin-contracts-upgradeable/scripts/generate/templates/EnumerableSet.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/scripts/generate/templates/EnumerableSet.js rename to lib/openzeppelin-contracts-upgradeable/scripts/generate/templates/EnumerableSet.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/scripts/generate/templates/EnumerableSetMock.js b/lib/openzeppelin-contracts-upgradeable/scripts/generate/templates/EnumerableSetMock.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/scripts/generate/templates/EnumerableSetMock.js rename to lib/openzeppelin-contracts-upgradeable/scripts/generate/templates/EnumerableSetMock.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/scripts/generate/templates/SafeCast.js b/lib/openzeppelin-contracts-upgradeable/scripts/generate/templates/SafeCast.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/scripts/generate/templates/SafeCast.js rename to lib/openzeppelin-contracts-upgradeable/scripts/generate/templates/SafeCast.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/scripts/generate/templates/SafeCastMock.js b/lib/openzeppelin-contracts-upgradeable/scripts/generate/templates/SafeCastMock.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/scripts/generate/templates/SafeCastMock.js rename to lib/openzeppelin-contracts-upgradeable/scripts/generate/templates/SafeCastMock.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/scripts/generate/templates/conversion.js b/lib/openzeppelin-contracts-upgradeable/scripts/generate/templates/conversion.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/scripts/generate/templates/conversion.js rename to lib/openzeppelin-contracts-upgradeable/scripts/generate/templates/conversion.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/scripts/git-user-config.sh b/lib/openzeppelin-contracts-upgradeable/scripts/git-user-config.sh similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/scripts/git-user-config.sh rename to lib/openzeppelin-contracts-upgradeable/scripts/git-user-config.sh diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/scripts/helpers.js b/lib/openzeppelin-contracts-upgradeable/scripts/helpers.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/scripts/helpers.js rename to lib/openzeppelin-contracts-upgradeable/scripts/helpers.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/scripts/migrate-imports.js b/lib/openzeppelin-contracts-upgradeable/scripts/migrate-imports.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/scripts/migrate-imports.js rename to lib/openzeppelin-contracts-upgradeable/scripts/migrate-imports.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/scripts/prepack.sh b/lib/openzeppelin-contracts-upgradeable/scripts/prepack.sh similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/scripts/prepack.sh rename to lib/openzeppelin-contracts-upgradeable/scripts/prepack.sh diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/scripts/prepare-contracts-package.sh b/lib/openzeppelin-contracts-upgradeable/scripts/prepare-contracts-package.sh similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/scripts/prepare-contracts-package.sh rename to lib/openzeppelin-contracts-upgradeable/scripts/prepare-contracts-package.sh diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/scripts/prepare-docs.sh b/lib/openzeppelin-contracts-upgradeable/scripts/prepare-docs.sh similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/scripts/prepare-docs.sh rename to lib/openzeppelin-contracts-upgradeable/scripts/prepare-docs.sh diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/scripts/prepare.sh b/lib/openzeppelin-contracts-upgradeable/scripts/prepare.sh similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/scripts/prepare.sh rename to lib/openzeppelin-contracts-upgradeable/scripts/prepare.sh diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/scripts/release/release.sh b/lib/openzeppelin-contracts-upgradeable/scripts/release/release.sh similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/scripts/release/release.sh rename to lib/openzeppelin-contracts-upgradeable/scripts/release/release.sh diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/scripts/release/synchronize-versions.js b/lib/openzeppelin-contracts-upgradeable/scripts/release/synchronize-versions.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/scripts/release/synchronize-versions.js rename to lib/openzeppelin-contracts-upgradeable/scripts/release/synchronize-versions.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/scripts/release/update-changelog-release-date.js b/lib/openzeppelin-contracts-upgradeable/scripts/release/update-changelog-release-date.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/scripts/release/update-changelog-release-date.js rename to lib/openzeppelin-contracts-upgradeable/scripts/release/update-changelog-release-date.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/scripts/release/update-comment.js b/lib/openzeppelin-contracts-upgradeable/scripts/release/update-comment.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/scripts/release/update-comment.js rename to lib/openzeppelin-contracts-upgradeable/scripts/release/update-comment.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/scripts/release/version.sh b/lib/openzeppelin-contracts-upgradeable/scripts/release/version.sh similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/scripts/release/version.sh rename to lib/openzeppelin-contracts-upgradeable/scripts/release/version.sh diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/scripts/remove-ignored-artifacts.js b/lib/openzeppelin-contracts-upgradeable/scripts/remove-ignored-artifacts.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/scripts/remove-ignored-artifacts.js rename to lib/openzeppelin-contracts-upgradeable/scripts/remove-ignored-artifacts.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/scripts/update-docs-branch.js b/lib/openzeppelin-contracts-upgradeable/scripts/update-docs-branch.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/scripts/update-docs-branch.js rename to lib/openzeppelin-contracts-upgradeable/scripts/update-docs-branch.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/scripts/upgradeable/git-user-config.sh b/lib/openzeppelin-contracts-upgradeable/scripts/upgradeable/git-user-config.sh similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/scripts/upgradeable/git-user-config.sh rename to lib/openzeppelin-contracts-upgradeable/scripts/upgradeable/git-user-config.sh diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/scripts/upgradeable/merge-upstream.sh b/lib/openzeppelin-contracts-upgradeable/scripts/upgradeable/merge-upstream.sh similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/scripts/upgradeable/merge-upstream.sh rename to lib/openzeppelin-contracts-upgradeable/scripts/upgradeable/merge-upstream.sh diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/scripts/upgradeable/patch/.gitkeep b/lib/openzeppelin-contracts-upgradeable/scripts/upgradeable/patch/.gitkeep similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/scripts/upgradeable/patch/.gitkeep rename to lib/openzeppelin-contracts-upgradeable/scripts/upgradeable/patch/.gitkeep diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/scripts/upgradeable/transpile-onto.sh b/lib/openzeppelin-contracts-upgradeable/scripts/upgradeable/transpile-onto.sh similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/scripts/upgradeable/transpile-onto.sh rename to lib/openzeppelin-contracts-upgradeable/scripts/upgradeable/transpile-onto.sh diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/scripts/upgradeable/transpile.sh b/lib/openzeppelin-contracts-upgradeable/scripts/upgradeable/transpile.sh similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/scripts/upgradeable/transpile.sh rename to lib/openzeppelin-contracts-upgradeable/scripts/upgradeable/transpile.sh diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/slither.config.json b/lib/openzeppelin-contracts-upgradeable/slither.config.json similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/slither.config.json rename to lib/openzeppelin-contracts-upgradeable/slither.config.json diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/TESTING.md b/lib/openzeppelin-contracts-upgradeable/test/TESTING.md similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/TESTING.md rename to lib/openzeppelin-contracts-upgradeable/test/TESTING.md diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/access/AccessControl.behavior.js b/lib/openzeppelin-contracts-upgradeable/test/access/AccessControl.behavior.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/access/AccessControl.behavior.js rename to lib/openzeppelin-contracts-upgradeable/test/access/AccessControl.behavior.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/access/AccessControl.test.js b/lib/openzeppelin-contracts-upgradeable/test/access/AccessControl.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/access/AccessControl.test.js rename to lib/openzeppelin-contracts-upgradeable/test/access/AccessControl.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/access/AccessControlCrossChain.test.js b/lib/openzeppelin-contracts-upgradeable/test/access/AccessControlCrossChain.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/access/AccessControlCrossChain.test.js rename to lib/openzeppelin-contracts-upgradeable/test/access/AccessControlCrossChain.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/access/AccessControlEnumerable.test.js b/lib/openzeppelin-contracts-upgradeable/test/access/AccessControlEnumerable.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/access/AccessControlEnumerable.test.js rename to lib/openzeppelin-contracts-upgradeable/test/access/AccessControlEnumerable.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/access/Ownable.test.js b/lib/openzeppelin-contracts-upgradeable/test/access/Ownable.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/access/Ownable.test.js rename to lib/openzeppelin-contracts-upgradeable/test/access/Ownable.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/access/Ownable2Step.test.js b/lib/openzeppelin-contracts-upgradeable/test/access/Ownable2Step.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/access/Ownable2Step.test.js rename to lib/openzeppelin-contracts-upgradeable/test/access/Ownable2Step.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/crosschain/CrossChainEnabled.test.js b/lib/openzeppelin-contracts-upgradeable/test/crosschain/CrossChainEnabled.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/crosschain/CrossChainEnabled.test.js rename to lib/openzeppelin-contracts-upgradeable/test/crosschain/CrossChainEnabled.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/finance/PaymentSplitter.test.js b/lib/openzeppelin-contracts-upgradeable/test/finance/PaymentSplitter.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/finance/PaymentSplitter.test.js rename to lib/openzeppelin-contracts-upgradeable/test/finance/PaymentSplitter.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/finance/VestingWallet.behavior.js b/lib/openzeppelin-contracts-upgradeable/test/finance/VestingWallet.behavior.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/finance/VestingWallet.behavior.js rename to lib/openzeppelin-contracts-upgradeable/test/finance/VestingWallet.behavior.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/finance/VestingWallet.test.js b/lib/openzeppelin-contracts-upgradeable/test/finance/VestingWallet.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/finance/VestingWallet.test.js rename to lib/openzeppelin-contracts-upgradeable/test/finance/VestingWallet.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/governance/Governor.test.js b/lib/openzeppelin-contracts-upgradeable/test/governance/Governor.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/governance/Governor.test.js rename to lib/openzeppelin-contracts-upgradeable/test/governance/Governor.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/governance/TimelockController.test.js b/lib/openzeppelin-contracts-upgradeable/test/governance/TimelockController.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/governance/TimelockController.test.js rename to lib/openzeppelin-contracts-upgradeable/test/governance/TimelockController.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/governance/compatibility/GovernorCompatibilityBravo.test.js b/lib/openzeppelin-contracts-upgradeable/test/governance/compatibility/GovernorCompatibilityBravo.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/governance/compatibility/GovernorCompatibilityBravo.test.js rename to lib/openzeppelin-contracts-upgradeable/test/governance/compatibility/GovernorCompatibilityBravo.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/governance/extensions/GovernorComp.test.js b/lib/openzeppelin-contracts-upgradeable/test/governance/extensions/GovernorComp.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/governance/extensions/GovernorComp.test.js rename to lib/openzeppelin-contracts-upgradeable/test/governance/extensions/GovernorComp.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/governance/extensions/GovernorERC721.test.js b/lib/openzeppelin-contracts-upgradeable/test/governance/extensions/GovernorERC721.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/governance/extensions/GovernorERC721.test.js rename to lib/openzeppelin-contracts-upgradeable/test/governance/extensions/GovernorERC721.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/governance/extensions/GovernorPreventLateQuorum.test.js b/lib/openzeppelin-contracts-upgradeable/test/governance/extensions/GovernorPreventLateQuorum.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/governance/extensions/GovernorPreventLateQuorum.test.js rename to lib/openzeppelin-contracts-upgradeable/test/governance/extensions/GovernorPreventLateQuorum.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/governance/extensions/GovernorTimelockCompound.test.js b/lib/openzeppelin-contracts-upgradeable/test/governance/extensions/GovernorTimelockCompound.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/governance/extensions/GovernorTimelockCompound.test.js rename to lib/openzeppelin-contracts-upgradeable/test/governance/extensions/GovernorTimelockCompound.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/governance/extensions/GovernorTimelockControl.test.js b/lib/openzeppelin-contracts-upgradeable/test/governance/extensions/GovernorTimelockControl.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/governance/extensions/GovernorTimelockControl.test.js rename to lib/openzeppelin-contracts-upgradeable/test/governance/extensions/GovernorTimelockControl.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/governance/extensions/GovernorVotesQuorumFraction.test.js b/lib/openzeppelin-contracts-upgradeable/test/governance/extensions/GovernorVotesQuorumFraction.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/governance/extensions/GovernorVotesQuorumFraction.test.js rename to lib/openzeppelin-contracts-upgradeable/test/governance/extensions/GovernorVotesQuorumFraction.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/governance/extensions/GovernorWithParams.test.js b/lib/openzeppelin-contracts-upgradeable/test/governance/extensions/GovernorWithParams.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/governance/extensions/GovernorWithParams.test.js rename to lib/openzeppelin-contracts-upgradeable/test/governance/extensions/GovernorWithParams.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/governance/utils/Votes.behavior.js b/lib/openzeppelin-contracts-upgradeable/test/governance/utils/Votes.behavior.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/governance/utils/Votes.behavior.js rename to lib/openzeppelin-contracts-upgradeable/test/governance/utils/Votes.behavior.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/governance/utils/Votes.test.js b/lib/openzeppelin-contracts-upgradeable/test/governance/utils/Votes.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/governance/utils/Votes.test.js rename to lib/openzeppelin-contracts-upgradeable/test/governance/utils/Votes.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/helpers/create2.js b/lib/openzeppelin-contracts-upgradeable/test/helpers/create2.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/helpers/create2.js rename to lib/openzeppelin-contracts-upgradeable/test/helpers/create2.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/helpers/crosschain.js b/lib/openzeppelin-contracts-upgradeable/test/helpers/crosschain.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/helpers/crosschain.js rename to lib/openzeppelin-contracts-upgradeable/test/helpers/crosschain.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/helpers/customError.js b/lib/openzeppelin-contracts-upgradeable/test/helpers/customError.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/helpers/customError.js rename to lib/openzeppelin-contracts-upgradeable/test/helpers/customError.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/helpers/eip712.js b/lib/openzeppelin-contracts-upgradeable/test/helpers/eip712.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/helpers/eip712.js rename to lib/openzeppelin-contracts-upgradeable/test/helpers/eip712.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/helpers/enums.js b/lib/openzeppelin-contracts-upgradeable/test/helpers/enums.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/helpers/enums.js rename to lib/openzeppelin-contracts-upgradeable/test/helpers/enums.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/helpers/erc1967.js b/lib/openzeppelin-contracts-upgradeable/test/helpers/erc1967.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/helpers/erc1967.js rename to lib/openzeppelin-contracts-upgradeable/test/helpers/erc1967.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/helpers/governance.js b/lib/openzeppelin-contracts-upgradeable/test/helpers/governance.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/helpers/governance.js rename to lib/openzeppelin-contracts-upgradeable/test/helpers/governance.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/helpers/sign.js b/lib/openzeppelin-contracts-upgradeable/test/helpers/sign.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/helpers/sign.js rename to lib/openzeppelin-contracts-upgradeable/test/helpers/sign.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/helpers/txpool.js b/lib/openzeppelin-contracts-upgradeable/test/helpers/txpool.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/helpers/txpool.js rename to lib/openzeppelin-contracts-upgradeable/test/helpers/txpool.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/metatx/ERC2771Context.test.js b/lib/openzeppelin-contracts-upgradeable/test/metatx/ERC2771Context.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/metatx/ERC2771Context.test.js rename to lib/openzeppelin-contracts-upgradeable/test/metatx/ERC2771Context.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/metatx/MinimalForwarder.test.js b/lib/openzeppelin-contracts-upgradeable/test/metatx/MinimalForwarder.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/metatx/MinimalForwarder.test.js rename to lib/openzeppelin-contracts-upgradeable/test/metatx/MinimalForwarder.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/migrate-imports.test.js b/lib/openzeppelin-contracts-upgradeable/test/migrate-imports.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/migrate-imports.test.js rename to lib/openzeppelin-contracts-upgradeable/test/migrate-imports.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/proxy/Clones.behaviour.js b/lib/openzeppelin-contracts-upgradeable/test/proxy/Clones.behaviour.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/proxy/Clones.behaviour.js rename to lib/openzeppelin-contracts-upgradeable/test/proxy/Clones.behaviour.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/proxy/Clones.test.js b/lib/openzeppelin-contracts-upgradeable/test/proxy/Clones.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/proxy/Clones.test.js rename to lib/openzeppelin-contracts-upgradeable/test/proxy/Clones.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/proxy/ERC1967/ERC1967Proxy.test.js b/lib/openzeppelin-contracts-upgradeable/test/proxy/ERC1967/ERC1967Proxy.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/proxy/ERC1967/ERC1967Proxy.test.js rename to lib/openzeppelin-contracts-upgradeable/test/proxy/ERC1967/ERC1967Proxy.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/proxy/Proxy.behaviour.js b/lib/openzeppelin-contracts-upgradeable/test/proxy/Proxy.behaviour.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/proxy/Proxy.behaviour.js rename to lib/openzeppelin-contracts-upgradeable/test/proxy/Proxy.behaviour.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/proxy/beacon/BeaconProxy.test.js b/lib/openzeppelin-contracts-upgradeable/test/proxy/beacon/BeaconProxy.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/proxy/beacon/BeaconProxy.test.js rename to lib/openzeppelin-contracts-upgradeable/test/proxy/beacon/BeaconProxy.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/proxy/beacon/UpgradeableBeacon.test.js b/lib/openzeppelin-contracts-upgradeable/test/proxy/beacon/UpgradeableBeacon.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/proxy/beacon/UpgradeableBeacon.test.js rename to lib/openzeppelin-contracts-upgradeable/test/proxy/beacon/UpgradeableBeacon.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/proxy/transparent/ProxyAdmin.test.js b/lib/openzeppelin-contracts-upgradeable/test/proxy/transparent/ProxyAdmin.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/proxy/transparent/ProxyAdmin.test.js rename to lib/openzeppelin-contracts-upgradeable/test/proxy/transparent/ProxyAdmin.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/proxy/transparent/TransparentUpgradeableProxy.behaviour.js b/lib/openzeppelin-contracts-upgradeable/test/proxy/transparent/TransparentUpgradeableProxy.behaviour.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/proxy/transparent/TransparentUpgradeableProxy.behaviour.js rename to lib/openzeppelin-contracts-upgradeable/test/proxy/transparent/TransparentUpgradeableProxy.behaviour.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/proxy/transparent/TransparentUpgradeableProxy.test.js b/lib/openzeppelin-contracts-upgradeable/test/proxy/transparent/TransparentUpgradeableProxy.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/proxy/transparent/TransparentUpgradeableProxy.test.js rename to lib/openzeppelin-contracts-upgradeable/test/proxy/transparent/TransparentUpgradeableProxy.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/proxy/utils/Initializable.test.js b/lib/openzeppelin-contracts-upgradeable/test/proxy/utils/Initializable.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/proxy/utils/Initializable.test.js rename to lib/openzeppelin-contracts-upgradeable/test/proxy/utils/Initializable.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/proxy/utils/UUPSUpgradeable.test.js b/lib/openzeppelin-contracts-upgradeable/test/proxy/utils/UUPSUpgradeable.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/proxy/utils/UUPSUpgradeable.test.js rename to lib/openzeppelin-contracts-upgradeable/test/proxy/utils/UUPSUpgradeable.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/security/Pausable.test.js b/lib/openzeppelin-contracts-upgradeable/test/security/Pausable.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/security/Pausable.test.js rename to lib/openzeppelin-contracts-upgradeable/test/security/Pausable.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/security/PullPayment.test.js b/lib/openzeppelin-contracts-upgradeable/test/security/PullPayment.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/security/PullPayment.test.js rename to lib/openzeppelin-contracts-upgradeable/test/security/PullPayment.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/security/ReentrancyGuard.test.js b/lib/openzeppelin-contracts-upgradeable/test/security/ReentrancyGuard.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/security/ReentrancyGuard.test.js rename to lib/openzeppelin-contracts-upgradeable/test/security/ReentrancyGuard.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC1155/ERC1155.behavior.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC1155/ERC1155.behavior.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC1155/ERC1155.behavior.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC1155/ERC1155.behavior.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC1155/ERC1155.test.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC1155/ERC1155.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC1155/ERC1155.test.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC1155/ERC1155.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC1155/extensions/ERC1155Burnable.test.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC1155/extensions/ERC1155Burnable.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC1155/extensions/ERC1155Burnable.test.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC1155/extensions/ERC1155Burnable.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC1155/extensions/ERC1155Pausable.test.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC1155/extensions/ERC1155Pausable.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC1155/extensions/ERC1155Pausable.test.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC1155/extensions/ERC1155Pausable.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC1155/extensions/ERC1155Supply.test.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC1155/extensions/ERC1155Supply.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC1155/extensions/ERC1155Supply.test.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC1155/extensions/ERC1155Supply.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC1155/extensions/ERC1155URIStorage.test.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC1155/extensions/ERC1155URIStorage.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC1155/extensions/ERC1155URIStorage.test.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC1155/extensions/ERC1155URIStorage.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC1155/presets/ERC1155PresetMinterPauser.test.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC1155/presets/ERC1155PresetMinterPauser.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC1155/presets/ERC1155PresetMinterPauser.test.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC1155/presets/ERC1155PresetMinterPauser.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC1155/utils/ERC1155Holder.test.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC1155/utils/ERC1155Holder.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC1155/utils/ERC1155Holder.test.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC1155/utils/ERC1155Holder.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/ERC20.behavior.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/ERC20.behavior.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/ERC20.behavior.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC20/ERC20.behavior.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/ERC20.test.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/ERC20.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/ERC20.test.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC20/ERC20.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20Burnable.behavior.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20Burnable.behavior.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20Burnable.behavior.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20Burnable.behavior.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20Burnable.test.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20Burnable.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20Burnable.test.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20Burnable.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20Capped.behavior.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20Capped.behavior.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20Capped.behavior.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20Capped.behavior.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20Capped.test.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20Capped.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20Capped.test.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20Capped.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20FlashMint.test.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20FlashMint.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20FlashMint.test.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20FlashMint.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20Pausable.test.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20Pausable.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20Pausable.test.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20Pausable.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20Snapshot.test.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20Snapshot.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20Snapshot.test.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20Snapshot.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20Votes.test.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20Votes.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20Votes.test.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20Votes.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20VotesComp.test.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20VotesComp.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20VotesComp.test.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20VotesComp.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20Wrapper.test.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20Wrapper.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20Wrapper.test.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC20Wrapper.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC4626.test.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC4626.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC4626.test.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/ERC4626.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/draft-ERC20Permit.test.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/draft-ERC20Permit.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/draft-ERC20Permit.test.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC20/extensions/draft-ERC20Permit.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/presets/ERC20PresetFixedSupply.test.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/presets/ERC20PresetFixedSupply.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/presets/ERC20PresetFixedSupply.test.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC20/presets/ERC20PresetFixedSupply.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/presets/ERC20PresetMinterPauser.test.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/presets/ERC20PresetMinterPauser.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/presets/ERC20PresetMinterPauser.test.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC20/presets/ERC20PresetMinterPauser.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/utils/SafeERC20.test.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/utils/SafeERC20.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/utils/SafeERC20.test.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC20/utils/SafeERC20.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/utils/TokenTimelock.test.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/utils/TokenTimelock.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC20/utils/TokenTimelock.test.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC20/utils/TokenTimelock.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC721/ERC721.behavior.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC721/ERC721.behavior.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC721/ERC721.behavior.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC721/ERC721.behavior.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC721/ERC721.test.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC721/ERC721.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC721/ERC721.test.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC721/ERC721.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC721/ERC721Enumerable.test.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC721/ERC721Enumerable.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC721/ERC721Enumerable.test.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC721/ERC721Enumerable.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC721/extensions/ERC721Burnable.test.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC721/extensions/ERC721Burnable.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC721/extensions/ERC721Burnable.test.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC721/extensions/ERC721Burnable.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC721/extensions/ERC721Consecutive.test.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC721/extensions/ERC721Consecutive.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC721/extensions/ERC721Consecutive.test.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC721/extensions/ERC721Consecutive.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC721/extensions/ERC721Pausable.test.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC721/extensions/ERC721Pausable.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC721/extensions/ERC721Pausable.test.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC721/extensions/ERC721Pausable.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC721/extensions/ERC721Royalty.test.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC721/extensions/ERC721Royalty.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC721/extensions/ERC721Royalty.test.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC721/extensions/ERC721Royalty.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC721/extensions/ERC721URIStorage.test.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC721/extensions/ERC721URIStorage.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC721/extensions/ERC721URIStorage.test.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC721/extensions/ERC721URIStorage.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC721/extensions/ERC721Votes.test.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC721/extensions/ERC721Votes.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC721/extensions/ERC721Votes.test.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC721/extensions/ERC721Votes.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC721/presets/ERC721PresetMinterPauserAutoId.test.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC721/presets/ERC721PresetMinterPauserAutoId.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC721/presets/ERC721PresetMinterPauserAutoId.test.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC721/presets/ERC721PresetMinterPauserAutoId.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC721/utils/ERC721Holder.test.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC721/utils/ERC721Holder.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC721/utils/ERC721Holder.test.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC721/utils/ERC721Holder.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC777/ERC777.behavior.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC777/ERC777.behavior.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC777/ERC777.behavior.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC777/ERC777.behavior.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC777/ERC777.test.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC777/ERC777.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC777/ERC777.test.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC777/ERC777.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC777/presets/ERC777PresetFixedSupply.test.js b/lib/openzeppelin-contracts-upgradeable/test/token/ERC777/presets/ERC777PresetFixedSupply.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/ERC777/presets/ERC777PresetFixedSupply.test.js rename to lib/openzeppelin-contracts-upgradeable/test/token/ERC777/presets/ERC777PresetFixedSupply.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/token/common/ERC2981.behavior.js b/lib/openzeppelin-contracts-upgradeable/test/token/common/ERC2981.behavior.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/token/common/ERC2981.behavior.js rename to lib/openzeppelin-contracts-upgradeable/test/token/common/ERC2981.behavior.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/utils/Address.test.js b/lib/openzeppelin-contracts-upgradeable/test/utils/Address.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/utils/Address.test.js rename to lib/openzeppelin-contracts-upgradeable/test/utils/Address.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/utils/Arrays.test.js b/lib/openzeppelin-contracts-upgradeable/test/utils/Arrays.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/utils/Arrays.test.js rename to lib/openzeppelin-contracts-upgradeable/test/utils/Arrays.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/utils/Base64.test.js b/lib/openzeppelin-contracts-upgradeable/test/utils/Base64.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/utils/Base64.test.js rename to lib/openzeppelin-contracts-upgradeable/test/utils/Base64.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/utils/Checkpoints.test.js b/lib/openzeppelin-contracts-upgradeable/test/utils/Checkpoints.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/utils/Checkpoints.test.js rename to lib/openzeppelin-contracts-upgradeable/test/utils/Checkpoints.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/utils/Context.behavior.js b/lib/openzeppelin-contracts-upgradeable/test/utils/Context.behavior.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/utils/Context.behavior.js rename to lib/openzeppelin-contracts-upgradeable/test/utils/Context.behavior.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/utils/Context.test.js b/lib/openzeppelin-contracts-upgradeable/test/utils/Context.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/utils/Context.test.js rename to lib/openzeppelin-contracts-upgradeable/test/utils/Context.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/utils/Counters.test.js b/lib/openzeppelin-contracts-upgradeable/test/utils/Counters.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/utils/Counters.test.js rename to lib/openzeppelin-contracts-upgradeable/test/utils/Counters.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/utils/Create2.test.js b/lib/openzeppelin-contracts-upgradeable/test/utils/Create2.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/utils/Create2.test.js rename to lib/openzeppelin-contracts-upgradeable/test/utils/Create2.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/utils/Multicall.test.js b/lib/openzeppelin-contracts-upgradeable/test/utils/Multicall.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/utils/Multicall.test.js rename to lib/openzeppelin-contracts-upgradeable/test/utils/Multicall.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/utils/StorageSlot.test.js b/lib/openzeppelin-contracts-upgradeable/test/utils/StorageSlot.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/utils/StorageSlot.test.js rename to lib/openzeppelin-contracts-upgradeable/test/utils/StorageSlot.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/utils/Strings.test.js b/lib/openzeppelin-contracts-upgradeable/test/utils/Strings.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/utils/Strings.test.js rename to lib/openzeppelin-contracts-upgradeable/test/utils/Strings.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/utils/TimersBlockNumberImpl.test.js b/lib/openzeppelin-contracts-upgradeable/test/utils/TimersBlockNumberImpl.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/utils/TimersBlockNumberImpl.test.js rename to lib/openzeppelin-contracts-upgradeable/test/utils/TimersBlockNumberImpl.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/utils/TimersTimestamp.test.js b/lib/openzeppelin-contracts-upgradeable/test/utils/TimersTimestamp.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/utils/TimersTimestamp.test.js rename to lib/openzeppelin-contracts-upgradeable/test/utils/TimersTimestamp.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/utils/cryptography/ECDSA.test.js b/lib/openzeppelin-contracts-upgradeable/test/utils/cryptography/ECDSA.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/utils/cryptography/ECDSA.test.js rename to lib/openzeppelin-contracts-upgradeable/test/utils/cryptography/ECDSA.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/utils/cryptography/EIP712.test.js b/lib/openzeppelin-contracts-upgradeable/test/utils/cryptography/EIP712.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/utils/cryptography/EIP712.test.js rename to lib/openzeppelin-contracts-upgradeable/test/utils/cryptography/EIP712.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/utils/cryptography/MerkleProof.test.js b/lib/openzeppelin-contracts-upgradeable/test/utils/cryptography/MerkleProof.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/utils/cryptography/MerkleProof.test.js rename to lib/openzeppelin-contracts-upgradeable/test/utils/cryptography/MerkleProof.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/utils/cryptography/SignatureChecker.test.js b/lib/openzeppelin-contracts-upgradeable/test/utils/cryptography/SignatureChecker.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/utils/cryptography/SignatureChecker.test.js rename to lib/openzeppelin-contracts-upgradeable/test/utils/cryptography/SignatureChecker.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/utils/escrow/ConditionalEscrow.test.js b/lib/openzeppelin-contracts-upgradeable/test/utils/escrow/ConditionalEscrow.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/utils/escrow/ConditionalEscrow.test.js rename to lib/openzeppelin-contracts-upgradeable/test/utils/escrow/ConditionalEscrow.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/utils/escrow/Escrow.behavior.js b/lib/openzeppelin-contracts-upgradeable/test/utils/escrow/Escrow.behavior.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/utils/escrow/Escrow.behavior.js rename to lib/openzeppelin-contracts-upgradeable/test/utils/escrow/Escrow.behavior.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/utils/escrow/Escrow.test.js b/lib/openzeppelin-contracts-upgradeable/test/utils/escrow/Escrow.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/utils/escrow/Escrow.test.js rename to lib/openzeppelin-contracts-upgradeable/test/utils/escrow/Escrow.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/utils/escrow/RefundEscrow.test.js b/lib/openzeppelin-contracts-upgradeable/test/utils/escrow/RefundEscrow.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/utils/escrow/RefundEscrow.test.js rename to lib/openzeppelin-contracts-upgradeable/test/utils/escrow/RefundEscrow.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/utils/introspection/ERC165.test.js b/lib/openzeppelin-contracts-upgradeable/test/utils/introspection/ERC165.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/utils/introspection/ERC165.test.js rename to lib/openzeppelin-contracts-upgradeable/test/utils/introspection/ERC165.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/utils/introspection/ERC165Checker.test.js b/lib/openzeppelin-contracts-upgradeable/test/utils/introspection/ERC165Checker.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/utils/introspection/ERC165Checker.test.js rename to lib/openzeppelin-contracts-upgradeable/test/utils/introspection/ERC165Checker.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/utils/introspection/ERC165Storage.test.js b/lib/openzeppelin-contracts-upgradeable/test/utils/introspection/ERC165Storage.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/utils/introspection/ERC165Storage.test.js rename to lib/openzeppelin-contracts-upgradeable/test/utils/introspection/ERC165Storage.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/utils/introspection/ERC1820Implementer.test.js b/lib/openzeppelin-contracts-upgradeable/test/utils/introspection/ERC1820Implementer.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/utils/introspection/ERC1820Implementer.test.js rename to lib/openzeppelin-contracts-upgradeable/test/utils/introspection/ERC1820Implementer.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/utils/introspection/SupportsInterface.behavior.js b/lib/openzeppelin-contracts-upgradeable/test/utils/introspection/SupportsInterface.behavior.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/utils/introspection/SupportsInterface.behavior.js rename to lib/openzeppelin-contracts-upgradeable/test/utils/introspection/SupportsInterface.behavior.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/utils/math/Math.t.sol b/lib/openzeppelin-contracts-upgradeable/test/utils/math/Math.t.sol similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/utils/math/Math.t.sol rename to lib/openzeppelin-contracts-upgradeable/test/utils/math/Math.t.sol diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/utils/math/Math.test.js b/lib/openzeppelin-contracts-upgradeable/test/utils/math/Math.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/utils/math/Math.test.js rename to lib/openzeppelin-contracts-upgradeable/test/utils/math/Math.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/utils/math/SafeCast.test.js b/lib/openzeppelin-contracts-upgradeable/test/utils/math/SafeCast.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/utils/math/SafeCast.test.js rename to lib/openzeppelin-contracts-upgradeable/test/utils/math/SafeCast.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/utils/math/SafeMath.test.js b/lib/openzeppelin-contracts-upgradeable/test/utils/math/SafeMath.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/utils/math/SafeMath.test.js rename to lib/openzeppelin-contracts-upgradeable/test/utils/math/SafeMath.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/utils/math/SignedMath.test.js b/lib/openzeppelin-contracts-upgradeable/test/utils/math/SignedMath.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/utils/math/SignedMath.test.js rename to lib/openzeppelin-contracts-upgradeable/test/utils/math/SignedMath.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/utils/math/SignedSafeMath.test.js b/lib/openzeppelin-contracts-upgradeable/test/utils/math/SignedSafeMath.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/utils/math/SignedSafeMath.test.js rename to lib/openzeppelin-contracts-upgradeable/test/utils/math/SignedSafeMath.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/utils/structs/BitMap.test.js b/lib/openzeppelin-contracts-upgradeable/test/utils/structs/BitMap.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/utils/structs/BitMap.test.js rename to lib/openzeppelin-contracts-upgradeable/test/utils/structs/BitMap.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/utils/structs/DoubleEndedQueue.test.js b/lib/openzeppelin-contracts-upgradeable/test/utils/structs/DoubleEndedQueue.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/utils/structs/DoubleEndedQueue.test.js rename to lib/openzeppelin-contracts-upgradeable/test/utils/structs/DoubleEndedQueue.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/utils/structs/EnumerableMap.behavior.js b/lib/openzeppelin-contracts-upgradeable/test/utils/structs/EnumerableMap.behavior.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/utils/structs/EnumerableMap.behavior.js rename to lib/openzeppelin-contracts-upgradeable/test/utils/structs/EnumerableMap.behavior.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/utils/structs/EnumerableMap.test.js b/lib/openzeppelin-contracts-upgradeable/test/utils/structs/EnumerableMap.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/utils/structs/EnumerableMap.test.js rename to lib/openzeppelin-contracts-upgradeable/test/utils/structs/EnumerableMap.test.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/utils/structs/EnumerableSet.behavior.js b/lib/openzeppelin-contracts-upgradeable/test/utils/structs/EnumerableSet.behavior.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/utils/structs/EnumerableSet.behavior.js rename to lib/openzeppelin-contracts-upgradeable/test/utils/structs/EnumerableSet.behavior.js diff --git a/contracts/lib/openzeppelin-contracts-upgradeable/test/utils/structs/EnumerableSet.test.js b/lib/openzeppelin-contracts-upgradeable/test/utils/structs/EnumerableSet.test.js similarity index 100% rename from contracts/lib/openzeppelin-contracts-upgradeable/test/utils/structs/EnumerableSet.test.js rename to lib/openzeppelin-contracts-upgradeable/test/utils/structs/EnumerableSet.test.js diff --git a/contracts/lib/prb-test/.commitlintrc.yml b/lib/prb-test/.commitlintrc.yml similarity index 100% rename from contracts/lib/prb-test/.commitlintrc.yml rename to lib/prb-test/.commitlintrc.yml diff --git a/contracts/lib/prb-test/.editorconfig b/lib/prb-test/.editorconfig similarity index 100% rename from contracts/lib/prb-test/.editorconfig rename to lib/prb-test/.editorconfig diff --git a/contracts/lib/prb-test/.github/workflows/ci.yml b/lib/prb-test/.github/workflows/ci.yml similarity index 100% rename from contracts/lib/prb-test/.github/workflows/ci.yml rename to lib/prb-test/.github/workflows/ci.yml diff --git a/contracts/lib/prb-test/.gitignore b/lib/prb-test/.gitignore similarity index 100% rename from contracts/lib/prb-test/.gitignore rename to lib/prb-test/.gitignore diff --git a/contracts/lib/prb-test/.lintstagedrc.yml b/lib/prb-test/.lintstagedrc.yml similarity index 100% rename from contracts/lib/prb-test/.lintstagedrc.yml rename to lib/prb-test/.lintstagedrc.yml diff --git a/contracts/lib/prb-test/.prettierignore b/lib/prb-test/.prettierignore similarity index 100% rename from contracts/lib/prb-test/.prettierignore rename to lib/prb-test/.prettierignore diff --git a/contracts/lib/prb-test/.prettierrc.yml b/lib/prb-test/.prettierrc.yml similarity index 100% rename from contracts/lib/prb-test/.prettierrc.yml rename to lib/prb-test/.prettierrc.yml diff --git a/contracts/lib/prb-test/.solhint.json b/lib/prb-test/.solhint.json similarity index 100% rename from contracts/lib/prb-test/.solhint.json rename to lib/prb-test/.solhint.json diff --git a/contracts/lib/prb-test/.yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs b/lib/prb-test/.yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs similarity index 100% rename from contracts/lib/prb-test/.yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs rename to lib/prb-test/.yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs diff --git a/contracts/lib/prb-test/.yarn/releases/yarn-3.2.4.cjs b/lib/prb-test/.yarn/releases/yarn-3.2.4.cjs similarity index 100% rename from contracts/lib/prb-test/.yarn/releases/yarn-3.2.4.cjs rename to lib/prb-test/.yarn/releases/yarn-3.2.4.cjs diff --git a/contracts/lib/prb-test/.yarnrc.yml b/lib/prb-test/.yarnrc.yml similarity index 100% rename from contracts/lib/prb-test/.yarnrc.yml rename to lib/prb-test/.yarnrc.yml diff --git a/contracts/lib/prb-test/CHANGELOG.md b/lib/prb-test/CHANGELOG.md similarity index 100% rename from contracts/lib/prb-test/CHANGELOG.md rename to lib/prb-test/CHANGELOG.md diff --git a/contracts/lib/prb-test/LICENSE.md b/lib/prb-test/LICENSE.md similarity index 100% rename from contracts/lib/prb-test/LICENSE.md rename to lib/prb-test/LICENSE.md diff --git a/contracts/lib/prb-test/README.md b/lib/prb-test/README.md similarity index 100% rename from contracts/lib/prb-test/README.md rename to lib/prb-test/README.md diff --git a/contracts/lib/prb-test/foundry.toml b/lib/prb-test/foundry.toml similarity index 100% rename from contracts/lib/prb-test/foundry.toml rename to lib/prb-test/foundry.toml diff --git a/contracts/lib/prb-test/package.json b/lib/prb-test/package.json similarity index 100% rename from contracts/lib/prb-test/package.json rename to lib/prb-test/package.json diff --git a/contracts/lib/prb-test/src/Helpers.sol b/lib/prb-test/src/Helpers.sol similarity index 100% rename from contracts/lib/prb-test/src/Helpers.sol rename to lib/prb-test/src/Helpers.sol diff --git a/contracts/lib/prb-test/src/PRBTest.sol b/lib/prb-test/src/PRBTest.sol similarity index 100% rename from contracts/lib/prb-test/src/PRBTest.sol rename to lib/prb-test/src/PRBTest.sol diff --git a/contracts/lib/prb-test/src/Vm.sol b/lib/prb-test/src/Vm.sol similarity index 100% rename from contracts/lib/prb-test/src/Vm.sol rename to lib/prb-test/src/Vm.sol diff --git a/contracts/lib/prb-test/test/PRBTestMock.t.sol b/lib/prb-test/test/PRBTestMock.t.sol similarity index 100% rename from contracts/lib/prb-test/test/PRBTestMock.t.sol rename to lib/prb-test/test/PRBTestMock.t.sol diff --git a/contracts/lib/prb-test/test/PRBTestTest.t.sol b/lib/prb-test/test/PRBTestTest.t.sol similarity index 100% rename from contracts/lib/prb-test/test/PRBTestTest.t.sol rename to lib/prb-test/test/PRBTestTest.t.sol diff --git a/contracts/lib/prb-test/test/assert-almost-eq/assertAlmostEq.t.sol b/lib/prb-test/test/assert-almost-eq/assertAlmostEq.t.sol similarity index 100% rename from contracts/lib/prb-test/test/assert-almost-eq/assertAlmostEq.t.sol rename to lib/prb-test/test/assert-almost-eq/assertAlmostEq.t.sol diff --git a/contracts/lib/prb-test/test/assert-contains/assertContains.t.sol b/lib/prb-test/test/assert-contains/assertContains.t.sol similarity index 100% rename from contracts/lib/prb-test/test/assert-contains/assertContains.t.sol rename to lib/prb-test/test/assert-contains/assertContains.t.sol diff --git a/contracts/lib/prb-test/test/assert-eq/assertEq.t.sol b/lib/prb-test/test/assert-eq/assertEq.t.sol similarity index 100% rename from contracts/lib/prb-test/test/assert-eq/assertEq.t.sol rename to lib/prb-test/test/assert-eq/assertEq.t.sol diff --git a/contracts/lib/prb-test/test/assert-false/assertFalse.t.sol b/lib/prb-test/test/assert-false/assertFalse.t.sol similarity index 100% rename from contracts/lib/prb-test/test/assert-false/assertFalse.t.sol rename to lib/prb-test/test/assert-false/assertFalse.t.sol diff --git a/contracts/lib/prb-test/test/assert-gt/assertGt.t.sol b/lib/prb-test/test/assert-gt/assertGt.t.sol similarity index 100% rename from contracts/lib/prb-test/test/assert-gt/assertGt.t.sol rename to lib/prb-test/test/assert-gt/assertGt.t.sol diff --git a/contracts/lib/prb-test/test/assert-gte/assertGte.t.sol b/lib/prb-test/test/assert-gte/assertGte.t.sol similarity index 100% rename from contracts/lib/prb-test/test/assert-gte/assertGte.t.sol rename to lib/prb-test/test/assert-gte/assertGte.t.sol diff --git a/contracts/lib/prb-test/test/assert-lt/assertLt.t.sol b/lib/prb-test/test/assert-lt/assertLt.t.sol similarity index 100% rename from contracts/lib/prb-test/test/assert-lt/assertLt.t.sol rename to lib/prb-test/test/assert-lt/assertLt.t.sol diff --git a/contracts/lib/prb-test/test/assert-lte/assertLte.t.sol b/lib/prb-test/test/assert-lte/assertLte.t.sol similarity index 100% rename from contracts/lib/prb-test/test/assert-lte/assertLte.t.sol rename to lib/prb-test/test/assert-lte/assertLte.t.sol diff --git a/contracts/lib/prb-test/test/assert-not-eq/assertNotEq.t.sol b/lib/prb-test/test/assert-not-eq/assertNotEq.t.sol similarity index 100% rename from contracts/lib/prb-test/test/assert-not-eq/assertNotEq.t.sol rename to lib/prb-test/test/assert-not-eq/assertNotEq.t.sol diff --git a/contracts/lib/prb-test/test/assert-true/assertTrue.t.sol b/lib/prb-test/test/assert-true/assertTrue.t.sol similarity index 100% rename from contracts/lib/prb-test/test/assert-true/assertTrue.t.sol rename to lib/prb-test/test/assert-true/assertTrue.t.sol diff --git a/contracts/lib/prb-test/test/fail/fail.t.sol b/lib/prb-test/test/fail/fail.t.sol similarity index 100% rename from contracts/lib/prb-test/test/fail/fail.t.sol rename to lib/prb-test/test/fail/fail.t.sol diff --git a/contracts/lib/prb-test/yarn.lock b/lib/prb-test/yarn.lock similarity index 100% rename from contracts/lib/prb-test/yarn.lock rename to lib/prb-test/yarn.lock diff --git a/package.json b/package.json index 7f34032..6f1a7f8 100644 --- a/package.json +++ b/package.json @@ -1,29 +1,119 @@ { - "name": "hypercerts", - "description": "Scalable retrospective reward systems for impact", - "version": "1.0.0-alpha.0", - "author": "Hypercerts Foundation", - "license": "Apache-2.0", - "private": true, - "scripts": { - "build": "turbo run build --filter=@hypercerts-org/contracts --concurrency=100%", - "copy": "pnpm copy:docs && pnpm copy:html", - "copy:docs": "mkdir -p ./build/docs/ && cp -r ./docs/build/* ./build/docs/", - "format:staged": "lint-staged", - "lint": "turbo run lint --filter=@hypercerts-org/contracts --concurrency=100%", - "serve:build": "pnpm serve build", - "test": "turbo run test --filter=@hypercerts-org/contracts --concurrency=1", - "prepare": "husky install" + "name": "@hypercerts-org/contracts", + "description": "EVM compatible protocol for managing impact claims", + "version": "2.0.0-alpha.11", + "author": { + "name": "Hypercerts Foundation", + "url": "https://github.com/hypercerts-org/hypercerts-protocol" + }, + "homepage": "https://hypercerts.org", + "bugs": "https://github.com/hypercerts-org/hypercerts-protocol/issues/new", + "repository": { + "url": "https://github.com/hypercerts-org/hypercerts-protocol", + "type": "git" + }, + "main": "./dist/cjs/index.cjs", + "module": "./dist/esm/index.mjs", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "require": "./dist/cjs/index.cjs", + "import": "./dist/esm/index.mjs" + } }, + "files": [ + "dist", + "README.md", + "package.json" + ], "devDependencies": { - "husky": "^8.0.3", - "lint-staged": "^13.1.2", - "prettier": "^2.8.3", - "turbo": "^2.0.3" + "@chainlink/contracts": "^0.8.0", + "@commitlint/cli": "^17.1.2", + "@commitlint/config-conventional": "^17.1.0", + "@looksrare/contracts-libs": "^3.4.0", + "@nomicfoundation/hardhat-ethers": "^3.0.8", + "@nomicfoundation/hardhat-toolbox": "^5.0.0", + "@nomicfoundation/hardhat-viem": "^2.0.6", + "@openzeppelin/contracts": "^4.9.3", + "@openzeppelin/hardhat-upgrades": "3.9.0", + "@primitivefi/hardhat-dodoc": "^0.2.3", + "@rollup/plugin-commonjs": "^24.0.1", + "@rollup/plugin-json": "^6.0.0", + "@rollup/plugin-node-resolve": "^15.0.1", + "@trivago/prettier-plugin-sort-imports": "^3.3.0", + "@typechain/hardhat": "^9.1.0", + "@types/node": "^18.18.1", + "@typescript-eslint/eslint-plugin": "^7.12.0", + "@typescript-eslint/parser": "^7.12.0", + "chai": "^4.5.0", + "commitizen": "^4.2.5", + "cross-env": "^7.0.3", + "cz-conventional-changelog": "^3.3.0", + "dotenv": "^16.0.2", + "eslint": "^8.23.1", + "eslint-config-prettier": "^8.5.0", + "ethers": "^6.8.0", + "hardhat-abi-exporter": "^2.10.1", + "hardhat-preprocessor": "^0.1.5", + "husky": "^8.0.1", + "lint-staged": "^13.0.3", + "prettier": "^2.8.8", + "prettier-plugin-solidity": "^1.1.3", + "rimraf": "^5.0.5", + "rollup": "^4.0.2", + "rollup-plugin-auto-external": "^2.0.0", + "rollup-plugin-dts": "^6.1.1", + "rollup-plugin-esbuild": "^6.1.0", + "rollup-plugin-node-polyfills": "^0.2.1", + "rollup-plugin-swc3": "^0.11.2", + "shx": "^0.3.4", + "solhint": "^3.6.2", + "solhint-plugin-prettier": "^0.0.5", + "solmate": "^6.2.0", + "ts-node": "^10.9.1", + "typechain": "^8.3.2", + "typescript": "^5.5.3", + "viem": "^2.19.7", + "xdeployer": "^2.1.13" }, - "repository": { - "type": "git", - "url": "git+https://github.com/hypercerts-org/hypercerts.git" + "keywords": [ + "blockchain", + "ethereum", + "forge", + "foundry", + "hypercerts", + "smart-contracts", + "solidity", + "template" + ], + "scripts": { + "build": "pnpm clean && forge compile && hardhat compile && pnpm tsc -p tsconfig.build.json && rollup -c", + "build:forge": "pnpm clean && forge build", + "clean": "rimraf abi artifacts build cache cache_hardhat dist out types", + "deploy:create2-factory": "NODE_OPTIONS='--experimental-loader ts-node/esm/transpile-only --no-warnings=ExperimentalWarning' hardhat deploy-create2-factory", + "deploy:marketplace:celo": "NODE_OPTIONS='--experimental-loader ts-node/esm/transpile-only --no-warnings=ExperimentalWarning' hardhat deploy-marketplace-celo", + "deploy:marketplace:dryrun": "NODE_OPTIONS='--experimental-loader ts-node/esm/transpile-only --no-warnings=ExperimentalWarning' hardhat deploy-marketplace", + "deploy:marketplace": "NODE_OPTIONS='--experimental-loader ts-node/esm/transpile-only --no-warnings=ExperimentalWarning' hardhat deploy-marketplace", + "deploy:protocol:dryrun": "pnpm hardhat deploy-minter", + "deploy:protocol": "pnpm hardhat deploy-minter", + "docs": "hardhat dodoc", + "lint": "pnpm lint:sol && pnpm prettier:check", + "lint:sol": "forge fmt && solhint \"./{src,test/foundry/protocol,test/foundry/marketplace}/**/*.sol\"", + "prepublish": "pnpm build", + "prettier": "prettier --config \"./.prettierrc.yml\" --write \"**/*.{json,md,ts,yml}\"", + "prettier:check": "prettier --config \"./.prettierrc.yml\" --check \"**/*.{json,md,ts,yml}\"", + "slither": "slither ./src", + "test": "pnpm test:hardhat && pnpm test:forge", + "test:forge": "forge test", + "test:hardhat": "hardhat test", + "test:gas": "forge test --match-path test/foundry/PerformanceTesting.t.sol --gas-report", + "hardhat": "hardhat" + }, + "dependencies": { + "@starboardventures/hardhat-verify": "^1.0.1", + "@tenderly/hardhat-tenderly": "^2.3.0", + "hardhat": "^2.22.18" }, "packageManager": "pnpm@9.2.0+sha256.94fab213df221c55b6956b14a2264c21c6203cca9f0b3b95ff2fe9b84b120390" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a66fa7d..d35349d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,116 +7,101 @@ settings: importers: .: - devDependencies: - husky: - specifier: ^8.0.3 - version: 8.0.3 - lint-staged: - specifier: ^13.1.2 - version: 13.3.0(enquirer@2.4.1) - prettier: - specifier: ^2.8.3 - version: 2.8.8 - turbo: - specifier: ^2.0.3 - version: 2.0.3 - - contracts: dependencies: '@starboardventures/hardhat-verify': specifier: ^1.0.1 - version: 1.0.1(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)) + version: 1.0.1(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) '@tenderly/hardhat-tenderly': specifier: ^2.3.0 - version: 2.3.0(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)))(@swc/core@1.6.3)(@types/node@18.18.7)(bufferutil@4.0.8)(encoding@0.1.13)(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 2.3.0(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@swc/core@1.7.26)(@types/node@18.19.50)(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) hardhat: specifier: ^2.22.18 - version: 2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10) + version: 2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) devDependencies: '@chainlink/contracts': specifier: ^0.8.0 - version: 0.8.0(bufferutil@4.0.8)(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + version: 0.8.0(ethers@6.13.2) '@commitlint/cli': specifier: ^17.1.2 - version: 17.8.1(@swc/core@1.6.3) + version: 17.8.1(@swc/core@1.7.26) '@commitlint/config-conventional': specifier: ^17.1.0 version: 17.8.1 '@looksrare/contracts-libs': specifier: ^3.4.0 - version: 3.4.0 + version: 3.5.1 '@nomicfoundation/hardhat-ethers': specifier: ^3.0.8 - version: 3.0.8(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)) + version: 3.0.8(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) '@nomicfoundation/hardhat-toolbox': specifier: ^5.0.0 - version: 5.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition-ethers@0.15.4(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-network-helpers@1.0.9(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)))(@typechain/ethers-v6@0.4.3(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.3))(typescript@5.5.3))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.4.3(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.3))(typescript@5.5.3))(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.3)))(@types/chai@4.3.11)(@types/mocha@9.1.0)(@types/node@18.18.7)(chai@4.5.0)(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat-gas-reporter@1.0.9(bufferutil@4.0.8)(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10))(solidity-coverage@0.8.5(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)))(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typechain@8.3.2(typescript@5.5.3))(typescript@5.5.3) + version: 5.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(chai@4.5.0)(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@nomicfoundation/hardhat-ignition-ethers@0.15.5(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.10(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@nomicfoundation/ignition-core@0.15.5)(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@nomicfoundation/hardhat-network-helpers@1.0.11(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@nomicfoundation/hardhat-verify@2.0.10(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.6.2))(typescript@5.6.2))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.6.2))(typescript@5.6.2))(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))(typechain@8.3.2(typescript@5.6.2)))(@types/chai@4.3.19)(@types/mocha@10.0.7)(@types/node@18.19.50)(chai@4.5.0)(ethers@6.13.2)(hardhat-gas-reporter@1.0.10(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))(solidity-coverage@0.8.13(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typechain@8.3.2(typescript@5.6.2))(typescript@5.6.2) '@nomicfoundation/hardhat-viem': specifier: ^2.0.6 - version: 2.0.6(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10))(typescript@5.5.3)(viem@2.19.7(bufferutil@4.0.8)(typescript@5.5.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8) + version: 2.0.6(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))(typescript@5.6.2)(viem@2.21.5(typescript@5.6.2)) '@openzeppelin/contracts': specifier: ^4.9.3 - version: 4.9.3 + version: 4.9.6 '@openzeppelin/hardhat-upgrades': specifier: 3.9.0 - version: 3.9.0(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)))(encoding@0.1.13)(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)) + version: 3.9.0(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@nomicfoundation/hardhat-verify@2.0.10(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) '@primitivefi/hardhat-dodoc': specifier: ^0.2.3 - version: 0.2.3(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10))(squirrelly@8.0.8) + version: 0.2.3(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))(squirrelly@8.0.8) '@rollup/plugin-commonjs': specifier: ^24.0.1 - version: 24.1.0(rollup@4.6.1) + version: 24.1.0(rollup@4.21.2) '@rollup/plugin-json': specifier: ^6.0.0 - version: 6.0.1(rollup@4.6.1) + version: 6.1.0(rollup@4.21.2) '@rollup/plugin-node-resolve': specifier: ^15.0.1 - version: 15.2.3(rollup@4.6.1) + version: 15.2.3(rollup@4.21.2) '@trivago/prettier-plugin-sort-imports': specifier: ^3.3.0 version: 3.4.0(prettier@2.8.8) '@typechain/hardhat': specifier: ^9.1.0 - version: 9.1.0(@typechain/ethers-v6@0.4.3(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.3))(typescript@5.5.3))(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.3)) + version: 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.6.2))(typescript@5.6.2))(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))(typechain@8.3.2(typescript@5.6.2)) '@types/node': specifier: ^18.18.1 - version: 18.18.7 + version: 18.19.50 '@typescript-eslint/eslint-plugin': specifier: ^7.12.0 - version: 7.12.0(@typescript-eslint/parser@7.12.0(eslint@8.52.0)(typescript@5.5.3))(eslint@8.52.0)(typescript@5.5.3) + version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2) '@typescript-eslint/parser': specifier: ^7.12.0 - version: 7.12.0(eslint@8.52.0)(typescript@5.5.3) + version: 7.18.0(eslint@8.57.0)(typescript@5.6.2) chai: specifier: ^4.5.0 version: 4.5.0 commitizen: specifier: ^4.2.5 - version: 4.3.0(typescript@5.5.3) + version: 4.3.0(@types/node@18.19.50)(typescript@5.6.2) cross-env: specifier: ^7.0.3 version: 7.0.3 cz-conventional-changelog: specifier: ^3.3.0 - version: 3.3.0(typescript@5.5.3) + version: 3.3.0(@types/node@18.19.50)(typescript@5.6.2) dotenv: specifier: ^16.0.2 - version: 16.3.1 + version: 16.4.5 eslint: specifier: ^8.23.1 - version: 8.52.0 + version: 8.57.0 eslint-config-prettier: specifier: ^8.5.0 - version: 8.10.0(eslint@8.52.0) + version: 8.10.0(eslint@8.57.0) ethers: specifier: ^6.8.0 - version: 6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + version: 6.13.2 hardhat-abi-exporter: specifier: ^2.10.1 - version: 2.10.1(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)) + version: 2.10.1(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) hardhat-preprocessor: specifier: ^0.1.5 - version: 0.1.5(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)) + version: 0.1.5(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) husky: specifier: ^8.0.1 version: 8.0.3 @@ -128,70 +113,66 @@ importers: version: 2.8.8 prettier-plugin-solidity: specifier: ^1.1.3 - version: 1.1.3(prettier@2.8.8) + version: 1.4.1(prettier@2.8.8) rimraf: specifier: ^5.0.5 - version: 5.0.5 + version: 5.0.10 rollup: specifier: ^4.0.2 - version: 4.6.1 + version: 4.21.2 rollup-plugin-auto-external: specifier: ^2.0.0 - version: 2.0.0(rollup@4.6.1) + version: 2.0.0(rollup@4.21.2) rollup-plugin-dts: specifier: ^6.1.1 - version: 6.1.1(rollup@4.6.1)(typescript@5.5.3) + version: 6.1.1(rollup@4.21.2)(typescript@5.6.2) rollup-plugin-esbuild: specifier: ^6.1.0 - version: 6.1.0(esbuild@0.21.5)(rollup@4.6.1) + version: 6.1.1(esbuild@0.23.1)(rollup@4.21.2) rollup-plugin-node-polyfills: specifier: ^0.2.1 version: 0.2.1 rollup-plugin-swc3: specifier: ^0.11.2 - version: 0.11.2(@swc/core@1.6.3)(rollup@4.6.1) + version: 0.11.2(@swc/core@1.7.26)(rollup@4.21.2) shx: specifier: ^0.3.4 version: 0.3.4 solhint: specifier: ^3.6.2 - version: 3.6.2(typescript@5.5.3) + version: 3.6.2(typescript@5.6.2) solhint-plugin-prettier: specifier: ^0.0.5 - version: 0.0.5(prettier-plugin-solidity@1.1.3(prettier@2.8.8))(prettier@2.8.8) + version: 0.0.5(prettier-plugin-solidity@1.4.1(prettier@2.8.8))(prettier@2.8.8) solmate: specifier: ^6.2.0 version: 6.2.0 ts-node: specifier: ^10.9.1 - version: 10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3) + version: 10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2) typechain: specifier: ^8.3.2 - version: 8.3.2(typescript@5.5.3) + version: 8.3.2(typescript@5.6.2) typescript: specifier: ^5.5.3 - version: 5.5.3 + version: 5.6.2 viem: specifier: ^2.19.7 - version: 2.19.7(bufferutil@4.0.8)(typescript@5.5.3)(utf-8-validate@5.0.10)(zod@3.23.8) + version: 2.21.5(typescript@5.6.2) xdeployer: specifier: ^2.1.13 - version: 2.1.13(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)))(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)) + version: 2.2.2(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) packages: - '@aashutoshrathi/word-wrap@1.2.6': - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - '@adraffy/ens-normalize@1.10.0': resolution: {integrity: sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==} '@adraffy/ens-normalize@1.10.1': resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} - '@ampproject/remapping@2.2.1': - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} '@aws-crypto/crc32@5.2.0': @@ -285,9 +266,9 @@ packages: resolution: {integrity: sha512-t34GOPwBZsX7zGHjiTXmMHGY3kHM7fLiQ60Jqk0On9P0ASHTDE5U75RgCXboE3u+qEv9wyKyaqMNyMWj9qQlFg==} engines: {node: '>=18.0.0'} - '@aws-sdk/types@3.433.0': - resolution: {integrity: sha512-0jEE2mSrNDd8VGFjTc1otYrwYPIkzZJEIK90ZxisKvQ/EURGBhNzWn7ejWB9XCMFT6XumYLBR0V9qq5UPisWtA==} - engines: {node: '>=14.0.0'} + '@aws-sdk/types@3.649.0': + resolution: {integrity: sha512-PuPw8RysbhJNlaD2d/PzOTf8sbf4Dsn2b7hwyGh7YVG3S75yTpxSAZxrnhKsz9fStgqFmnw/jUfV/G+uQAeTVw==} + engines: {node: '>=16.0.0'} '@aws-sdk/types@3.731.0': resolution: {integrity: sha512-NrdkJg6oOUbXR2r9WvHP408CLyvST8cJfp1/jP9pemtjvjPoh6NukbCtiSFdOOb1eryP02CnqQWItfJC1p2Y/Q==} @@ -316,16 +297,12 @@ packages: '@aws-sdk/util-utf8-browser@3.259.0': resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} - '@babel/code-frame@7.23.5': - resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} - engines: {node: '>=6.9.0'} - '@babel/code-frame@7.24.7': resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.23.5': - resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + '@babel/compat-data@7.25.4': + resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==} engines: {node: '>=6.9.0'} '@babel/core@7.17.8': @@ -336,66 +313,58 @@ packages: resolution: {integrity: sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==} engines: {node: '>=6.9.0'} - '@babel/generator@7.23.5': - resolution: {integrity: sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==} + '@babel/generator@7.25.6': + resolution: {integrity: sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.22.15': - resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} + '@babel/helper-compilation-targets@7.25.2': + resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} engines: {node: '>=6.9.0'} - '@babel/helper-environment-visitor@7.22.20': - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + '@babel/helper-environment-visitor@7.24.7': + resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} engines: {node: '>=6.9.0'} - '@babel/helper-function-name@7.23.0': - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + '@babel/helper-function-name@7.24.7': + resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} engines: {node: '>=6.9.0'} - '@babel/helper-hoist-variables@7.22.5': - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + '@babel/helper-hoist-variables@7.24.7': + resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.22.15': - resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + '@babel/helper-module-imports@7.24.7': + resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.23.3': - resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + '@babel/helper-module-transforms@7.25.2': + resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-simple-access@7.22.5': - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} - engines: {node: '>=6.9.0'} - - '@babel/helper-split-export-declaration@7.22.6': - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + '@babel/helper-simple-access@7.24.7': + resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.23.4': - resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + '@babel/helper-split-export-declaration@7.24.7': + resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.22.20': - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + '@babel/helper-string-parser@7.24.8': + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} engines: {node: '>=6.9.0'} '@babel/helper-validator-identifier@7.24.7': resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.23.5': - resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + '@babel/helper-validator-option@7.24.8': + resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.23.5': - resolution: {integrity: sha512-oO7us8FzTEsG3U6ag9MfdF1iA/7Z6dz+MtFhifZk8C8o453rGJFFWUP1t+ULM9TUIAzC9uxXEiXjOiVMyd7QPg==} - engines: {node: '>=6.9.0'} - - '@babel/highlight@7.23.4': - resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + '@babel/helpers@7.25.6': + resolution: {integrity: sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==} engines: {node: '>=6.9.0'} '@babel/highlight@7.24.7': @@ -407,29 +376,29 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/parser@7.23.5': - resolution: {integrity: sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==} + '@babel/parser@7.25.6': + resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/template@7.22.15': - resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + '@babel/template@7.25.0': + resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} engines: {node: '>=6.9.0'} '@babel/traverse@7.17.3': resolution: {integrity: sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.23.5': - resolution: {integrity: sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w==} + '@babel/traverse@7.25.6': + resolution: {integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==} engines: {node: '>=6.9.0'} '@babel/types@7.17.0': resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==} engines: {node: '>=6.9.0'} - '@babel/types@7.23.5': - resolution: {integrity: sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==} + '@babel/types@7.25.6': + resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} engines: {node: '>=6.9.0'} '@bytecodealliance/preview2-shim@0.17.0': @@ -455,8 +424,8 @@ packages: resolution: {integrity: sha512-UUgUC+sNiiMwkyiuIFR7JG2cfd9t/7MV8VB4TZ+q02ZFkHoduUS4tJGsCBWvBOGD9Btev6IecPMvlWUfJorkEA==} engines: {node: '>=v14'} - '@commitlint/config-validator@18.1.0': - resolution: {integrity: sha512-kbHkIuItXn93o2NmTdwi5Mk1ujyuSIysRE/XHtrcps/27GuUKEIqBJp6TdJ4Sq+ze59RlzYSHMKuDKZbfg9+uQ==} + '@commitlint/config-validator@19.5.0': + resolution: {integrity: sha512-CHtj92H5rdhKt17RmgALhfQt95VayrUo2tSqY9g2w+laAXyk7K/Ef6uPm9tn5qSIwSmrLjKaXK9eiNuxmQrDBw==} engines: {node: '>=v18'} '@commitlint/ensure@17.8.1': @@ -467,8 +436,8 @@ packages: resolution: {integrity: sha512-JHVupQeSdNI6xzA9SqMF+p/JjrHTcrJdI02PwesQIDCIGUrv04hicJgCcws5nzaoZbROapPs0s6zeVHoxpMwFQ==} engines: {node: '>=v14'} - '@commitlint/execute-rule@18.1.0': - resolution: {integrity: sha512-w3Vt4K+O7+nSr9/gFSEfZ1exKUOPSlJaRpnk7Y+XowEhvwT7AIk1HNANH+gETf0zGZ020+hfiMW/Ome+SNCUsg==} + '@commitlint/execute-rule@19.5.0': + resolution: {integrity: sha512-aqyGgytXhl2ejlk+/rfgtwpPexYyri4t8/n4ku6rRJoRhGZpLFMqrZ+YaubeGysCP6oz4mMA34YSTaSOKEeNrg==} engines: {node: '>=v18'} '@commitlint/format@17.8.1': @@ -487,8 +456,8 @@ packages: resolution: {integrity: sha512-iF4CL7KDFstP1kpVUkT8K2Wl17h2yx9VaR1ztTc8vzByWWcbO/WaKwxsnCOqow9tVAlzPfo1ywk9m2oJ9ucMqA==} engines: {node: '>=v14'} - '@commitlint/load@18.2.0': - resolution: {integrity: sha512-xjX3d3CRlOALwImhOsmLYZh14/+gW/KxsY7+bPKrzmGuFailf9K7ckhB071oYZVJdACnpY4hDYiosFyOC+MpAA==} + '@commitlint/load@19.5.0': + resolution: {integrity: sha512-INOUhkL/qaKqwcTUvCE8iIUf5XHsEPCLY9looJ/ipzi7jtGhgmtH7OOFiNvwYgH7mA8osUWOUDV8t4E2HAi4xA==} engines: {node: '>=v18'} '@commitlint/message@17.8.1': @@ -507,8 +476,8 @@ packages: resolution: {integrity: sha512-W/ryRoQ0TSVXqJrx5SGkaYuAaE/BUontL1j1HsKckvM6e5ZaG0M9126zcwL6peKSuIetJi7E87PRQF8O86EW0Q==} engines: {node: '>=v14'} - '@commitlint/resolve-extends@18.1.0': - resolution: {integrity: sha512-3mZpzOEJkELt7BbaZp6+bofJyxViyObebagFn0A7IHaLARhPkWTivXdjvZHS12nAORftv88Yhbh8eCPKfSvB7g==} + '@commitlint/resolve-extends@19.5.0': + resolution: {integrity: sha512-CU/GscZhCUsJwcKTJS9Ndh3AKGZTNFIOoQB2n8CmFnizE0VnEuJoum+COW+C1lNABEeqk6ssfc1Kkalm4bDklA==} engines: {node: '>=v18'} '@commitlint/rules@17.8.1': @@ -527,149 +496,155 @@ packages: resolution: {integrity: sha512-PXDQXkAmiMEG162Bqdh9ChML/GJZo6vU+7F03ALKDK8zYc6SuAr47LjG7hGYRqUOz+WK0dU7bQ0xzuqFMdxzeQ==} engines: {node: '>=v14'} - '@commitlint/types@18.1.0': - resolution: {integrity: sha512-65vGxZmbs+2OVwEItxhp3Ul7X2m2LyLfifYI/NdPwRqblmuES2w2aIRhIjb7cwUIBHHSTT8WXj4ixVHQibmvLQ==} + '@commitlint/types@19.5.0': + resolution: {integrity: sha512-DSHae2obMSMkAtTBSOulg5X7/z+rGLxcXQIkg3OmWvY6wifojge5uVMydfhUvs7yQj+V7jNmRZ2Xzl8GJyqRgg==} engines: {node: '>=v18'} '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@esbuild/aix-ppc64@0.21.5': - resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} - engines: {node: '>=12'} + '@esbuild/aix-ppc64@0.23.1': + resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.21.5': - resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} - engines: {node: '>=12'} + '@esbuild/android-arm64@0.23.1': + resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.21.5': - resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} - engines: {node: '>=12'} + '@esbuild/android-arm@0.23.1': + resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.21.5': - resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} - engines: {node: '>=12'} + '@esbuild/android-x64@0.23.1': + resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.21.5': - resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} - engines: {node: '>=12'} + '@esbuild/darwin-arm64@0.23.1': + resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.21.5': - resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} - engines: {node: '>=12'} + '@esbuild/darwin-x64@0.23.1': + resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.21.5': - resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} - engines: {node: '>=12'} + '@esbuild/freebsd-arm64@0.23.1': + resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.21.5': - resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} - engines: {node: '>=12'} + '@esbuild/freebsd-x64@0.23.1': + resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.21.5': - resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} - engines: {node: '>=12'} + '@esbuild/linux-arm64@0.23.1': + resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.21.5': - resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} - engines: {node: '>=12'} + '@esbuild/linux-arm@0.23.1': + resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.21.5': - resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} - engines: {node: '>=12'} + '@esbuild/linux-ia32@0.23.1': + resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.21.5': - resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} - engines: {node: '>=12'} + '@esbuild/linux-loong64@0.23.1': + resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.21.5': - resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} - engines: {node: '>=12'} + '@esbuild/linux-mips64el@0.23.1': + resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.21.5': - resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} - engines: {node: '>=12'} + '@esbuild/linux-ppc64@0.23.1': + resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.21.5': - resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} - engines: {node: '>=12'} + '@esbuild/linux-riscv64@0.23.1': + resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.21.5': - resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} - engines: {node: '>=12'} + '@esbuild/linux-s390x@0.23.1': + resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.21.5': - resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} - engines: {node: '>=12'} + '@esbuild/linux-x64@0.23.1': + resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.21.5': - resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} - engines: {node: '>=12'} + '@esbuild/netbsd-x64@0.23.1': + resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-x64@0.21.5': - resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} - engines: {node: '>=12'} + '@esbuild/openbsd-arm64@0.23.1': + resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.23.1': + resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.21.5': - resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} - engines: {node: '>=12'} + '@esbuild/sunos-x64@0.23.1': + resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.21.5': - resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} - engines: {node: '>=12'} + '@esbuild/win32-arm64@0.23.1': + resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.21.5': - resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} - engines: {node: '>=12'} + '@esbuild/win32-ia32@0.23.1': + resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.21.5': - resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} - engines: {node: '>=12'} + '@esbuild/win32-x64@0.23.1': + resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -679,16 +654,16 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.10.0': - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + '@eslint-community/regexpp@4.11.0': + resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/eslintrc@2.1.2': - resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@eslint/js@8.52.0': - resolution: {integrity: sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==} + '@eslint/js@8.57.0': + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} '@eth-optimism/contracts@0.5.40': @@ -801,73 +776,69 @@ packages: '@ethersproject/wordlists@5.7.0': resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} - '@fastify/busboy@2.0.0': - resolution: {integrity: sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==} + '@fastify/busboy@2.1.1': + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} '@fastify/deepmerge@1.3.0': resolution: {integrity: sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==} - '@humanwhocodes/config-array@0.11.13': - resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} + '@humanwhocodes/config-array@0.11.14': + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/object-schema@2.0.1': - resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} - '@jridgewell/gen-mapping@0.3.3': - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} - '@jridgewell/resolve-uri@3.1.1': - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.1.2': - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - '@jridgewell/trace-mapping@0.3.20': - resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@looksrare/contracts-libs@3.4.0': - resolution: {integrity: sha512-tRFHcz9D4J0PLQg4ETWlvlRqrHpEoZhKsCTbyqATDXmekXvxbgk8+sRtaZK9Zo4gHpt6x+TcOgdUdARCg2elWg==} + '@looksrare/contracts-libs@3.5.1': + resolution: {integrity: sha512-grKSOYJS6iSwS3zrrR3v/RWUbJW+y7P0gg3GakA5A0kfQrzxK8wYpOqaOyAAOzS7/Yy9ToWnGpzYTr6YXz7olQ==} engines: {node: '>=8.3.0'} '@metamask/eth-sig-util@4.0.1': resolution: {integrity: sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==} engines: {node: '>=12.0.0'} - '@noble/curves@1.1.0': - resolution: {integrity: sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==} - '@noble/curves@1.2.0': resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} '@noble/curves@1.4.0': resolution: {integrity: sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==} + '@noble/curves@1.4.2': + resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} + '@noble/hashes@1.2.0': resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} - '@noble/hashes@1.3.1': - resolution: {integrity: sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==} - engines: {node: '>= 16'} - '@noble/hashes@1.3.2': resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} engines: {node: '>= 16'} @@ -876,6 +847,10 @@ packages: resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} engines: {node: '>= 16'} + '@noble/hashes@1.5.0': + resolution: {integrity: sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==} + engines: {node: ^14.21.3 || >=16} + '@noble/secp256k1@1.7.1': resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} @@ -963,12 +938,12 @@ packages: ethers: ^6.1.0 hardhat: ^2.0.0 - '@nomicfoundation/hardhat-ignition-ethers@0.15.4': - resolution: {integrity: sha512-vY30V4b788GSziW/nOd0L/4IPw6mwpluahLs4+gPUUKWaHHGMA8OIeHaYpRRljM1i0M/Kg1yIozrDM/aeRebkg==} + '@nomicfoundation/hardhat-ignition-ethers@0.15.5': + resolution: {integrity: sha512-W6s1QN9CFxzSVZS6w9Jcj3WLaK32z2FP5MxNU2OKY1Fn9ZzLr+miXbUbWYuRHl6dxrrl6sE8cv33Cybv19pmCg==} peerDependencies: '@nomicfoundation/hardhat-ethers': ^3.0.4 - '@nomicfoundation/hardhat-ignition': ^0.15.4 - '@nomicfoundation/ignition-core': ^0.15.4 + '@nomicfoundation/hardhat-ignition': ^0.15.5 + '@nomicfoundation/ignition-core': ^0.15.5 ethers: ^6.7.0 hardhat: ^2.18.0 @@ -978,8 +953,8 @@ packages: '@nomicfoundation/hardhat-verify': ^2.0.1 hardhat: ^2.18.0 - '@nomicfoundation/hardhat-network-helpers@1.0.9': - resolution: {integrity: sha512-OXWCv0cHpwLUO2u7bFxBna6dQtCC2Gg/aN/KtJLO7gmuuA28vgmVKYFRCDUqrbjujzgfwQ2aKyZ9Y3vSmDqS7Q==} + '@nomicfoundation/hardhat-network-helpers@1.0.11': + resolution: {integrity: sha512-uGPL7QSKvxrHRU69dx8jzoBvuztlLCtyFsbgfXIwIjnO3dqZRz2GNMHJoO3C3dIiUNM6jdNF4AUnoQKDscdYrA==} peerDependencies: hardhat: ^2.9.5 @@ -1005,10 +980,10 @@ packages: typechain: ^8.3.0 typescript: '>=4.5.0' - '@nomicfoundation/hardhat-verify@2.0.9': - resolution: {integrity: sha512-7kD8hu1+zlnX87gC+UN4S0HTKBnIsDfXZ/pproq1gYsK94hgCk+exvzXbwR0X2giiY/RZPkqY9oKRi0Uev91hQ==} + '@nomicfoundation/hardhat-verify@2.0.10': + resolution: {integrity: sha512-3zoTZGQhpeOm6piJDdsGb6euzZAd7N5Tk0zPQvGnfKQ0+AoxKz/7i4if12goi8IDTuUGElAUuZyQB8PMQoXA5g==} peerDependencies: - hardhat: ^2.22.72.0.4 + hardhat: ^2.0.4 '@nomicfoundation/hardhat-viem@2.0.6': resolution: {integrity: sha512-Pl5pvYK5VYKflfoUk4fVBESqKMNBtAIGPIT4j+Q8KNFueAe1vB2PsbRESeNJyW5YLL9pqKaD1RVqLmgIa1yvDg==} @@ -1022,111 +997,79 @@ packages: '@nomicfoundation/ignition-ui@0.15.5': resolution: {integrity: sha512-ZcE4rIn10qKahR4OqS8rl8NM2Fbg2QYiBXgMgj74ZI0++LlCcZgB5HyaBbX+lsnKHjTXtjYD3b+2mtg7jFbAMQ==} - '@nomicfoundation/slang-darwin-arm64@0.15.1': - resolution: {integrity: sha512-taPHlCUNNztQZJze9OlZFK9cZH8Ut4Ih4QJQo5CKebXx9vWOUtmSBfKv/M2P8hiV/iL7Q5sPwR7HY9uZYnb49Q==} + '@nomicfoundation/slang-darwin-arm64@0.17.0': + resolution: {integrity: sha512-O0q94EUtoWy9A5kOTOa9/khtxXDYnLqmuda9pQELurSiwbQEVCPQL8kb34VbOW+ifdre66JM/05Xw9JWhIZ9sA==} engines: {node: '>= 10'} - '@nomicfoundation/slang-darwin-x64@0.15.1': - resolution: {integrity: sha512-kgZh5KQe/UcbFqn1EpyrvBuT8E6I1kWSgGPtO25t90zAqFv23sMUPdn7wLpMjngkD+quIIgrzQGUtupS5YYEig==} + '@nomicfoundation/slang-darwin-x64@0.17.0': + resolution: {integrity: sha512-IaDbHzvT08sBK2HyGzonWhq1uu8IxdjmTqAWHr25Oh/PYnamdi8u4qchZXXYKz/DHLoYN3vIpBXoqLQIomhD/g==} engines: {node: '>= 10'} - '@nomicfoundation/slang-linux-arm64-gnu@0.15.1': - resolution: {integrity: sha512-Iw8mepaccKRWllPU9l+hoe88LN9fScC0Px3nFeNQy26qk1ueO0tjovP1dhTvmGwHUxacOYPqhQTUn7Iu0oxNoQ==} + '@nomicfoundation/slang-linux-arm64-gnu@0.17.0': + resolution: {integrity: sha512-Lj4anvOsQZxs1SycG8VyT2Rl2oqIhyLSUCgGepTt3CiJ/bM+8r8bLJIgh8vKkki4BWz49YsYIgaJB2IPv8FFTw==} engines: {node: '>= 10'} - '@nomicfoundation/slang-linux-arm64-musl@0.15.1': - resolution: {integrity: sha512-zcesdQZwRgrT7ND+3TZUjRK/uGF20EfhEfCg8ZMhrb4Q7XaK1JvtHazIs03TV8Jcs30TPkEXks8Qi0Zdfy4RuA==} + '@nomicfoundation/slang-linux-arm64-musl@0.17.0': + resolution: {integrity: sha512-/xkTCa9d5SIWUBQE3BmLqDFfJRr4yUBwbl4ynPiGUpRXrD69cs6pWKkwjwz/FdBpXqVo36I+zY95qzoTj/YhOA==} engines: {node: '>= 10'} - '@nomicfoundation/slang-linux-x64-gnu@0.15.1': - resolution: {integrity: sha512-FSmAnzKm58TFIwx4r/wOZtqfDx0nI6AfvnOh8kLDF5OxpWW3r0q9fq8lyaUReg9C/ZgCZRBn+m5WGrNKCZcvPQ==} + '@nomicfoundation/slang-linux-x64-gnu@0.17.0': + resolution: {integrity: sha512-oe5IO5vntOqYvTd67deCHPIWuSuWm6aYtT2/0Kqz2/VLtGz4ClEulBSRwfnNzBVtw2nksWipE1w8BzhImI7Syg==} engines: {node: '>= 10'} - '@nomicfoundation/slang-linux-x64-musl@0.15.1': - resolution: {integrity: sha512-hnoA/dgeHQ8aS0SReABYkxf0d/Q6DdaKsaYv6ev21wyQA7TROxT1X3nekECLGu1GYLML8pzvD9vyAMBRKOkkyg==} + '@nomicfoundation/slang-linux-x64-musl@0.17.0': + resolution: {integrity: sha512-PpYCI5K/kgLAMXaPY0V4VST5gCDprEOh7z/47tbI8kJQumI5odjsj/Cs8MpTo7/uRH6flKYbVNgUzcocWVYrAQ==} engines: {node: '>= 10'} - '@nomicfoundation/slang-win32-arm64-msvc@0.15.1': - resolution: {integrity: sha512-2H0chHQ4uTh4l4UxN5fIVHR5mKaL5mfYTID6kxxxv2+KAh68EpYWwxLlkS5So90R2WcuPvFvTVKLm/uRo4h4dg==} + '@nomicfoundation/slang-win32-arm64-msvc@0.17.0': + resolution: {integrity: sha512-u/Mkf7OjokdBilP7QOJj6QYJU4/mjkbKnTX21wLyCIzeVWS7yafRPYpBycKIBj2pRRZ6ceAY5EqRpb0aiCq+0Q==} engines: {node: '>= 10'} - '@nomicfoundation/slang-win32-ia32-msvc@0.15.1': - resolution: {integrity: sha512-CVZWBnbpFlVBg/m7bsiw70jY3p9TGH9vxq0vLEEJ56yK+QPosxPrKMcADojtGjIOjWjPSZ+lCoo5ilnW0a249g==} + '@nomicfoundation/slang-win32-ia32-msvc@0.17.0': + resolution: {integrity: sha512-XJBVQfNnZQUv0tP2JSJ573S+pmgrLWgqSZOGaMllnB/TL1gRci4Z7dYRJUF2s82GlRJE+FHSI2Ro6JISKmlXCg==} engines: {node: '>= 10'} - '@nomicfoundation/slang-win32-x64-msvc@0.15.1': - resolution: {integrity: sha512-cyER8M1fdBTzIfihy55d4LGGlN/eQxDqfRUTXgJf1VvNR98tRB0Q3nBfyh5PK2yP98B4lMt3RJYDqTQu+dOVDA==} + '@nomicfoundation/slang-win32-x64-msvc@0.17.0': + resolution: {integrity: sha512-zPGsAeiTfqfPNYHD8BfrahQmYzA78ZraoHKTGraq/1xwJwzBK4bu/NtvVA4pJjBV+B4L6DCxVhSbpn40q26JQA==} engines: {node: '>= 10'} - '@nomicfoundation/slang@0.15.1': - resolution: {integrity: sha512-th7nxRWRXf583uHpWUCd8U7BYxIqJX2f3oZLff/mlPkqIr45pD2hLT/o00eCjrBIR8N7vybUULZg1CeThGNk7g==} + '@nomicfoundation/slang@0.17.0': + resolution: {integrity: sha512-1GlkGRcGpVnjFw9Z1vvDKOKo2mzparFt7qrl2pDxWp+jrVtlvej98yCMX52pVyrYE7ZeOSZFnx/DtsSgoukStQ==} engines: {node: '>= 10'} '@nomicfoundation/slang@0.18.3': resolution: {integrity: sha512-YqAWgckqbHM0/CZxi9Nlf4hjk9wUNLC9ngWCWBiqMxPIZmzsVKYuChdlrfeBPQyvQQBoOhbx+7C1005kLVQDZQ==} - '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1': - resolution: {integrity: sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1': - resolution: {integrity: sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1': - resolution: {integrity: sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - - '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1': - resolution: {integrity: sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] + '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': + resolution: {integrity: sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw==} + engines: {node: '>= 12'} - '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1': - resolution: {integrity: sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] + '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2': + resolution: {integrity: sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw==} + engines: {node: '>= 12'} - '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1': - resolution: {integrity: sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2': + resolution: {integrity: sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA==} + engines: {node: '>= 12'} - '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1': - resolution: {integrity: sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] + '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2': + resolution: {integrity: sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA==} + engines: {node: '>= 12'} - '@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1': - resolution: {integrity: sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] + '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2': + resolution: {integrity: sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g==} + engines: {node: '>= 12'} - '@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1': - resolution: {integrity: sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] + '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2': + resolution: {integrity: sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg==} + engines: {node: '>= 12'} - '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1': - resolution: {integrity: sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] + '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2': + resolution: {integrity: sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA==} + engines: {node: '>= 12'} - '@nomicfoundation/solidity-analyzer@0.1.1': - resolution: {integrity: sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==} + '@nomicfoundation/solidity-analyzer@0.1.2': + resolution: {integrity: sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA==} engines: {node: '>= 12'} '@openzeppelin/contracts-upgradeable@4.7.3': @@ -1138,8 +1081,8 @@ packages: '@openzeppelin/contracts@4.3.3': resolution: {integrity: sha512-tDBopO1c98Yk7Cv/PZlHqrvtVjlgK5R4J6jxLwoO7qxK4xqOiZG+zSkIvGFpPZ0ikc3QOED3plgdqjgNTnBc7g==} - '@openzeppelin/contracts@4.9.3': - resolution: {integrity: sha512-He3LieZ1pP2TNt5JbkPA4PNT9WC3gOTOlDcFGJW4Le4QKqwmiNJCRt44APfxMxvq7OugU/cqYuPcSBzOw38DAg==} + '@openzeppelin/contracts@4.9.6': + resolution: {integrity: sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA==} '@openzeppelin/defender-sdk-base-client@2.1.0': resolution: {integrity: sha512-YxrOgjESsbmxArLoe8kRA6lKwz/Qm/OtaZBfquzAg+w0jgOG9ogFuXA3NI6w2sVw1w/PzI1dWKe30u62p5vLXw==} @@ -1162,8 +1105,8 @@ packages: '@nomicfoundation/hardhat-verify': optional: true - '@openzeppelin/upgrades-core@1.35.1': - resolution: {integrity: sha512-FzbOzMrrNtXpL+DoM6jtOGZOvUdp6F4KTsb0niqfrd2BxMecL9fUA0aupi09p1Of+9BELcYozX/Gt7tr91Z2TA==} + '@openzeppelin/upgrades-core@1.37.1': + resolution: {integrity: sha512-dMQPDoMn1OUZXsCHT1thnAmkZ14v0FNlst5Ej8MIfujOv0k74kUok5XeuNF42fYewnNUYMkkz3PhXU1OIwSeyg==} hasBin: true '@openzeppelin/upgrades-core@1.41.0': @@ -1189,8 +1132,8 @@ packages: rollup: optional: true - '@rollup/plugin-json@6.0.1': - resolution: {integrity: sha512-RgVfl5hWMkxN1h/uZj8FVESvPuBJ/uf6ly6GTj0GONnkfoBN5KC0MSz+PN2OLDgYXMhtG0mWpTrkiOjoxAIevw==} + '@rollup/plugin-json@6.1.0': + resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -1207,15 +1150,6 @@ packages: rollup: optional: true - '@rollup/pluginutils@5.0.5': - resolution: {integrity: sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - '@rollup/pluginutils@5.1.0': resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} engines: {node: '>=14.0.0'} @@ -1225,87 +1159,104 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.6.1': - resolution: {integrity: sha512-0WQ0ouLejaUCRsL93GD4uft3rOmB8qoQMU05Kb8CmMtMBe7XUDLAltxVZI1q6byNqEtU7N1ZX1Vw5lIpgulLQA==} + '@rollup/rollup-android-arm-eabi@4.21.2': + resolution: {integrity: sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.6.1': - resolution: {integrity: sha512-1TKm25Rn20vr5aTGGZqo6E4mzPicCUD79k17EgTLAsXc1zysyi4xXKACfUbwyANEPAEIxkzwue6JZ+stYzWUTA==} + '@rollup/rollup-android-arm64@4.21.2': + resolution: {integrity: sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.6.1': - resolution: {integrity: sha512-cEXJQY/ZqMACb+nxzDeX9IPLAg7S94xouJJCNVE5BJM8JUEP4HeTF+ti3cmxWeSJo+5D+o8Tc0UAWUkfENdeyw==} + '@rollup/rollup-darwin-arm64@4.21.2': + resolution: {integrity: sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.6.1': - resolution: {integrity: sha512-LoSU9Xu56isrkV2jLldcKspJ7sSXmZWkAxg7sW/RfF7GS4F5/v4EiqKSMCFbZtDu2Nc1gxxFdQdKwkKS4rwxNg==} + '@rollup/rollup-darwin-x64@4.21.2': + resolution: {integrity: sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==} cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.6.1': - resolution: {integrity: sha512-EfI3hzYAy5vFNDqpXsNxXcgRDcFHUWSx5nnRSCKwXuQlI5J9dD84g2Usw81n3FLBNsGCegKGwwTVsSKK9cooSQ==} + '@rollup/rollup-linux-arm-gnueabihf@4.21.2': + resolution: {integrity: sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.6.1': - resolution: {integrity: sha512-9lhc4UZstsegbNLhH0Zu6TqvDfmhGzuCWtcTFXY10VjLLUe4Mr0Ye2L3rrtHaDd/J5+tFMEuo5LTCSCMXWfUKw==} + '@rollup/rollup-linux-arm-musleabihf@4.21.2': + resolution: {integrity: sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.21.2': + resolution: {integrity: sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.6.1': - resolution: {integrity: sha512-FfoOK1yP5ksX3wwZ4Zk1NgyGHZyuRhf99j64I5oEmirV8EFT7+OhUZEnP+x17lcP/QHJNWGsoJwrz4PJ9fBEXw==} + '@rollup/rollup-linux-arm64-musl@4.21.2': + resolution: {integrity: sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.6.1': - resolution: {integrity: sha512-DNGZvZDO5YF7jN5fX8ZqmGLjZEXIJRdJEdTFMhiyXqyXubBa0WVLDWSNlQ5JR2PNgDbEV1VQowhVRUh+74D+RA==} + '@rollup/rollup-linux-powerpc64le-gnu@4.21.2': + resolution: {integrity: sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.21.2': + resolution: {integrity: sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.21.2': + resolution: {integrity: sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.21.2': + resolution: {integrity: sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.6.1': - resolution: {integrity: sha512-RkJVNVRM+piYy87HrKmhbexCHg3A6Z6MU0W9GHnJwBQNBeyhCJG9KDce4SAMdicQnpURggSvtbGo9xAWOfSvIQ==} + '@rollup/rollup-linux-x64-musl@4.21.2': + resolution: {integrity: sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.6.1': - resolution: {integrity: sha512-v2FVT6xfnnmTe3W9bJXl6r5KwJglMK/iRlkKiIFfO6ysKs0rDgz7Cwwf3tjldxQUrHL9INT/1r4VA0n9L/F1vQ==} + '@rollup/rollup-win32-arm64-msvc@4.21.2': + resolution: {integrity: sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.6.1': - resolution: {integrity: sha512-YEeOjxRyEjqcWphH9dyLbzgkF8wZSKAKUkldRY6dgNR5oKs2LZazqGB41cWJ4Iqqcy9/zqYgmzBkRoVz3Q9MLw==} + '@rollup/rollup-win32-ia32-msvc@4.21.2': + resolution: {integrity: sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.6.1': - resolution: {integrity: sha512-0zfTlFAIhgz8V2G8STq8toAjsYYA6eci1hnXuyOTUFnymrtJwnS6uGKiv3v5UrPZkBlamLvrLV2iiaeqCKzb0A==} + '@rollup/rollup-win32-x64-msvc@4.21.2': + resolution: {integrity: sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==} cpu: [x64] os: [win32] - '@scure/base@1.1.7': - resolution: {integrity: sha512-PPNYBslrLNNUQ/Yad37MHYsNQtK67EhWb6WtSvNLLPo7SdVZgkUjD6Dg+5On7zNwmskf8OX7I7Nx5oN+MIWE0g==} + '@scure/base@1.1.8': + resolution: {integrity: sha512-6CyAclxj3Nb0XT7GHK6K4zK6k2xJm6E4Ft0Ohjt4WgegiFUHEtFb2CGzmPmGBwoIhrLsqNLYfLr04Y1GePrzZg==} '@scure/bip32@1.1.5': resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} - '@scure/bip32@1.3.1': - resolution: {integrity: sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==} - '@scure/bip32@1.4.0': resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} '@scure/bip39@1.1.1': resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} - '@scure/bip39@1.2.1': - resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} - '@scure/bip39@1.3.0': resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==} + '@scure/bip39@1.4.0': + resolution: {integrity: sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw==} + '@sentry/core@5.30.0': resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} engines: {node: '>=6'} @@ -1450,9 +1401,9 @@ packages: resolution: {integrity: sha512-0yApeHWBqocelHGK22UivZyShNxFbDNrgREBllGh5Ws0D0rg/yId/CJfeoKKpjbfY2ju8j6WgDUGZHYQmINZ5w==} engines: {node: '>=18.0.0'} - '@smithy/types@2.4.0': - resolution: {integrity: sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==} - engines: {node: '>=14.0.0'} + '@smithy/types@3.4.0': + resolution: {integrity: sha512-0shOWSg/pnFXPcsSU8ZbaJ4JBHZJPPzLCJxafJvbMVFo9l1w81CqpgUqjlKGNHVrVB7fhIs+WS82JDTyzaLyLA==} + engines: {node: '>=16.0.0'} '@smithy/types@4.1.0': resolution: {integrity: sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==} @@ -1533,76 +1484,79 @@ packages: '@solidity-parser/parser@0.14.5': resolution: {integrity: sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==} - '@solidity-parser/parser@0.16.1': - resolution: {integrity: sha512-PdhRFNhbTtu3x8Axm0uYpqOy/lODYQK+MlYSgqIsq2L8SFYEHJPHNUiOTAJbDGzNjjr1/n9AcIayxafR/fWmYw==} + '@solidity-parser/parser@0.16.2': + resolution: {integrity: sha512-PI9NfoA3P8XK2VBkK5oIfRgKDsicwDZfkVq9ZTBCQYGOP1N2owgY2dyLGyU5/J/hQs8KRk55kdmvTLjy3Mu3vg==} + + '@solidity-parser/parser@0.18.0': + resolution: {integrity: sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==} '@starboardventures/hardhat-verify@1.0.1': resolution: {integrity: sha512-/FO3wMmUSrL8PsYwuxA233+3iwLzmjI2z39MiZCgki0uJXtDELhO9YXDI9qoUR2jHxvHiBa1gKd/ZIpC9tpuKw==} peerDependencies: hardhat: ^2.0.0 - '@swc/core-darwin-arm64@1.6.3': - resolution: {integrity: sha512-3r7cJf1BcE30iyF1rnOSKrEzIR+cqnyYSZvivrm62TZdXVsIjfXe1xulsKGxZgNeLY5erIu7ukvMvBvPhnQvqA==} + '@swc/core-darwin-arm64@1.7.26': + resolution: {integrity: sha512-FF3CRYTg6a7ZVW4yT9mesxoVVZTrcSWtmZhxKCYJX9brH4CS/7PRPjAKNk6kzWgWuRoglP7hkjQcd6EpMcZEAw==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.6.3': - resolution: {integrity: sha512-8GLZ23IgVpF5xh2SbS5ZW/12/EEBuRU1hFOLB5rKERJU0y1RJ6YhDMf/FuOWhfHQcFM7TeedBwHIzaF+tdKKlw==} + '@swc/core-darwin-x64@1.7.26': + resolution: {integrity: sha512-az3cibZdsay2HNKmc4bjf62QVukuiMRh5sfM5kHR/JMTrLyS6vSw7Ihs3UTkZjUxkLTT8ro54LI6sV6sUQUbLQ==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.6.3': - resolution: {integrity: sha512-VQ/bduX7WhLOlGbJLMG7UH0LBehjjx43R4yuk55rjjJLqpvX5fQzMsWhQdIZ5vsc+4ORzdgtEAlpumTv6bsD1A==} + '@swc/core-linux-arm-gnueabihf@1.7.26': + resolution: {integrity: sha512-VYPFVJDO5zT5U3RpCdHE5v1gz4mmR8BfHecUZTmD2v1JeFY6fv9KArJUpjrHEEsjK/ucXkQFmJ0jaiWXmpOV9Q==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.6.3': - resolution: {integrity: sha512-jHIQ/PCwtdDBIF/BiC5DochswuCAIW/T5skJ+eDMbta7+QtEnZCXTZWpT5ORoEY/gtsE2fjpOA4TS6fBBvXqUw==} + '@swc/core-linux-arm64-gnu@1.7.26': + resolution: {integrity: sha512-YKevOV7abpjcAzXrhsl+W48Z9mZvgoVs2eP5nY+uoMAdP2b3GxC0Df1Co0I90o2lkzO4jYBpTMcZlmUXLdXn+Q==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.6.3': - resolution: {integrity: sha512-gA6velEUD27Dwu0BlR9hCcFzkWq2YL2pDAU5qbgeuGhaMiUCBssfqTQB+2ctEnV+AZx+hSMJOHvtA+uFZjfRrw==} + '@swc/core-linux-arm64-musl@1.7.26': + resolution: {integrity: sha512-3w8iZICMkQQON0uIcvz7+Q1MPOW6hJ4O5ETjA0LSP/tuKqx30hIniCGOgPDnv3UTMruLUnQbtBwVCZTBKR3Rkg==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.6.3': - resolution: {integrity: sha512-fy4qoBDr5I8r+ZNCZxs/oZcmu4j/8mtSud6Ka102DaSxEjNg0vfIdo9ITsVIPsofhUTmDKjQsPB2O7YUlJAioQ==} + '@swc/core-linux-x64-gnu@1.7.26': + resolution: {integrity: sha512-c+pp9Zkk2lqb06bNGkR2Looxrs7FtGDMA4/aHjZcCqATgp348hOKH5WPvNLBl+yPrISuWjbKDVn3NgAvfvpH4w==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.6.3': - resolution: {integrity: sha512-c/twcMbq/Gpq47G+b3kWgoaCujpXO11aRgJx6am+CprvP4uNeBHEpQkxD+DQmdWFHisZd0i9GB8NG3e7L9Rz9Q==} + '@swc/core-linux-x64-musl@1.7.26': + resolution: {integrity: sha512-PgtyfHBF6xG87dUSSdTJHwZ3/8vWZfNIXQV2GlwEpslrOkGqy+WaiiyE7Of7z9AvDILfBBBcJvJ/r8u980wAfQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.6.3': - resolution: {integrity: sha512-y6RxMtX45acReQmzkxcEfJscfBXce6QjuNgWQHHs9exA592BZzmolDUwgmAyjyvopz1lWX+KdymdZFKvuDSx4w==} + '@swc/core-win32-arm64-msvc@1.7.26': + resolution: {integrity: sha512-9TNXPIJqFynlAOrRD6tUQjMq7KApSklK3R/tXgIxc7Qx+lWu8hlDQ/kVPLpU7PWvMMwC/3hKBW+p5f+Tms1hmA==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.6.3': - resolution: {integrity: sha512-41h7z3xgukl1HDDwhquaeOPSP1OWeHl+mWKnJVmmwd3ui/oowUDCO856qa6JagBgPSnAGfyXwv6vthuXwyCcWA==} + '@swc/core-win32-ia32-msvc@1.7.26': + resolution: {integrity: sha512-9YngxNcG3177GYdsTum4V98Re+TlCeJEP4kEwEg9EagT5s3YejYdKwVAkAsJszzkXuyRDdnHUpYbTrPG6FiXrQ==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.6.3': - resolution: {integrity: sha512-//bnwo9b8Vp1ED06eXCHyGZ5xIpdkQgg2fuFDdtd1FITl7r5bdQh2ryRzPiKiGwgXZwZQitUshI4JeEX9IuW+Q==} + '@swc/core-win32-x64-msvc@1.7.26': + resolution: {integrity: sha512-VR+hzg9XqucgLjXxA13MtV5O3C0bK0ywtLIBw/+a+O+Oc6mxFWHtdUeXDbIi5AiPbn0fjgVJMqYnyjGyyX8u0w==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.6.3': - resolution: {integrity: sha512-mZpei+LqE+AL+nwgERMQey9EJA9/yhHTN6nwbobH5GnSij/lhfTdGfAb1iumOrroqEcXbHUaK//7wOw7DjBGdA==} + '@swc/core@1.7.26': + resolution: {integrity: sha512-f5uYFf+TmMQyYIoxkn/evWhNGuUzC730dFwAKGwBVHHVoPyak1/GvJUm6i1SKl+2Hrj9oN0i3WSoWWZ4pgI8lw==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '*' @@ -1613,8 +1567,8 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/types@0.1.8': - resolution: {integrity: sha512-RNFA3+7OJFNYY78x0FYwi1Ow+iF1eF5WvmfY1nXPOEH4R2p/D4Cr1vzje7dNAI2aLFqpv8Wyz4oKSWqIZArpQA==} + '@swc/types@0.1.12': + resolution: {integrity: sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA==} '@tenderly/hardhat-tenderly@2.3.0': resolution: {integrity: sha512-Q21HeQofncnrH33Ys4Xd2HRgxl+4E/HgUqUIu6l734Cpw07KMwlsTicEML0nlVPgLDmtNrJv4cnFn4SypwioaA==} @@ -1627,8 +1581,8 @@ packages: peerDependencies: prettier: 2.x - '@tsconfig/node10@1.0.9': - resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} '@tsconfig/node12@1.0.11': resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} @@ -1639,11 +1593,11 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - '@typechain/ethers-v6@0.4.3': - resolution: {integrity: sha512-TrxBsyb4ryhaY9keP6RzhFCviWYApcLCIRMPyWaKp2cZZrfaM3QBoxXTnw/eO4+DAY3l+8O0brNW0WgeQeOiDA==} + '@typechain/ethers-v6@0.5.1': + resolution: {integrity: sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA==} peerDependencies: ethers: 6.x - typechain: ^8.3.1 + typechain: ^8.3.2 typescript: '>=4.7.0' '@typechain/hardhat@9.1.0': @@ -1657,20 +1611,20 @@ packages: '@types/bn.js@4.11.6': resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} - '@types/bn.js@5.1.3': - resolution: {integrity: sha512-wT1B4iIO82ecXkdN6waCK8Ou7E71WU+mP1osDA5Q8c6Ur+ozU2vIKUIhSpUr6uE5L2YHocKS1Z2jG2fBC1YVeg==} + '@types/bn.js@5.1.5': + resolution: {integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==} - '@types/chai-as-promised@7.1.7': - resolution: {integrity: sha512-APucaP5rlmTRYKtRA6FE5QPP87x76ejw5t5guRJ4y5OgMnwtsvigw7HHhKZlx2MGXLeZd6R/GNZR/IqDHcbtQw==} + '@types/chai-as-promised@7.1.8': + resolution: {integrity: sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==} - '@types/chai@4.3.11': - resolution: {integrity: sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ==} + '@types/chai@4.3.19': + resolution: {integrity: sha512-2hHHvQBVE2FiSK4eN0Br6snX9MtolHaTo/batnLjlGRhoQzlCL61iVpxoqO7SfFyOw+P/pwv+0zNHzKoGWz9Cw==} '@types/concat-stream@1.6.1': resolution: {integrity: sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==} - '@types/estree@1.0.3': - resolution: {integrity: sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==} + '@types/conventional-commits-parser@5.0.0': + resolution: {integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==} '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} @@ -1687,11 +1641,11 @@ packages: '@types/minimatch@5.1.2': resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} - '@types/minimist@1.2.4': - resolution: {integrity: sha512-Kfe/D3hxHTusnPNRbycJE1N77WHDsdS4AjUYIzlDzhDrS47NrwuL3YW4VITxwR7KCVpzwgy4Rbj829KSSQmwXQ==} + '@types/minimist@1.2.5': + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} - '@types/mocha@9.1.0': - resolution: {integrity: sha512-QCWHkbMv4Y5U9oW10Uxbr45qMMSzl4OzijsozynUAgx3kEHUdXB00udx2dWDQ7f2TU2a2uuiFaRZjCe3unPpeg==} + '@types/mocha@10.0.7': + resolution: {integrity: sha512-GN8yJ1mNTcFcah/wKEFIJckJx9iJLoMSzWcfRRuxz/Jk+U6KQNnml+etbtxFK8lPjzOw3zp4Ha/kjSst9fsHYw==} '@types/node@10.17.60': resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==} @@ -1699,8 +1653,8 @@ packages: '@types/node@18.15.13': resolution: {integrity: sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==} - '@types/node@18.18.7': - resolution: {integrity: sha512-bw+lEsxis6eqJYW8Ql6+yTqkE6RuFtsQPSe5JxXbqYRFQEER5aJA9a5UH9igqDWm3X4iLHIKOHlnAXLM4mi7uQ==} + '@types/node@18.19.50': + resolution: {integrity: sha512-xonK+NRrMBRtkL1hVCc3G+uXtjh1Al4opBLjqVmipe5ZAaBYWW6cNAiBVZ1BvmkBhep698rP3UM3aRAdSALuhg==} '@types/node@20.5.1': resolution: {integrity: sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==} @@ -1708,26 +1662,26 @@ packages: '@types/node@8.10.66': resolution: {integrity: sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==} - '@types/normalize-package-data@2.4.3': - resolution: {integrity: sha512-ehPtgRgaULsFG8x0NeYJvmyH1hmlfsNLujHe9dQEia/7MAJYdzMSi19JtchUHjmBA6XC/75dK55mzZH+RyieSg==} + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - '@types/pbkdf2@3.1.1': - resolution: {integrity: sha512-4HCoGwR3221nOc7G0Z/6KgTNGgaaFGkbGrtUJsB+zlKX2LBVjFHHIUkieMBgHHXgBH5Gq6dZHJKdBYdtlhBQvw==} + '@types/pbkdf2@3.1.2': + resolution: {integrity: sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==} '@types/prettier@2.7.3': resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} - '@types/qs@6.9.9': - resolution: {integrity: sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg==} + '@types/qs@6.9.15': + resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} - '@types/secp256k1@4.0.5': - resolution: {integrity: sha512-aIonTBMErtE3T9MxDvTZRzcrT/mCqpEZBw3CCY/i+oG9n57N/+7obBkhFgavUAIrX21bU0LHg1XRgtaLdelBhA==} + '@types/secp256k1@4.0.6': + resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} - '@typescript-eslint/eslint-plugin@7.12.0': - resolution: {integrity: sha512-7F91fcbuDf/d3S8o21+r3ZncGIke/+eWk0EpO21LXhDfLahriZF9CGj4fbAetEjlaBdjdSm9a6VeXbpbT6Z40Q==} + '@typescript-eslint/eslint-plugin@7.18.0': + resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: '@typescript-eslint/parser': ^7.0.0 @@ -1737,8 +1691,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@7.12.0': - resolution: {integrity: sha512-dm/J2UDY3oV3TKius2OUZIFHsomQmpHtsV0FTh1WO8EKgHLQ1QCADUqscPgTpU+ih1e21FQSRjXckHn3txn6kQ==} + '@typescript-eslint/parser@7.18.0': + resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -1747,12 +1701,12 @@ packages: typescript: optional: true - '@typescript-eslint/scope-manager@7.12.0': - resolution: {integrity: sha512-itF1pTnN6F3unPak+kutH9raIkL3lhH1YRPGgt7QQOh43DQKVJXmWkpb+vpc/TiDHs6RSd9CTbDsc/Y+Ygq7kg==} + '@typescript-eslint/scope-manager@7.18.0': + resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/type-utils@7.12.0': - resolution: {integrity: sha512-lib96tyRtMhLxwauDWUp/uW3FMhLA6D0rJ8T7HmH7x23Gk1Gwwu8UZ94NMXBvOELn6flSPiBrCKlehkiXyaqwA==} + '@typescript-eslint/type-utils@7.18.0': + resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -1761,12 +1715,12 @@ packages: typescript: optional: true - '@typescript-eslint/types@7.12.0': - resolution: {integrity: sha512-o+0Te6eWp2ppKY3mLCU+YA9pVJxhUJE15FV7kxuD9jgwIAa+w/ycGJBMrYDTpVGUM/tgpa9SeMOugSabWFq7bg==} + '@typescript-eslint/types@7.18.0': + resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/typescript-estree@7.12.0': - resolution: {integrity: sha512-5bwqLsWBULv1h6pn7cMW5dXX/Y2amRqLaKqsASVwbBHMZSnHqE/HN4vT4fE0aFsiwxYvr98kqOWh1a8ZKXalCQ==} + '@typescript-eslint/typescript-estree@7.18.0': + resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' @@ -1774,36 +1728,33 @@ packages: typescript: optional: true - '@typescript-eslint/utils@7.12.0': - resolution: {integrity: sha512-Y6hhwxwDx41HNpjuYswYp6gDbkiZ8Hin9Bf5aJQn1bpTs3afYY4GX+MPYxma8jtoIV2GRwTM/UJm/2uGCVv+DQ==} + '@typescript-eslint/utils@7.18.0': + resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 - '@typescript-eslint/visitor-keys@7.12.0': - resolution: {integrity: sha512-uZk7DevrQLL3vSnfFl5bj4sL75qC9D6EdjemIdbtkuUmIheWpuiiylSY01JxJE7+zGrOWDZrp1WxOuDntvKrHQ==} + '@typescript-eslint/visitor-keys@7.18.0': + resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} engines: {node: ^18.18.0 || >=20.0.0} '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@vue/compiler-core@3.3.7': - resolution: {integrity: sha512-pACdY6YnTNVLXsB86YD8OF9ihwpolzhhtdLVHhBL6do/ykr6kKXNYABRtNMGrsQXpEXXyAdwvWWkuTbs4MFtPQ==} - - '@vue/compiler-dom@3.3.7': - resolution: {integrity: sha512-0LwkyJjnUPssXv/d1vNJ0PKfBlDoQs7n81CbO6Q0zdL7H1EzqYRrTVXDqdBVqro0aJjo/FOa1qBAPVI4PGSHBw==} + '@vue/compiler-core@3.5.4': + resolution: {integrity: sha512-oNwn+BAt3n9dK9uAYvI+XGlutwuTq/wfj4xCBaZCqwwVIGtD7D6ViihEbyYZrDHIHTDE3Q6oL3/hqmAyFEy9DQ==} - '@vue/compiler-sfc@3.3.7': - resolution: {integrity: sha512-7pfldWy/J75U/ZyYIXRVqvLRw3vmfxDo2YLMwVtWVNew8Sm8d6wodM+OYFq4ll/UxfqVr0XKiVwti32PCrruAw==} + '@vue/compiler-dom@3.5.4': + resolution: {integrity: sha512-yP9RRs4BDLOLfldn6ah+AGCNovGjMbL9uHvhDHf5wan4dAHLnFGOkqtfE7PPe4HTXIqE7l/NILdYw53bo1C8jw==} - '@vue/compiler-ssr@3.3.7': - resolution: {integrity: sha512-TxOfNVVeH3zgBc82kcUv+emNHo+vKnlRrkv8YvQU5+Y5LJGJwSNzcmLUoxD/dNzv0bhQ/F0s+InlgV0NrApJZg==} + '@vue/compiler-sfc@3.5.4': + resolution: {integrity: sha512-P+yiPhL+NYH7m0ZgCq7AQR2q7OIE+mpAEgtkqEeH9oHSdIRvUO+4X6MPvblJIWcoe4YC5a2Gdf/RsoyP8FFiPQ==} - '@vue/reactivity-transform@3.3.7': - resolution: {integrity: sha512-APhRmLVbgE1VPGtoLQoWBJEaQk4V8JUsqrQihImVqKT+8U6Qi3t5ATcg4Y9wGAPb3kIhetpufyZ1RhwbZCIdDA==} + '@vue/compiler-ssr@3.5.4': + resolution: {integrity: sha512-acESdTXsxPnYr2C4Blv0ggx5zIFMgOzZmYU2UgvIff9POdRGbRNBHRyzHAnizcItvpgerSKQbllUc9USp3V7eg==} - '@vue/shared@3.3.7': - resolution: {integrity: sha512-N/tbkINRUDExgcPTBvxNkvHGu504k8lzlNQRITVnm6YjOjwa4r0nnbd4Jb01sNpur5hAllyRJzSK5PvB9PPwRg==} + '@vue/shared@3.5.4': + resolution: {integrity: sha512-L2MCDD8l7yC62Te5UUyPVpmexhL9ipVnYRw9CsWfm/BGRL5FwDX4a25bcJ/OJSD3+Hx+k/a8LDKcG2AFdJV3BA==} JSONStream@1.3.5: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} @@ -1812,11 +1763,11 @@ packages: abbrev@1.0.9: resolution: {integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==} - abitype@0.9.8: - resolution: {integrity: sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==} + abitype@0.9.10: + resolution: {integrity: sha512-FIS7U4n7qwAT58KibwYig5iFG4K61rbhAqaQh/UWj8v1Y8mjX3F8TC9gd8cz9yT1TYel9f8nS5NO5kZp2RW0jQ==} peerDependencies: typescript: '>=5.0.4' - zod: ^3 >=3.19.1 + zod: ^3 >=3.22.0 peerDependenciesMeta: typescript: optional: true @@ -1839,19 +1790,15 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} engines: {node: '>=0.4.0'} - acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} engines: {node: '>=0.4.0'} hasBin: true - address@1.2.2: - resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} - engines: {node: '>= 10.0.0'} - adm-zip@0.4.16: resolution: {integrity: sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==} engines: {node: '>=0.3.0'} @@ -1873,11 +1820,11 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - amazon-cognito-identity-js@6.3.6: - resolution: {integrity: sha512-kBq+GE6OkLrxtFj3ZduIOlKBFYeOqZK3EhxbDBkv476UTvy+uwfR0tlriTq2QzNdnvlQAjBIXnXuOM7DwR1UEQ==} + amazon-cognito-identity-js@6.3.12: + resolution: {integrity: sha512-s7NKDZgx336cp+oDeUtB2ZzT8jWJp/v2LWuYl+LQtMEODe22RF1IJ4nRiDATp+rp1pTffCZcm44Quw4jx2bqNg==} amdefine@1.0.1: resolution: {integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==} @@ -1886,10 +1833,6 @@ packages: ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -1910,8 +1853,8 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} engines: {node: '>=12'} ansi-styles@3.2.1: @@ -1926,8 +1869,8 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} - antlr4@4.13.1: - resolution: {integrity: sha512-kiXTspaRYvnIArgE97z5YVVf/cDVQABr3abFRR6mE7yesLMkgu4ujuyV/sgxafQ8wgve0DJQUJ38Z8tkgA2izA==} + antlr4@4.13.2: + resolution: {integrity: sha512-QiVbZhyy4xAZ17UPEuG3YTOt8ZaoeOR1CvEAqrEsDBsOqINslaB147i9xqljZqoyf5S+EUlGStaj+t22LT9MOg==} engines: {node: '>=16'} antlr4ts@0.5.0-alpha.4: @@ -1954,10 +1897,6 @@ packages: resolution: {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==} engines: {node: '>=8'} - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} - array-ify@1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} @@ -1969,14 +1908,6 @@ packages: resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} engines: {node: '>=0.10.0'} - array.prototype.findlast@1.2.3: - resolution: {integrity: sha512-kcBubumjciBg4JKp5KTKtI7ec7tRefPk88yjkWJwaVKYd9QfTaxcsOxoMNKd7iBr447zCfDV0z1kOF47umv42g==} - engines: {node: '>= 0.4'} - - arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} - arrify@1.0.1: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} @@ -2007,27 +1938,20 @@ packages: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - axios@0.21.4: resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} axios@0.27.2: resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} - axios@1.7.2: - resolution: {integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==} - - axios@1.7.9: - resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==} + axios@1.7.7: + resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - base-x@3.0.9: - resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} + base-x@3.0.10: + resolution: {integrity: sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==} base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -2035,8 +1959,8 @@ packages: bech32@1.1.4: resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} - binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} bl@4.1.0: @@ -2067,8 +1991,8 @@ packages: brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} brorand@1.1.0: @@ -2080,8 +2004,8 @@ packages: browserify-aes@1.2.0: resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} - browserslist@4.22.1: - resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} + browserslist@4.23.3: + resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -2103,10 +2027,6 @@ packages: buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - bufferutil@4.0.8: - resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} - engines: {node: '>=6.14.2'} - bufio@1.2.1: resolution: {integrity: sha512-9oR3zNdupcg/Ge2sSHQF3GX+kmvL/fTPvD0nd5AGLq8SjUYnTz+SlFjK/GXidndbZtIj+pVKXiWeR9w6e9wKCA==} engines: {node: '>=14.0.0'} @@ -2146,8 +2066,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001554: - resolution: {integrity: sha512-A2E3U//MBwbJVzebddm1YfNp7Nud5Ip+IPn4BozBmn4KqVX7AvluoIDFWjsv5OkGnKUXQVmMSoMKLa3ScCblcQ==} + caniuse-lite@1.0.30001660: + resolution: {integrity: sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg==} caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} @@ -2156,14 +2076,14 @@ packages: resolution: {integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==} engines: {node: '>=12.19'} - cbor@9.0.1: - resolution: {integrity: sha512-/TQOWyamDxvVIv+DY9cOLNuABkoyz8K/F3QE56539pGVYohx0+MEA1f4lChFTX79dBTBS7R1PF6ovH7G+VtBfQ==} + cbor@9.0.2: + resolution: {integrity: sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ==} engines: {node: '>=16'} - chai-as-promised@7.1.1: - resolution: {integrity: sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==} + chai-as-promised@7.1.2: + resolution: {integrity: sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw==} peerDependencies: - chai: '>= 2.1.2 < 5' + chai: '>= 2.1.2 < 6' chai@4.5.0: resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} @@ -2190,16 +2110,12 @@ packages: check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} - chokidar@4.0.3: - resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + chokidar@4.0.1: + resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} engines: {node: '>= 14.16.0'} ci-info@2.0.0: @@ -2224,16 +2140,16 @@ packages: resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - cli-spinners@2.9.1: - resolution: {integrity: sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==} + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} cli-table3@0.5.1: resolution: {integrity: sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==} engines: {node: '>=6'} - cli-table3@0.6.3: - resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} + cli-table3@0.6.5: + resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} engines: {node: 10.* || >= 12.*} cli-truncate@3.1.0: @@ -2317,8 +2233,8 @@ packages: compare-func@2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} - compare-versions@6.1.0: - resolution: {integrity: sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==} + compare-versions@6.1.1: + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -2379,6 +2295,15 @@ packages: typescript: optional: true + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + create-hash@1.2.0: resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} @@ -2408,18 +2333,6 @@ packages: resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} engines: {node: '>=8'} - data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} - - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} - - data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} - death@1.1.0: resolution: {integrity: sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==} @@ -2432,6 +2345,15 @@ packages: supports-color: optional: true + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decamelize-keys@1.1.1: resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} engines: {node: '>=0.10.0'} @@ -2447,8 +2369,8 @@ packages: dedent@0.7.0: resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} - deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} engines: {node: '>=6'} deep-extend@0.6.0: @@ -2473,10 +2395,6 @@ packages: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -2498,16 +2416,12 @@ packages: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} - detect-port@1.5.1: - resolution: {integrity: sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==} - hasBin: true - diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} difflib@0.2.4: @@ -2525,19 +2439,22 @@ packages: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} - dotenv@16.3.1: - resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.4.567: - resolution: {integrity: sha512-8KR114CAYQ4/r5EIEsOmOMqQ9j0MRbJZR3aXD/KFA8RuKzyoUB4XrUCg+l8RUGqTVQgKNIgTpjaG8YHRPAbX2w==} + electron-to-chromium@1.5.19: + resolution: {integrity: sha512-kpLJJi3zxTR1U828P+LIUDZ5ohixyo68/IcYOHLqnbTPr/wdgn4i1ECvmALN9E16JPA6cvCG5UG79gVwVdEK5w==} elliptic@6.5.4: resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + elliptic@6.5.7: + resolution: {integrity: sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -2547,13 +2464,14 @@ packages: encode-utf8@1.0.3: resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} - encoding@0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} - enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -2561,10 +2479,6 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} - es-define-property@1.0.0: resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} engines: {node: '>= 0.4'} @@ -2573,31 +2487,16 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-module-lexer@1.3.1: - resolution: {integrity: sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==} - - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} - - es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - - esbuild@0.21.5: - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} - engines: {node: '>=12'} + esbuild@0.23.1: + resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + engines: {node: '>=18'} hasBin: true - escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} escape-string-regexp@1.0.5: @@ -2627,8 +2526,8 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint@8.52.0: - resolution: {integrity: sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==} + eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true @@ -2646,8 +2545,8 @@ packages: engines: {node: '>=4'} hasBin: true - esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} esrecurse@4.3.0: @@ -2680,8 +2579,8 @@ packages: '@codechecks/client': optional: true - ethereum-bloom-filters@1.0.10: - resolution: {integrity: sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==} + ethereum-bloom-filters@1.2.0: + resolution: {integrity: sha512-28hyiE7HVsWubqhpVLVmZXFd4ITeHi+BUu05o9isf0GUpMtzBUi+8/gFrGaGYzvGAJQmJ3JKj77Mk9G98T84rA==} ethereum-cryptography@0.1.3: resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} @@ -2689,11 +2588,12 @@ packages: ethereum-cryptography@1.2.0: resolution: {integrity: sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==} - ethereum-cryptography@2.1.2: - resolution: {integrity: sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==} + ethereum-cryptography@2.2.1: + resolution: {integrity: sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==} ethereumjs-abi@0.6.8: resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} + deprecated: This library has been deprecated and usage is discouraged. ethereumjs-util@6.2.1: resolution: {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==} @@ -2705,12 +2605,8 @@ packages: ethers@5.7.2: resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} - ethers@6.13.1: - resolution: {integrity: sha512-hdJ2HOxg/xx97Lm9HdCWk949BfYqYWpyw4//78SiwOLgASyfrNszfMUNB2joKjvGUdwhHfaiMMFFwacVVoLR9A==} - engines: {node: '>=14.0.0'} - - ethers@6.9.0: - resolution: {integrity: sha512-pmfNyQzc2mseLe91FnT2vmNaTt8dDzhxZ/xItAV7uGsF4dI4ek2ufMu3rAkgQETL/TIs0GS5A+U05g9QyWnv3Q==} + ethers@6.13.2: + resolution: {integrity: sha512-9VkriTTed+/27BGuY1s0hf441kqwHJ1wtN2edksEtiRvXx+soxRX3iSXTfFqq2+YwrOqbDoTHjIhQnjJRlzKmg==} engines: {node: '>=14.0.0'} ethjs-unit@0.1.6: @@ -2762,15 +2658,18 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-uri@3.0.1: + resolution: {integrity: sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==} + fast-xml-parser@4.4.1: resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==} hasBin: true - fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - fdir@6.4.3: - resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + fdir@6.4.2: + resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -2785,8 +2684,8 @@ packages: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} find-node-modules@2.1.3: @@ -2811,22 +2710,22 @@ packages: resolution: {integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==} engines: {node: '>= 8'} - flat-cache@3.1.1: - resolution: {integrity: sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==} - engines: {node: '>=12.0.0'} + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} flat@5.0.2: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true - flatted@3.2.9: - resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} fmix@0.1.0: resolution: {integrity: sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w==} - follow-redirects@1.15.6: - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -2834,11 +2733,8 @@ packages: debug: optional: true - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - - foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} form-data@2.5.1: @@ -2886,13 +2782,6 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} - - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -2916,15 +2805,8 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} - - get-tsconfig@4.7.2: - resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} - - get-tsconfig@4.7.5: - resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} + get-tsconfig@4.8.0: + resolution: {integrity: sha512-Pgba6TExTZ0FJAn1qkJAjIeKoDJ3CsI2ChuLohJnZl/tTU8MVrq3b+2t5UOPfRa4RMsorClBjJALkJUMjG1PAw==} ghost-testrpc@0.0.2: resolution: {integrity: sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==} @@ -2943,9 +2825,8 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true glob@5.0.15: @@ -2955,9 +2836,6 @@ packages: glob@7.1.7: resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} @@ -2965,6 +2843,10 @@ packages: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} + global-directory@4.0.1: + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} + engines: {node: '>=18'} + global-dirs@0.1.1: resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} engines: {node: '>=4'} @@ -2989,14 +2871,10 @@ packages: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} - globals@13.23.0: - resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} - globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} - globby@10.0.2: resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} engines: {node: '>=8'} @@ -3032,8 +2910,8 @@ packages: hardhat-deploy@0.11.45: resolution: {integrity: sha512-aC8UNaq3JcORnEUIwV945iJuvBwi65tjHVDU3v6mOcqik7WAzHVCJ7cwmkkipsHrWysrB5YvGF1q9S1vIph83w==} - hardhat-gas-reporter@1.0.9: - resolution: {integrity: sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==} + hardhat-gas-reporter@1.0.10: + resolution: {integrity: sha512-02N4+So/fZrzJ88ci54GqwVA3Zrf0C9duuTyGt0CFRIh/CdNwbnTgkXkRfojOMLBQ+6t+lBIkgbsOtqMvNwikA==} peerDependencies: hardhat: ^2.0.2 @@ -3054,9 +2932,6 @@ packages: typescript: optional: true - has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - has-flag@1.0.0: resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} engines: {node: '>=0.10.0'} @@ -3080,10 +2955,6 @@ packages: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - hash-base@3.1.0: resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} engines: {node: '>=4'} @@ -3148,27 +3019,26 @@ packages: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} immer@10.0.2: resolution: {integrity: sha512-Rx3CqeqQ19sxUtYV9CU911Vhy8/721wRFnJv3REVGWUmoAcIwzifTsdmJte/MV+0/XpM35LZdQMBGkRIoLPwQA==} - immutable@4.3.4: - resolution: {integrity: sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==} + immutable@4.3.7: + resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} + import-meta-resolve@4.1.0: + resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + imul@1.0.1: resolution: {integrity: sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA==} engines: {node: '>=0.10.0'} @@ -3190,14 +3060,14 @@ packages: ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + inquirer@8.2.5: resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==} engines: {node: '>=12.0.0'} - internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} - interpret@1.4.0: resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} engines: {node: '>= 0.10'} @@ -3205,41 +3075,19 @@ packages: io-ts@1.10.4: resolution: {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==} - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} - is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - is-builtin-module@3.2.1: resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} engines: {node: '>=6'} - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - - is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - - is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} - - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + is-core-module@2.15.1: + resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} engines: {node: '>= 0.4'} is-docker@2.2.1: @@ -3278,14 +3126,6 @@ packages: is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -3309,14 +3149,6 @@ packages: is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - - is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} - is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -3325,22 +3157,10 @@ packages: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - is-text-path@1.0.1: resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} engines: {node: '>=0.10.0'} - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} - is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} @@ -3348,9 +3168,6 @@ packages: is-utf8@0.2.1: resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} @@ -3362,9 +3179,6 @@ packages: isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -3376,15 +3190,14 @@ packages: peerDependencies: ws: '*' - jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} javascript-natural-sort@0.7.1: resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==} - jiti@1.20.0: - resolution: {integrity: sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==} + jiti@1.21.6: + resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} hasBin: true js-cookie@2.2.1: @@ -3571,9 +3384,8 @@ packages: loupe@2.3.7: resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - lru-cache@10.1.0: - resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} - engines: {node: 14 || >=16.14} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -3592,12 +3404,8 @@ packages: resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} engines: {node: '>=12'} - magic-string@0.30.10: - resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} - - magic-string@0.30.5: - resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} - engines: {node: '>=12'} + magic-string@0.30.11: + resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} @@ -3644,6 +3452,10 @@ packages: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -3673,18 +3485,10 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@5.0.1: - resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} - engines: {node: '>=10'} - minimatch@5.1.6: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} - minimatch@9.0.4: - resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} - engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -3699,8 +3503,8 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} mkdirp@0.5.6: @@ -3715,8 +3519,8 @@ packages: mnemonist@0.38.5: resolution: {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==} - mocha@10.2.0: - resolution: {integrity: sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==} + mocha@10.7.3: + resolution: {integrity: sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==} engines: {node: '>= 14.0.0'} hasBin: true @@ -3732,11 +3536,6 @@ packages: mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - nanoid@3.3.3: - resolution: {integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -3772,12 +3571,12 @@ packages: encoding: optional: true - node-gyp-build@4.6.1: - resolution: {integrity: sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==} + node-gyp-build@4.8.2: + resolution: {integrity: sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==} hasBin: true - node-releases@2.0.13: - resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} nofilter@3.1.0: resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} @@ -3802,8 +3601,8 @@ packages: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} - npm-run-path@5.1.0: - resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} number-to-bn@1.7.0: @@ -3814,15 +3613,8 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + object-inspect@1.13.2: + resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} engines: {node: '>= 0.4'} obliterator@2.0.4: @@ -3847,8 +3639,8 @@ packages: resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} engines: {node: '>= 0.8.0'} - optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} ora@5.4.1: @@ -3886,6 +3678,9 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -3924,9 +3719,9 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} path-starts-with@2.0.1: resolution: {integrity: sha512-wZ3AeiRBRlNwkdUxvBANh0+esnt38DLffHDujZyRHkqkaKHTglnY2EP5UX3b8rdeiSutgO4y9NEJwXezNP5vHg==} @@ -3947,11 +3742,8 @@ packages: resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} engines: {node: '>=0.12'} - picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - - picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + picocolors@1.1.0: + resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -3978,12 +3770,8 @@ packages: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - - postcss@8.4.32: - resolution: {integrity: sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==} + postcss@8.4.45: + resolution: {integrity: sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.1.2: @@ -3998,11 +3786,11 @@ packages: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} - prettier-plugin-solidity@1.1.3: - resolution: {integrity: sha512-fQ9yucPi2sBbA2U2Xjh6m4isUTJ7S7QLc/XDDsktqqxYfTwdYKJ0EnnywXHwCGAaYbQNK+HIYPL1OemxuMsgeg==} - engines: {node: '>=12'} + prettier-plugin-solidity@1.4.1: + resolution: {integrity: sha512-Mq8EtfacVZ/0+uDKTtHZGW3Aa7vEbX/BNx63hmVg6YTiTXSiuKP0amj0G6pGwjmLaOfymWh3QgXEZkjQbU8QRg==} + engines: {node: '>=16'} peerDependencies: - prettier: '>=2.3.0 || >=3.0.0-alpha.0' + prettier: '>=2.3.0' prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} @@ -4025,12 +3813,12 @@ packages: proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - qs@6.11.2: - resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} queue-microtask@1.2.3: @@ -4070,9 +3858,9 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} - readdirp@4.1.1: - resolution: {integrity: sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==} - engines: {node: '>= 14.18.0'} + readdirp@4.0.2: + resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} + engines: {node: '>= 14.16.0'} rechoir@0.6.2: resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} @@ -4090,10 +3878,6 @@ packages: resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} engines: {node: '>=6'} - regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} - req-cwd@2.0.0: resolution: {integrity: sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==} engines: {node: '>=4'} @@ -4163,8 +3947,8 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rfdc@1.3.0: - resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} rimraf@2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} @@ -4174,9 +3958,8 @@ packages: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true - rimraf@5.0.5: - resolution: {integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==} - engines: {node: '>=14'} + rimraf@5.0.10: + resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} hasBin: true ripemd160@2.0.2: @@ -4199,8 +3982,8 @@ packages: rollup: ^3.29.4 || ^4 typescript: ^4.5 || ^5.0 - rollup-plugin-esbuild@6.1.0: - resolution: {integrity: sha512-HPpXU65V8bSpW8eSYPahtUJaJHmbxJGybuf/M8B3bz/6i11YaYHlNNJIQ38gSEV0FyohQOgVxJ2YMEEZtEmwvA==} + rollup-plugin-esbuild@6.1.1: + resolution: {integrity: sha512-CehMY9FAqJD5OUaE/Mi1r5z0kNeYxItmRO2zG4Qnv2qWKF09J2lTy5GUzjJR354ZPrLkCj4fiBN41lo8PzBUhw==} engines: {node: '>=14.18.0'} peerDependencies: esbuild: '>=0.18.0' @@ -4227,8 +4010,8 @@ packages: peerDependencies: rollup: ^2.0.0 || ^3.0.0 || ^4.0.0 - rollup@4.6.1: - resolution: {integrity: sha512-jZHaZotEHQaHLgKr8JnQiDT1rmatjgKlMekyksz+yk9jt/8z9quNjnKNRoaM0wd9DC2QKXjmWWuDYtM3jfF8pQ==} + rollup@4.21.2: + resolution: {integrity: sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -4242,20 +4025,12 @@ packages: rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} - safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} - safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} - safe-resolve@1.0.0: resolution: {integrity: sha512-aQpRvfxoi1y0UxKEU0tNO327kb0/LMo8Xrk64M2u172UqOOLCCM0khxN2OTClDiTqTJz5864GMD1X92j4YiHTg==} @@ -4286,22 +4061,18 @@ packages: engines: {node: '>=10'} hasBin: true - semver@7.6.2: - resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} hasBin: true - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} - setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} @@ -4333,8 +4104,9 @@ packages: engines: {node: '>=6'} hasBin: true - side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -4373,14 +4145,11 @@ packages: resolution: {integrity: sha512-85EeLbmkcPwD+3JR7aEMKsVC9YrRSxd4qkXuMzrlf7+z2Eqdfm1wHWq1ffTuo5aDhoZxp2I9yF3QkxZOxOL7aQ==} hasBin: true - solidity-ast@0.4.52: - resolution: {integrity: sha512-iOya9BSiB9jhM8Vf40n8lGELGzwrUc57rl5BhfNtJ5cvAaMvRcNlHeAMNvqJJyjoUnczqRbHqdivEqK89du3Cw==} - - solidity-comments-extractor@0.0.7: - resolution: {integrity: sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw==} + solidity-ast@0.4.59: + resolution: {integrity: sha512-I+CX0wrYUN9jDfYtcgWSe+OAowaXy8/1YQy7NS4ni5IBDmIYBq7ZzaP/7QqouLjzZapmQtvGLqCaYgoUWqBo5g==} - solidity-coverage@0.8.5: - resolution: {integrity: sha512-6C6N6OV2O8FQA0FWA95FdzVH+L16HU94iFgg5wAFZ29UpLFkgNI/DRR2HotG1bC0F4gAc/OMs2BJI44Q/DYlKQ==} + solidity-coverage@0.8.13: + resolution: {integrity: sha512-RiBoI+kF94V3Rv0+iwOj3HQVSqNzA9qm/qDP1ZDXK5IX0Cvho1qiz8hAXTsAo6KOIUeP73jfscq0KlLqVxzGWA==} hasBin: true peerDependencies: hardhat: ^2.11.0 @@ -4388,8 +4157,8 @@ packages: solmate@6.2.0: resolution: {integrity: sha512-AM38ioQ2P8zRsA42zenb9or6OybRjOLXIu3lhIT8rhddUuduCt76pUEuLxOIg9GByGojGz+EbpFdCB6B+QZVVA==} - source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} source-map-support@0.5.21: @@ -4413,14 +4182,14 @@ packages: spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - spdx-exceptions@2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - spdx-license-ids@3.0.16: - resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} + spdx-license-ids@3.0.20: + resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==} split2@3.2.2: resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} @@ -4459,17 +4228,6 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} - - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} - string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -4550,8 +4308,8 @@ packages: resolution: {integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==} engines: {node: '>=8.0.0'} - table@6.8.1: - resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} + table@6.8.2: + resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==} engines: {node: '>=10.0.0'} tenderly@0.9.1: @@ -4624,8 +4382,8 @@ packages: peerDependencies: typescript: '>=3.7.0' - ts-node@10.9.1: - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true peerDependencies: '@swc/core': '>=1.2.50' @@ -4644,8 +4402,8 @@ packages: tslib@2.4.0: resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} - tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + tslib@2.7.0: + resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} tslog@4.9.3: resolution: {integrity: sha512-oDWuGVONxhVEBtschLf2cs/Jy8i7h1T+CpdkTNWQgdAF7DhRo2G8vMCgILKe7ojdEkLhICWgI1LYSSKaJsRgcw==} @@ -4654,40 +4412,6 @@ packages: tsort@0.0.1: resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} - turbo-darwin-64@2.0.3: - resolution: {integrity: sha512-v7ztJ8sxdHw3SLfO2MhGFeeU4LQhFii1hIGs9uBiXns/0YTGOvxLeifnfGqhfSrAIIhrCoByXO7nR9wlm10n3Q==} - cpu: [x64] - os: [darwin] - - turbo-darwin-arm64@2.0.3: - resolution: {integrity: sha512-LUcqvkV9Bxtng6QHbevp8IK8zzwbIxM6HMjCE7FEW6yJBN1KwvTtRtsGBwwmTxaaLO0wD1Jgl3vgkXAmQ4fqUw==} - cpu: [arm64] - os: [darwin] - - turbo-linux-64@2.0.3: - resolution: {integrity: sha512-xpdY1suXoEbsQsu0kPep2zrB8ijv/S5aKKrntGuQ62hCiwDFoDcA/Z7FZ8IHQ2u+dpJARa7yfiByHmizFE0r5Q==} - cpu: [x64] - os: [linux] - - turbo-linux-arm64@2.0.3: - resolution: {integrity: sha512-MBACTcSR874L1FtLL7gkgbI4yYJWBUCqeBN/iE29D+8EFe0d3fAyviFlbQP4K/HaDYet1i26xkkOiWr0z7/V9A==} - cpu: [arm64] - os: [linux] - - turbo-windows-64@2.0.3: - resolution: {integrity: sha512-zi3YuKPkM9JxMTshZo3excPk37hUrj5WfnCqh4FjI26ux6j/LJK+Dh3SebMHd9mR7wP9CMam4GhmLCT+gDfM+w==} - cpu: [x64] - os: [win32] - - turbo-windows-arm64@2.0.3: - resolution: {integrity: sha512-wmed4kkenLvRbidi7gISB4PU77ujBuZfgVGDZ4DXTFslE/kYpINulwzkVwJIvNXsJtHqyOq0n6jL8Zwl3BrwDg==} - cpu: [arm64] - os: [win32] - - turbo@2.0.3: - resolution: {integrity: sha512-jF1K0tTUyryEWmgqk1V0ALbSz3VdeZ8FXUo6B64WsPksCMCE48N5jUezGOH2MN0+epdaRMH8/WcPU0QQaVfeLA==} - hasBin: true - tweetnacl-util@0.15.1: resolution: {integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==} @@ -4740,32 +4464,11 @@ packages: peerDependencies: typescript: '>=4.3.0' - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} - - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} - - typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} - - typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} - typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - typescript@5.5.3: - resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} - engines: {node: '>=14.17'} - hasBin: true - - typescript@5.5.4: - resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + typescript@5.6.2: + resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} engines: {node: '>=14.17'} hasBin: true @@ -4777,14 +4480,11 @@ packages: resolution: {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==} engines: {node: '>=8'} - uglify-js@3.17.4: - resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} engines: {node: '>=0.8.0'} hasBin: true - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} @@ -4792,8 +4492,8 @@ packages: resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} engines: {node: '>=14.0'} - undici@6.18.2: - resolution: {integrity: sha512-o/MQLTwRm9IVhOqhZ0NQ9oXax1ygPjw6Vs+Vq/4QRjbOAC3B1GCHy7TYxxbExKlb7bzDRzt9vBWU6BDz0RFfYg==} + undici@6.19.8: + resolution: {integrity: sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==} engines: {node: '>=18.17'} unfetch@4.2.0: @@ -4803,16 +4503,16 @@ packages: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} - universalify@2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - update-browserslist-db@1.0.13: - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + update-browserslist-db@1.1.0: + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -4820,10 +4520,6 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - utf8@3.0.0: resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} @@ -4844,8 +4540,8 @@ packages: validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - viem@2.19.7: - resolution: {integrity: sha512-zoaBWnI6vf7MVRn4lAbuKd25hR31088yrMqONMHU8RjHTY4nqf+O589BPODwJak1LkfpbawyGyCY2tRFwZCWgw==} + viem@2.21.5: + resolution: {integrity: sha512-MFuoeGA8hRJJ0CknSuKYZjVaxSy5hyzu9MCArOANz3Iq5RITBJNIhM+m6TNvO9I2AxCSF3+PZObjbrLVg7cX2w==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -4855,8 +4551,8 @@ packages: wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - web3-utils@1.10.3: - resolution: {integrity: sha512-OqcUrEE16fDBbGoQtZXWdavsPzbGIDc5v3VrRTZ0XrIpefC/viZ1ZU9bGEemazyS0catk/3rkOOxpzTfY+XsyQ==} + web3-utils@1.10.4: + resolution: {integrity: sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==} engines: {node: '>=8.0.0'} webauthn-p256@0.0.5: @@ -4868,13 +4564,6 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} - which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true @@ -4899,8 +4588,8 @@ packages: resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} engines: {node: '>=8.0.0'} - workerpool@6.2.1: - resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} + workerpool@6.5.1: + resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} @@ -4925,8 +4614,8 @@ packages: utf-8-validate: optional: true - ws@7.5.9: - resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} engines: {node: '>=8.3.0'} peerDependencies: bufferutil: ^4.0.1 @@ -4949,25 +4638,13 @@ packages: utf-8-validate: optional: true - ws@8.5.0: - resolution: {integrity: sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - xdeployer@2.1.13: - resolution: {integrity: sha512-QxVsQ+zz+cnhzCIs7/e5F06nKjOD2Lb47nW52Jw3IzFQVeYv6NfvokhZiez+y8jkzwvHDwVru+fCVlml0GQGkw==} + xdeployer@2.2.2: + resolution: {integrity: sha512-CmkADnwn9M7J33Rrb1sbaI5mBaXrRr2kLEw5W6QMeTJkXw57ae7/IIBYHDbuFLu7L60J3ZF21KdpHjmSMkUsVQ==} engines: {node: '>=14.0.0'} peerDependencies: - '@nomicfoundation/hardhat-ethers': ^3.0.4 - ethers: ^6.8.1 - hardhat: ^2.19.0 + '@nomicfoundation/hardhat-ethers': ^3.0.5 + ethers: ^6.9.0 + hardhat: ^2.19.2 y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} @@ -4983,10 +4660,6 @@ packages: resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} engines: {node: '>= 14'} - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} @@ -5020,27 +4693,22 @@ packages: peerDependencies: ethers: ^5.7.0 - zod@3.23.8: - resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} - snapshots: - '@aashutoshrathi/word-wrap@1.2.6': {} - '@adraffy/ens-normalize@1.10.0': {} '@adraffy/ens-normalize@1.10.1': {} - '@ampproject/remapping@2.2.1': + '@ampproject/remapping@2.3.0': dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 '@aws-sdk/types': 3.731.0 - tslib: 2.6.2 + tslib: 2.7.0 '@aws-crypto/sha256-browser@5.2.0': dependencies: @@ -5050,27 +4718,27 @@ snapshots: '@aws-sdk/types': 3.731.0 '@aws-sdk/util-locate-window': 3.723.0 '@smithy/util-utf8': 2.3.0 - tslib: 2.6.2 + tslib: 2.7.0 '@aws-crypto/sha256-js@1.2.2': dependencies: '@aws-crypto/util': 1.2.2 - '@aws-sdk/types': 3.433.0 + '@aws-sdk/types': 3.649.0 tslib: 1.14.1 '@aws-crypto/sha256-js@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 '@aws-sdk/types': 3.731.0 - tslib: 2.6.2 + tslib: 2.7.0 '@aws-crypto/supports-web-crypto@5.2.0': dependencies: - tslib: 2.6.2 + tslib: 2.7.0 '@aws-crypto/util@1.2.2': dependencies: - '@aws-sdk/types': 3.433.0 + '@aws-sdk/types': 3.649.0 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 @@ -5078,7 +4746,7 @@ snapshots: dependencies: '@aws-sdk/types': 3.731.0 '@smithy/util-utf8': 2.3.0 - tslib: 2.6.2 + tslib: 2.7.0 '@aws-sdk/client-lambda@3.731.1': dependencies: @@ -5125,7 +4793,7 @@ snapshots: '@smithy/util-stream': 4.0.2 '@smithy/util-utf8': 4.0.0 '@smithy/util-waiter': 4.0.2 - tslib: 2.6.2 + tslib: 2.7.0 transitivePeerDependencies: - aws-crt @@ -5168,7 +4836,7 @@ snapshots: '@smithy/util-middleware': 4.0.1 '@smithy/util-retry': 4.0.1 '@smithy/util-utf8': 4.0.0 - tslib: 2.6.2 + tslib: 2.7.0 transitivePeerDependencies: - aws-crt @@ -5184,7 +4852,7 @@ snapshots: '@smithy/types': 4.1.0 '@smithy/util-middleware': 4.0.1 fast-xml-parser: 4.4.1 - tslib: 2.6.2 + tslib: 2.7.0 '@aws-sdk/credential-provider-env@3.731.0': dependencies: @@ -5192,7 +4860,7 @@ snapshots: '@aws-sdk/types': 3.731.0 '@smithy/property-provider': 4.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.7.0 '@aws-sdk/credential-provider-http@3.731.0': dependencies: @@ -5205,7 +4873,7 @@ snapshots: '@smithy/smithy-client': 4.1.2 '@smithy/types': 4.1.0 '@smithy/util-stream': 4.0.2 - tslib: 2.6.2 + tslib: 2.7.0 '@aws-sdk/credential-provider-ini@3.731.1': dependencies: @@ -5221,7 +4889,7 @@ snapshots: '@smithy/property-provider': 4.0.1 '@smithy/shared-ini-file-loader': 4.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.7.0 transitivePeerDependencies: - aws-crt @@ -5238,7 +4906,7 @@ snapshots: '@smithy/property-provider': 4.0.1 '@smithy/shared-ini-file-loader': 4.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.7.0 transitivePeerDependencies: - aws-crt @@ -5249,7 +4917,7 @@ snapshots: '@smithy/property-provider': 4.0.1 '@smithy/shared-ini-file-loader': 4.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.7.0 '@aws-sdk/credential-provider-sso@3.731.1': dependencies: @@ -5260,7 +4928,7 @@ snapshots: '@smithy/property-provider': 4.0.1 '@smithy/shared-ini-file-loader': 4.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.7.0 transitivePeerDependencies: - aws-crt @@ -5271,7 +4939,7 @@ snapshots: '@aws-sdk/types': 3.731.0 '@smithy/property-provider': 4.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.7.0 transitivePeerDependencies: - aws-crt @@ -5280,20 +4948,20 @@ snapshots: '@aws-sdk/types': 3.731.0 '@smithy/protocol-http': 5.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.7.0 '@aws-sdk/middleware-logger@3.731.0': dependencies: '@aws-sdk/types': 3.731.0 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.7.0 '@aws-sdk/middleware-recursion-detection@3.731.0': dependencies: '@aws-sdk/types': 3.731.0 '@smithy/protocol-http': 5.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.7.0 '@aws-sdk/middleware-user-agent@3.731.0': dependencies: @@ -5303,7 +4971,7 @@ snapshots: '@smithy/core': 3.1.1 '@smithy/protocol-http': 5.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.7.0 '@aws-sdk/nested-clients@3.731.1': dependencies: @@ -5344,7 +5012,7 @@ snapshots: '@smithy/util-middleware': 4.0.1 '@smithy/util-retry': 4.0.1 '@smithy/util-utf8': 4.0.0 - tslib: 2.6.2 + tslib: 2.7.0 transitivePeerDependencies: - aws-crt @@ -5355,7 +5023,7 @@ snapshots: '@smithy/types': 4.1.0 '@smithy/util-config-provider': 4.0.0 '@smithy/util-middleware': 4.0.1 - tslib: 2.6.2 + tslib: 2.7.0 '@aws-sdk/token-providers@3.731.1': dependencies: @@ -5364,37 +5032,37 @@ snapshots: '@smithy/property-provider': 4.0.1 '@smithy/shared-ini-file-loader': 4.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.7.0 transitivePeerDependencies: - aws-crt - '@aws-sdk/types@3.433.0': + '@aws-sdk/types@3.649.0': dependencies: - '@smithy/types': 2.4.0 - tslib: 2.6.2 + '@smithy/types': 3.4.0 + tslib: 2.7.0 '@aws-sdk/types@3.731.0': dependencies: '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.7.0 '@aws-sdk/util-endpoints@3.731.0': dependencies: '@aws-sdk/types': 3.731.0 '@smithy/types': 4.1.0 '@smithy/util-endpoints': 3.0.1 - tslib: 2.6.2 + tslib: 2.7.0 '@aws-sdk/util-locate-window@3.723.0': dependencies: - tslib: 2.6.2 + tslib: 2.7.0 '@aws-sdk/util-user-agent-browser@3.731.0': dependencies: '@aws-sdk/types': 3.731.0 '@smithy/types': 4.1.0 bowser: 2.11.0 - tslib: 2.6.2 + tslib: 2.7.0 '@aws-sdk/util-user-agent-node@3.731.0': dependencies: @@ -5402,39 +5070,33 @@ snapshots: '@aws-sdk/types': 3.731.0 '@smithy/node-config-provider': 4.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.7.0 '@aws-sdk/util-utf8-browser@3.259.0': dependencies: - tslib: 2.6.2 - - '@babel/code-frame@7.23.5': - dependencies: - '@babel/highlight': 7.23.4 - chalk: 2.4.2 + tslib: 2.7.0 '@babel/code-frame@7.24.7': dependencies: '@babel/highlight': 7.24.7 - picocolors: 1.0.0 - optional: true + picocolors: 1.1.0 - '@babel/compat-data@7.23.5': {} + '@babel/compat-data@7.25.4': {} '@babel/core@7.17.8': dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.5 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.17.8) - '@babel/helpers': 7.23.5 - '@babel/parser': 7.23.5 - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.5 - '@babel/types': 7.23.5 + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.17.7 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.17.8) + '@babel/helpers': 7.25.6 + '@babel/parser': 7.18.9 + '@babel/template': 7.25.0 + '@babel/traverse': 7.17.3 + '@babel/types': 7.17.0 convert-source-map: 1.9.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -5443,148 +5105,141 @@ snapshots: '@babel/generator@7.17.7': dependencies: - '@babel/types': 7.23.5 + '@babel/types': 7.17.0 jsesc: 2.5.2 source-map: 0.5.7 - '@babel/generator@7.23.5': + '@babel/generator@7.25.6': dependencies: - '@babel/types': 7.23.5 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 + '@babel/types': 7.25.6 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 - '@babel/helper-compilation-targets@7.22.15': + '@babel/helper-compilation-targets@7.25.2': dependencies: - '@babel/compat-data': 7.23.5 - '@babel/helper-validator-option': 7.23.5 - browserslist: 4.22.1 + '@babel/compat-data': 7.25.4 + '@babel/helper-validator-option': 7.24.8 + browserslist: 4.23.3 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-environment-visitor@7.22.20': {} + '@babel/helper-environment-visitor@7.24.7': + dependencies: + '@babel/types': 7.25.6 - '@babel/helper-function-name@7.23.0': + '@babel/helper-function-name@7.24.7': dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.5 + '@babel/template': 7.25.0 + '@babel/types': 7.25.6 - '@babel/helper-hoist-variables@7.22.5': + '@babel/helper-hoist-variables@7.24.7': dependencies: - '@babel/types': 7.23.5 + '@babel/types': 7.25.6 - '@babel/helper-module-imports@7.22.15': + '@babel/helper-module-imports@7.24.7': dependencies: - '@babel/types': 7.23.5 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 + transitivePeerDependencies: + - supports-color - '@babel/helper-module-transforms@7.23.3(@babel/core@7.17.8)': + '@babel/helper-module-transforms@7.25.2(@babel/core@7.17.8)': dependencies: '@babel/core': 7.17.8 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + '@babel/traverse': 7.25.6 + transitivePeerDependencies: + - supports-color - '@babel/helper-simple-access@7.22.5': + '@babel/helper-simple-access@7.24.7': dependencies: - '@babel/types': 7.23.5 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 + transitivePeerDependencies: + - supports-color - '@babel/helper-split-export-declaration@7.22.6': + '@babel/helper-split-export-declaration@7.24.7': dependencies: - '@babel/types': 7.23.5 - - '@babel/helper-string-parser@7.23.4': {} + '@babel/types': 7.25.6 - '@babel/helper-validator-identifier@7.22.20': {} - - '@babel/helper-validator-identifier@7.24.7': - optional: true + '@babel/helper-string-parser@7.24.8': {} - '@babel/helper-validator-option@7.23.5': {} + '@babel/helper-validator-identifier@7.24.7': {} - '@babel/helpers@7.23.5': - dependencies: - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.5 - '@babel/types': 7.23.5 - transitivePeerDependencies: - - supports-color + '@babel/helper-validator-option@7.24.8': {} - '@babel/highlight@7.23.4': + '@babel/helpers@7.25.6': dependencies: - '@babel/helper-validator-identifier': 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 + '@babel/template': 7.25.0 + '@babel/types': 7.25.6 '@babel/highlight@7.24.7': dependencies: '@babel/helper-validator-identifier': 7.24.7 chalk: 2.4.2 js-tokens: 4.0.0 - picocolors: 1.0.0 - optional: true + picocolors: 1.1.0 '@babel/parser@7.18.9': dependencies: - '@babel/types': 7.23.5 + '@babel/types': 7.17.0 - '@babel/parser@7.23.5': + '@babel/parser@7.25.6': dependencies: - '@babel/types': 7.23.5 + '@babel/types': 7.25.6 - '@babel/template@7.22.15': + '@babel/template@7.25.0': dependencies: - '@babel/code-frame': 7.23.5 - '@babel/parser': 7.23.5 - '@babel/types': 7.23.5 + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 '@babel/traverse@7.17.3': dependencies: - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.23.5 - '@babel/types': 7.23.5 - debug: 4.3.4(supports-color@8.1.1) + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.17.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-function-name': 7.24.7 + '@babel/helper-hoist-variables': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/parser': 7.18.9 + '@babel/types': 7.17.0 + debug: 4.3.7(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/traverse@7.23.5': - dependencies: - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.23.5 - '@babel/types': 7.23.5 - debug: 4.3.4(supports-color@8.1.1) + '@babel/traverse@7.25.6': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.6 + '@babel/parser': 7.25.6 + '@babel/template': 7.25.0 + '@babel/types': 7.25.6 + debug: 4.3.7(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color '@babel/types@7.17.0': dependencies: - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 - '@babel/types@7.23.5': + '@babel/types@7.25.6': dependencies: - '@babel/helper-string-parser': 7.23.4 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 '@bytecodealliance/preview2-shim@0.17.0': {} - '@chainlink/contracts@0.8.0(bufferutil@4.0.8)(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@chainlink/contracts@0.8.0(ethers@6.13.2)': dependencies: - '@eth-optimism/contracts': 0.5.40(bufferutil@4.0.8)(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@eth-optimism/contracts': 0.5.40(ethers@6.13.2) '@openzeppelin/contracts': 4.3.3 '@openzeppelin/contracts-upgradeable-4.7.3': '@openzeppelin/contracts-upgradeable@4.7.3' '@openzeppelin/contracts-v0.7': '@openzeppelin/contracts@3.4.2' @@ -5596,11 +5251,11 @@ snapshots: '@colors/colors@1.5.0': optional: true - '@commitlint/cli@17.8.1(@swc/core@1.6.3)': + '@commitlint/cli@17.8.1(@swc/core@1.7.26)': dependencies: '@commitlint/format': 17.8.1 '@commitlint/lint': 17.8.1 - '@commitlint/load': 17.8.1(@swc/core@1.6.3) + '@commitlint/load': 17.8.1(@swc/core@1.7.26) '@commitlint/read': 17.8.1 '@commitlint/types': 17.8.1 execa: 5.1.1 @@ -5619,12 +5274,12 @@ snapshots: '@commitlint/config-validator@17.8.1': dependencies: '@commitlint/types': 17.8.1 - ajv: 8.12.0 + ajv: 8.17.1 - '@commitlint/config-validator@18.1.0': + '@commitlint/config-validator@19.5.0': dependencies: - '@commitlint/types': 18.1.0 - ajv: 8.12.0 + '@commitlint/types': 19.5.0 + ajv: 8.17.1 optional: true '@commitlint/ensure@17.8.1': @@ -5638,7 +5293,7 @@ snapshots: '@commitlint/execute-rule@17.8.1': {} - '@commitlint/execute-rule@18.1.0': + '@commitlint/execute-rule@19.5.0': optional: true '@commitlint/format@17.8.1': @@ -5658,7 +5313,7 @@ snapshots: '@commitlint/rules': 17.8.1 '@commitlint/types': 17.8.1 - '@commitlint/load@17.8.1(@swc/core@1.6.3)': + '@commitlint/load@17.8.1(@swc/core@1.7.26)': dependencies: '@commitlint/config-validator': 17.8.1 '@commitlint/execute-rule': 17.8.1 @@ -5666,33 +5321,32 @@ snapshots: '@commitlint/types': 17.8.1 '@types/node': 20.5.1 chalk: 4.1.2 - cosmiconfig: 8.3.6(typescript@5.5.3) - cosmiconfig-typescript-loader: 4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6(typescript@5.5.3))(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@20.5.1)(typescript@5.5.3))(typescript@5.5.3) + cosmiconfig: 8.3.6(typescript@5.6.2) + cosmiconfig-typescript-loader: 4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6(typescript@5.6.2))(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@20.5.1)(typescript@5.6.2))(typescript@5.6.2) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 resolve-from: 5.0.0 - ts-node: 10.9.1(@swc/core@1.6.3)(@types/node@20.5.1)(typescript@5.5.3) - typescript: 5.5.3 + ts-node: 10.9.2(@swc/core@1.7.26)(@types/node@20.5.1)(typescript@5.6.2) + typescript: 5.6.2 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' - '@commitlint/load@18.2.0(typescript@5.5.3)': + '@commitlint/load@19.5.0(@types/node@18.19.50)(typescript@5.6.2)': dependencies: - '@commitlint/config-validator': 18.1.0 - '@commitlint/execute-rule': 18.1.0 - '@commitlint/resolve-extends': 18.1.0 - '@commitlint/types': 18.1.0 - '@types/node': 18.18.7 - chalk: 4.1.2 - cosmiconfig: 8.3.6(typescript@5.5.3) - cosmiconfig-typescript-loader: 5.0.0(@types/node@18.18.7)(cosmiconfig@8.3.6(typescript@5.5.3))(typescript@5.5.3) + '@commitlint/config-validator': 19.5.0 + '@commitlint/execute-rule': 19.5.0 + '@commitlint/resolve-extends': 19.5.0 + '@commitlint/types': 19.5.0 + chalk: 5.3.0 + cosmiconfig: 9.0.0(typescript@5.6.2) + cosmiconfig-typescript-loader: 5.0.0(@types/node@18.19.50)(cosmiconfig@9.0.0(typescript@5.6.2))(typescript@5.6.2) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 - resolve-from: 5.0.0 transitivePeerDependencies: + - '@types/node' - typescript optional: true @@ -5721,14 +5375,14 @@ snapshots: resolve-from: 5.0.0 resolve-global: 1.0.0 - '@commitlint/resolve-extends@18.1.0': + '@commitlint/resolve-extends@19.5.0': dependencies: - '@commitlint/config-validator': 18.1.0 - '@commitlint/types': 18.1.0 - import-fresh: 3.3.0 + '@commitlint/config-validator': 19.5.0 + '@commitlint/types': 19.5.0 + global-directory: 4.0.1 + import-meta-resolve: 4.1.0 lodash.mergewith: 4.6.2 resolve-from: 5.0.0 - resolve-global: 1.0.0 optional: true '@commitlint/rules@17.8.1': @@ -5749,98 +5403,102 @@ snapshots: dependencies: chalk: 4.1.2 - '@commitlint/types@18.1.0': + '@commitlint/types@19.5.0': dependencies: - chalk: 4.1.2 + '@types/conventional-commits-parser': 5.0.0 + chalk: 5.3.0 optional: true '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@esbuild/aix-ppc64@0.21.5': + '@esbuild/aix-ppc64@0.23.1': + optional: true + + '@esbuild/android-arm64@0.23.1': optional: true - '@esbuild/android-arm64@0.21.5': + '@esbuild/android-arm@0.23.1': optional: true - '@esbuild/android-arm@0.21.5': + '@esbuild/android-x64@0.23.1': optional: true - '@esbuild/android-x64@0.21.5': + '@esbuild/darwin-arm64@0.23.1': optional: true - '@esbuild/darwin-arm64@0.21.5': + '@esbuild/darwin-x64@0.23.1': optional: true - '@esbuild/darwin-x64@0.21.5': + '@esbuild/freebsd-arm64@0.23.1': optional: true - '@esbuild/freebsd-arm64@0.21.5': + '@esbuild/freebsd-x64@0.23.1': optional: true - '@esbuild/freebsd-x64@0.21.5': + '@esbuild/linux-arm64@0.23.1': optional: true - '@esbuild/linux-arm64@0.21.5': + '@esbuild/linux-arm@0.23.1': optional: true - '@esbuild/linux-arm@0.21.5': + '@esbuild/linux-ia32@0.23.1': optional: true - '@esbuild/linux-ia32@0.21.5': + '@esbuild/linux-loong64@0.23.1': optional: true - '@esbuild/linux-loong64@0.21.5': + '@esbuild/linux-mips64el@0.23.1': optional: true - '@esbuild/linux-mips64el@0.21.5': + '@esbuild/linux-ppc64@0.23.1': optional: true - '@esbuild/linux-ppc64@0.21.5': + '@esbuild/linux-riscv64@0.23.1': optional: true - '@esbuild/linux-riscv64@0.21.5': + '@esbuild/linux-s390x@0.23.1': optional: true - '@esbuild/linux-s390x@0.21.5': + '@esbuild/linux-x64@0.23.1': optional: true - '@esbuild/linux-x64@0.21.5': + '@esbuild/netbsd-x64@0.23.1': optional: true - '@esbuild/netbsd-x64@0.21.5': + '@esbuild/openbsd-arm64@0.23.1': optional: true - '@esbuild/openbsd-x64@0.21.5': + '@esbuild/openbsd-x64@0.23.1': optional: true - '@esbuild/sunos-x64@0.21.5': + '@esbuild/sunos-x64@0.23.1': optional: true - '@esbuild/win32-arm64@0.21.5': + '@esbuild/win32-arm64@0.23.1': optional: true - '@esbuild/win32-ia32@0.21.5': + '@esbuild/win32-ia32@0.23.1': optional: true - '@esbuild/win32-x64@0.21.5': + '@esbuild/win32-x64@0.23.1': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@8.52.0)': + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': dependencies: - eslint: 8.52.0 + eslint: 8.57.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.10.0': {} + '@eslint-community/regexpp@4.11.0': {} - '@eslint/eslintrc@2.1.2': + '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) espree: 9.6.1 - globals: 13.23.0 - ignore: 5.3.1 + globals: 13.24.0 + ignore: 5.3.2 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -5848,19 +5506,19 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@8.52.0': {} + '@eslint/js@8.57.0': {} - '@eth-optimism/contracts@0.5.40(bufferutil@4.0.8)(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@eth-optimism/contracts@0.5.40(ethers@6.13.2)': dependencies: - '@eth-optimism/core-utils': 0.12.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@eth-optimism/core-utils': 0.12.0 '@ethersproject/abstract-provider': 5.7.0 '@ethersproject/abstract-signer': 5.7.0 - ethers: 6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ethers: 6.13.2 transitivePeerDependencies: - bufferutil - utf-8-validate - '@eth-optimism/core-utils@0.12.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@eth-optimism/core-utils@0.12.0': dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/abstract-provider': 5.7.0 @@ -5872,7 +5530,7 @@ snapshots: '@ethersproject/hash': 5.7.0 '@ethersproject/keccak256': 5.7.0 '@ethersproject/properties': 5.7.0 - '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@ethersproject/providers': 5.7.2 '@ethersproject/rlp': 5.7.0 '@ethersproject/transactions': 5.7.0 '@ethersproject/web': 5.7.1 @@ -5887,7 +5545,7 @@ snapshots: '@ethereumjs/util@8.1.0': dependencies: '@ethereumjs/rlp': 4.0.1 - ethereum-cryptography: 2.1.2 + ethereum-cryptography: 2.2.1 micro-ftch: 0.3.1 '@ethersproject/abi@5.7.0': @@ -6035,7 +5693,7 @@ snapshots: dependencies: '@ethersproject/logger': 5.7.0 - '@ethersproject/providers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@ethersproject/providers@5.7.2': dependencies: '@ethersproject/abstract-provider': 5.7.0 '@ethersproject/abstract-signer': 5.7.0 @@ -6056,7 +5714,7 @@ snapshots: '@ethersproject/transactions': 5.7.0 '@ethersproject/web': 5.7.1 bech32: 1.1.4 - ws: 7.4.6(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ws: 7.4.6 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -6153,21 +5811,21 @@ snapshots: '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 - '@fastify/busboy@2.0.0': {} + '@fastify/busboy@2.1.1': {} '@fastify/deepmerge@1.3.0': {} - '@humanwhocodes/config-array@0.11.13': + '@humanwhocodes/config-array@0.11.14': dependencies: - '@humanwhocodes/object-schema': 2.0.1 - debug: 4.3.4(supports-color@8.1.1) + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.7(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@2.0.1': {} + '@humanwhocodes/object-schema@2.0.3': {} '@isaacs/cliui@8.0.2': dependencies: @@ -6178,29 +5836,29 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@jridgewell/gen-mapping@0.3.3': + '@jridgewell/gen-mapping@0.3.5': dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 - '@jridgewell/resolve-uri@3.1.1': {} + '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/set-array@1.1.2': {} + '@jridgewell/set-array@1.2.1': {} - '@jridgewell/sourcemap-codec@1.4.15': {} + '@jridgewell/sourcemap-codec@1.5.0': {} - '@jridgewell/trace-mapping@0.3.20': + '@jridgewell/trace-mapping@0.3.25': dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping@0.3.9': dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 - '@looksrare/contracts-libs@3.4.0': {} + '@looksrare/contracts-libs@3.5.1': {} '@metamask/eth-sig-util@4.0.1': dependencies: @@ -6210,10 +5868,6 @@ snapshots: tweetnacl: 1.0.3 tweetnacl-util: 0.15.1 - '@noble/curves@1.1.0': - dependencies: - '@noble/hashes': 1.3.1 - '@noble/curves@1.2.0': dependencies: '@noble/hashes': 1.3.2 @@ -6222,14 +5876,18 @@ snapshots: dependencies: '@noble/hashes': 1.4.0 - '@noble/hashes@1.2.0': {} + '@noble/curves@1.4.2': + dependencies: + '@noble/hashes': 1.4.0 - '@noble/hashes@1.3.1': {} + '@noble/hashes@1.2.0': {} '@noble/hashes@1.3.2': {} '@noble/hashes@1.4.0': {} + '@noble/hashes@1.5.0': {} + '@noble/secp256k1@1.7.1': {} '@nodelib/fs.scandir@2.1.5': @@ -6242,7 +5900,7 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 + fastq: 1.17.1 '@nomicfoundation/edr-darwin-arm64@0.7.0': {} @@ -6288,107 +5946,107 @@ snapshots: '@nomicfoundation/ethereumjs-rlp': 5.0.4 ethereum-cryptography: 0.1.3 - '@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(chai@4.5.0)(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)) - '@types/chai-as-promised': 7.1.7 + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) + '@types/chai-as-promised': 7.1.8 chai: 4.5.0 - chai-as-promised: 7.1.1(chai@4.5.0) - deep-eql: 4.1.3 - ethers: 6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat: 2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10) + chai-as-promised: 7.1.2(chai@4.5.0) + deep-eql: 4.1.4 + ethers: 6.13.2 + hardhat: 2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) ordinal: 1.0.3 - '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))': dependencies: - debug: 4.3.4(supports-color@8.1.1) - ethers: 6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat: 2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10) + debug: 4.3.7(supports-color@8.1.1) + ethers: 6.13.2 + hardhat: 2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-ignition-ethers@0.15.4(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ignition-ethers@0.15.5(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.10(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@nomicfoundation/ignition-core@0.15.5)(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition': 0.15.5(@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - '@nomicfoundation/ignition-core': 0.15.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) - ethers: 6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat: 2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) + '@nomicfoundation/hardhat-ignition': 0.15.5(@nomicfoundation/hardhat-verify@2.0.10(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) + '@nomicfoundation/ignition-core': 0.15.5 + ethers: 6.13.2 + hardhat: 2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) - '@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.10(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))': dependencies: - '@nomicfoundation/hardhat-verify': 2.0.9(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/ignition-core': 0.15.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@nomicfoundation/hardhat-verify': 2.0.10(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) + '@nomicfoundation/ignition-core': 0.15.5 '@nomicfoundation/ignition-ui': 0.15.5 chalk: 4.1.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) fs-extra: 10.1.0 - hardhat: 2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10) + hardhat: 2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) prompts: 2.4.2 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@nomicfoundation/hardhat-network-helpers@1.0.9(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-network-helpers@1.0.11(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))': dependencies: ethereumjs-util: 7.1.5 - hardhat: 2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10) + hardhat: 2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) - ? '@nomicfoundation/hardhat-toolbox@5.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition-ethers@0.15.4(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-network-helpers@1.0.9(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)))(@typechain/ethers-v6@0.4.3(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.3))(typescript@5.5.3))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.4.3(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.3))(typescript@5.5.3))(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.3)))(@types/chai@4.3.11)(@types/mocha@9.1.0)(@types/node@18.18.7)(chai@4.5.0)(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat-gas-reporter@1.0.9(bufferutil@4.0.8)(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10))(solidity-coverage@0.8.5(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)))(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typechain@8.3.2(typescript@5.5.3))(typescript@5.5.3)' + ? '@nomicfoundation/hardhat-toolbox@5.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(chai@4.5.0)(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@nomicfoundation/hardhat-ignition-ethers@0.15.5(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.10(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@nomicfoundation/ignition-core@0.15.5)(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@nomicfoundation/hardhat-network-helpers@1.0.11(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@nomicfoundation/hardhat-verify@2.0.10(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.6.2))(typescript@5.6.2))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.6.2))(typescript@5.6.2))(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))(typechain@8.3.2(typescript@5.6.2)))(@types/chai@4.3.19)(@types/mocha@10.0.7)(@types/node@18.19.50)(chai@4.5.0)(ethers@6.13.2)(hardhat-gas-reporter@1.0.10(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))(solidity-coverage@0.8.13(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typechain@8.3.2(typescript@5.6.2))(typescript@5.6.2)' : dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.0.7(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition-ethers': 0.15.4(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-network-helpers': 1.0.9(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-verify': 2.0.9(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)) - '@typechain/ethers-v6': 0.4.3(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.3))(typescript@5.5.3) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.4.3(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.3))(typescript@5.5.3))(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.3)) - '@types/chai': 4.3.11 - '@types/mocha': 9.1.0 - '@types/node': 18.18.7 + '@nomicfoundation/hardhat-chai-matchers': 2.0.7(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(chai@4.5.0)(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) + '@nomicfoundation/hardhat-ignition-ethers': 0.15.5(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.10(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@nomicfoundation/ignition-core@0.15.5)(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) + '@nomicfoundation/hardhat-network-helpers': 1.0.11(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) + '@nomicfoundation/hardhat-verify': 2.0.10(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) + '@typechain/ethers-v6': 0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.6.2))(typescript@5.6.2) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.6.2))(typescript@5.6.2))(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))(typechain@8.3.2(typescript@5.6.2)) + '@types/chai': 4.3.19 + '@types/mocha': 10.0.7 + '@types/node': 18.19.50 chai: 4.5.0 - ethers: 6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat: 2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10) - hardhat-gas-reporter: 1.0.9(bufferutil@4.0.8)(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - solidity-coverage: 0.8.5(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)) - ts-node: 10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3) - typechain: 8.3.2(typescript@5.5.3) - typescript: 5.5.3 + ethers: 6.13.2 + hardhat: 2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) + hardhat-gas-reporter: 1.0.10(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) + solidity-coverage: 0.8.13(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) + ts-node: 10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2) + typechain: 8.3.2(typescript@5.6.2) + typescript: 5.6.2 - '@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-verify@2.0.10(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))': dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/address': 5.7.0 cbor: 8.1.0 chalk: 2.4.2 - debug: 4.3.4(supports-color@8.1.1) - hardhat: 2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10) + debug: 4.3.7(supports-color@8.1.1) + hardhat: 2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) lodash.clonedeep: 4.5.0 semver: 6.3.1 - table: 6.8.1 + table: 6.8.2 undici: 5.28.4 transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-viem@2.0.6(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10))(typescript@5.5.3)(viem@2.19.7(bufferutil@4.0.8)(typescript@5.5.3)(utf-8-validate@5.0.10)(zod@3.23.8))(zod@3.23.8)': + '@nomicfoundation/hardhat-viem@2.0.6(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))(typescript@5.6.2)(viem@2.21.5(typescript@5.6.2))': dependencies: - abitype: 0.9.8(typescript@5.5.3)(zod@3.23.8) - hardhat: 2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10) + abitype: 0.9.10(typescript@5.6.2) + hardhat: 2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) lodash.memoize: 4.1.2 - viem: 2.19.7(bufferutil@4.0.8)(typescript@5.5.3)(utf-8-validate@5.0.10)(zod@3.23.8) + viem: 2.21.5(typescript@5.6.2) transitivePeerDependencies: - typescript - zod - '@nomicfoundation/ignition-core@0.15.5(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@nomicfoundation/ignition-core@0.15.5': dependencies: '@ethersproject/address': 5.6.1 - '@nomicfoundation/solidity-analyzer': 0.1.1 - cbor: 9.0.1 - debug: 4.3.4(supports-color@8.1.1) - ethers: 6.13.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@nomicfoundation/solidity-analyzer': 0.1.2 + cbor: 9.0.2 + debug: 4.3.7(supports-color@8.1.1) + ethers: 6.13.2 fs-extra: 10.1.0 immer: 10.0.2 lodash: 4.17.21 @@ -6400,82 +6058,70 @@ snapshots: '@nomicfoundation/ignition-ui@0.15.5': {} - '@nomicfoundation/slang-darwin-arm64@0.15.1': {} + '@nomicfoundation/slang-darwin-arm64@0.17.0': {} - '@nomicfoundation/slang-darwin-x64@0.15.1': {} + '@nomicfoundation/slang-darwin-x64@0.17.0': {} - '@nomicfoundation/slang-linux-arm64-gnu@0.15.1': {} + '@nomicfoundation/slang-linux-arm64-gnu@0.17.0': {} - '@nomicfoundation/slang-linux-arm64-musl@0.15.1': {} + '@nomicfoundation/slang-linux-arm64-musl@0.17.0': {} - '@nomicfoundation/slang-linux-x64-gnu@0.15.1': {} + '@nomicfoundation/slang-linux-x64-gnu@0.17.0': {} - '@nomicfoundation/slang-linux-x64-musl@0.15.1': {} + '@nomicfoundation/slang-linux-x64-musl@0.17.0': {} - '@nomicfoundation/slang-win32-arm64-msvc@0.15.1': {} + '@nomicfoundation/slang-win32-arm64-msvc@0.17.0': {} - '@nomicfoundation/slang-win32-ia32-msvc@0.15.1': {} + '@nomicfoundation/slang-win32-ia32-msvc@0.17.0': {} - '@nomicfoundation/slang-win32-x64-msvc@0.15.1': {} + '@nomicfoundation/slang-win32-x64-msvc@0.17.0': {} - '@nomicfoundation/slang@0.15.1': + '@nomicfoundation/slang@0.17.0': dependencies: - '@nomicfoundation/slang-darwin-arm64': 0.15.1 - '@nomicfoundation/slang-darwin-x64': 0.15.1 - '@nomicfoundation/slang-linux-arm64-gnu': 0.15.1 - '@nomicfoundation/slang-linux-arm64-musl': 0.15.1 - '@nomicfoundation/slang-linux-x64-gnu': 0.15.1 - '@nomicfoundation/slang-linux-x64-musl': 0.15.1 - '@nomicfoundation/slang-win32-arm64-msvc': 0.15.1 - '@nomicfoundation/slang-win32-ia32-msvc': 0.15.1 - '@nomicfoundation/slang-win32-x64-msvc': 0.15.1 + '@nomicfoundation/slang-darwin-arm64': 0.17.0 + '@nomicfoundation/slang-darwin-x64': 0.17.0 + '@nomicfoundation/slang-linux-arm64-gnu': 0.17.0 + '@nomicfoundation/slang-linux-arm64-musl': 0.17.0 + '@nomicfoundation/slang-linux-x64-gnu': 0.17.0 + '@nomicfoundation/slang-linux-x64-musl': 0.17.0 + '@nomicfoundation/slang-win32-arm64-msvc': 0.17.0 + '@nomicfoundation/slang-win32-ia32-msvc': 0.17.0 + '@nomicfoundation/slang-win32-x64-msvc': 0.17.0 '@nomicfoundation/slang@0.18.3': dependencies: '@bytecodealliance/preview2-shim': 0.17.0 - '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1': - optional: true - - '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1': - optional: true - - '@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1': - optional: true - - '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1': + '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': optional: true - '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1': + '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2': optional: true - '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1': + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2': optional: true - '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1': + '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2': optional: true - '@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1': + '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2': optional: true - '@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1': + '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2': optional: true - '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1': + '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2': optional: true - '@nomicfoundation/solidity-analyzer@0.1.1': + '@nomicfoundation/solidity-analyzer@0.1.2': optionalDependencies: - '@nomicfoundation/solidity-analyzer-darwin-arm64': 0.1.1 - '@nomicfoundation/solidity-analyzer-darwin-x64': 0.1.1 - '@nomicfoundation/solidity-analyzer-freebsd-x64': 0.1.1 - '@nomicfoundation/solidity-analyzer-linux-arm64-gnu': 0.1.1 - '@nomicfoundation/solidity-analyzer-linux-arm64-musl': 0.1.1 - '@nomicfoundation/solidity-analyzer-linux-x64-gnu': 0.1.1 - '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.1 - '@nomicfoundation/solidity-analyzer-win32-arm64-msvc': 0.1.1 - '@nomicfoundation/solidity-analyzer-win32-ia32-msvc': 0.1.1 - '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.1 + '@nomicfoundation/solidity-analyzer-darwin-arm64': 0.1.2 + '@nomicfoundation/solidity-analyzer-darwin-x64': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-arm64-musl': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-x64-gnu': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.2 + '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.2 '@openzeppelin/contracts-upgradeable@4.7.3': {} @@ -6483,209 +6129,208 @@ snapshots: '@openzeppelin/contracts@4.3.3': {} - '@openzeppelin/contracts@4.9.3': {} + '@openzeppelin/contracts@4.9.6': {} - '@openzeppelin/defender-sdk-base-client@2.1.0(encoding@0.1.13)': + '@openzeppelin/defender-sdk-base-client@2.1.0': dependencies: '@aws-sdk/client-lambda': 3.731.1 - amazon-cognito-identity-js: 6.3.6(encoding@0.1.13) + amazon-cognito-identity-js: 6.3.12 async-retry: 1.3.3 transitivePeerDependencies: - aws-crt - encoding - '@openzeppelin/defender-sdk-deploy-client@2.1.0(debug@4.3.4)(encoding@0.1.13)': + '@openzeppelin/defender-sdk-deploy-client@2.1.0(debug@4.3.7)': dependencies: - '@openzeppelin/defender-sdk-base-client': 2.1.0(encoding@0.1.13) - axios: 1.7.9(debug@4.3.4) + '@openzeppelin/defender-sdk-base-client': 2.1.0 + axios: 1.7.7(debug@4.3.7) lodash: 4.17.21 transitivePeerDependencies: - aws-crt - debug - encoding - '@openzeppelin/defender-sdk-network-client@2.1.0(debug@4.3.4)(encoding@0.1.13)': + '@openzeppelin/defender-sdk-network-client@2.1.0(debug@4.3.7)': dependencies: - '@openzeppelin/defender-sdk-base-client': 2.1.0(encoding@0.1.13) - axios: 1.7.9(debug@4.3.4) + '@openzeppelin/defender-sdk-base-client': 2.1.0 + axios: 1.7.7(debug@4.3.7) lodash: 4.17.21 transitivePeerDependencies: - aws-crt - debug - encoding - '@openzeppelin/hardhat-upgrades@3.9.0(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)))(encoding@0.1.13)(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10))': + '@openzeppelin/hardhat-upgrades@3.9.0(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@nomicfoundation/hardhat-verify@2.0.10(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)) - '@openzeppelin/defender-sdk-base-client': 2.1.0(encoding@0.1.13) - '@openzeppelin/defender-sdk-deploy-client': 2.1.0(debug@4.3.4)(encoding@0.1.13) - '@openzeppelin/defender-sdk-network-client': 2.1.0(debug@4.3.4)(encoding@0.1.13) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) + '@openzeppelin/defender-sdk-base-client': 2.1.0 + '@openzeppelin/defender-sdk-deploy-client': 2.1.0(debug@4.3.7) + '@openzeppelin/defender-sdk-network-client': 2.1.0(debug@4.3.7) '@openzeppelin/upgrades-core': 1.41.0 chalk: 4.1.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) ethereumjs-util: 7.1.5 - ethers: 6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat: 2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10) + ethers: 6.13.2 + hardhat: 2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) proper-lockfile: 4.1.2 - undici: 6.18.2 + undici: 6.19.8 optionalDependencies: - '@nomicfoundation/hardhat-verify': 2.0.9(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.0.10(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) transitivePeerDependencies: - aws-crt - encoding - supports-color - '@openzeppelin/upgrades-core@1.35.1': + '@openzeppelin/upgrades-core@1.37.1': dependencies: - '@nomicfoundation/slang': 0.15.1 - cbor: 9.0.1 + '@nomicfoundation/slang': 0.17.0 + cbor: 9.0.2 chalk: 4.1.2 - compare-versions: 6.1.0 - debug: 4.3.4(supports-color@8.1.1) + compare-versions: 6.1.1 + debug: 4.3.7(supports-color@8.1.1) ethereumjs-util: 7.1.5 + minimatch: 9.0.5 minimist: 1.2.8 proper-lockfile: 4.1.2 - solidity-ast: 0.4.52 + solidity-ast: 0.4.59 transitivePeerDependencies: - supports-color '@openzeppelin/upgrades-core@1.41.0': dependencies: '@nomicfoundation/slang': 0.18.3 - cbor: 9.0.1 + cbor: 9.0.2 chalk: 4.1.2 - compare-versions: 6.1.0 - debug: 4.3.4(supports-color@8.1.1) + compare-versions: 6.1.1 + debug: 4.3.7(supports-color@8.1.1) ethereumjs-util: 7.1.5 minimatch: 9.0.5 minimist: 1.2.8 proper-lockfile: 4.1.2 - solidity-ast: 0.4.52 + solidity-ast: 0.4.59 transitivePeerDependencies: - supports-color '@pkgjs/parseargs@0.11.0': optional: true - '@primitivefi/hardhat-dodoc@0.2.3(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10))(squirrelly@8.0.8)': + '@primitivefi/hardhat-dodoc@0.2.3(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))(squirrelly@8.0.8)': dependencies: - hardhat: 2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10) + hardhat: 2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) squirrelly: 8.0.8 - '@rollup/plugin-commonjs@24.1.0(rollup@4.6.1)': + '@rollup/plugin-commonjs@24.1.0(rollup@4.21.2)': dependencies: - '@rollup/pluginutils': 5.0.5(rollup@4.6.1) + '@rollup/pluginutils': 5.1.0(rollup@4.21.2) commondir: 1.0.1 estree-walker: 2.0.2 glob: 8.1.0 is-reference: 1.2.1 magic-string: 0.27.0 optionalDependencies: - rollup: 4.6.1 + rollup: 4.21.2 - '@rollup/plugin-json@6.0.1(rollup@4.6.1)': + '@rollup/plugin-json@6.1.0(rollup@4.21.2)': dependencies: - '@rollup/pluginutils': 5.0.5(rollup@4.6.1) + '@rollup/pluginutils': 5.1.0(rollup@4.21.2) optionalDependencies: - rollup: 4.6.1 + rollup: 4.21.2 - '@rollup/plugin-node-resolve@15.2.3(rollup@4.6.1)': + '@rollup/plugin-node-resolve@15.2.3(rollup@4.21.2)': dependencies: - '@rollup/pluginutils': 5.0.5(rollup@4.6.1) + '@rollup/pluginutils': 5.1.0(rollup@4.21.2) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-builtin-module: 3.2.1 is-module: 1.0.0 resolve: 1.22.8 optionalDependencies: - rollup: 4.6.1 - - '@rollup/pluginutils@5.0.5(rollup@4.6.1)': - dependencies: - '@types/estree': 1.0.3 - estree-walker: 2.0.2 - picomatch: 2.3.1 - optionalDependencies: - rollup: 4.6.1 + rollup: 4.21.2 - '@rollup/pluginutils@5.1.0(rollup@4.6.1)': + '@rollup/pluginutils@5.1.0(rollup@4.21.2)': dependencies: '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 optionalDependencies: - rollup: 4.6.1 + rollup: 4.21.2 + + '@rollup/rollup-android-arm-eabi@4.21.2': + optional: true + + '@rollup/rollup-android-arm64@4.21.2': + optional: true + + '@rollup/rollup-darwin-arm64@4.21.2': + optional: true - '@rollup/rollup-android-arm-eabi@4.6.1': + '@rollup/rollup-darwin-x64@4.21.2': optional: true - '@rollup/rollup-android-arm64@4.6.1': + '@rollup/rollup-linux-arm-gnueabihf@4.21.2': optional: true - '@rollup/rollup-darwin-arm64@4.6.1': + '@rollup/rollup-linux-arm-musleabihf@4.21.2': optional: true - '@rollup/rollup-darwin-x64@4.6.1': + '@rollup/rollup-linux-arm64-gnu@4.21.2': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.6.1': + '@rollup/rollup-linux-arm64-musl@4.21.2': optional: true - '@rollup/rollup-linux-arm64-gnu@4.6.1': + '@rollup/rollup-linux-powerpc64le-gnu@4.21.2': optional: true - '@rollup/rollup-linux-arm64-musl@4.6.1': + '@rollup/rollup-linux-riscv64-gnu@4.21.2': optional: true - '@rollup/rollup-linux-x64-gnu@4.6.1': + '@rollup/rollup-linux-s390x-gnu@4.21.2': optional: true - '@rollup/rollup-linux-x64-musl@4.6.1': + '@rollup/rollup-linux-x64-gnu@4.21.2': optional: true - '@rollup/rollup-win32-arm64-msvc@4.6.1': + '@rollup/rollup-linux-x64-musl@4.21.2': optional: true - '@rollup/rollup-win32-ia32-msvc@4.6.1': + '@rollup/rollup-win32-arm64-msvc@4.21.2': optional: true - '@rollup/rollup-win32-x64-msvc@4.6.1': + '@rollup/rollup-win32-ia32-msvc@4.21.2': optional: true - '@scure/base@1.1.7': {} + '@rollup/rollup-win32-x64-msvc@4.21.2': + optional: true + + '@scure/base@1.1.8': {} '@scure/bip32@1.1.5': dependencies: '@noble/hashes': 1.2.0 '@noble/secp256k1': 1.7.1 - '@scure/base': 1.1.7 - - '@scure/bip32@1.3.1': - dependencies: - '@noble/curves': 1.1.0 - '@noble/hashes': 1.3.2 - '@scure/base': 1.1.7 + '@scure/base': 1.1.8 '@scure/bip32@1.4.0': dependencies: '@noble/curves': 1.4.0 '@noble/hashes': 1.4.0 - '@scure/base': 1.1.7 + '@scure/base': 1.1.8 '@scure/bip39@1.1.1': dependencies: '@noble/hashes': 1.2.0 - '@scure/base': 1.1.7 - - '@scure/bip39@1.2.1': - dependencies: - '@noble/hashes': 1.3.2 - '@scure/base': 1.1.7 + '@scure/base': 1.1.8 '@scure/bip39@1.3.0': dependencies: '@noble/hashes': 1.4.0 - '@scure/base': 1.1.7 + '@scure/base': 1.1.8 + + '@scure/bip39@1.4.0': + dependencies: + '@noble/hashes': 1.5.0 + '@scure/base': 1.1.8 '@sentry/core@5.30.0': dependencies: @@ -6739,7 +6384,7 @@ snapshots: '@smithy/abort-controller@4.0.1': dependencies: '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/config-resolver@4.0.1': dependencies: @@ -6747,7 +6392,7 @@ snapshots: '@smithy/types': 4.1.0 '@smithy/util-config-provider': 4.0.0 '@smithy/util-middleware': 4.0.1 - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/core@3.1.1': dependencies: @@ -6758,7 +6403,7 @@ snapshots: '@smithy/util-middleware': 4.0.1 '@smithy/util-stream': 4.0.2 '@smithy/util-utf8': 4.0.0 - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/credential-provider-imds@4.0.1': dependencies: @@ -6766,37 +6411,37 @@ snapshots: '@smithy/property-provider': 4.0.1 '@smithy/types': 4.1.0 '@smithy/url-parser': 4.0.1 - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/eventstream-codec@4.0.1': dependencies: '@aws-crypto/crc32': 5.2.0 '@smithy/types': 4.1.0 '@smithy/util-hex-encoding': 4.0.0 - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/eventstream-serde-browser@4.0.1': dependencies: '@smithy/eventstream-serde-universal': 4.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/eventstream-serde-config-resolver@4.0.1': dependencies: '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/eventstream-serde-node@4.0.1': dependencies: '@smithy/eventstream-serde-universal': 4.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/eventstream-serde-universal@4.0.1': dependencies: '@smithy/eventstream-codec': 4.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/fetch-http-handler@5.0.1': dependencies: @@ -6804,33 +6449,33 @@ snapshots: '@smithy/querystring-builder': 4.0.1 '@smithy/types': 4.1.0 '@smithy/util-base64': 4.0.0 - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/hash-node@4.0.1': dependencies: '@smithy/types': 4.1.0 '@smithy/util-buffer-from': 4.0.0 '@smithy/util-utf8': 4.0.0 - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/invalid-dependency@4.0.1': dependencies: '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/is-array-buffer@2.2.0': dependencies: - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/is-array-buffer@4.0.0': dependencies: - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/middleware-content-length@4.0.1': dependencies: '@smithy/protocol-http': 5.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/middleware-endpoint@4.0.2': dependencies: @@ -6841,7 +6486,7 @@ snapshots: '@smithy/types': 4.1.0 '@smithy/url-parser': 4.0.1 '@smithy/util-middleware': 4.0.1 - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/middleware-retry@4.0.3': dependencies: @@ -6852,25 +6497,25 @@ snapshots: '@smithy/types': 4.1.0 '@smithy/util-middleware': 4.0.1 '@smithy/util-retry': 4.0.1 - tslib: 2.6.2 + tslib: 2.7.0 uuid: 9.0.1 '@smithy/middleware-serde@4.0.1': dependencies: '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/middleware-stack@4.0.1': dependencies: '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/node-config-provider@4.0.1': dependencies: '@smithy/property-provider': 4.0.1 '@smithy/shared-ini-file-loader': 4.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/node-http-handler@4.0.2': dependencies: @@ -6878,28 +6523,28 @@ snapshots: '@smithy/protocol-http': 5.0.1 '@smithy/querystring-builder': 4.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/property-provider@4.0.1': dependencies: '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/protocol-http@5.0.1': dependencies: '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/querystring-builder@4.0.1': dependencies: '@smithy/types': 4.1.0 '@smithy/util-uri-escape': 4.0.0 - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/querystring-parser@4.0.1': dependencies: '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/service-error-classification@4.0.1': dependencies: @@ -6908,7 +6553,7 @@ snapshots: '@smithy/shared-ini-file-loader@4.0.1': dependencies: '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/signature-v4@5.0.1': dependencies: @@ -6919,7 +6564,7 @@ snapshots: '@smithy/util-middleware': 4.0.1 '@smithy/util-uri-escape': 4.0.0 '@smithy/util-utf8': 4.0.0 - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/smithy-client@4.1.2': dependencies: @@ -6929,49 +6574,49 @@ snapshots: '@smithy/protocol-http': 5.0.1 '@smithy/types': 4.1.0 '@smithy/util-stream': 4.0.2 - tslib: 2.6.2 + tslib: 2.7.0 - '@smithy/types@2.4.0': + '@smithy/types@3.4.0': dependencies: - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/types@4.1.0': dependencies: - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/url-parser@4.0.1': dependencies: '@smithy/querystring-parser': 4.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/util-base64@4.0.0': dependencies: '@smithy/util-buffer-from': 4.0.0 '@smithy/util-utf8': 4.0.0 - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/util-body-length-browser@4.0.0': dependencies: - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/util-body-length-node@4.0.0': dependencies: - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/util-buffer-from@2.2.0': dependencies: '@smithy/is-array-buffer': 2.2.0 - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/util-buffer-from@4.0.0': dependencies: '@smithy/is-array-buffer': 4.0.0 - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/util-config-provider@4.0.0': dependencies: - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/util-defaults-mode-browser@4.0.3': dependencies: @@ -6979,7 +6624,7 @@ snapshots: '@smithy/smithy-client': 4.1.2 '@smithy/types': 4.1.0 bowser: 2.11.0 - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/util-defaults-mode-node@4.0.3': dependencies: @@ -6989,28 +6634,28 @@ snapshots: '@smithy/property-provider': 4.0.1 '@smithy/smithy-client': 4.1.2 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/util-endpoints@3.0.1': dependencies: '@smithy/node-config-provider': 4.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/util-hex-encoding@4.0.0': dependencies: - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/util-middleware@4.0.1': dependencies: '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/util-retry@4.0.1': dependencies: '@smithy/service-error-classification': 4.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/util-stream@4.0.2': dependencies: @@ -7021,110 +6666,112 @@ snapshots: '@smithy/util-buffer-from': 4.0.0 '@smithy/util-hex-encoding': 4.0.0 '@smithy/util-utf8': 4.0.0 - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/util-uri-escape@4.0.0': dependencies: - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/util-utf8@2.3.0': dependencies: '@smithy/util-buffer-from': 2.2.0 - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/util-utf8@4.0.0': dependencies: '@smithy/util-buffer-from': 4.0.0 - tslib: 2.6.2 + tslib: 2.7.0 '@smithy/util-waiter@4.0.2': dependencies: '@smithy/abort-controller': 4.0.1 '@smithy/types': 4.1.0 - tslib: 2.6.2 + tslib: 2.7.0 '@solidity-parser/parser@0.14.5': dependencies: antlr4ts: 0.5.0-alpha.4 - '@solidity-parser/parser@0.16.1': + '@solidity-parser/parser@0.16.2': dependencies: antlr4ts: 0.5.0-alpha.4 - '@starboardventures/hardhat-verify@1.0.1(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10))': + '@solidity-parser/parser@0.18.0': {} + + '@starboardventures/hardhat-verify@1.0.1(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))': dependencies: fs-extra: 11.2.0 - hardhat: 2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10) + hardhat: 2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) node-fetch: 2.0.0 - '@swc/core-darwin-arm64@1.6.3': + '@swc/core-darwin-arm64@1.7.26': optional: true - '@swc/core-darwin-x64@1.6.3': + '@swc/core-darwin-x64@1.7.26': optional: true - '@swc/core-linux-arm-gnueabihf@1.6.3': + '@swc/core-linux-arm-gnueabihf@1.7.26': optional: true - '@swc/core-linux-arm64-gnu@1.6.3': + '@swc/core-linux-arm64-gnu@1.7.26': optional: true - '@swc/core-linux-arm64-musl@1.6.3': + '@swc/core-linux-arm64-musl@1.7.26': optional: true - '@swc/core-linux-x64-gnu@1.6.3': + '@swc/core-linux-x64-gnu@1.7.26': optional: true - '@swc/core-linux-x64-musl@1.6.3': + '@swc/core-linux-x64-musl@1.7.26': optional: true - '@swc/core-win32-arm64-msvc@1.6.3': + '@swc/core-win32-arm64-msvc@1.7.26': optional: true - '@swc/core-win32-ia32-msvc@1.6.3': + '@swc/core-win32-ia32-msvc@1.7.26': optional: true - '@swc/core-win32-x64-msvc@1.6.3': + '@swc/core-win32-x64-msvc@1.7.26': optional: true - '@swc/core@1.6.3': + '@swc/core@1.7.26': dependencies: '@swc/counter': 0.1.3 - '@swc/types': 0.1.8 + '@swc/types': 0.1.12 optionalDependencies: - '@swc/core-darwin-arm64': 1.6.3 - '@swc/core-darwin-x64': 1.6.3 - '@swc/core-linux-arm-gnueabihf': 1.6.3 - '@swc/core-linux-arm64-gnu': 1.6.3 - '@swc/core-linux-arm64-musl': 1.6.3 - '@swc/core-linux-x64-gnu': 1.6.3 - '@swc/core-linux-x64-musl': 1.6.3 - '@swc/core-win32-arm64-msvc': 1.6.3 - '@swc/core-win32-ia32-msvc': 1.6.3 - '@swc/core-win32-x64-msvc': 1.6.3 + '@swc/core-darwin-arm64': 1.7.26 + '@swc/core-darwin-x64': 1.7.26 + '@swc/core-linux-arm-gnueabihf': 1.7.26 + '@swc/core-linux-arm64-gnu': 1.7.26 + '@swc/core-linux-arm64-musl': 1.7.26 + '@swc/core-linux-x64-gnu': 1.7.26 + '@swc/core-linux-x64-musl': 1.7.26 + '@swc/core-win32-arm64-msvc': 1.7.26 + '@swc/core-win32-ia32-msvc': 1.7.26 + '@swc/core-win32-x64-msvc': 1.7.26 '@swc/counter@0.1.3': {} - '@swc/types@0.1.8': + '@swc/types@0.1.12': dependencies: '@swc/counter': 0.1.3 - '@tenderly/hardhat-tenderly@2.3.0(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)))(@swc/core@1.6.3)(@types/node@18.18.7)(bufferutil@4.0.8)(encoding@0.1.13)(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@tenderly/hardhat-tenderly@2.3.0(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@swc/core@1.7.26)(@types/node@18.19.50)(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))': dependencies: '@ethersproject/bignumber': 5.7.0 - '@nomicfoundation/hardhat-ignition': 0.15.5(@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-verify': 2.0.9(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)) - '@openzeppelin/hardhat-upgrades': 3.9.0(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)))(encoding@0.1.13)(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)) - '@openzeppelin/upgrades-core': 1.35.1 - axios: 1.7.2 - ethers: 6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@nomicfoundation/hardhat-ignition': 0.15.5(@nomicfoundation/hardhat-verify@2.0.10(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) + '@nomicfoundation/hardhat-verify': 2.0.10(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) + '@openzeppelin/hardhat-upgrades': 3.9.0(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(@nomicfoundation/hardhat-verify@2.0.10(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) + '@openzeppelin/upgrades-core': 1.37.1 + axios: 1.7.7(debug@4.3.7) + ethers: 6.13.2 fs-extra: 10.1.0 - hardhat: 2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10) - hardhat-deploy: 0.11.45(bufferutil@4.0.8)(utf-8-validate@5.0.10) - tenderly: 0.9.1(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.4))(typescript@5.5.4) - ts-node: 10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.4) + hardhat: 2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) + hardhat-deploy: 0.11.45 + tenderly: 0.9.1(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) + ts-node: 10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2) tslog: 4.9.3 - typescript: 5.5.4 + typescript: 5.6.2 transitivePeerDependencies: - '@nomicfoundation/hardhat-ethers' - '@swc/core' @@ -7144,14 +6791,14 @@ snapshots: '@babel/parser': 7.18.9 '@babel/traverse': 7.17.3 '@babel/types': 7.17.0 - '@vue/compiler-sfc': 3.3.7 + '@vue/compiler-sfc': 3.5.4 javascript-natural-sort: 0.7.1 lodash: 4.17.21 prettier: 2.8.8 transitivePeerDependencies: - supports-color - '@tsconfig/node10@1.0.9': {} + '@tsconfig/node10@1.0.11': {} '@tsconfig/node12@1.0.11': {} @@ -7159,66 +6806,69 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@typechain/ethers-v6@0.4.3(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.3))(typescript@5.5.3)': + '@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.6.2))(typescript@5.6.2)': dependencies: - ethers: 6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ethers: 6.13.2 lodash: 4.17.21 - ts-essentials: 7.0.3(typescript@5.5.3) - typechain: 8.3.2(typescript@5.5.3) - typescript: 5.5.3 + ts-essentials: 7.0.3(typescript@5.6.2) + typechain: 8.3.2(typescript@5.6.2) + typescript: 5.6.2 - '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.4.3(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.3))(typescript@5.5.3))(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.3))': + '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.6.2))(typescript@5.6.2))(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2))(typechain@8.3.2(typescript@5.6.2))': dependencies: - '@typechain/ethers-v6': 0.4.3(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.3))(typescript@5.5.3) - ethers: 6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@typechain/ethers-v6': 0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.6.2))(typescript@5.6.2) + ethers: 6.13.2 fs-extra: 9.1.0 - hardhat: 2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10) - typechain: 8.3.2(typescript@5.5.3) + hardhat: 2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) + typechain: 8.3.2(typescript@5.6.2) '@types/bn.js@4.11.6': dependencies: - '@types/node': 18.18.7 + '@types/node': 18.19.50 - '@types/bn.js@5.1.3': + '@types/bn.js@5.1.5': dependencies: - '@types/node': 18.18.7 + '@types/node': 18.19.50 - '@types/chai-as-promised@7.1.7': + '@types/chai-as-promised@7.1.8': dependencies: - '@types/chai': 4.3.11 + '@types/chai': 4.3.19 - '@types/chai@4.3.11': {} + '@types/chai@4.3.19': {} '@types/concat-stream@1.6.1': dependencies: - '@types/node': 18.18.7 + '@types/node': 18.19.50 - '@types/estree@1.0.3': {} + '@types/conventional-commits-parser@5.0.0': + dependencies: + '@types/node': 18.19.50 + optional: true '@types/estree@1.0.5': {} '@types/form-data@0.0.33': dependencies: - '@types/node': 18.18.7 + '@types/node': 18.19.50 '@types/glob@7.2.0': dependencies: '@types/minimatch': 5.1.2 - '@types/node': 18.18.7 + '@types/node': 18.19.50 '@types/lru-cache@5.1.1': {} '@types/minimatch@5.1.2': {} - '@types/minimist@1.2.4': {} + '@types/minimist@1.2.5': {} - '@types/mocha@9.1.0': {} + '@types/mocha@10.0.7': {} '@types/node@10.17.60': {} '@types/node@18.15.13': {} - '@types/node@18.18.7': + '@types/node@18.19.50': dependencies: undici-types: 5.26.5 @@ -7226,144 +6876,136 @@ snapshots: '@types/node@8.10.66': {} - '@types/normalize-package-data@2.4.3': {} + '@types/normalize-package-data@2.4.4': {} - '@types/pbkdf2@3.1.1': + '@types/pbkdf2@3.1.2': dependencies: - '@types/node': 18.18.7 + '@types/node': 18.19.50 '@types/prettier@2.7.3': {} - '@types/qs@6.9.9': {} + '@types/qs@6.9.15': {} '@types/resolve@1.20.2': {} - '@types/secp256k1@4.0.5': + '@types/secp256k1@4.0.6': dependencies: - '@types/node': 18.18.7 + '@types/node': 18.19.50 - '@typescript-eslint/eslint-plugin@7.12.0(@typescript-eslint/parser@7.12.0(eslint@8.52.0)(typescript@5.5.3))(eslint@8.52.0)(typescript@5.5.3)': + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2)': dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.12.0(eslint@8.52.0)(typescript@5.5.3) - '@typescript-eslint/scope-manager': 7.12.0 - '@typescript-eslint/type-utils': 7.12.0(eslint@8.52.0)(typescript@5.5.3) - '@typescript-eslint/utils': 7.12.0(eslint@8.52.0)(typescript@5.5.3) - '@typescript-eslint/visitor-keys': 7.12.0 - eslint: 8.52.0 + '@eslint-community/regexpp': 4.11.0 + '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.6.2) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.0)(typescript@5.6.2) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.6.2) + '@typescript-eslint/visitor-keys': 7.18.0 + eslint: 8.57.0 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.5.3) + ts-api-utils: 1.3.0(typescript@5.6.2) optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.12.0(eslint@8.52.0)(typescript@5.5.3)': + '@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.6.2)': dependencies: - '@typescript-eslint/scope-manager': 7.12.0 - '@typescript-eslint/types': 7.12.0 - '@typescript-eslint/typescript-estree': 7.12.0(typescript@5.5.3) - '@typescript-eslint/visitor-keys': 7.12.0 - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.52.0 + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.2) + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.3.7(supports-color@8.1.1) + eslint: 8.57.0 optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@7.12.0': + '@typescript-eslint/scope-manager@7.18.0': dependencies: - '@typescript-eslint/types': 7.12.0 - '@typescript-eslint/visitor-keys': 7.12.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 - '@typescript-eslint/type-utils@7.12.0(eslint@8.52.0)(typescript@5.5.3)': + '@typescript-eslint/type-utils@7.18.0(eslint@8.57.0)(typescript@5.6.2)': dependencies: - '@typescript-eslint/typescript-estree': 7.12.0(typescript@5.5.3) - '@typescript-eslint/utils': 7.12.0(eslint@8.52.0)(typescript@5.5.3) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.52.0 - ts-api-utils: 1.3.0(typescript@5.5.3) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.2) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.6.2) + debug: 4.3.7(supports-color@8.1.1) + eslint: 8.57.0 + ts-api-utils: 1.3.0(typescript@5.6.2) optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@7.12.0': {} + '@typescript-eslint/types@7.18.0': {} - '@typescript-eslint/typescript-estree@7.12.0(typescript@5.5.3)': + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.6.2)': dependencies: - '@typescript-eslint/types': 7.12.0 - '@typescript-eslint/visitor-keys': 7.12.0 - debug: 4.3.4(supports-color@8.1.1) + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.3.7(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 - minimatch: 9.0.4 - semver: 7.6.2 - ts-api-utils: 1.3.0(typescript@5.5.3) + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.6.2) optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.12.0(eslint@8.52.0)(typescript@5.5.3)': + '@typescript-eslint/utils@7.18.0(eslint@8.57.0)(typescript@5.6.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) - '@typescript-eslint/scope-manager': 7.12.0 - '@typescript-eslint/types': 7.12.0 - '@typescript-eslint/typescript-estree': 7.12.0(typescript@5.5.3) - eslint: 8.52.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.2) + eslint: 8.57.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@7.12.0': + '@typescript-eslint/visitor-keys@7.18.0': dependencies: - '@typescript-eslint/types': 7.12.0 + '@typescript-eslint/types': 7.18.0 eslint-visitor-keys: 3.4.3 '@ungap/structured-clone@1.2.0': {} - '@vue/compiler-core@3.3.7': + '@vue/compiler-core@3.5.4': dependencies: - '@babel/parser': 7.23.5 - '@vue/shared': 3.3.7 + '@babel/parser': 7.25.6 + '@vue/shared': 3.5.4 + entities: 4.5.0 estree-walker: 2.0.2 - source-map-js: 1.0.2 + source-map-js: 1.2.1 - '@vue/compiler-dom@3.3.7': + '@vue/compiler-dom@3.5.4': dependencies: - '@vue/compiler-core': 3.3.7 - '@vue/shared': 3.3.7 + '@vue/compiler-core': 3.5.4 + '@vue/shared': 3.5.4 - '@vue/compiler-sfc@3.3.7': + '@vue/compiler-sfc@3.5.4': dependencies: - '@babel/parser': 7.23.5 - '@vue/compiler-core': 3.3.7 - '@vue/compiler-dom': 3.3.7 - '@vue/compiler-ssr': 3.3.7 - '@vue/reactivity-transform': 3.3.7 - '@vue/shared': 3.3.7 + '@babel/parser': 7.25.6 + '@vue/compiler-core': 3.5.4 + '@vue/compiler-dom': 3.5.4 + '@vue/compiler-ssr': 3.5.4 + '@vue/shared': 3.5.4 estree-walker: 2.0.2 - magic-string: 0.30.5 - postcss: 8.4.32 - source-map-js: 1.0.2 - - '@vue/compiler-ssr@3.3.7': - dependencies: - '@vue/compiler-dom': 3.3.7 - '@vue/shared': 3.3.7 + magic-string: 0.30.11 + postcss: 8.4.45 + source-map-js: 1.2.1 - '@vue/reactivity-transform@3.3.7': + '@vue/compiler-ssr@3.5.4': dependencies: - '@babel/parser': 7.23.5 - '@vue/compiler-core': 3.3.7 - '@vue/shared': 3.3.7 - estree-walker: 2.0.2 - magic-string: 0.30.5 + '@vue/compiler-dom': 3.5.4 + '@vue/shared': 3.5.4 - '@vue/shared@3.3.7': {} + '@vue/shared@3.5.4': {} JSONStream@1.3.5: dependencies: @@ -7372,25 +7014,23 @@ snapshots: abbrev@1.0.9: {} - abitype@0.9.8(typescript@5.5.3)(zod@3.23.8): + abitype@0.9.10(typescript@5.6.2): optionalDependencies: - typescript: 5.5.3 - zod: 3.23.8 + typescript: 5.6.2 - abitype@1.0.5(typescript@5.5.3)(zod@3.23.8): + abitype@1.0.5(typescript@5.6.2): optionalDependencies: - typescript: 5.5.3 - zod: 3.23.8 + typescript: 5.6.2 - acorn-jsx@5.3.2(acorn@8.11.3): + acorn-jsx@5.3.2(acorn@8.12.1): dependencies: - acorn: 8.11.3 - - acorn-walk@8.3.2: {} + acorn: 8.12.1 - acorn@8.11.3: {} + acorn-walk@8.3.4: + dependencies: + acorn: 8.12.1 - address@1.2.2: {} + acorn@8.12.1: {} adm-zip@0.4.16: {} @@ -7400,7 +7040,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -7416,19 +7056,19 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ajv@8.12.0: + ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 + fast-uri: 3.0.1 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - uri-js: 4.4.1 - amazon-cognito-identity-js@6.3.6(encoding@0.1.13): + amazon-cognito-identity-js@6.3.12: dependencies: '@aws-crypto/sha256-js': 1.2.2 buffer: 4.9.2 fast-base64-decode: 1.0.0 - isomorphic-unfetch: 3.1.0(encoding@0.1.13) + isomorphic-unfetch: 3.1.0 js-cookie: 2.2.1 transitivePeerDependencies: - encoding @@ -7440,8 +7080,6 @@ snapshots: dependencies: string-width: 4.2.3 - ansi-colors@4.1.1: {} - ansi-colors@4.1.3: {} ansi-escapes@4.3.2: @@ -7456,7 +7094,7 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.0.1: {} + ansi-regex@6.1.0: {} ansi-styles@3.2.1: dependencies: @@ -7468,7 +7106,7 @@ snapshots: ansi-styles@6.2.1: {} - antlr4@4.13.1: {} + antlr4@4.13.2: {} antlr4ts@0.5.0-alpha.4: {} @@ -7489,36 +7127,12 @@ snapshots: array-back@4.0.2: {} - array-buffer-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.4 - array-ify@1.0.0: {} array-union@2.1.0: {} array-uniq@1.0.3: {} - array.prototype.findlast@1.2.3: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 - get-intrinsic: 1.2.4 - - arraybuffer.prototype.slice@1.0.3: - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 - arrify@1.0.1: {} asap@2.0.6: {} @@ -7539,34 +7153,22 @@ snapshots: at-least-node@1.0.0: {} - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.0.0 - - axios@0.21.4(debug@4.3.4): + axios@0.21.4(debug@4.3.7): dependencies: - follow-redirects: 1.15.6(debug@4.3.4) + follow-redirects: 1.15.9(debug@4.3.7) transitivePeerDependencies: - debug axios@0.27.2: dependencies: - follow-redirects: 1.15.6(debug@4.3.4) - form-data: 4.0.0 - transitivePeerDependencies: - - debug - - axios@1.7.2: - dependencies: - follow-redirects: 1.15.6(debug@4.3.4) + follow-redirects: 1.15.9(debug@4.3.7) form-data: 4.0.0 - proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - axios@1.7.9(debug@4.3.4): + axios@1.7.7(debug@4.3.7): dependencies: - follow-redirects: 1.15.6(debug@4.3.4) + follow-redirects: 1.15.9(debug@4.3.7) form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -7574,7 +7176,7 @@ snapshots: balanced-match@1.0.2: {} - base-x@3.0.9: + base-x@3.0.10: dependencies: safe-buffer: 5.2.1 @@ -7582,7 +7184,7 @@ snapshots: bech32@1.1.4: {} - binary-extensions@2.2.0: {} + binary-extensions@2.3.0: {} bl@4.1.0: dependencies: @@ -7620,9 +7222,9 @@ snapshots: dependencies: balanced-match: 1.0.2 - braces@3.0.2: + braces@3.0.3: dependencies: - fill-range: 7.0.1 + fill-range: 7.1.1 brorand@1.1.0: {} @@ -7637,16 +7239,16 @@ snapshots: inherits: 2.0.4 safe-buffer: 5.2.1 - browserslist@4.22.1: + browserslist@4.23.3: dependencies: - caniuse-lite: 1.0.30001554 - electron-to-chromium: 1.4.567 - node-releases: 2.0.13 - update-browserslist-db: 1.0.13(browserslist@4.22.1) + caniuse-lite: 1.0.30001660 + electron-to-chromium: 1.5.19 + node-releases: 2.0.18 + update-browserslist-db: 1.1.0(browserslist@4.23.3) bs58@4.0.1: dependencies: - base-x: 3.0.9 + base-x: 3.0.10 bs58check@2.1.2: dependencies: @@ -7669,11 +7271,6 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - bufferutil@4.0.8: - dependencies: - node-gyp-build: 4.6.1 - optional: true - bufio@1.2.1: {} builtin-modules@3.3.0: {} @@ -7706,7 +7303,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001554: {} + caniuse-lite@1.0.30001660: {} caseless@0.12.0: {} @@ -7714,11 +7311,11 @@ snapshots: dependencies: nofilter: 3.1.0 - cbor@9.0.1: + cbor@9.0.2: dependencies: nofilter: 3.1.0 - chai-as-promised@7.1.1(chai@4.5.0): + chai-as-promised@7.1.2(chai@4.5.0): dependencies: chai: 4.5.0 check-error: 1.0.3 @@ -7727,7 +7324,7 @@ snapshots: dependencies: assertion-error: 1.1.0 check-error: 1.0.3 - deep-eql: 4.1.3 + deep-eql: 4.1.4 get-func-name: 2.0.2 loupe: 2.3.7 pathval: 1.1.1 @@ -7754,22 +7351,10 @@ snapshots: dependencies: get-func-name: 2.0.2 - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - chokidar@3.6.0: dependencies: anymatch: 3.1.3 - braces: 3.0.2 + braces: 3.0.3 glob-parent: 5.1.2 is-binary-path: 2.1.0 is-glob: 4.0.3 @@ -7778,9 +7363,9 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - chokidar@4.0.3: + chokidar@4.0.1: dependencies: - readdirp: 4.1.1 + readdirp: 4.0.2 ci-info@2.0.0: {} @@ -7801,7 +7386,7 @@ snapshots: dependencies: restore-cursor: 4.0.0 - cli-spinners@2.9.1: {} + cli-spinners@2.9.2: {} cli-table3@0.5.1: dependencies: @@ -7810,7 +7395,7 @@ snapshots: optionalDependencies: colors: 1.4.0 - cli-table3@0.6.3: + cli-table3@0.6.5: dependencies: string-width: 4.2.3 optionalDependencies: @@ -7881,10 +7466,10 @@ snapshots: commander@9.5.0: {} - commitizen@4.3.0(typescript@5.5.3): + commitizen@4.3.0(@types/node@18.19.50)(typescript@5.6.2): dependencies: cachedir: 2.3.0 - cz-conventional-changelog: 3.3.0(typescript@5.5.3) + cz-conventional-changelog: 3.3.0(@types/node@18.19.50)(typescript@5.6.2) dedent: 0.7.0 detect-indent: 6.1.0 find-node-modules: 2.1.3 @@ -7898,6 +7483,7 @@ snapshots: strip-bom: 4.0.0 strip-json-comments: 3.1.1 transitivePeerDependencies: + - '@types/node' - typescript commondir@1.0.1: {} @@ -7907,7 +7493,7 @@ snapshots: array-ify: 1.0.0 dot-prop: 5.3.0 - compare-versions@6.1.0: {} + compare-versions@6.1.1: {} concat-map@0.0.1: {} @@ -7941,29 +7527,39 @@ snapshots: core-util-is@1.0.3: {} - cosmiconfig-typescript-loader@4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6(typescript@5.5.3))(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@20.5.1)(typescript@5.5.3))(typescript@5.5.3): + cosmiconfig-typescript-loader@4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6(typescript@5.6.2))(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@20.5.1)(typescript@5.6.2))(typescript@5.6.2): dependencies: '@types/node': 20.5.1 - cosmiconfig: 8.3.6(typescript@5.5.3) - ts-node: 10.9.1(@swc/core@1.6.3)(@types/node@20.5.1)(typescript@5.5.3) - typescript: 5.5.3 + cosmiconfig: 8.3.6(typescript@5.6.2) + ts-node: 10.9.2(@swc/core@1.7.26)(@types/node@20.5.1)(typescript@5.6.2) + typescript: 5.6.2 - cosmiconfig-typescript-loader@5.0.0(@types/node@18.18.7)(cosmiconfig@8.3.6(typescript@5.5.3))(typescript@5.5.3): + cosmiconfig-typescript-loader@5.0.0(@types/node@18.19.50)(cosmiconfig@9.0.0(typescript@5.6.2))(typescript@5.6.2): dependencies: - '@types/node': 18.18.7 - cosmiconfig: 8.3.6(typescript@5.5.3) - jiti: 1.20.0 - typescript: 5.5.3 + '@types/node': 18.19.50 + cosmiconfig: 9.0.0(typescript@5.6.2) + jiti: 1.21.6 + typescript: 5.6.2 optional: true - cosmiconfig@8.3.6(typescript@5.5.3): + cosmiconfig@8.3.6(typescript@5.6.2): dependencies: import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.2 + + cosmiconfig@9.0.0(typescript@5.6.2): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.6.2 + optional: true create-hash@1.2.0: dependencies: @@ -7996,44 +7592,31 @@ snapshots: crypt@0.0.2: {} - cz-conventional-changelog@3.3.0(typescript@5.5.3): + cz-conventional-changelog@3.3.0(@types/node@18.19.50)(typescript@5.6.2): dependencies: chalk: 2.4.2 - commitizen: 4.3.0(typescript@5.5.3) + commitizen: 4.3.0(@types/node@18.19.50)(typescript@5.6.2) conventional-commit-types: 3.0.0 lodash.map: 4.6.0 longest: 2.0.1 word-wrap: 1.2.5 optionalDependencies: - '@commitlint/load': 18.2.0(typescript@5.5.3) + '@commitlint/load': 19.5.0(@types/node@18.19.50)(typescript@5.6.2) transitivePeerDependencies: + - '@types/node' - typescript dargs@7.0.0: {} - data-view-buffer@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - data-view-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - data-view-byte-offset@1.0.0: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - death@1.1.0: {} - debug@4.3.4(supports-color@8.1.1): + debug@4.3.4: dependencies: ms: 2.1.2 + + debug@4.3.7(supports-color@8.1.1): + dependencies: + ms: 2.1.3 optionalDependencies: supports-color: 8.1.1 @@ -8048,7 +7631,7 @@ snapshots: dedent@0.7.0: {} - deep-eql@4.1.3: + deep-eql@4.1.4: dependencies: type-detect: 4.1.0 @@ -8070,12 +7653,6 @@ snapshots: define-lazy-prop@2.0.0: {} - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - delayed-stream@1.0.0: {} delete-empty@3.0.0: @@ -8091,16 +7668,9 @@ snapshots: detect-indent@6.1.0: {} - detect-port@1.5.1: - dependencies: - address: 1.2.2 - debug: 4.3.4(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - diff@4.0.2: {} - diff@5.0.0: {} + diff@5.2.0: {} difflib@0.2.4: dependencies: @@ -8118,11 +7688,11 @@ snapshots: dependencies: is-obj: 2.0.0 - dotenv@16.3.1: {} + dotenv@16.4.5: {} eastasianwidth@0.2.0: {} - electron-to-chromium@1.4.567: {} + electron-to-chromium@1.5.19: {} elliptic@6.5.4: dependencies: @@ -8134,132 +7704,71 @@ snapshots: minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - emoji-regex@8.0.0: {} - - emoji-regex@9.2.2: {} - - encode-utf8@1.0.3: {} - - encoding@0.1.13: + elliptic@6.5.7: dependencies: - iconv-lite: 0.6.3 - optional: true - + bn.js: 4.12.0 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + encode-utf8@1.0.3: {} + enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 strip-ansi: 6.0.1 + entities@4.5.0: {} + env-paths@2.2.1: {} error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - es-abstract@1.23.3: - dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 - es-define-property: 1.0.0 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-set-tostringtag: 2.0.3 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 - globalthis: 1.0.3 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 - is-callable: 1.2.7 - is-data-view: 1.0.1 - is-negative-zero: 2.0.3 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - is-string: 1.0.7 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 - object-inspect: 1.13.1 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.6 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 - es-define-property@1.0.0: dependencies: get-intrinsic: 1.2.4 es-errors@1.3.0: {} - es-module-lexer@1.3.1: {} + es-module-lexer@1.5.4: {} - es-object-atoms@1.0.0: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.0.3: - dependencies: - get-intrinsic: 1.2.4 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - es-shim-unscopables@1.0.2: - dependencies: - hasown: 2.0.2 - - es-to-primitive@1.2.1: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - - esbuild@0.21.5: + esbuild@0.23.1: optionalDependencies: - '@esbuild/aix-ppc64': 0.21.5 - '@esbuild/android-arm': 0.21.5 - '@esbuild/android-arm64': 0.21.5 - '@esbuild/android-x64': 0.21.5 - '@esbuild/darwin-arm64': 0.21.5 - '@esbuild/darwin-x64': 0.21.5 - '@esbuild/freebsd-arm64': 0.21.5 - '@esbuild/freebsd-x64': 0.21.5 - '@esbuild/linux-arm': 0.21.5 - '@esbuild/linux-arm64': 0.21.5 - '@esbuild/linux-ia32': 0.21.5 - '@esbuild/linux-loong64': 0.21.5 - '@esbuild/linux-mips64el': 0.21.5 - '@esbuild/linux-ppc64': 0.21.5 - '@esbuild/linux-riscv64': 0.21.5 - '@esbuild/linux-s390x': 0.21.5 - '@esbuild/linux-x64': 0.21.5 - '@esbuild/netbsd-x64': 0.21.5 - '@esbuild/openbsd-x64': 0.21.5 - '@esbuild/sunos-x64': 0.21.5 - '@esbuild/win32-arm64': 0.21.5 - '@esbuild/win32-ia32': 0.21.5 - '@esbuild/win32-x64': 0.21.5 - - escalade@3.1.1: {} + '@esbuild/aix-ppc64': 0.23.1 + '@esbuild/android-arm': 0.23.1 + '@esbuild/android-arm64': 0.23.1 + '@esbuild/android-x64': 0.23.1 + '@esbuild/darwin-arm64': 0.23.1 + '@esbuild/darwin-x64': 0.23.1 + '@esbuild/freebsd-arm64': 0.23.1 + '@esbuild/freebsd-x64': 0.23.1 + '@esbuild/linux-arm': 0.23.1 + '@esbuild/linux-arm64': 0.23.1 + '@esbuild/linux-ia32': 0.23.1 + '@esbuild/linux-loong64': 0.23.1 + '@esbuild/linux-mips64el': 0.23.1 + '@esbuild/linux-ppc64': 0.23.1 + '@esbuild/linux-riscv64': 0.23.1 + '@esbuild/linux-s390x': 0.23.1 + '@esbuild/linux-x64': 0.23.1 + '@esbuild/netbsd-x64': 0.23.1 + '@esbuild/openbsd-arm64': 0.23.1 + '@esbuild/openbsd-x64': 0.23.1 + '@esbuild/sunos-x64': 0.23.1 + '@esbuild/win32-arm64': 0.23.1 + '@esbuild/win32-ia32': 0.23.1 + '@esbuild/win32-x64': 0.23.1 + + escalade@3.2.0: {} escape-string-regexp@1.0.5: {} @@ -8274,9 +7783,9 @@ snapshots: optionalDependencies: source-map: 0.2.0 - eslint-config-prettier@8.10.0(eslint@8.52.0): + eslint-config-prettier@8.10.0(eslint@8.57.0): dependencies: - eslint: 8.52.0 + eslint: 8.57.0 eslint-scope@7.2.2: dependencies: @@ -8285,34 +7794,34 @@ snapshots: eslint-visitor-keys@3.4.3: {} - eslint@8.52.0: + eslint@8.57.0: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) - '@eslint-community/regexpp': 4.10.0 - '@eslint/eslintrc': 2.1.2 - '@eslint/js': 8.52.0 - '@humanwhocodes/config-array': 0.11.13 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/regexpp': 4.11.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 '@ungap/structured-clone': 1.2.0 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - esquery: 1.5.0 + esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.23.0 + globals: 13.24.0 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -8322,7 +7831,7 @@ snapshots: lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.3 + optionator: 0.9.4 strip-ansi: 6.0.1 text-table: 0.2.0 transitivePeerDependencies: @@ -8330,15 +7839,15 @@ snapshots: espree@9.6.1: dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) eslint-visitor-keys: 3.4.3 esprima@2.7.3: {} esprima@4.0.1: {} - esquery@1.5.0: + esquery@1.6.0: dependencies: estraverse: 5.3.0 @@ -8356,18 +7865,18 @@ snapshots: esutils@2.0.3: {} - eth-gas-reporter@0.2.27(bufferutil@4.0.8)(utf-8-validate@5.0.10): + eth-gas-reporter@0.2.27: dependencies: '@solidity-parser/parser': 0.14.5 - axios: 1.7.9(debug@4.3.4) + axios: 1.7.7(debug@4.3.7) cli-table3: 0.5.1 colors: 1.4.0 ethereum-cryptography: 1.2.0 - ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ethers: 5.7.2 fs-readdir-recursive: 1.1.0 lodash: 4.17.21 markdown-table: 1.1.3 - mocha: 10.2.0 + mocha: 10.7.3 req-cwd: 2.0.0 sha1: 1.1.1 sync-request: 6.1.0 @@ -8376,14 +7885,14 @@ snapshots: - debug - utf-8-validate - ethereum-bloom-filters@1.0.10: + ethereum-bloom-filters@1.2.0: dependencies: - js-sha3: 0.8.0 + '@noble/hashes': 1.5.0 ethereum-cryptography@0.1.3: dependencies: - '@types/pbkdf2': 3.1.1 - '@types/secp256k1': 4.0.5 + '@types/pbkdf2': 3.1.2 + '@types/secp256k1': 4.0.6 blakejs: 1.2.1 browserify-aes: 1.2.0 bs58check: 2.1.2 @@ -8405,12 +7914,12 @@ snapshots: '@scure/bip32': 1.1.5 '@scure/bip39': 1.1.1 - ethereum-cryptography@2.1.2: + ethereum-cryptography@2.2.1: dependencies: - '@noble/curves': 1.1.0 - '@noble/hashes': 1.3.1 - '@scure/bip32': 1.3.1 - '@scure/bip39': 1.2.1 + '@noble/curves': 1.4.2 + '@noble/hashes': 1.4.0 + '@scure/bip32': 1.4.0 + '@scure/bip39': 1.3.0 ethereumjs-abi@0.6.8: dependencies: @@ -8422,20 +7931,20 @@ snapshots: '@types/bn.js': 4.11.6 bn.js: 4.12.0 create-hash: 1.2.0 - elliptic: 6.5.4 + elliptic: 6.5.7 ethereum-cryptography: 0.1.3 ethjs-util: 0.1.6 rlp: 2.2.7 ethereumjs-util@7.1.5: dependencies: - '@types/bn.js': 5.1.3 + '@types/bn.js': 5.1.5 bn.js: 5.2.1 create-hash: 1.2.0 ethereum-cryptography: 0.1.3 rlp: 2.2.7 - ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10): + ethers@5.7.2: dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/abstract-provider': 5.7.0 @@ -8455,7 +7964,7 @@ snapshots: '@ethersproject/networks': 5.7.1 '@ethersproject/pbkdf2': 5.7.0 '@ethersproject/properties': 5.7.0 - '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@ethersproject/providers': 5.7.2 '@ethersproject/random': 5.7.0 '@ethersproject/rlp': 5.7.0 '@ethersproject/sha2': 5.7.0 @@ -8471,7 +7980,7 @@ snapshots: - bufferutil - utf-8-validate - ethers@6.13.1(bufferutil@4.0.8)(utf-8-validate@5.0.10): + ethers@6.13.2: dependencies: '@adraffy/ens-normalize': 1.10.1 '@noble/curves': 1.2.0 @@ -8479,20 +7988,7 @@ snapshots: '@types/node': 18.15.13 aes-js: 4.0.0-beta.5 tslib: 2.4.0 - ws: 8.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): - dependencies: - '@adraffy/ens-normalize': 1.10.0 - '@noble/curves': 1.2.0 - '@noble/hashes': 1.3.2 - '@types/node': 18.15.13 - aes-js: 4.0.0-beta.5 - tslib: 2.4.0 - ws: 8.5.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ws: 8.17.1 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -8533,7 +8029,7 @@ snapshots: human-signals: 4.3.1 is-stream: 3.0.0 merge-stream: 2.0.0 - npm-run-path: 5.1.0 + npm-run-path: 5.3.0 onetime: 6.0.0 signal-exit: 3.0.7 strip-final-newline: 3.0.0 @@ -8560,21 +8056,23 @@ snapshots: '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.5 + micromatch: 4.0.8 fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} + fast-uri@3.0.1: {} + fast-xml-parser@4.4.1: dependencies: strnum: 1.0.5 - fastq@1.15.0: + fastq@1.17.1: dependencies: reusify: 1.0.4 - fdir@6.4.3(picomatch@4.0.2): + fdir@6.4.2(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -8584,9 +8082,9 @@ snapshots: file-entry-cache@6.0.1: dependencies: - flat-cache: 3.1.1 + flat-cache: 3.2.0 - fill-range@7.0.1: + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -8615,32 +8113,28 @@ snapshots: dependencies: detect-file: 1.0.0 is-glob: 4.0.3 - micromatch: 4.0.5 + micromatch: 4.0.8 resolve-dir: 1.0.1 - flat-cache@3.1.1: + flat-cache@3.2.0: dependencies: - flatted: 3.2.9 + flatted: 3.3.1 keyv: 4.5.4 rimraf: 3.0.2 flat@5.0.2: {} - flatted@3.2.9: {} + flatted@3.3.1: {} fmix@0.1.0: dependencies: imul: 1.0.1 - follow-redirects@1.15.6(debug@4.3.4): + follow-redirects@1.15.9(debug@4.3.7): optionalDependencies: - debug: 4.3.4(supports-color@8.1.1) - - for-each@0.3.3: - dependencies: - is-callable: 1.2.7 + debug: 4.3.7(supports-color@8.1.1) - foreground-child@3.1.1: + foreground-child@3.3.0: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 @@ -8663,13 +8157,13 @@ snapshots: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 - universalify: 2.0.0 + universalify: 2.0.1 fs-extra@11.2.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 - universalify: 2.0.0 + universalify: 2.0.1 fs-extra@7.0.1: dependencies: @@ -8688,7 +8182,7 @@ snapshots: at-least-node: 1.0.0 graceful-fs: 4.2.11 jsonfile: 6.1.0 - universalify: 2.0.0 + universalify: 2.0.1 fs-readdir-recursive@1.1.0: {} @@ -8699,15 +8193,6 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.1.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - functions-have-names: 1.2.3 - - functions-have-names@1.2.3: {} - gensync@1.0.0-beta.2: {} get-caller-file@2.0.5: {} @@ -8726,17 +8211,7 @@ snapshots: get-stream@6.0.1: {} - get-symbol-description@1.0.2: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - - get-tsconfig@4.7.2: - dependencies: - resolve-pkg-maps: 1.0.0 - - get-tsconfig@4.7.5: + get-tsconfig@4.8.0: dependencies: resolve-pkg-maps: 1.0.0 @@ -8761,13 +8236,14 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.3.10: + glob@10.4.5: dependencies: - foreground-child: 3.1.1 - jackspeak: 2.3.6 - minimatch: 9.0.4 - minipass: 7.0.4 - path-scurry: 1.10.1 + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 glob@5.0.15: dependencies: @@ -8786,15 +8262,6 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -8812,6 +8279,11 @@ snapshots: minimatch: 5.1.6 once: 1.4.0 + global-directory@4.0.1: + dependencies: + ini: 4.1.1 + optional: true + global-dirs@0.1.1: dependencies: ini: 1.3.8 @@ -8842,14 +8314,10 @@ snapshots: globals@11.12.0: {} - globals@13.23.0: + globals@13.24.0: dependencies: type-fest: 0.20.2 - globalthis@1.0.3: - dependencies: - define-properties: 1.2.1 - globby@10.0.2: dependencies: '@types/glob': 7.2.0 @@ -8857,7 +8325,7 @@ snapshots: dir-glob: 3.0.1 fast-glob: 3.3.2 glob: 7.2.3 - ignore: 5.3.1 + ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 @@ -8866,7 +8334,7 @@ snapshots: array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.3.2 - ignore: 5.3.1 + ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 @@ -8885,17 +8353,17 @@ snapshots: source-map: 0.6.1 wordwrap: 1.0.0 optionalDependencies: - uglify-js: 3.17.4 + uglify-js: 3.19.3 hard-rejection@2.1.0: {} - hardhat-abi-exporter@2.10.1(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)): + hardhat-abi-exporter@2.10.1(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)): dependencies: '@ethersproject/abi': 5.7.0 delete-empty: 3.0.0 - hardhat: 2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10) + hardhat: 2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) - hardhat-deploy@0.11.45(bufferutil@4.0.8)(utf-8-validate@5.0.10): + hardhat-deploy@0.11.45: dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/abstract-signer': 5.7.0 @@ -8904,33 +8372,33 @@ snapshots: '@ethersproject/bytes': 5.7.0 '@ethersproject/constants': 5.7.0 '@ethersproject/contracts': 5.7.0 - '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@ethersproject/providers': 5.7.2 '@ethersproject/solidity': 5.7.0 '@ethersproject/transactions': 5.7.0 '@ethersproject/wallet': 5.7.0 - '@types/qs': 6.9.9 - axios: 0.21.4(debug@4.3.4) + '@types/qs': 6.9.15 + axios: 0.21.4(debug@4.3.7) chalk: 4.1.2 chokidar: 3.6.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) enquirer: 2.4.1 - ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ethers: 5.7.2 form-data: 4.0.0 fs-extra: 10.1.0 match-all: 1.2.6 murmur-128: 0.2.1 - qs: 6.11.2 - zksync-web3: 0.14.4(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + qs: 6.13.0 + zksync-web3: 0.14.4(ethers@5.7.2) transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - hardhat-gas-reporter@1.0.9(bufferutil@4.0.8)(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): + hardhat-gas-reporter@1.0.10(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)): dependencies: array-uniq: 1.0.3 - eth-gas-reporter: 0.2.27(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat: 2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10) + eth-gas-reporter: 0.2.27 + hardhat: 2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) sha1: 1.1.1 transitivePeerDependencies: - '@codechecks/client' @@ -8938,12 +8406,12 @@ snapshots: - debug - utf-8-validate - hardhat-preprocessor@0.1.5(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)): + hardhat-preprocessor@0.1.5(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)): dependencies: - hardhat: 2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10) + hardhat: 2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) murmur-128: 0.2.1 - hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10): + hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2): dependencies: '@ethersproject/abi': 5.7.0 '@metamask/eth-sig-util': 4.0.1 @@ -8951,17 +8419,17 @@ snapshots: '@nomicfoundation/ethereumjs-common': 4.0.4 '@nomicfoundation/ethereumjs-tx': 5.0.4 '@nomicfoundation/ethereumjs-util': 9.0.4 - '@nomicfoundation/solidity-analyzer': 0.1.1 + '@nomicfoundation/solidity-analyzer': 0.1.2 '@sentry/node': 5.30.0 - '@types/bn.js': 5.1.3 + '@types/bn.js': 5.1.5 '@types/lru-cache': 5.1.1 adm-zip: 0.4.16 aggregate-error: 3.1.0 ansi-escapes: 4.3.2 boxen: 5.1.2 - chokidar: 4.0.3 + chokidar: 4.0.1 ci-info: 2.0.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) enquirer: 2.4.1 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 @@ -8969,37 +8437,35 @@ snapshots: find-up: 5.0.0 fp-ts: 1.19.3 fs-extra: 7.0.1 - immutable: 4.3.4 + immutable: 4.3.7 io-ts: 1.10.4 json-stream-stringify: 3.1.6 keccak: 3.0.4 lodash: 4.17.21 mnemonist: 0.38.5 - mocha: 10.2.0 + mocha: 10.7.3 p-map: 4.0.0 - picocolors: 1.1.1 + picocolors: 1.1.0 raw-body: 2.5.2 resolve: 1.17.0 semver: 6.3.1 - solc: 0.8.26(debug@4.3.4) + solc: 0.8.26(debug@4.3.7) source-map-support: 0.5.21 stacktrace-parser: 0.1.10 tinyglobby: 0.2.10 tsort: 0.0.1 undici: 5.28.4 uuid: 8.3.2 - ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ws: 7.5.10 optionalDependencies: - ts-node: 10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3) - typescript: 5.5.3 + ts-node: 10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2) + typescript: 5.6.2 transitivePeerDependencies: - bufferutil - c-kzg - supports-color - utf-8-validate - has-bigints@1.0.2: {} - has-flag@1.0.0: {} has-flag@3.0.0: {} @@ -9014,10 +8480,6 @@ snapshots: has-symbols@1.0.3: {} - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.0.3 - hash-base@3.1.0: dependencies: inherits: 2.0.4 @@ -9075,7 +8537,7 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -9089,24 +8551,22 @@ snapshots: dependencies: safer-buffer: 2.1.2 - iconv-lite@0.6.3: - dependencies: - safer-buffer: 2.1.2 - optional: true - ieee754@1.2.1: {} - ignore@5.3.1: {} + ignore@5.3.2: {} immer@10.0.2: {} - immutable@4.3.4: {} + immutable@4.3.7: {} import-fresh@3.3.0: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 + import-meta-resolve@4.1.0: + optional: true + imul@1.0.1: {} imurmurhash@0.1.4: {} @@ -9122,6 +8582,9 @@ snapshots: ini@1.3.8: {} + ini@4.1.1: + optional: true + inquirer@8.2.5: dependencies: ansi-escapes: 4.3.2 @@ -9140,56 +8603,26 @@ snapshots: through: 2.3.8 wrap-ansi: 7.0.0 - internal-slot@1.0.7: - dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.0.4 - interpret@1.4.0: {} io-ts@1.10.4: dependencies: fp-ts: 1.19.3 - is-array-buffer@3.0.4: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - is-arrayish@0.2.1: {} - is-bigint@1.0.4: - dependencies: - has-bigints: 1.0.2 - is-binary-path@2.1.0: dependencies: - binary-extensions: 2.2.0 - - is-boolean-object@1.1.2: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 + binary-extensions: 2.3.0 is-builtin-module@3.2.1: dependencies: builtin-modules: 3.3.0 - is-callable@1.2.7: {} - - is-core-module@2.13.1: + is-core-module@2.15.1: dependencies: hasown: 2.0.2 - is-data-view@1.0.1: - dependencies: - is-typed-array: 1.1.13 - - is-date-object@1.0.5: - dependencies: - has-tostringtag: 1.0.2 - is-docker@2.2.1: {} is-extglob@2.1.1: {} @@ -9210,12 +8643,6 @@ snapshots: is-module@1.0.0: {} - is-negative-zero@2.0.3: {} - - is-number-object@1.0.7: - dependencies: - has-tostringtag: 1.0.2 - is-number@7.0.0: {} is-obj@2.0.0: {} @@ -9228,45 +8655,20 @@ snapshots: is-reference@1.2.1: dependencies: - '@types/estree': 1.0.3 - - is-regex@1.1.4: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - - is-shared-array-buffer@1.0.3: - dependencies: - call-bind: 1.0.7 + '@types/estree': 1.0.5 is-stream@2.0.1: {} is-stream@3.0.0: {} - is-string@1.0.7: - dependencies: - has-tostringtag: 1.0.2 - - is-symbol@1.0.4: - dependencies: - has-symbols: 1.0.3 - is-text-path@1.0.1: dependencies: text-extensions: 1.9.0 - is-typed-array@1.1.13: - dependencies: - which-typed-array: 1.1.15 - is-unicode-supported@0.1.0: {} is-utf8@0.2.1: {} - is-weakref@1.0.2: - dependencies: - call-bind: 1.0.7 - is-windows@1.0.2: {} is-wsl@2.2.0: @@ -9275,22 +8677,20 @@ snapshots: isarray@1.0.0: {} - isarray@2.0.5: {} - isexe@2.0.0: {} - isomorphic-unfetch@3.1.0(encoding@0.1.13): + isomorphic-unfetch@3.1.0: dependencies: - node-fetch: 2.7.0(encoding@0.1.13) + node-fetch: 2.7.0 unfetch: 4.2.0 transitivePeerDependencies: - encoding - isows@1.0.4(ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)): + isows@1.0.4(ws@8.17.1): dependencies: - ws: 8.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ws: 8.17.1 - jackspeak@2.3.6: + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: @@ -9298,7 +8698,7 @@ snapshots: javascript-natural-sort@0.7.1: {} - jiti@1.20.0: + jiti@1.21.6: optional: true js-cookie@2.2.1: {} @@ -9342,7 +8742,7 @@ snapshots: jsonfile@6.1.0: dependencies: - universalify: 2.0.0 + universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 @@ -9353,7 +8753,7 @@ snapshots: keccak@3.0.4: dependencies: node-addon-api: 2.0.2 - node-gyp-build: 4.6.1 + node-gyp-build: 4.8.2 readable-stream: 3.6.2 keyv@4.5.4: @@ -9382,7 +8782,7 @@ snapshots: dependencies: chalk: 5.3.0 commander: 11.0.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 execa: 7.2.0 lilconfig: 2.1.0 listr2: 6.6.1(enquirer@2.4.1) @@ -9400,7 +8800,7 @@ snapshots: colorette: 2.0.20 eventemitter3: 5.0.1 log-update: 5.0.1 - rfdc: 1.3.0 + rfdc: 1.4.1 wrap-ansi: 8.1.0 optionalDependencies: enquirer: 2.4.1 @@ -9471,7 +8871,7 @@ snapshots: dependencies: get-func-name: 2.0.2 - lru-cache@10.1.0: {} + lru-cache@10.4.3: {} lru-cache@5.1.1: dependencies: @@ -9489,15 +8889,11 @@ snapshots: magic-string@0.27.0: dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - - magic-string@0.30.10: - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 - magic-string@0.30.5: + magic-string@0.30.11: dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 make-error@1.3.6: {} @@ -9519,7 +8915,7 @@ snapshots: meow@8.1.2: dependencies: - '@types/minimist': 1.2.4 + '@types/minimist': 1.2.5 camelcase-keys: 6.2.2 decamelize-keys: 1.1.1 hard-rejection: 2.1.0 @@ -9541,7 +8937,12 @@ snapshots: micromatch@4.0.5: dependencies: - braces: 3.0.2 + braces: 3.0.3 + picomatch: 2.3.1 + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 picomatch: 2.3.1 mime-db@1.52.0: {} @@ -9564,18 +8965,10 @@ snapshots: dependencies: brace-expansion: 1.1.11 - minimatch@5.0.1: - dependencies: - brace-expansion: 2.0.1 - minimatch@5.1.6: dependencies: brace-expansion: 2.0.1 - minimatch@9.0.4: - dependencies: - brace-expansion: 2.0.1 - minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 @@ -9590,7 +8983,7 @@ snapshots: minimist@1.2.8: {} - minipass@7.0.4: {} + minipass@7.1.2: {} mkdirp@0.5.6: dependencies: @@ -9602,28 +8995,27 @@ snapshots: dependencies: obliterator: 2.0.4 - mocha@10.2.0: + mocha@10.7.3: dependencies: - ansi-colors: 4.1.1 + ansi-colors: 4.1.3 browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.4(supports-color@8.1.1) - diff: 5.0.0 + chokidar: 3.6.0 + debug: 4.3.7(supports-color@8.1.1) + diff: 5.2.0 escape-string-regexp: 4.0.0 find-up: 5.0.0 - glob: 7.2.0 + glob: 8.1.0 he: 1.2.0 js-yaml: 4.1.0 log-symbols: 4.1.0 - minimatch: 5.0.1 + minimatch: 5.1.6 ms: 2.1.3 - nanoid: 3.3.3 - serialize-javascript: 6.0.0 + serialize-javascript: 6.0.2 strip-json-comments: 3.1.1 supports-color: 8.1.1 - workerpool: 6.2.1 + workerpool: 6.5.1 yargs: 16.2.0 - yargs-parser: 20.2.4 + yargs-parser: 20.2.9 yargs-unparser: 2.0.0 ms@2.1.2: {} @@ -9638,8 +9030,6 @@ snapshots: mute-stream@0.0.8: {} - nanoid@3.3.3: {} - nanoid@3.3.7: {} natural-compare@1.4.0: {} @@ -9662,15 +9052,13 @@ snapshots: node-fetch@2.0.0: {} - node-fetch@2.7.0(encoding@0.1.13): + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 - optionalDependencies: - encoding: 0.1.13 - node-gyp-build@4.6.1: {} + node-gyp-build@4.8.2: {} - node-releases@2.0.13: {} + node-releases@2.0.18: {} nofilter@3.1.0: {} @@ -9688,8 +9076,8 @@ snapshots: normalize-package-data@3.0.3: dependencies: hosted-git-info: 4.1.0 - is-core-module: 2.13.1 - semver: 7.6.2 + is-core-module: 2.15.1 + semver: 7.6.3 validate-npm-package-license: 3.0.4 normalize-path@3.0.0: {} @@ -9698,7 +9086,7 @@ snapshots: dependencies: path-key: 3.1.1 - npm-run-path@5.1.0: + npm-run-path@5.3.0: dependencies: path-key: 4.0.0 @@ -9709,16 +9097,7 @@ snapshots: object-assign@4.1.1: {} - object-inspect@1.13.1: {} - - object-keys@1.1.1: {} - - object.assign@4.1.5: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - has-symbols: 1.0.3 - object-keys: 1.1.1 + object-inspect@1.13.2: {} obliterator@2.0.4: {} @@ -9749,21 +9128,21 @@ snapshots: type-check: 0.3.2 word-wrap: 1.2.5 - optionator@0.9.3: + optionator@0.9.4: dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 + word-wrap: 1.2.5 ora@5.4.1: dependencies: bl: 4.1.0 chalk: 4.1.2 cli-cursor: 3.1.0 - cli-spinners: 2.9.1 + cli-spinners: 2.9.2 is-interactive: 1.0.0 is-unicode-supported: 0.1.0 log-symbols: 4.1.0 @@ -9796,6 +9175,8 @@ snapshots: p-try@2.2.0: {} + package-json-from-dist@1.0.0: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -9809,7 +9190,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.23.5 + '@babel/code-frame': 7.24.7 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -9826,10 +9207,10 @@ snapshots: path-parse@1.0.7: {} - path-scurry@1.10.1: + path-scurry@1.11.1: dependencies: - lru-cache: 10.1.0 - minipass: 7.0.4 + lru-cache: 10.4.3 + minipass: 7.1.2 path-starts-with@2.0.1: {} @@ -9849,9 +9230,7 @@ snapshots: safe-buffer: 5.2.1 sha.js: 2.4.11 - picocolors@1.0.0: {} - - picocolors@1.1.1: {} + picocolors@1.1.0: {} picomatch@2.3.1: {} @@ -9865,13 +9244,11 @@ snapshots: pluralize@8.0.0: {} - possible-typed-array-names@1.0.0: {} - - postcss@8.4.32: + postcss@8.4.45: dependencies: nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.0.2 + picocolors: 1.1.0 + source-map-js: 1.2.1 prelude-ls@1.1.2: {} @@ -9881,12 +9258,11 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier-plugin-solidity@1.1.3(prettier@2.8.8): + prettier-plugin-solidity@1.4.1(prettier@2.8.8): dependencies: - '@solidity-parser/parser': 0.16.1 + '@solidity-parser/parser': 0.18.0 prettier: 2.8.8 - semver: 7.6.2 - solidity-comments-extractor: 0.0.7 + semver: 7.6.3 prettier@2.8.8: {} @@ -9909,11 +9285,11 @@ snapshots: proxy-from-env@1.1.0: {} - punycode@2.3.0: {} + punycode@2.3.1: {} - qs@6.11.2: + qs@6.13.0: dependencies: - side-channel: 1.0.4 + side-channel: 1.0.6 queue-microtask@1.2.3: {} @@ -9944,7 +9320,7 @@ snapshots: read-pkg@5.2.0: dependencies: - '@types/normalize-package-data': 2.4.3 + '@types/normalize-package-data': 2.4.4 normalize-package-data: 2.5.0 parse-json: 5.2.0 type-fest: 0.6.0 @@ -9969,7 +9345,7 @@ snapshots: dependencies: picomatch: 2.3.1 - readdirp@4.1.1: {} + readdirp@4.0.2: {} rechoir@0.6.2: dependencies: @@ -9986,13 +9362,6 @@ snapshots: reduce-flatten@2.0.0: {} - regexp.prototype.flags@1.5.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-errors: 1.3.0 - set-function-name: 2.0.2 - req-cwd@2.0.0: dependencies: req-from: 2.0.0 @@ -10030,7 +9399,7 @@ snapshots: resolve@1.22.8: dependencies: - is-core-module: 2.13.1 + is-core-module: 2.15.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -10050,7 +9419,7 @@ snapshots: reusify@1.0.4: {} - rfdc@1.3.0: {} + rfdc@1.4.1: {} rimraf@2.7.1: dependencies: @@ -10060,9 +9429,9 @@ snapshots: dependencies: glob: 7.2.3 - rimraf@5.0.5: + rimraf@5.0.10: dependencies: - glob: 10.3.10 + glob: 10.4.5 ripemd160@2.0.2: dependencies: @@ -10073,30 +9442,30 @@ snapshots: dependencies: bn.js: 5.2.1 - rollup-plugin-auto-external@2.0.0(rollup@4.6.1): + rollup-plugin-auto-external@2.0.0(rollup@4.21.2): dependencies: builtins: 2.0.1 read-pkg: 3.0.0 - rollup: 4.6.1 + rollup: 4.21.2 safe-resolve: 1.0.0 semver: 5.7.2 - rollup-plugin-dts@6.1.1(rollup@4.6.1)(typescript@5.5.3): + rollup-plugin-dts@6.1.1(rollup@4.21.2)(typescript@5.6.2): dependencies: - magic-string: 0.30.10 - rollup: 4.6.1 - typescript: 5.5.3 + magic-string: 0.30.11 + rollup: 4.21.2 + typescript: 5.6.2 optionalDependencies: '@babel/code-frame': 7.24.7 - rollup-plugin-esbuild@6.1.0(esbuild@0.21.5)(rollup@4.6.1): + rollup-plugin-esbuild@6.1.1(esbuild@0.23.1)(rollup@4.21.2): dependencies: - '@rollup/pluginutils': 5.0.5(rollup@4.6.1) - debug: 4.3.4(supports-color@8.1.1) - es-module-lexer: 1.3.1 - esbuild: 0.21.5 - get-tsconfig: 4.7.2 - rollup: 4.6.1 + '@rollup/pluginutils': 5.1.0(rollup@4.21.2) + debug: 4.3.7(supports-color@8.1.1) + es-module-lexer: 1.5.4 + esbuild: 0.23.1 + get-tsconfig: 4.8.0 + rollup: 4.21.2 transitivePeerDependencies: - supports-color @@ -10110,38 +9479,44 @@ snapshots: dependencies: rollup-plugin-inject: 3.0.2 - rollup-plugin-swc3@0.11.2(@swc/core@1.6.3)(rollup@4.6.1): + rollup-plugin-swc3@0.11.2(@swc/core@1.7.26)(rollup@4.21.2): dependencies: '@fastify/deepmerge': 1.3.0 - '@rollup/pluginutils': 5.1.0(rollup@4.6.1) - '@swc/core': 1.6.3 - get-tsconfig: 4.7.5 - rollup: 4.6.1 - rollup-preserve-directives: 1.1.1(rollup@4.6.1) + '@rollup/pluginutils': 5.1.0(rollup@4.21.2) + '@swc/core': 1.7.26 + get-tsconfig: 4.8.0 + rollup: 4.21.2 + rollup-preserve-directives: 1.1.1(rollup@4.21.2) rollup-pluginutils@2.8.2: dependencies: estree-walker: 0.6.1 - rollup-preserve-directives@1.1.1(rollup@4.6.1): + rollup-preserve-directives@1.1.1(rollup@4.21.2): dependencies: - magic-string: 0.30.10 - rollup: 4.6.1 + magic-string: 0.30.11 + rollup: 4.21.2 - rollup@4.6.1: + rollup@4.21.2: + dependencies: + '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.6.1 - '@rollup/rollup-android-arm64': 4.6.1 - '@rollup/rollup-darwin-arm64': 4.6.1 - '@rollup/rollup-darwin-x64': 4.6.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.6.1 - '@rollup/rollup-linux-arm64-gnu': 4.6.1 - '@rollup/rollup-linux-arm64-musl': 4.6.1 - '@rollup/rollup-linux-x64-gnu': 4.6.1 - '@rollup/rollup-linux-x64-musl': 4.6.1 - '@rollup/rollup-win32-arm64-msvc': 4.6.1 - '@rollup/rollup-win32-ia32-msvc': 4.6.1 - '@rollup/rollup-win32-x64-msvc': 4.6.1 + '@rollup/rollup-android-arm-eabi': 4.21.2 + '@rollup/rollup-android-arm64': 4.21.2 + '@rollup/rollup-darwin-arm64': 4.21.2 + '@rollup/rollup-darwin-x64': 4.21.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.21.2 + '@rollup/rollup-linux-arm-musleabihf': 4.21.2 + '@rollup/rollup-linux-arm64-gnu': 4.21.2 + '@rollup/rollup-linux-arm64-musl': 4.21.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.21.2 + '@rollup/rollup-linux-riscv64-gnu': 4.21.2 + '@rollup/rollup-linux-s390x-gnu': 4.21.2 + '@rollup/rollup-linux-x64-gnu': 4.21.2 + '@rollup/rollup-linux-x64-musl': 4.21.2 + '@rollup/rollup-win32-arm64-msvc': 4.21.2 + '@rollup/rollup-win32-ia32-msvc': 4.21.2 + '@rollup/rollup-win32-x64-msvc': 4.21.2 fsevents: 2.3.3 run-async@2.4.1: {} @@ -10152,25 +9527,12 @@ snapshots: rxjs@7.8.1: dependencies: - tslib: 2.6.2 - - safe-array-concat@1.1.2: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - isarray: 2.0.5 + tslib: 2.7.0 safe-buffer@5.1.2: {} safe-buffer@5.2.1: {} - safe-regex-test@1.0.3: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-regex: 1.1.4 - safe-resolve@1.0.0: {} safer-buffer@2.1.2: {} @@ -10196,9 +9558,9 @@ snapshots: secp256k1@4.0.3: dependencies: - elliptic: 6.5.4 + elliptic: 6.5.7 node-addon-api: 2.0.2 - node-gyp-build: 4.6.1 + node-gyp-build: 4.8.2 semver@5.7.2: {} @@ -10208,9 +9570,9 @@ snapshots: dependencies: lru-cache: 6.0.0 - semver@7.6.2: {} + semver@7.6.3: {} - serialize-javascript@6.0.0: + serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 @@ -10223,13 +9585,6 @@ snapshots: gopd: 1.0.1 has-property-descriptors: 1.0.2 - set-function-name@2.0.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 - setimmediate@1.0.5: {} setprototypeof@1.2.0: {} @@ -10261,11 +9616,12 @@ snapshots: minimist: 1.2.8 shelljs: 0.8.5 - side-channel@1.0.4: + side-channel@1.0.6: dependencies: call-bind: 1.0.7 + es-errors: 1.3.0 get-intrinsic: 1.2.4 - object-inspect: 1.13.1 + object-inspect: 1.13.2 signal-exit@3.0.7: {} @@ -10286,11 +9642,11 @@ snapshots: ansi-styles: 6.2.1 is-fullwidth-code-point: 4.0.0 - solc@0.8.26(debug@4.3.4): + solc@0.8.26(debug@4.3.7): dependencies: command-exists: 1.2.9 commander: 8.3.0 - follow-redirects: 1.15.6(debug@4.3.4) + follow-redirects: 1.15.9(debug@4.3.7) js-sha3: 0.8.0 memorystream: 0.3.1 semver: 5.7.2 @@ -10298,71 +9654,64 @@ snapshots: transitivePeerDependencies: - debug - solhint-plugin-prettier@0.0.5(prettier-plugin-solidity@1.1.3(prettier@2.8.8))(prettier@2.8.8): + solhint-plugin-prettier@0.0.5(prettier-plugin-solidity@1.4.1(prettier@2.8.8))(prettier@2.8.8): dependencies: prettier: 2.8.8 prettier-linter-helpers: 1.0.0 - prettier-plugin-solidity: 1.1.3(prettier@2.8.8) + prettier-plugin-solidity: 1.4.1(prettier@2.8.8) - solhint@3.6.2(typescript@5.5.3): + solhint@3.6.2(typescript@5.6.2): dependencies: - '@solidity-parser/parser': 0.16.1 + '@solidity-parser/parser': 0.16.2 ajv: 6.12.6 - antlr4: 4.13.1 + antlr4: 4.13.2 ast-parents: 0.0.1 chalk: 4.1.2 commander: 10.0.1 - cosmiconfig: 8.3.6(typescript@5.5.3) + cosmiconfig: 8.3.6(typescript@5.6.2) fast-diff: 1.3.0 glob: 8.1.0 - ignore: 5.3.1 + ignore: 5.3.2 js-yaml: 4.1.0 lodash: 4.17.21 pluralize: 8.0.0 - semver: 7.6.2 + semver: 7.6.3 strip-ansi: 6.0.1 - table: 6.8.1 + table: 6.8.2 text-table: 0.2.0 optionalDependencies: prettier: 2.8.8 transitivePeerDependencies: - typescript - solidity-ast@0.4.52: - dependencies: - array.prototype.findlast: 1.2.3 - - solidity-comments-extractor@0.0.7: {} + solidity-ast@0.4.59: {} - solidity-coverage@0.8.5(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)): + solidity-coverage@0.8.13(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)): dependencies: '@ethersproject/abi': 5.7.0 - '@solidity-parser/parser': 0.16.1 + '@solidity-parser/parser': 0.18.0 chalk: 2.4.2 death: 1.1.0 - detect-port: 1.5.1 difflib: 0.2.4 fs-extra: 8.1.0 ghost-testrpc: 0.0.2 global-modules: 2.0.0 globby: 10.0.2 - hardhat: 2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10) + hardhat: 2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) jsonschema: 1.4.1 lodash: 4.17.21 - mocha: 10.2.0 + mocha: 10.7.3 node-emoji: 1.11.0 pify: 4.0.1 recursive-readdir: 2.2.3 sc-istanbul: 0.4.6 - semver: 7.6.2 + semver: 7.6.3 shelljs: 0.8.5 - web3-utils: 1.10.3 - transitivePeerDependencies: - - supports-color + web3-utils: 1.10.4 solmate@6.2.0: {} - source-map-js@1.0.2: {} + source-map-js@1.2.1: {} source-map-support@0.5.21: dependencies: @@ -10383,16 +9732,16 @@ snapshots: spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.16 + spdx-license-ids: 3.0.20 - spdx-exceptions@2.3.0: {} + spdx-exceptions@2.5.0: {} spdx-expression-parse@3.0.1: dependencies: - spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.16 + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.20 - spdx-license-ids@3.0.16: {} + spdx-license-ids@3.0.20: {} split2@3.2.2: dependencies: @@ -10429,25 +9778,6 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - string.prototype.trim@1.2.9: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - - string.prototype.trimend@1.0.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - - string.prototype.trimstart@1.0.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 @@ -10466,7 +9796,7 @@ snapshots: strip-ansi@7.1.0: dependencies: - ansi-regex: 6.0.1 + ansi-regex: 6.1.0 strip-bom@3.0.0: {} @@ -10523,26 +9853,26 @@ snapshots: typical: 5.2.0 wordwrapjs: 4.0.1 - table@6.8.1: + table@6.8.2: dependencies: - ajv: 8.12.0 + ajv: 8.17.1 lodash.truncate: 4.4.2 slice-ansi: 4.0.0 string-width: 4.2.3 strip-ansi: 6.0.1 - tenderly@0.9.1(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.4))(typescript@5.5.4): + tenderly@0.9.1(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2): dependencies: axios: 0.27.2 - cli-table3: 0.6.3 + cli-table3: 0.6.5 commander: 9.5.0 js-yaml: 4.1.0 open: 8.4.2 prompts: 2.4.2 tslog: 4.9.3 optionalDependencies: - ts-node: 10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.4) - typescript: 5.5.4 + ts-node: 10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2) + typescript: 5.6.2 transitivePeerDependencies: - debug @@ -10555,14 +9885,14 @@ snapshots: '@types/concat-stream': 1.6.1 '@types/form-data': 0.0.33 '@types/node': 8.10.66 - '@types/qs': 6.9.9 + '@types/qs': 6.9.15 caseless: 0.12.0 concat-stream: 1.6.2 form-data: 2.5.1 http-basic: 8.1.3 http-response-object: 3.0.2 promise: 8.3.0 - qs: 6.11.2 + qs: 6.13.0 through2@4.0.2: dependencies: @@ -10572,7 +9902,7 @@ snapshots: tinyglobby@0.2.10: dependencies: - fdir: 6.4.3(picomatch@4.0.2) + fdir: 6.4.2(picomatch@4.0.2) picomatch: 4.0.2 tmp@0.0.33: @@ -10591,9 +9921,9 @@ snapshots: trim-newlines@3.0.1: {} - ts-api-utils@1.3.0(typescript@5.5.3): + ts-api-utils@1.3.0(typescript@5.6.2): dependencies: - typescript: 5.5.3 + typescript: 5.6.2 ts-command-line-args@2.5.1: dependencies: @@ -10602,107 +9932,60 @@ snapshots: command-line-usage: 6.1.3 string-format: 2.0.0 - ts-essentials@7.0.3(typescript@5.5.3): - dependencies: - typescript: 5.5.3 - - ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3): + ts-essentials@7.0.3(typescript@5.6.2): dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 18.18.7 - acorn: 8.11.3 - acorn-walk: 8.3.2 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.5.3 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - optionalDependencies: - '@swc/core': 1.6.3 + typescript: 5.6.2 - ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.4): + ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2): dependencies: '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 + '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 18.18.7 - acorn: 8.11.3 - acorn-walk: 8.3.2 + '@types/node': 18.19.50 + acorn: 8.12.1 + acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.5.4 + typescript: 5.6.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.6.3 + '@swc/core': 1.7.26 - ts-node@10.9.1(@swc/core@1.6.3)(@types/node@20.5.1)(typescript@5.5.3): + ts-node@10.9.2(@swc/core@1.7.26)(@types/node@20.5.1)(typescript@5.6.2): dependencies: '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 + '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 '@types/node': 20.5.1 - acorn: 8.11.3 - acorn-walk: 8.3.2 + acorn: 8.12.1 + acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.5.3 + typescript: 5.6.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.6.3 + '@swc/core': 1.7.26 tslib@1.14.1: {} tslib@2.4.0: {} - tslib@2.6.2: {} + tslib@2.7.0: {} tslog@4.9.3: {} tsort@0.0.1: {} - turbo-darwin-64@2.0.3: - optional: true - - turbo-darwin-arm64@2.0.3: - optional: true - - turbo-linux-64@2.0.3: - optional: true - - turbo-linux-arm64@2.0.3: - optional: true - - turbo-windows-64@2.0.3: - optional: true - - turbo-windows-arm64@2.0.3: - optional: true - - turbo@2.0.3: - optionalDependencies: - turbo-darwin-64: 2.0.3 - turbo-darwin-arm64: 2.0.3 - turbo-linux-64: 2.0.3 - turbo-linux-arm64: 2.0.3 - turbo-windows-64: 2.0.3 - turbo-windows-arm64: 2.0.3 - tweetnacl-util@0.15.1: {} tweetnacl@1.0.3: {} @@ -10731,10 +10014,10 @@ snapshots: type-fest@1.4.0: {} - typechain@8.3.2(typescript@5.5.3): + typechain@8.3.2(typescript@5.6.2): dependencies: '@types/prettier': 2.7.3 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) fs-extra: 7.0.1 glob: 7.1.7 js-sha3: 0.8.0 @@ -10742,93 +10025,47 @@ snapshots: mkdirp: 1.0.4 prettier: 2.8.8 ts-command-line-args: 2.5.1 - ts-essentials: 7.0.3(typescript@5.5.3) - typescript: 5.5.3 + ts-essentials: 7.0.3(typescript@5.6.2) + typescript: 5.6.2 transitivePeerDependencies: - supports-color - typed-array-buffer@1.0.2: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-typed-array: 1.1.13 - - typed-array-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - - typed-array-byte-offset@1.0.2: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - - typed-array-length@1.0.6: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - possible-typed-array-names: 1.0.0 - typedarray@0.0.6: {} - typescript@5.5.3: {} - - typescript@5.5.4: {} + typescript@5.6.2: {} typical@4.0.0: {} typical@5.2.0: {} - uglify-js@3.17.4: + uglify-js@3.19.3: optional: true - unbox-primitive@1.0.2: - dependencies: - call-bind: 1.0.7 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 - undici-types@5.26.5: {} undici@5.28.4: dependencies: - '@fastify/busboy': 2.0.0 + '@fastify/busboy': 2.1.1 - undici@6.18.2: {} + undici@6.19.8: {} unfetch@4.2.0: {} universalify@0.1.2: {} - universalify@2.0.0: {} + universalify@2.0.1: {} unpipe@1.0.0: {} - update-browserslist-db@1.0.13(browserslist@4.22.1): + update-browserslist-db@1.1.0(browserslist@4.23.3): dependencies: - browserslist: 4.22.1 - escalade: 3.1.1 - picocolors: 1.0.0 + browserslist: 4.23.3 + escalade: 3.2.0 + picocolors: 1.1.0 uri-js@4.4.1: dependencies: - punycode: 2.3.0 - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.6.1 - optional: true + punycode: 2.3.1 utf8@3.0.0: {} @@ -10845,19 +10082,19 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - viem@2.19.7(bufferutil@4.0.8)(typescript@5.5.3)(utf-8-validate@5.0.10)(zod@3.23.8): + viem@2.21.5(typescript@5.6.2): dependencies: '@adraffy/ens-normalize': 1.10.0 '@noble/curves': 1.4.0 '@noble/hashes': 1.4.0 '@scure/bip32': 1.4.0 - '@scure/bip39': 1.3.0 - abitype: 1.0.5(typescript@5.5.3)(zod@3.23.8) - isows: 1.0.4(ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@scure/bip39': 1.4.0 + abitype: 1.0.5(typescript@5.6.2) + isows: 1.0.4(ws@8.17.1) webauthn-p256: 0.0.5 - ws: 8.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ws: 8.17.1 optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.2 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -10867,12 +10104,12 @@ snapshots: dependencies: defaults: 1.0.4 - web3-utils@1.10.3: + web3-utils@1.10.4: dependencies: '@ethereumjs/util': 8.1.0 bn.js: 5.2.1 - ethereum-bloom-filters: 1.0.10 - ethereum-cryptography: 2.1.2 + ethereum-bloom-filters: 1.2.0 + ethereum-cryptography: 2.2.1 ethjs-unit: 0.1.6 number-to-bn: 1.7.0 randombytes: 2.1.0 @@ -10890,22 +10127,6 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 - which-boxed-primitive@1.0.2: - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - - which-typed-array@1.1.15: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.2 - which@1.3.1: dependencies: isexe: 2.0.0 @@ -10927,7 +10148,7 @@ snapshots: reduce-flatten: 2.0.0 typical: 5.2.0 - workerpool@6.2.1: {} + workerpool@6.5.1: {} wrap-ansi@7.0.0: dependencies: @@ -10943,31 +10164,17 @@ snapshots: wrappy@1.0.2: {} - ws@7.4.6(bufferutil@4.0.8)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 5.0.10 - - ws@7.5.9(bufferutil@4.0.8)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 5.0.10 + ws@7.4.6: {} - ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 5.0.10 + ws@7.5.10: {} - ws@8.5.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 5.0.10 + ws@8.17.1: {} - xdeployer@2.1.13(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)))(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)): + xdeployer@2.2.2(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)))(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)): dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10)) - ethers: 6.9.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat: 2.22.18(bufferutil@4.0.8)(ts-node@10.9.1(@swc/core@1.6.3)(@types/node@18.18.7)(typescript@5.5.3))(typescript@5.5.3)(utf-8-validate@5.0.10) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2)(hardhat@2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2)) + ethers: 6.13.2 + hardhat: 2.22.18(ts-node@10.9.2(@swc/core@1.7.26)(@types/node@18.19.50)(typescript@5.6.2))(typescript@5.6.2) y18n@5.0.8: {} @@ -10977,8 +10184,6 @@ snapshots: yaml@2.3.1: {} - yargs-parser@20.2.4: {} - yargs-parser@20.2.9: {} yargs-parser@21.1.1: {} @@ -10993,7 +10198,7 @@ snapshots: yargs@16.2.0: dependencies: cliui: 7.0.4 - escalade: 3.1.1 + escalade: 3.2.0 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 @@ -11003,7 +10208,7 @@ snapshots: yargs@17.7.2: dependencies: cliui: 8.0.1 - escalade: 3.1.1 + escalade: 3.2.0 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 @@ -11014,9 +10219,6 @@ snapshots: yocto-queue@0.1.0: {} - zksync-web3@0.14.4(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)): + zksync-web3@0.14.4(ethers@5.7.2): dependencies: - ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - - zod@3.23.8: - optional: true + ethers: 5.7.2 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml deleted file mode 100644 index 8f67b30..0000000 --- a/pnpm-workspace.yaml +++ /dev/null @@ -1,2 +0,0 @@ -packages: - - "contracts" diff --git a/contracts/remappings.txt b/remappings.txt similarity index 100% rename from contracts/remappings.txt rename to remappings.txt diff --git a/contracts/rollup.config.mjs b/rollup.config.mjs similarity index 100% rename from contracts/rollup.config.mjs rename to rollup.config.mjs diff --git a/contracts/slither.config.json b/slither.config.json similarity index 100% rename from contracts/slither.config.json rename to slither.config.json diff --git a/contracts/src/deployments/deployment-marketplace-arb-sepolia.json b/src/deployments/deployment-marketplace-arb-sepolia.json similarity index 100% rename from contracts/src/deployments/deployment-marketplace-arb-sepolia.json rename to src/deployments/deployment-marketplace-arb-sepolia.json diff --git a/contracts/src/deployments/deployment-marketplace-arbitrumOne.json b/src/deployments/deployment-marketplace-arbitrumOne.json similarity index 100% rename from contracts/src/deployments/deployment-marketplace-arbitrumOne.json rename to src/deployments/deployment-marketplace-arbitrumOne.json diff --git a/contracts/src/deployments/deployment-marketplace-base-sepolia.json b/src/deployments/deployment-marketplace-base-sepolia.json similarity index 100% rename from contracts/src/deployments/deployment-marketplace-base-sepolia.json rename to src/deployments/deployment-marketplace-base-sepolia.json diff --git a/contracts/src/deployments/deployment-marketplace-celo-mainnet.json b/src/deployments/deployment-marketplace-celo-mainnet.json similarity index 100% rename from contracts/src/deployments/deployment-marketplace-celo-mainnet.json rename to src/deployments/deployment-marketplace-celo-mainnet.json diff --git a/contracts/src/deployments/deployment-marketplace-optimism-mainnet.json b/src/deployments/deployment-marketplace-optimism-mainnet.json similarity index 100% rename from contracts/src/deployments/deployment-marketplace-optimism-mainnet.json rename to src/deployments/deployment-marketplace-optimism-mainnet.json diff --git a/contracts/src/deployments/deployment-marketplace-sepolia.json b/src/deployments/deployment-marketplace-sepolia.json similarity index 100% rename from contracts/src/deployments/deployment-marketplace-sepolia.json rename to src/deployments/deployment-marketplace-sepolia.json diff --git a/contracts/src/deployments/deployments-protocol.json b/src/deployments/deployments-protocol.json similarity index 100% rename from contracts/src/deployments/deployments-protocol.json rename to src/deployments/deployments-protocol.json diff --git a/contracts/src/deployments/index.ts b/src/deployments/index.ts similarity index 100% rename from contracts/src/deployments/index.ts rename to src/deployments/index.ts diff --git a/contracts/src/index.ts b/src/index.ts similarity index 100% rename from contracts/src/index.ts rename to src/index.ts diff --git a/contracts/src/marketplace/BatchOrderTypehashRegistry.sol b/src/marketplace/BatchOrderTypehashRegistry.sol similarity index 100% rename from contracts/src/marketplace/BatchOrderTypehashRegistry.sol rename to src/marketplace/BatchOrderTypehashRegistry.sol diff --git a/contracts/src/marketplace/CreatorFeeManagerWithRebates.sol b/src/marketplace/CreatorFeeManagerWithRebates.sol similarity index 100% rename from contracts/src/marketplace/CreatorFeeManagerWithRebates.sol rename to src/marketplace/CreatorFeeManagerWithRebates.sol diff --git a/contracts/src/marketplace/CreatorFeeManagerWithRoyalties.sol b/src/marketplace/CreatorFeeManagerWithRoyalties.sol similarity index 100% rename from contracts/src/marketplace/CreatorFeeManagerWithRoyalties.sol rename to src/marketplace/CreatorFeeManagerWithRoyalties.sol diff --git a/contracts/src/marketplace/CurrencyManager.sol b/src/marketplace/CurrencyManager.sol similarity index 100% rename from contracts/src/marketplace/CurrencyManager.sol rename to src/marketplace/CurrencyManager.sol diff --git a/contracts/src/marketplace/ExecutionManager.sol b/src/marketplace/ExecutionManager.sol similarity index 100% rename from contracts/src/marketplace/ExecutionManager.sol rename to src/marketplace/ExecutionManager.sol diff --git a/contracts/src/marketplace/InheritedStrategy.sol b/src/marketplace/InheritedStrategy.sol similarity index 100% rename from contracts/src/marketplace/InheritedStrategy.sol rename to src/marketplace/InheritedStrategy.sol diff --git a/contracts/src/marketplace/LooksRareProtocol.sol b/src/marketplace/LooksRareProtocol.sol similarity index 100% rename from contracts/src/marketplace/LooksRareProtocol.sol rename to src/marketplace/LooksRareProtocol.sol diff --git a/contracts/src/marketplace/NonceManager.sol b/src/marketplace/NonceManager.sol similarity index 100% rename from contracts/src/marketplace/NonceManager.sol rename to src/marketplace/NonceManager.sol diff --git a/contracts/src/marketplace/ProtocolFeeRecipient.sol b/src/marketplace/ProtocolFeeRecipient.sol similarity index 100% rename from contracts/src/marketplace/ProtocolFeeRecipient.sol rename to src/marketplace/ProtocolFeeRecipient.sol diff --git a/contracts/src/marketplace/StrategyManager.sol b/src/marketplace/StrategyManager.sol similarity index 100% rename from contracts/src/marketplace/StrategyManager.sol rename to src/marketplace/StrategyManager.sol diff --git a/contracts/src/marketplace/TransferManager.sol b/src/marketplace/TransferManager.sol similarity index 100% rename from contracts/src/marketplace/TransferManager.sol rename to src/marketplace/TransferManager.sol diff --git a/contracts/src/marketplace/TransferSelectorNFT.sol b/src/marketplace/TransferSelectorNFT.sol similarity index 100% rename from contracts/src/marketplace/TransferSelectorNFT.sol rename to src/marketplace/TransferSelectorNFT.sol diff --git a/contracts/src/marketplace/constants/AssemblyConstants.sol b/src/marketplace/constants/AssemblyConstants.sol similarity index 100% rename from contracts/src/marketplace/constants/AssemblyConstants.sol rename to src/marketplace/constants/AssemblyConstants.sol diff --git a/contracts/src/marketplace/constants/NumericConstants.sol b/src/marketplace/constants/NumericConstants.sol similarity index 100% rename from contracts/src/marketplace/constants/NumericConstants.sol rename to src/marketplace/constants/NumericConstants.sol diff --git a/contracts/src/marketplace/constants/ValidationCodeConstants.sol b/src/marketplace/constants/ValidationCodeConstants.sol similarity index 100% rename from contracts/src/marketplace/constants/ValidationCodeConstants.sol rename to src/marketplace/constants/ValidationCodeConstants.sol diff --git a/contracts/src/marketplace/enums/CollectionType.sol b/src/marketplace/enums/CollectionType.sol similarity index 100% rename from contracts/src/marketplace/enums/CollectionType.sol rename to src/marketplace/enums/CollectionType.sol diff --git a/contracts/src/marketplace/enums/QuoteType.sol b/src/marketplace/enums/QuoteType.sol similarity index 100% rename from contracts/src/marketplace/enums/QuoteType.sol rename to src/marketplace/enums/QuoteType.sol diff --git a/contracts/src/marketplace/errors/ChainlinkErrors.sol b/src/marketplace/errors/ChainlinkErrors.sol similarity index 100% rename from contracts/src/marketplace/errors/ChainlinkErrors.sol rename to src/marketplace/errors/ChainlinkErrors.sol diff --git a/contracts/src/marketplace/errors/HypercertErrors.sol b/src/marketplace/errors/HypercertErrors.sol similarity index 100% rename from contracts/src/marketplace/errors/HypercertErrors.sol rename to src/marketplace/errors/HypercertErrors.sol diff --git a/contracts/src/marketplace/errors/SharedErrors.sol b/src/marketplace/errors/SharedErrors.sol similarity index 100% rename from contracts/src/marketplace/errors/SharedErrors.sol rename to src/marketplace/errors/SharedErrors.sol diff --git a/contracts/src/marketplace/executionStrategies/BaseStrategy.sol b/src/marketplace/executionStrategies/BaseStrategy.sol similarity index 100% rename from contracts/src/marketplace/executionStrategies/BaseStrategy.sol rename to src/marketplace/executionStrategies/BaseStrategy.sol diff --git a/contracts/src/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.sol b/src/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.sol similarity index 100% rename from contracts/src/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.sol rename to src/marketplace/executionStrategies/Chainlink/BaseStrategyChainlinkPriceLatency.sol diff --git a/contracts/src/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.sol b/src/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.sol similarity index 100% rename from contracts/src/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.sol rename to src/marketplace/executionStrategies/Chainlink/StrategyChainlinkUSDDynamicAsk.sol diff --git a/contracts/src/marketplace/executionStrategies/StrategyCollectionOffer.sol b/src/marketplace/executionStrategies/StrategyCollectionOffer.sol similarity index 100% rename from contracts/src/marketplace/executionStrategies/StrategyCollectionOffer.sol rename to src/marketplace/executionStrategies/StrategyCollectionOffer.sol diff --git a/contracts/src/marketplace/executionStrategies/StrategyDutchAuction.sol b/src/marketplace/executionStrategies/StrategyDutchAuction.sol similarity index 100% rename from contracts/src/marketplace/executionStrategies/StrategyDutchAuction.sol rename to src/marketplace/executionStrategies/StrategyDutchAuction.sol diff --git a/contracts/src/marketplace/executionStrategies/StrategyHypercertCollectionOffer.sol b/src/marketplace/executionStrategies/StrategyHypercertCollectionOffer.sol similarity index 100% rename from contracts/src/marketplace/executionStrategies/StrategyHypercertCollectionOffer.sol rename to src/marketplace/executionStrategies/StrategyHypercertCollectionOffer.sol diff --git a/contracts/src/marketplace/executionStrategies/StrategyHypercertDutchAuction.sol b/src/marketplace/executionStrategies/StrategyHypercertDutchAuction.sol similarity index 100% rename from contracts/src/marketplace/executionStrategies/StrategyHypercertDutchAuction.sol rename to src/marketplace/executionStrategies/StrategyHypercertDutchAuction.sol diff --git a/contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol b/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol similarity index 100% rename from contracts/src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol rename to src/marketplace/executionStrategies/StrategyHypercertFractionOffer.sol diff --git a/contracts/src/marketplace/executionStrategies/StrategyItemIdsRange.sol b/src/marketplace/executionStrategies/StrategyItemIdsRange.sol similarity index 100% rename from contracts/src/marketplace/executionStrategies/StrategyItemIdsRange.sol rename to src/marketplace/executionStrategies/StrategyItemIdsRange.sol diff --git a/contracts/src/marketplace/helpers/OrderValidatorV2A.sol b/src/marketplace/helpers/OrderValidatorV2A.sol similarity index 100% rename from contracts/src/marketplace/helpers/OrderValidatorV2A.sol rename to src/marketplace/helpers/OrderValidatorV2A.sol diff --git a/contracts/src/marketplace/helpers/ProtocolHelpers.sol b/src/marketplace/helpers/ProtocolHelpers.sol similarity index 100% rename from contracts/src/marketplace/helpers/ProtocolHelpers.sol rename to src/marketplace/helpers/ProtocolHelpers.sol diff --git a/contracts/src/marketplace/interfaces/ICreatorFeeManager.sol b/src/marketplace/interfaces/ICreatorFeeManager.sol similarity index 100% rename from contracts/src/marketplace/interfaces/ICreatorFeeManager.sol rename to src/marketplace/interfaces/ICreatorFeeManager.sol diff --git a/contracts/src/marketplace/interfaces/ICurrencyManager.sol b/src/marketplace/interfaces/ICurrencyManager.sol similarity index 100% rename from contracts/src/marketplace/interfaces/ICurrencyManager.sol rename to src/marketplace/interfaces/ICurrencyManager.sol diff --git a/contracts/src/marketplace/interfaces/IExecutionManager.sol b/src/marketplace/interfaces/IExecutionManager.sol similarity index 100% rename from contracts/src/marketplace/interfaces/IExecutionManager.sol rename to src/marketplace/interfaces/IExecutionManager.sol diff --git a/contracts/src/marketplace/interfaces/IHypercert1155Token.sol b/src/marketplace/interfaces/IHypercert1155Token.sol similarity index 100% rename from contracts/src/marketplace/interfaces/IHypercert1155Token.sol rename to src/marketplace/interfaces/IHypercert1155Token.sol diff --git a/contracts/src/marketplace/interfaces/IImmutableCreate2Factory.sol b/src/marketplace/interfaces/IImmutableCreate2Factory.sol similarity index 100% rename from contracts/src/marketplace/interfaces/IImmutableCreate2Factory.sol rename to src/marketplace/interfaces/IImmutableCreate2Factory.sol diff --git a/contracts/src/marketplace/interfaces/ILooksRareProtocol.sol b/src/marketplace/interfaces/ILooksRareProtocol.sol similarity index 100% rename from contracts/src/marketplace/interfaces/ILooksRareProtocol.sol rename to src/marketplace/interfaces/ILooksRareProtocol.sol diff --git a/contracts/src/marketplace/interfaces/INonceManager.sol b/src/marketplace/interfaces/INonceManager.sol similarity index 100% rename from contracts/src/marketplace/interfaces/INonceManager.sol rename to src/marketplace/interfaces/INonceManager.sol diff --git a/contracts/src/marketplace/interfaces/IRoyaltyFeeRegistry.sol b/src/marketplace/interfaces/IRoyaltyFeeRegistry.sol similarity index 100% rename from contracts/src/marketplace/interfaces/IRoyaltyFeeRegistry.sol rename to src/marketplace/interfaces/IRoyaltyFeeRegistry.sol diff --git a/contracts/src/marketplace/interfaces/IStrategy.sol b/src/marketplace/interfaces/IStrategy.sol similarity index 100% rename from contracts/src/marketplace/interfaces/IStrategy.sol rename to src/marketplace/interfaces/IStrategy.sol diff --git a/contracts/src/marketplace/interfaces/IStrategyManager.sol b/src/marketplace/interfaces/IStrategyManager.sol similarity index 100% rename from contracts/src/marketplace/interfaces/IStrategyManager.sol rename to src/marketplace/interfaces/IStrategyManager.sol diff --git a/contracts/src/marketplace/interfaces/ITransferManager.sol b/src/marketplace/interfaces/ITransferManager.sol similarity index 100% rename from contracts/src/marketplace/interfaces/ITransferManager.sol rename to src/marketplace/interfaces/ITransferManager.sol diff --git a/contracts/src/marketplace/libraries/CurrencyValidator.sol b/src/marketplace/libraries/CurrencyValidator.sol similarity index 100% rename from contracts/src/marketplace/libraries/CurrencyValidator.sol rename to src/marketplace/libraries/CurrencyValidator.sol diff --git a/contracts/src/marketplace/libraries/LowLevelHypercertCaller.sol b/src/marketplace/libraries/LowLevelHypercertCaller.sol similarity index 100% rename from contracts/src/marketplace/libraries/LowLevelHypercertCaller.sol rename to src/marketplace/libraries/LowLevelHypercertCaller.sol diff --git a/contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.sol b/src/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.sol similarity index 100% rename from contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.sol rename to src/marketplace/libraries/OpenZeppelin/MerkleProofCalldataWithNodes.sol diff --git a/contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofMemory.sol b/src/marketplace/libraries/OpenZeppelin/MerkleProofMemory.sol similarity index 100% rename from contracts/src/marketplace/libraries/OpenZeppelin/MerkleProofMemory.sol rename to src/marketplace/libraries/OpenZeppelin/MerkleProofMemory.sol diff --git a/contracts/src/marketplace/libraries/OrderStructs.sol b/src/marketplace/libraries/OrderStructs.sol similarity index 100% rename from contracts/src/marketplace/libraries/OrderStructs.sol rename to src/marketplace/libraries/OrderStructs.sol diff --git a/contracts/src/marketplace/libraries/RoyaltyFeeRegistry.sol b/src/marketplace/libraries/RoyaltyFeeRegistry.sol similarity index 100% rename from contracts/src/marketplace/libraries/RoyaltyFeeRegistry.sol rename to src/marketplace/libraries/RoyaltyFeeRegistry.sol diff --git a/contracts/src/protocol/AllowlistMinter.sol b/src/protocol/AllowlistMinter.sol similarity index 100% rename from contracts/src/protocol/AllowlistMinter.sol rename to src/protocol/AllowlistMinter.sol diff --git a/contracts/src/protocol/HypercertMinter.sol b/src/protocol/HypercertMinter.sol similarity index 100% rename from contracts/src/protocol/HypercertMinter.sol rename to src/protocol/HypercertMinter.sol diff --git a/contracts/src/protocol/SemiFungible1155.sol b/src/protocol/SemiFungible1155.sol similarity index 100% rename from contracts/src/protocol/SemiFungible1155.sol rename to src/protocol/SemiFungible1155.sol diff --git a/contracts/src/protocol/interfaces/IAllowlist.sol b/src/protocol/interfaces/IAllowlist.sol similarity index 100% rename from contracts/src/protocol/interfaces/IAllowlist.sol rename to src/protocol/interfaces/IAllowlist.sol diff --git a/contracts/src/protocol/interfaces/IHypercertToken.sol b/src/protocol/interfaces/IHypercertToken.sol similarity index 100% rename from contracts/src/protocol/interfaces/IHypercertToken.sol rename to src/protocol/interfaces/IHypercertToken.sol diff --git a/contracts/src/protocol/libs/Errors.sol b/src/protocol/libs/Errors.sol similarity index 100% rename from contracts/src/protocol/libs/Errors.sol rename to src/protocol/libs/Errors.sol diff --git a/contracts/tasks/config.ts b/tasks/config.ts similarity index 100% rename from contracts/tasks/config.ts rename to tasks/config.ts diff --git a/contracts/tasks/deploy-fee-recipient.ts b/tasks/deploy-fee-recipient.ts similarity index 100% rename from contracts/tasks/deploy-fee-recipient.ts rename to tasks/deploy-fee-recipient.ts diff --git a/contracts/tasks/deploy-implementation.ts b/tasks/deploy-implementation.ts similarity index 100% rename from contracts/tasks/deploy-implementation.ts rename to tasks/deploy-implementation.ts diff --git a/contracts/tasks/deploy-marketplace-celo.ts b/tasks/deploy-marketplace-celo.ts similarity index 100% rename from contracts/tasks/deploy-marketplace-celo.ts rename to tasks/deploy-marketplace-celo.ts diff --git a/contracts/tasks/deploy-marketplace.ts b/tasks/deploy-marketplace.ts similarity index 100% rename from contracts/tasks/deploy-marketplace.ts rename to tasks/deploy-marketplace.ts diff --git a/contracts/tasks/deploy-minter.ts b/tasks/deploy-minter.ts similarity index 100% rename from contracts/tasks/deploy-minter.ts rename to tasks/deploy-minter.ts diff --git a/contracts/tasks/deploy-propose-upgrade.ts b/tasks/deploy-propose-upgrade.ts similarity index 100% rename from contracts/tasks/deploy-propose-upgrade.ts rename to tasks/deploy-propose-upgrade.ts diff --git a/contracts/tasks/force-import.ts b/tasks/force-import.ts similarity index 100% rename from contracts/tasks/force-import.ts rename to tasks/force-import.ts diff --git a/contracts/tasks/generate-address.ts b/tasks/generate-address.ts similarity index 100% rename from contracts/tasks/generate-address.ts rename to tasks/generate-address.ts diff --git a/contracts/tasks/index.ts b/tasks/index.ts similarity index 100% rename from contracts/tasks/index.ts rename to tasks/index.ts diff --git a/contracts/tasks/pause.ts b/tasks/pause.ts similarity index 100% rename from contracts/tasks/pause.ts rename to tasks/pause.ts diff --git a/contracts/tasks/propose-owner.ts b/tasks/propose-owner.ts similarity index 100% rename from contracts/tasks/propose-owner.ts rename to tasks/propose-owner.ts diff --git a/contracts/tasks/test-tx-client.ts b/tasks/test-tx-client.ts similarity index 100% rename from contracts/tasks/test-tx-client.ts rename to tasks/test-tx-client.ts diff --git a/contracts/tasks/transfer-from-test-account.ts b/tasks/transfer-from-test-account.ts similarity index 100% rename from contracts/tasks/transfer-from-test-account.ts rename to tasks/transfer-from-test-account.ts diff --git a/contracts/tasks/transfer-owner.ts b/tasks/transfer-owner.ts similarity index 100% rename from contracts/tasks/transfer-owner.ts rename to tasks/transfer-owner.ts diff --git a/contracts/tasks/unpause.ts b/tasks/unpause.ts similarity index 100% rename from contracts/tasks/unpause.ts rename to tasks/unpause.ts diff --git a/contracts/tasks/upgrade.ts b/tasks/upgrade.ts similarity index 100% rename from contracts/tasks/upgrade.ts rename to tasks/upgrade.ts diff --git a/contracts/tasks/validate-upgrade.ts b/tasks/validate-upgrade.ts similarity index 100% rename from contracts/tasks/validate-upgrade.ts rename to tasks/validate-upgrade.ts diff --git a/contracts/test/HypercertMinter.test.ts b/test/HypercertMinter.test.ts similarity index 100% rename from contracts/test/HypercertMinter.test.ts rename to test/HypercertMinter.test.ts diff --git a/contracts/test/foundry/marketplace/BatchMakerCollectionOrders.t.sol b/test/foundry/marketplace/BatchMakerCollectionOrders.t.sol similarity index 100% rename from contracts/test/foundry/marketplace/BatchMakerCollectionOrders.t.sol rename to test/foundry/marketplace/BatchMakerCollectionOrders.t.sol diff --git a/contracts/test/foundry/marketplace/BatchMakerOrders.t.sol b/test/foundry/marketplace/BatchMakerOrders.t.sol similarity index 100% rename from contracts/test/foundry/marketplace/BatchMakerOrders.t.sol rename to test/foundry/marketplace/BatchMakerOrders.t.sol diff --git a/contracts/test/foundry/marketplace/BatchOrderTypehashRegistry.t.sol b/test/foundry/marketplace/BatchOrderTypehashRegistry.t.sol similarity index 100% rename from contracts/test/foundry/marketplace/BatchOrderTypehashRegistry.t.sol rename to test/foundry/marketplace/BatchOrderTypehashRegistry.t.sol diff --git a/contracts/test/foundry/marketplace/BundleTransactions.t.sol b/test/foundry/marketplace/BundleTransactions.t.sol similarity index 100% rename from contracts/test/foundry/marketplace/BundleTransactions.t.sol rename to test/foundry/marketplace/BundleTransactions.t.sol diff --git a/contracts/test/foundry/marketplace/CreatorFeeManagerWithRebates.t.sol b/test/foundry/marketplace/CreatorFeeManagerWithRebates.t.sol similarity index 100% rename from contracts/test/foundry/marketplace/CreatorFeeManagerWithRebates.t.sol rename to test/foundry/marketplace/CreatorFeeManagerWithRebates.t.sol diff --git a/contracts/test/foundry/marketplace/CreatorFeeManagerWithRoyalties.t.sol b/test/foundry/marketplace/CreatorFeeManagerWithRoyalties.t.sol similarity index 100% rename from contracts/test/foundry/marketplace/CreatorFeeManagerWithRoyalties.t.sol rename to test/foundry/marketplace/CreatorFeeManagerWithRoyalties.t.sol diff --git a/contracts/test/foundry/marketplace/CurrencyManager.t.sol b/test/foundry/marketplace/CurrencyManager.t.sol similarity index 100% rename from contracts/test/foundry/marketplace/CurrencyManager.t.sol rename to test/foundry/marketplace/CurrencyManager.t.sol diff --git a/contracts/test/foundry/marketplace/DelegationRecipientsTaker.t.sol b/test/foundry/marketplace/DelegationRecipientsTaker.t.sol similarity index 100% rename from contracts/test/foundry/marketplace/DelegationRecipientsTaker.t.sol rename to test/foundry/marketplace/DelegationRecipientsTaker.t.sol diff --git a/contracts/test/foundry/marketplace/DomainSeparatorUpdates.t.sol b/test/foundry/marketplace/DomainSeparatorUpdates.t.sol similarity index 100% rename from contracts/test/foundry/marketplace/DomainSeparatorUpdates.t.sol rename to test/foundry/marketplace/DomainSeparatorUpdates.t.sol diff --git a/contracts/test/foundry/marketplace/ExecutionManager.t.sol b/test/foundry/marketplace/ExecutionManager.t.sol similarity index 100% rename from contracts/test/foundry/marketplace/ExecutionManager.t.sol rename to test/foundry/marketplace/ExecutionManager.t.sol diff --git a/contracts/test/foundry/marketplace/GasGriefing.t.sol b/test/foundry/marketplace/GasGriefing.t.sol similarity index 100% rename from contracts/test/foundry/marketplace/GasGriefing.t.sol rename to test/foundry/marketplace/GasGriefing.t.sol diff --git a/contracts/test/foundry/marketplace/InitialStates.t.sol b/test/foundry/marketplace/InitialStates.t.sol similarity index 100% rename from contracts/test/foundry/marketplace/InitialStates.t.sol rename to test/foundry/marketplace/InitialStates.t.sol diff --git a/contracts/test/foundry/marketplace/LooksRareProtocol.t.sol b/test/foundry/marketplace/LooksRareProtocol.t.sol similarity index 100% rename from contracts/test/foundry/marketplace/LooksRareProtocol.t.sol rename to test/foundry/marketplace/LooksRareProtocol.t.sol diff --git a/contracts/test/foundry/marketplace/NonceInvalidation.t.sol b/test/foundry/marketplace/NonceInvalidation.t.sol similarity index 100% rename from contracts/test/foundry/marketplace/NonceInvalidation.t.sol rename to test/foundry/marketplace/NonceInvalidation.t.sol diff --git a/contracts/test/foundry/marketplace/OrderValidatorV2A.t.sol b/test/foundry/marketplace/OrderValidatorV2A.t.sol similarity index 100% rename from contracts/test/foundry/marketplace/OrderValidatorV2A.t.sol rename to test/foundry/marketplace/OrderValidatorV2A.t.sol diff --git a/contracts/test/foundry/marketplace/ProtocolBase.t.sol b/test/foundry/marketplace/ProtocolBase.t.sol similarity index 100% rename from contracts/test/foundry/marketplace/ProtocolBase.t.sol rename to test/foundry/marketplace/ProtocolBase.t.sol diff --git a/contracts/test/foundry/marketplace/ProtocolFeeRecipient.t.sol b/test/foundry/marketplace/ProtocolFeeRecipient.t.sol similarity index 100% rename from contracts/test/foundry/marketplace/ProtocolFeeRecipient.t.sol rename to test/foundry/marketplace/ProtocolFeeRecipient.t.sol diff --git a/contracts/test/foundry/marketplace/Sandbox.t.sol b/test/foundry/marketplace/Sandbox.t.sol similarity index 100% rename from contracts/test/foundry/marketplace/Sandbox.t.sol rename to test/foundry/marketplace/Sandbox.t.sol diff --git a/contracts/test/foundry/marketplace/SignaturesEIP2098.t.sol b/test/foundry/marketplace/SignaturesEIP2098.t.sol similarity index 100% rename from contracts/test/foundry/marketplace/SignaturesEIP2098.t.sol rename to test/foundry/marketplace/SignaturesEIP2098.t.sol diff --git a/contracts/test/foundry/marketplace/SignaturesERC1271WalletForERC1155.t.sol b/test/foundry/marketplace/SignaturesERC1271WalletForERC1155.t.sol similarity index 100% rename from contracts/test/foundry/marketplace/SignaturesERC1271WalletForERC1155.t.sol rename to test/foundry/marketplace/SignaturesERC1271WalletForERC1155.t.sol diff --git a/contracts/test/foundry/marketplace/SignaturesERC1271WalletForERC721.t.sol b/test/foundry/marketplace/SignaturesERC1271WalletForERC721.t.sol similarity index 100% rename from contracts/test/foundry/marketplace/SignaturesERC1271WalletForERC721.t.sol rename to test/foundry/marketplace/SignaturesERC1271WalletForERC721.t.sol diff --git a/contracts/test/foundry/marketplace/SignaturesERC1271WalletForHypercert.t.sol b/test/foundry/marketplace/SignaturesERC1271WalletForHypercert.t.sol similarity index 100% rename from contracts/test/foundry/marketplace/SignaturesERC1271WalletForHypercert.t.sol rename to test/foundry/marketplace/SignaturesERC1271WalletForHypercert.t.sol diff --git a/contracts/test/foundry/marketplace/SignaturesRevertions.t.sol b/test/foundry/marketplace/SignaturesRevertions.t.sol similarity index 100% rename from contracts/test/foundry/marketplace/SignaturesRevertions.t.sol rename to test/foundry/marketplace/SignaturesRevertions.t.sol diff --git a/contracts/test/foundry/marketplace/StandardTransactions.t.sol b/test/foundry/marketplace/StandardTransactions.t.sol similarity index 100% rename from contracts/test/foundry/marketplace/StandardTransactions.t.sol rename to test/foundry/marketplace/StandardTransactions.t.sol diff --git a/contracts/test/foundry/marketplace/StandardTransactionsHypercerts.t.sol b/test/foundry/marketplace/StandardTransactionsHypercerts.t.sol similarity index 100% rename from contracts/test/foundry/marketplace/StandardTransactionsHypercerts.t.sol rename to test/foundry/marketplace/StandardTransactionsHypercerts.t.sol diff --git a/contracts/test/foundry/marketplace/StrategyManager.t.sol b/test/foundry/marketplace/StrategyManager.t.sol similarity index 100% rename from contracts/test/foundry/marketplace/StrategyManager.t.sol rename to test/foundry/marketplace/StrategyManager.t.sol diff --git a/contracts/test/foundry/marketplace/TransferManager.t.sol b/test/foundry/marketplace/TransferManager.t.sol similarity index 100% rename from contracts/test/foundry/marketplace/TransferManager.t.sol rename to test/foundry/marketplace/TransferManager.t.sol diff --git a/contracts/test/foundry/marketplace/assembly/VerifyOrderTimestampValidityEquivalence.t.sol b/test/foundry/marketplace/assembly/VerifyOrderTimestampValidityEquivalence.t.sol similarity index 100% rename from contracts/test/foundry/marketplace/assembly/VerifyOrderTimestampValidityEquivalence.t.sol rename to test/foundry/marketplace/assembly/VerifyOrderTimestampValidityEquivalence.t.sol diff --git a/contracts/test/foundry/marketplace/executionStrategies/Chainlink/USDDynamicAskOrders.t.sol b/test/foundry/marketplace/executionStrategies/Chainlink/USDDynamicAskOrders.t.sol similarity index 100% rename from contracts/test/foundry/marketplace/executionStrategies/Chainlink/USDDynamicAskOrders.t.sol rename to test/foundry/marketplace/executionStrategies/Chainlink/USDDynamicAskOrders.t.sol diff --git a/contracts/test/foundry/marketplace/executionStrategies/CollectionOffers.t.sol b/test/foundry/marketplace/executionStrategies/CollectionOffers.t.sol similarity index 100% rename from contracts/test/foundry/marketplace/executionStrategies/CollectionOffers.t.sol rename to test/foundry/marketplace/executionStrategies/CollectionOffers.t.sol diff --git a/contracts/test/foundry/marketplace/executionStrategies/DutchAuctionOrders.t.sol b/test/foundry/marketplace/executionStrategies/DutchAuctionOrders.t.sol similarity index 100% rename from contracts/test/foundry/marketplace/executionStrategies/DutchAuctionOrders.t.sol rename to test/foundry/marketplace/executionStrategies/DutchAuctionOrders.t.sol diff --git a/contracts/test/foundry/marketplace/executionStrategies/HypercertCollectionOffers.t.sol b/test/foundry/marketplace/executionStrategies/HypercertCollectionOffers.t.sol similarity index 100% rename from contracts/test/foundry/marketplace/executionStrategies/HypercertCollectionOffers.t.sol rename to test/foundry/marketplace/executionStrategies/HypercertCollectionOffers.t.sol diff --git a/contracts/test/foundry/marketplace/executionStrategies/HypercertDutchAuctionOrders.t.sol b/test/foundry/marketplace/executionStrategies/HypercertDutchAuctionOrders.t.sol similarity index 100% rename from contracts/test/foundry/marketplace/executionStrategies/HypercertDutchAuctionOrders.t.sol rename to test/foundry/marketplace/executionStrategies/HypercertDutchAuctionOrders.t.sol diff --git a/contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol b/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol similarity index 100% rename from contracts/test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol rename to test/foundry/marketplace/executionStrategies/HypercertFractionOffers.t.sol diff --git a/contracts/test/foundry/marketplace/executionStrategies/ItemIdsRangeOrders.t.sol b/test/foundry/marketplace/executionStrategies/ItemIdsRangeOrders.t.sol similarity index 100% rename from contracts/test/foundry/marketplace/executionStrategies/ItemIdsRangeOrders.t.sol rename to test/foundry/marketplace/executionStrategies/ItemIdsRangeOrders.t.sol diff --git a/contracts/test/foundry/marketplace/executionStrategies/MultiFillCollectionOrders.t.sol b/test/foundry/marketplace/executionStrategies/MultiFillCollectionOrders.t.sol similarity index 100% rename from contracts/test/foundry/marketplace/executionStrategies/MultiFillCollectionOrders.t.sol rename to test/foundry/marketplace/executionStrategies/MultiFillCollectionOrders.t.sol diff --git a/contracts/test/foundry/marketplace/utils/BytesLib.sol b/test/foundry/marketplace/utils/BytesLib.sol similarity index 100% rename from contracts/test/foundry/marketplace/utils/BytesLib.sol rename to test/foundry/marketplace/utils/BytesLib.sol diff --git a/contracts/test/foundry/marketplace/utils/EIP712MerkleTree.sol b/test/foundry/marketplace/utils/EIP712MerkleTree.sol similarity index 100% rename from contracts/test/foundry/marketplace/utils/EIP712MerkleTree.sol rename to test/foundry/marketplace/utils/EIP712MerkleTree.sol diff --git a/contracts/test/foundry/marketplace/utils/ERC1271Wallet.sol b/test/foundry/marketplace/utils/ERC1271Wallet.sol similarity index 100% rename from contracts/test/foundry/marketplace/utils/ERC1271Wallet.sol rename to test/foundry/marketplace/utils/ERC1271Wallet.sol diff --git a/contracts/test/foundry/marketplace/utils/GasGriefer.sol b/test/foundry/marketplace/utils/GasGriefer.sol similarity index 100% rename from contracts/test/foundry/marketplace/utils/GasGriefer.sol rename to test/foundry/marketplace/utils/GasGriefer.sol diff --git a/contracts/test/foundry/marketplace/utils/MaliciousERC1271Wallet.sol b/test/foundry/marketplace/utils/MaliciousERC1271Wallet.sol similarity index 100% rename from contracts/test/foundry/marketplace/utils/MaliciousERC1271Wallet.sol rename to test/foundry/marketplace/utils/MaliciousERC1271Wallet.sol diff --git a/contracts/test/foundry/marketplace/utils/MaliciousIsValidSignatureERC1271Wallet.sol b/test/foundry/marketplace/utils/MaliciousIsValidSignatureERC1271Wallet.sol similarity index 100% rename from contracts/test/foundry/marketplace/utils/MaliciousIsValidSignatureERC1271Wallet.sol rename to test/foundry/marketplace/utils/MaliciousIsValidSignatureERC1271Wallet.sol diff --git a/contracts/test/foundry/marketplace/utils/MaliciousOnERC1155ReceivedERC1271Wallet.sol b/test/foundry/marketplace/utils/MaliciousOnERC1155ReceivedERC1271Wallet.sol similarity index 100% rename from contracts/test/foundry/marketplace/utils/MaliciousOnERC1155ReceivedERC1271Wallet.sol rename to test/foundry/marketplace/utils/MaliciousOnERC1155ReceivedERC1271Wallet.sol diff --git a/contracts/test/foundry/marketplace/utils/MaliciousOnERC1155ReceivedTheThirdTimeERC1271Wallet.sol b/test/foundry/marketplace/utils/MaliciousOnERC1155ReceivedTheThirdTimeERC1271Wallet.sol similarity index 100% rename from contracts/test/foundry/marketplace/utils/MaliciousOnERC1155ReceivedTheThirdTimeERC1271Wallet.sol rename to test/foundry/marketplace/utils/MaliciousOnERC1155ReceivedTheThirdTimeERC1271Wallet.sol diff --git a/contracts/test/foundry/marketplace/utils/MathLib.sol b/test/foundry/marketplace/utils/MathLib.sol similarity index 100% rename from contracts/test/foundry/marketplace/utils/MathLib.sol rename to test/foundry/marketplace/utils/MathLib.sol diff --git a/contracts/test/foundry/marketplace/utils/MerkleWithPosition.sol b/test/foundry/marketplace/utils/MerkleWithPosition.sol similarity index 100% rename from contracts/test/foundry/marketplace/utils/MerkleWithPosition.sol rename to test/foundry/marketplace/utils/MerkleWithPosition.sol diff --git a/contracts/test/foundry/marketplace/utils/MockOrderGenerator.sol b/test/foundry/marketplace/utils/MockOrderGenerator.sol similarity index 100% rename from contracts/test/foundry/marketplace/utils/MockOrderGenerator.sol rename to test/foundry/marketplace/utils/MockOrderGenerator.sol diff --git a/contracts/test/foundry/marketplace/utils/ProtocolHelpers.sol b/test/foundry/marketplace/utils/ProtocolHelpers.sol similarity index 100% rename from contracts/test/foundry/marketplace/utils/ProtocolHelpers.sol rename to test/foundry/marketplace/utils/ProtocolHelpers.sol diff --git a/contracts/test/foundry/marketplace/utils/StrategyTestMultiFillCollectionOrder.sol b/test/foundry/marketplace/utils/StrategyTestMultiFillCollectionOrder.sol similarity index 100% rename from contracts/test/foundry/marketplace/utils/StrategyTestMultiFillCollectionOrder.sol rename to test/foundry/marketplace/utils/StrategyTestMultiFillCollectionOrder.sol diff --git a/contracts/test/foundry/marketplace/utils/TestHelpers.sol b/test/foundry/marketplace/utils/TestHelpers.sol similarity index 100% rename from contracts/test/foundry/marketplace/utils/TestHelpers.sol rename to test/foundry/marketplace/utils/TestHelpers.sol diff --git a/contracts/test/foundry/marketplace/utils/TestParameters.sol b/test/foundry/marketplace/utils/TestParameters.sol similarity index 100% rename from contracts/test/foundry/marketplace/utils/TestParameters.sol rename to test/foundry/marketplace/utils/TestParameters.sol diff --git a/contracts/test/foundry/protocol/AllowlistMinter.t.sol b/test/foundry/protocol/AllowlistMinter.t.sol similarity index 100% rename from contracts/test/foundry/protocol/AllowlistMinter.t.sol rename to test/foundry/protocol/AllowlistMinter.t.sol diff --git a/contracts/test/foundry/protocol/Bitshifting.t.sol b/test/foundry/protocol/Bitshifting.t.sol similarity index 100% rename from contracts/test/foundry/protocol/Bitshifting.t.sol rename to test/foundry/protocol/Bitshifting.t.sol diff --git a/contracts/test/foundry/protocol/HypercertMinter.batchminting.t.sol b/test/foundry/protocol/HypercertMinter.batchminting.t.sol similarity index 100% rename from contracts/test/foundry/protocol/HypercertMinter.batchminting.t.sol rename to test/foundry/protocol/HypercertMinter.batchminting.t.sol diff --git a/contracts/test/foundry/protocol/HypercertMinter.pausable.t.sol b/test/foundry/protocol/HypercertMinter.pausable.t.sol similarity index 100% rename from contracts/test/foundry/protocol/HypercertMinter.pausable.t.sol rename to test/foundry/protocol/HypercertMinter.pausable.t.sol diff --git a/contracts/test/foundry/protocol/HypercertMinter.t.sol b/test/foundry/protocol/HypercertMinter.t.sol similarity index 100% rename from contracts/test/foundry/protocol/HypercertMinter.t.sol rename to test/foundry/protocol/HypercertMinter.t.sol diff --git a/contracts/test/foundry/protocol/HypercertMinter.transfers.t.sol b/test/foundry/protocol/HypercertMinter.transfers.t.sol similarity index 100% rename from contracts/test/foundry/protocol/HypercertMinter.transfers.t.sol rename to test/foundry/protocol/HypercertMinter.transfers.t.sol diff --git a/contracts/test/foundry/protocol/PerformanceTesting.t.sol b/test/foundry/protocol/PerformanceTesting.t.sol similarity index 100% rename from contracts/test/foundry/protocol/PerformanceTesting.t.sol rename to test/foundry/protocol/PerformanceTesting.t.sol diff --git a/contracts/test/foundry/protocol/SemiFungible1155.allowances.t.sol b/test/foundry/protocol/SemiFungible1155.allowances.t.sol similarity index 100% rename from contracts/test/foundry/protocol/SemiFungible1155.allowances.t.sol rename to test/foundry/protocol/SemiFungible1155.allowances.t.sol diff --git a/contracts/test/foundry/protocol/SemiFungible1155.burning.t.sol b/test/foundry/protocol/SemiFungible1155.burning.t.sol similarity index 100% rename from contracts/test/foundry/protocol/SemiFungible1155.burning.t.sol rename to test/foundry/protocol/SemiFungible1155.burning.t.sol diff --git a/contracts/test/foundry/protocol/SemiFungible1155.minting.t.sol b/test/foundry/protocol/SemiFungible1155.minting.t.sol similarity index 100% rename from contracts/test/foundry/protocol/SemiFungible1155.minting.t.sol rename to test/foundry/protocol/SemiFungible1155.minting.t.sol diff --git a/contracts/test/foundry/protocol/SemiFungible1155.t.sol b/test/foundry/protocol/SemiFungible1155.t.sol similarity index 100% rename from contracts/test/foundry/protocol/SemiFungible1155.t.sol rename to test/foundry/protocol/SemiFungible1155.t.sol diff --git a/contracts/test/foundry/protocol/SemiFungible1155.transfers.t.sol b/test/foundry/protocol/SemiFungible1155.transfers.t.sol similarity index 100% rename from contracts/test/foundry/protocol/SemiFungible1155.transfers.t.sol rename to test/foundry/protocol/SemiFungible1155.transfers.t.sol diff --git a/contracts/test/foundry/protocol/SemiFungible1155.units.sol b/test/foundry/protocol/SemiFungible1155.units.sol similarity index 100% rename from contracts/test/foundry/protocol/SemiFungible1155.units.sol rename to test/foundry/protocol/SemiFungible1155.units.sol diff --git a/contracts/test/foundry/protocol/SemiFungibleHelper.sol b/test/foundry/protocol/SemiFungibleHelper.sol similarity index 100% rename from contracts/test/foundry/protocol/SemiFungibleHelper.sol rename to test/foundry/protocol/SemiFungibleHelper.sol diff --git a/contracts/test/mock/MockChainlinkAggregator.sol b/test/mock/MockChainlinkAggregator.sol similarity index 100% rename from contracts/test/mock/MockChainlinkAggregator.sol rename to test/mock/MockChainlinkAggregator.sol diff --git a/contracts/test/mock/MockERC1155.sol b/test/mock/MockERC1155.sol similarity index 100% rename from contracts/test/mock/MockERC1155.sol rename to test/mock/MockERC1155.sol diff --git a/contracts/test/mock/MockERC1155SupportsNoInterface.sol b/test/mock/MockERC1155SupportsNoInterface.sol similarity index 100% rename from contracts/test/mock/MockERC1155SupportsNoInterface.sol rename to test/mock/MockERC1155SupportsNoInterface.sol diff --git a/contracts/test/mock/MockERC1155WithoutAnyBalanceOf.sol b/test/mock/MockERC1155WithoutAnyBalanceOf.sol similarity index 100% rename from contracts/test/mock/MockERC1155WithoutAnyBalanceOf.sol rename to test/mock/MockERC1155WithoutAnyBalanceOf.sol diff --git a/contracts/test/mock/MockERC1155WithoutBalanceOfBatch.sol b/test/mock/MockERC1155WithoutBalanceOfBatch.sol similarity index 100% rename from contracts/test/mock/MockERC1155WithoutBalanceOfBatch.sol rename to test/mock/MockERC1155WithoutBalanceOfBatch.sol diff --git a/contracts/test/mock/MockERC1155WithoutIsApprovedForAll.sol b/test/mock/MockERC1155WithoutIsApprovedForAll.sol similarity index 100% rename from contracts/test/mock/MockERC1155WithoutIsApprovedForAll.sol rename to test/mock/MockERC1155WithoutIsApprovedForAll.sol diff --git a/contracts/test/mock/MockERC20.sol b/test/mock/MockERC20.sol similarity index 100% rename from contracts/test/mock/MockERC20.sol rename to test/mock/MockERC20.sol diff --git a/contracts/test/mock/MockERC721.sol b/test/mock/MockERC721.sol similarity index 100% rename from contracts/test/mock/MockERC721.sol rename to test/mock/MockERC721.sol diff --git a/contracts/test/mock/MockERC721SupportsNoInterface.sol b/test/mock/MockERC721SupportsNoInterface.sol similarity index 100% rename from contracts/test/mock/MockERC721SupportsNoInterface.sol rename to test/mock/MockERC721SupportsNoInterface.sol diff --git a/contracts/test/mock/MockERC721WithRoyalties.sol b/test/mock/MockERC721WithRoyalties.sol similarity index 100% rename from contracts/test/mock/MockERC721WithRoyalties.sol rename to test/mock/MockERC721WithRoyalties.sol diff --git a/contracts/test/mock/MockHypercertMinter.sol b/test/mock/MockHypercertMinter.sol similarity index 100% rename from contracts/test/mock/MockHypercertMinter.sol rename to test/mock/MockHypercertMinter.sol diff --git a/contracts/test/mock/MockHypercertMinterSupportsNoInterface.sol b/test/mock/MockHypercertMinterSupportsNoInterface.sol similarity index 100% rename from contracts/test/mock/MockHypercertMinterSupportsNoInterface.sol rename to test/mock/MockHypercertMinterSupportsNoInterface.sol diff --git a/contracts/test/mock/MockHypercertMinterUUPS.sol b/test/mock/MockHypercertMinterUUPS.sol similarity index 100% rename from contracts/test/mock/MockHypercertMinterUUPS.sol rename to test/mock/MockHypercertMinterUUPS.sol diff --git a/contracts/test/mock/MockHypercertMinterWithoutAnyBalanceOf.sol b/test/mock/MockHypercertMinterWithoutAnyBalanceOf.sol similarity index 100% rename from contracts/test/mock/MockHypercertMinterWithoutAnyBalanceOf.sol rename to test/mock/MockHypercertMinterWithoutAnyBalanceOf.sol diff --git a/contracts/test/mock/MockHypercertMinterWithoutAnyOwnerOf.sol b/test/mock/MockHypercertMinterWithoutAnyOwnerOf.sol similarity index 100% rename from contracts/test/mock/MockHypercertMinterWithoutAnyOwnerOf.sol rename to test/mock/MockHypercertMinterWithoutAnyOwnerOf.sol diff --git a/contracts/test/mock/MockHypercertMinterWithoutAnyUnitsOf.sol b/test/mock/MockHypercertMinterWithoutAnyUnitsOf.sol similarity index 100% rename from contracts/test/mock/MockHypercertMinterWithoutAnyUnitsOf.sol rename to test/mock/MockHypercertMinterWithoutAnyUnitsOf.sol diff --git a/contracts/test/mock/MockRoyaltyFeeRegistry.sol b/test/mock/MockRoyaltyFeeRegistry.sol similarity index 100% rename from contracts/test/mock/MockRoyaltyFeeRegistry.sol rename to test/mock/MockRoyaltyFeeRegistry.sol diff --git a/contracts/test/mock/MockSmartWallet.sol b/test/mock/MockSmartWallet.sol similarity index 100% rename from contracts/test/mock/MockSmartWallet.sol rename to test/mock/MockSmartWallet.sol diff --git a/contracts/tsconfig.build.json b/tsconfig.build.json similarity index 100% rename from contracts/tsconfig.build.json rename to tsconfig.build.json diff --git a/contracts/tsconfig.json b/tsconfig.json similarity index 100% rename from contracts/tsconfig.json rename to tsconfig.json diff --git a/turbo.json b/turbo.json deleted file mode 100644 index 4907171..0000000 --- a/turbo.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "$schema": "https://turbo.build/schema.json", - "globalDependencies": [".env.*local", ".env"], - "tasks": { - "build": { - "outputs": ["build/**", "dist/**", "out/**"] - }, - "deploy": { - "dependsOn": ["build"], - "outputs": ["build/**", "dist/**", "out/**"] - }, - "dev": { - "persistent": true - }, - "lint": {}, - "start": { - "cache": false - }, - "test": {} - } -} diff --git a/utils/README.md b/utils/README.md deleted file mode 100644 index 20f72a7..0000000 --- a/utils/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# Utilities - -Scripts for automating operations built on top of hypercerts. Contributions welcome! - -## Organization - -`/gitcoin`: tools for gathering on-chain data about grants and rounds from Allo Protocol, and creating custom URLs for all projects - - diff --git a/utils/gitcoin/GR18/.env.example b/utils/gitcoin/GR18/.env.example deleted file mode 100644 index 510f634..0000000 --- a/utils/gitcoin/GR18/.env.example +++ /dev/null @@ -1,7 +0,0 @@ -#.env -ALCHEMY_KEY= -ETHERSCAN_KEY= -CHAINALYSIS_API_KEY= -OPTIMISM_ETHERSCAN_API_KEY= -OPENAI_API_KEY= -WEB3_STORAGE_TOKEN= \ No newline at end of file diff --git a/utils/gitcoin/GR18/.gitignore b/utils/gitcoin/GR18/.gitignore deleted file mode 100644 index 588984b..0000000 --- a/utils/gitcoin/GR18/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -# ignore local storage artifacts -.env -__pycache__/ -.DS_Store -*.csv -*.png -*.ipynb -*.log -.ipynb_checkpoints/ -data/* diff --git a/utils/gitcoin/GR18/README.md b/utils/gitcoin/GR18/README.md deleted file mode 100644 index 75192a3..0000000 --- a/utils/gitcoin/GR18/README.md +++ /dev/null @@ -1,49 +0,0 @@ -# Gitcoin GR18 - -Scripts which may be helpful when working with Gitcoin Data and Allo Protocol. Contributions welcome! - -# Setup - -1. Set environment variables in a `.env` file. You may need the following API keys: - - - ALCHEMY_KEY - - ETHERSCAN_KEY - - OPTIMISM_ETHERSCAN_API_KEY - - OPENAI_API_KEY - - WEB3_STORAGE_TOKEN - -2. Check you have installed the necessary requirements in `requirements.txt` and for web3.storage (npm) - -3. Reviewing settings in `config.json` - -# Funding Round Set-up - -To initialize the data, you will need to gather information about the Funding Rounds: - -1. In `get_grants_data.py`, run the `get_funding_rounds` module from the `main` function - -2. This will extract data from Gitcoin's allo protocol and create a file called `data/funding-round-data.json` - -3. Open the file and modify any of the styling for hypercert background colors and vector art. - -``` - { - "roundId": "0xdf22a2C8F6BA9376fF17EE13E6154B784ee92094", - "roundName": "Ethereum Infrastructure", - "backgroundColor": "blue", // YOU MAY EDIT THIS - "backgroundVectorArt": "contours" // YOU MAY EDIT THIS - } -``` - -# Generating Hypercerts - -1. Double check settings in `config.json` - -2. From the command line, execute `bash workflow.sh`. This will do the following: - - - Gather data for all projects - - Prepare allowlists for all projects (stored as CSV files locally in `data/allowlists/`) - - Extract and resize banner images for all projects (stored as PNG files locally in `data/img/`) - - Use GPT to generate a 2-3 sentence description and <30 character work scope for each project (stored as JSON files locally in `data/`) - - Upload allowlists and banner images to web3.storage (the CIDs are stored locally in `data/cids.json`) - - Create a custom hypercert minting link for each project (a table with each project and its minting link is stored locally in `data/minting_urls.csv` diff --git a/utils/gitcoin/GR18/ai_helper.py b/utils/gitcoin/GR18/ai_helper.py deleted file mode 100644 index 8a25dfc..0000000 --- a/utils/gitcoin/GR18/ai_helper.py +++ /dev/null @@ -1,182 +0,0 @@ -import argparse -from dotenv import load_dotenv -import json -import logging -import openai -import os -import time - - -PROJECTS_DATA = "data/projects-data.json" -DESCRIPTIONS = "data/descriptions.json" -WORK_SCOPES = "data/workscopes.json" - -MAX_TOKENS_SUMMARY = 1250 -MAX_TOKENS_WORK_SCOPE = 20 -MAX_RETRIES = 5 -WAIT_TIME = 10 - -logger = logging.getLogger(__name__) -logger.setLevel(logging.ERROR) -formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s") -file_handler = logging.FileHandler("error.log") -file_handler.setFormatter(formatter) -logger.addHandler(file_handler) - -def summarize(text_blob, max_tokens=MAX_TOKENS_SUMMARY): - if not isinstance(text_blob, str): - return "" - - tokens = text_blob.split(" ") - if len(tokens) < 100 or max_tokens < 200: - return text_blob - - text_blob = " ".join(tokens[:(max_tokens - 500)]) - - prompt = ( - f"Consider the following text:\n\n" - f"---\n\n" - f"{text_blob}\n\n" - f"---\n\n" - f"Please convert this into a 2-3 sentence summary that describes what the project is doing." - f"Use the name of the project in the description, e.g., 'Project X is an open source protocol for...'." - f"Only return the summary text; don't return any other comments or superfluous text." - ) - - try: - response = openai.Completion.create( - model="text-davinci-003", - prompt=prompt, - temperature=0.5, - max_tokens=200, - n=1, - stop=None - ) - - new_text = response.choices[0].text.strip().strip('"') - - return new_text - - except Exception as e: - logger.error(f"Error during summarization: {e}") - return "" - - -def shorten_workscope(title, description): - if not isinstance(title, str): - return "" - - title = title.strip() - - if len(title) <= 30: - return title - - text_blob = "\n\n".join([title, description]) - - prompt = ( - f"Consider the following text about a project:\n\n" - f"---\n\n" - f"{text_blob}\n\n" - f"---\n\n" - f"Please shorten this text to just project name. The project name should be 30 characters or less." - f"Only return the project name; don't return any other comments or superfluous text." - ) - - try: - response = openai.Completion.create( - model="text-davinci-003", - prompt=prompt, - temperature=0.5, - max_tokens=MAX_TOKENS_WORK_SCOPE, - n=1, - stop=None - ) - - new_text = response.choices[0].text.strip().strip('"') - - return new_text - - except Exception as e: - logger.error(f"Error during work scope shortening: {e}") - return "" - - -def process_project_descriptions(): - if os.path.exists(DESCRIPTIONS): - with open(DESCRIPTIONS) as f: - descriptions = json.load(f) - else: - descriptions = {} - - with open(PROJECTS_DATA) as f: - projects = json.load(f) - - for project_id, project in enumerate(projects): - if descriptions.get(str(project_id)): - continue - - print(f"Processing description for project {project_id} {project['name']}...") - descr = summarize(project['description']) - if descr == "": - continue - descriptions[project_id] = descr - - with open(DESCRIPTIONS, 'w') as f: - json.dump(descriptions, f, indent=4) - - -def split_scope(work_scope): - - split_chars = ["-", ":", "|"] - for char in split_chars: - if char in work_scope: - return work_scope.split(char)[0].strip() - - return work_scope - - -def process_work_scopes(): - if os.path.exists(WORK_SCOPES): - with open(WORK_SCOPES) as f: - work_scopes = json.load(f) - else: - work_scopes = {} - - with open(PROJECTS_DATA) as f: - projects = json.load(f) - - with open(DESCRIPTIONS) as f: - descriptions = json.load(f) - - for project_id, descr in descriptions.items(): - if work_scopes.get(str(project_id)): - continue - title = projects[int(project_id)].get('name') - print(f"Processing work scope for project {project_id} {title}...") - work_scope = shorten_workscope(title, descr) - if work_scope == "": - break - work_scopes[project_id] = split_scope(work_scope) - - with open(WORK_SCOPES, 'w') as f: - json.dump(work_scopes, f, indent=4) - - -def main(): - load_dotenv() - openai.api_key = os.environ['OPENAI_API_KEY'] - process_project_descriptions() - process_work_scopes() - - -if __name__ == "__main__": - parser = argparse.ArgumentParser(description="Process project descriptions and work scopes.") - parser.add_argument("--logfile", help="Specify the log file path.") - args = parser.parse_args() - - if args.logfile: - file_handler = logging.FileHandler(args.logfile) - file_handler.setFormatter(formatter) - logger.addHandler(file_handler) - - main() diff --git a/utils/gitcoin/GR18/config.json b/utils/gitcoin/GR18/config.json deleted file mode 100644 index b7c4bfa..0000000 --- a/utils/gitcoin/GR18/config.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "version": "1.0.0", - "hypercertCreateUrl": "https://hypercerts.org/app/create/#", - "hypercertTestingUrl": "https://hypercerts.org/app/create/#", - "hostedCidBaseUrl": "https://cloudflare-ipfs.com/ipfs/", - "localPaths": { - "exportsDirectory": "data/", - "donorlistDirectory": "data/donorlists/", - "allowlistDirectory": "data/allowlists/", - "imagesDirectory": "data/img/" - } -} diff --git a/utils/gitcoin/GR18/get_ens.py b/utils/gitcoin/GR18/get_ens.py deleted file mode 100644 index a92a057..0000000 --- a/utils/gitcoin/GR18/get_ens.py +++ /dev/null @@ -1,26 +0,0 @@ -from dotenv import load_dotenv -from ens import ENS -import os -from web3 import Web3 - -load_dotenv() -ALCHEMY_KEY = os.environ['ALCHEMY_KEY'] - -def get_ens(addr): - - # create a web3 connection - alchemy_url = f"https://eth-mainnet.g.alchemy.com/v2/{ALCHEMY_KEY}" - w3 = Web3(Web3.HTTPProvider(alchemy_url)) - ns = ENS.fromWeb3(w3) - - addr = addr.lower() - try: - checksum = Web3.toChecksumAddress(addr) - name = ns.name(checksum) - if name: - return name - else: - return addr - except: - print("Error getting ENS name:", addr) - return addr diff --git a/utils/gitcoin/GR18/get_grants_data.py b/utils/gitcoin/GR18/get_grants_data.py deleted file mode 100644 index e71be20..0000000 --- a/utils/gitcoin/GR18/get_grants_data.py +++ /dev/null @@ -1,225 +0,0 @@ -from datetime import datetime -import json -import logging -import os -import pandas as pd -import re -import requests - -from get_ens import get_ens - - -CHAINSAUCE_URL = "https://indexer-grants-stack.gitcoin.co/data/" -CHAIN_IDS = { - #'1': 'mainnet', - '10': 'optimism', - #'250': 'fantom', - #'42161': 'arbitrum one', - '424': 'pgn' -} -START_TIME = 1690862400 # Aug 1, 2023 -END_TIME = 1692331200 # Aug 18 2023 - -ROUNDS_DATA = "data/funding-round-data.json" -PROJECTS_DATA = "data/projects-data.json" - - -def setup_logging(): - logging.basicConfig( - level=logging.INFO, - format="%(asctime)s %(levelname)-8s %(message)s", - datefmt="%Y-%m-%d %H:%M:%S", - handlers=[ - logging.FileHandler("allo.log"), - logging.StreamHandler() - ] - ) - - -def flatten_dict(d): - flattened_dict = {} - for key, value in d.items(): - if isinstance(value, dict): - inner_dict = flatten_dict(value) - flattened_dict.update({f"{key}.{inner_key}": inner_value for inner_key, inner_value in inner_dict.items()}) - elif isinstance(value, list): - flattened_dict.update({f"{key}.{i}": item for i, item in enumerate(value)}) - else: - flattened_dict[key] = value - return flattened_dict - - -def assign_color_and_vector(round_name): - - design_mappings = [ - { - "words": "Community|Social|Source", - "color": "blue", - "vector": "contours" - }, - { - "words": "Zuzalu|ReFi|Climate", - "color": "green", - "vector": "circles" - }, - { - "words": "Infrastructure|Chinese|Engineering", - "color": "purple", - "vector": "octagonals" - } - ] - default_color = "blue" - default_vector = "contours" - - for mapping in design_mappings: - if re.search(mapping['words'], round_name): - return mapping['color'], mapping['vector'] - return default_color, default_vector - - -def get_funding_rounds(chain_nums): - - funding_round_data = [] - for chain_num in chain_nums: - round_url = "/".join([CHAINSAUCE_URL, chain_num, "rounds.json"]) - r = requests.get(round_url) - round_data = r.json() - for r in round_data: - if START_TIME < int(r['roundStartTime']) < END_TIME: - round_name = r['metadata']['name'] - if r['votes'] > 10 and 'test' not in round_name.lower(): - color, vectors = assign_color_and_vector(round_name) - funding_round_data.append({ - "roundId": r['id'], - "roundName": round_name, - "chain": chain_num, - "backgroundColor": color, - "backgroundVectorArt": vectors - }) - - with open(ROUNDS_DATA, 'w') as f: - json.dump(funding_round_data, f, indent=4) - - -def get_allo_data(chain_nums): - with open(ROUNDS_DATA) as f: - funding_round_data = json.load(f) - - projects_data = [] - for funding_round in funding_round_data: - round_id = funding_round['roundId'] - round_name = funding_round['roundName'] - chain_num = funding_round['chain'] - print(f"Gathering projects data for round: {round_name} on Chain {chain_num}...") - - url = "/".join([CHAINSAUCE_URL, chain_num, "rounds", round_id, "applications.json"]) - projects_json = requests.get(url).json() - - for project in projects_json: - if project['status'] != "APPROVED": - continue - - app = flatten_dict(project['metadata']['application']) - name = app.get('project.title') - address = get_ens(app.get('recipient')) - - project_data = { - 'id': project['projectId'], - 'name': name, - 'description': app.get('project.description'), - 'address': address, - 'logoImg': app.get('project.logoImg'), - 'bannerImg': app.get('project.bannerImg'), - 'externalLink': app.get('project.website'), - 'fundingRounds': [round_name], - 'chain': chain_num, - "backgroundColor": funding_round['backgroundColor'], - "backgroundVectorArt": funding_round['backgroundVectorArt'] - } - - # Check if this project already exists in the list - existing_project = next((item for item in projects_data if item['name'] == name and item['chain'] == chain_num), None) - if existing_project: - existing_project['fundingRounds'].append(round_name) - else: - projects_data.append(project_data) - print(f"Normalized data for project: {name}") - - print(f"Obtained {len(projects_data)} projects.") - - with open(PROJECTS_DATA, 'w') as f: - json.dump(projects_data, f, indent=4) - - df = pd.DataFrame(projects_data) - df.to_csv("data/projects.csv", index=False) - - -def rerun_get_ens(): - with open(PROJECTS_DATA) as f: - projects_data = json.load(f) - - for project in projects_data: - address = project['address'] - if ".eth" in address: - continue - ens = get_ens(address) - project['address'] = ens - - with open(PROJECTS_DATA, 'w') as f: - json.dump(projects_data, f, indent=4) - - -def get_allowlists(): - - path = "data/allowlists/" - if not os.path.exists(path): - os.makedirs(path) - - with open(ROUNDS_DATA) as f: - funding_round_data = json.load(f) - - votes_data = [] - for funding_round in funding_round_data: - round_id = funding_round['roundId'] - round_name = funding_round['roundName'] - chain_num = funding_round['chain'] - logging.info(f"Gathering voting data for round: {round_name}...") - - url = "/".join([CHAINSAUCE_URL, chain_num, "rounds", round_id, "votes.json"]) - votes_json = requests.get(url).json() - votes_data.extend(votes_json) - - df = pd.DataFrame(votes_data) - - for project in df['projectId'].unique(): - dff = ( - df[df['projectId'] == project] - .groupby('voter')['amountUSD'] - .sum() - .sort_values(ascending=False) - .reset_index() - .rename(columns={'voter': 'address'}) - ) - dff.index.name = 'index' - - # Round the hypercert quantity UP to the nearest integer - dff['fractions'] = dff['amountUSD'].apply(lambda x: int(x) + 1) - dff['address'] = dff['address'].apply(lambda x: x.lower()) - dff.drop(columns='amountUSD', inplace=True) - - dff.to_csv(f"{path}{project}.csv") - - -if __name__ == "__main__": - - # TODO: set colors and vectors dynamically - # Currently requires manually overriding a default color/vector combo - - if not os.path.exists(ROUNDS_DATA): - get_funding_rounds(CHAIN_IDS.keys()) - if not os.path.exists("data/img"): - os.makedirs("data/img") - - get_allo_data(CHAIN_IDS.keys()) - #get_allowlists() - #rerun_get_ens() \ No newline at end of file diff --git a/utils/gitcoin/GR18/minting_urls.py b/utils/gitcoin/GR18/minting_urls.py deleted file mode 100644 index 509d4fd..0000000 --- a/utils/gitcoin/GR18/minting_urls.py +++ /dev/null @@ -1,111 +0,0 @@ -import csv -from dotenv import load_dotenv -import json -import os -import requests -import urllib.parse - - -PROJECTS = json.load(open("data/projects-data.json")) -DESCRIPTIONS = json.load(open("data/descriptions.json")) -WORK_SCOPES = json.load(open("data/workscopes.json")) -CIDS = json.load(open("data/cids.json")) - -CONFIG = json.load(open("config.json")) - -# TODO: update dates -WORK_START = "2023-04-26" -WORK_END = "2023-08-14" - - -def url_parse(val): - return urllib.parse.quote(val, safe='') - - -def safe_url_attr(name, value): - parser = lambda k,v: url_parse(k) + '=' + url_parse(v) - if isinstance(value, list): - url_field = "&".join([parser(f"{name}[{i}]", x) for (i, x) in enumerate(value)]) - else: - url_field = parser(name, value) - return url_field - - -def create_url(idx): - - project = PROJECTS[idx] - project_id = project.get('id') - - print(project['name']) - - # TODO: check for ENS - address = project.get("address") - hypercert = { - "workScopes": WORK_SCOPES.get(str(idx)), - "workTimeStart": WORK_START, - "workTimeEnd": WORK_END, - "impactScopes": ["all"], - "impactTimeStart": WORK_START, - "impactTimeEnd": "indefinite", - "contributors": address, - "rights": ["Public Display"] - } - - # TODO: confirm all projects have valid images - base = CONFIG['hostedCidBaseUrl'] - logo_uri = f"https://ipfs-grants-stack.gitcoin.co/ipfs/{project.get('logoImg')}" - banner_uri = f"{base}{CIDS['img']}/img/{str(idx)}.png" - allowlist_uri = f"{base}{CIDS['allowlists']}/allowlists/{project_id}.csv" - - properties = [ - { - "trait_type": "Funding Platform", - "value": "Gitcoin Grants" - }, - { - "trait_type": "Funding Round", - "value": "Beta Round" - }, - # TODO: figure out how to make this render as an array value - { - "trait_type": "Matching Pool", - "value": ", ".join(project['fundingRounds']) - } - ] - - params = dict( - name = project['name'], - **hypercert, - description = DESCRIPTIONS.get(str(idx)), - externalLink = project['externalLink'], - logoUrl = logo_uri, - bannerUrl = banner_uri, - allowlistUrl = allowlist_uri, - metadataProperties = json.dumps(properties), - backgroundColor = project['backgroundColor'], - backgroundVectorArt = project['backgroundVectorArt'], - ) - params = "&".join([safe_url_attr(k,v) for (k,v) in params.items()]) - url = CONFIG['hypercertTestingUrl'] + params - - return url - - - -def create_csv_export(): - - csv_filename = "data/minting_urls.csv" - with open(csv_filename, 'w') as f: - writer = csv.writer(f) - cols = ['id', 'name', 'mintingUrl'] - writer.writerow(cols) - - for idx, project in enumerate(PROJECTS): - url = create_url(idx) - writer.writerow([idx, project['name'], url]) - - f.close() - - -if __name__ == "__main__": - create_csv_export() diff --git a/utils/gitcoin/GR18/process_images.py b/utils/gitcoin/GR18/process_images.py deleted file mode 100644 index d655b59..0000000 --- a/utils/gitcoin/GR18/process_images.py +++ /dev/null @@ -1,69 +0,0 @@ -from io import BytesIO -import json -from math import ceil -import os -from PIL import Image -import requests - -CID_HOST_URL = "https://ipfs-grants-stack.gitcoin.co/ipfs/" -PROJECTS_DATA = "data/projects-data.json" -IMG_DIR = "data/img/" - -IMG_WIDTH, IMG_HEIGHT = 320, 214 - - -def crop_and_resize(img): - - width, height = img.size - cropped_dims = img.getbbox() - cropped_width = cropped_dims[2] - cropped_dims[0] - cropped_height = cropped_dims[3] - cropped_dims[1] - - if cropped_width < width: - cropped_img = img.crop(cropped_dims) - ratio = IMG_WIDTH / cropped_width - resized_img = cropped_img.resize((IMG_WIDTH, ceil(cropped_height * ratio))) - _, resized_height = resized_img.size - cropper = ceil((resized_height - IMG_HEIGHT) / 2) - new_img = resized_img.crop((0,cropper,IMG_WIDTH,cropper+IMG_HEIGHT)) - else: - ratio = IMG_HEIGHT / height - resized_img = img.resize((ceil(width * ratio), IMG_HEIGHT)) - resized_width, _ = resized_img.size - cropper = ceil((resized_width - IMG_WIDTH) / 2) - new_img = resized_img.crop((cropper,0,cropper+IMG_WIDTH,IMG_HEIGHT)) - - return new_img - - -def process_image(uri, project_id, overwrite=False): - - outpath = str(project_id) + ".png" - if not overwrite: - if outpath in os.listdir(IMG_DIR): - return - - response = requests.get(uri) - try: - img = Image.open(BytesIO(response.content)) - img = crop_and_resize(img) - img.save(IMG_DIR + outpath) - except: - print("Error processing image:", uri) - - -def run_image_processing(): - - projects = json.load(open(PROJECTS_DATA)) - for idx, project in enumerate(projects): - cid = project['bannerImg'] - if cid is None: - continue - uri = CID_HOST_URL + cid - print("Processing", project['name'], uri) - - process_image(uri, idx) - - -if __name__ == "__main__": - run_image_processing() \ No newline at end of file diff --git a/utils/gitcoin/GR18/requirements.txt b/utils/gitcoin/GR18/requirements.txt deleted file mode 100644 index f34fa1d..0000000 --- a/utils/gitcoin/GR18/requirements.txt +++ /dev/null @@ -1,9 +0,0 @@ -ens -openai -pandas -pillow -python-dotenv -re -requests -urllib3 -web3 \ No newline at end of file diff --git a/utils/gitcoin/GR18/workflow.sh b/utils/gitcoin/GR18/workflow.sh deleted file mode 100644 index 74f2e0b..0000000 --- a/utils/gitcoin/GR18/workflow.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash - -# get grant data and allowlists -python get_grants_data.py - -# resize and process images -python process_images.py - -# shorten project titles and descriptions -python ai_helper.py - -# upload to web3.storage -source .env -path="../../../node_modules/@web3-storage/web3-storage-quickstart/put-files.js" - -r=$(node $path --token="$WEB3_STORAGE_TOKEN" data/img/) -img_cid=$(echo "$r" | awk -F'CID: ' '{print $2}' | tr -d '\n') - -r=$(node $path --token="$WEB3_STORAGE_TOKEN" data/allowlists/) -allowlist_cid=$(echo "$r" | awk -F'CID: ' '{print $2}' | tr -d '\n') - -echo "{\"img\": \"$img_cid\", \"allowlists\": \"$allowlist_cid\"}" > data/cids.json - -# generate urls -python minting_urls.py \ No newline at end of file diff --git a/utils/gitcoin/get_projects_in_round.py b/utils/gitcoin/get_projects_in_round.py deleted file mode 100644 index 661f36c..0000000 --- a/utils/gitcoin/get_projects_in_round.py +++ /dev/null @@ -1,77 +0,0 @@ -import pandas as pd -import requests - -# https://github.com/gitcoinco/allo-indexer -CHAINSAUCE_URL = "https://indexer-grants-stack.gitcoin.co/data/" -START_TIME = 1690862400 # Aug 1, 2023 - - -def get_rounds(chain_num): - - round_url = "/".join([CHAINSAUCE_URL, chain_num, "rounds.json"]) - r = requests.get(round_url) - round_data = r.json() - - funding_round_data = [ - { - "roundId": r['id'], - "roundName": r['metadata']['name'], - } - for r in round_data - if int(r['roundStartTime']) >= START_TIME and r['votes'] > 10 - ] - - return funding_round_data - - -def get_projects(chain_num, funding_round_data): - - projects_data = {} - for funding_round in funding_round_data: - round_id = funding_round['roundId'] - round_name = funding_round['roundName'] - print(f"Gathering projects data for round: {round_name}...") - - url = "/".join([CHAINSAUCE_URL, chain_num, "rounds", round_id, "applications.json"]) - projects_json = requests.get(url).json() - - for project in projects_json: - - if project['status'] != "APPROVED": - continue - - projectId = project.get('id') - if projects_data.get(projectId): - projects_data[projectId]['fundingRounds'].append(round_name) - continue - - name = project['metadata']['application']['project']['title'] - address = project['metadata']['application']['recipient'] - - projects_data[projectId] = { - 'name': name, - 'address': address, - 'fundingRounds': [round_name], - 'chain': chain_num - } - print(f"Normalized data for project: {name}") - - print(f"Obtained {len(projects_data)} projects on Chain {chain_num}.") - - return projects_data - - -def get_all_projects_in_round(chain_nums): - projects_data = {} - for chain_id in chain_nums: - funding_round_data = get_rounds(chain_id) - projects_data.update(get_projects(chain_id, funding_round_data)) - - df = pd.DataFrame(projects_data).T - df.sort_values(by='name', inplace=True) - df.reset_index(inplace=True, drop=True) - df.to_csv("projects.csv") - - -if __name__ == "__main__": - get_all_projects_in_round(['10','424']) \ No newline at end of file diff --git a/utils/gitcoin/gitcoin-alpha/.env.example b/utils/gitcoin/gitcoin-alpha/.env.example deleted file mode 100644 index 665d646..0000000 --- a/utils/gitcoin/gitcoin-alpha/.env.example +++ /dev/null @@ -1,5 +0,0 @@ -ALCHEMY_KEY= -ETHERSCAN_KEY= -CHAINALYSIS_API_KEY= -THEGRAPH_API_KEY= -OPTIMISM_ETHERSCAN_API_KEY= diff --git a/utils/gitcoin/gitcoin-alpha/.gitignore b/utils/gitcoin/gitcoin-alpha/.gitignore deleted file mode 100644 index f342d92..0000000 --- a/utils/gitcoin/gitcoin-alpha/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -# ignore local storage artifacts -.env -__pycache__/ -.DS_Store -*.csv -*.png -*.sql -*.pickle -*.ipynb -.ipynb_checkpoints/ -data/project_urls.html diff --git a/utils/gitcoin/gitcoin-alpha/Dockerfile b/utils/gitcoin/gitcoin-alpha/Dockerfile deleted file mode 100644 index aa4b043..0000000 --- a/utils/gitcoin/gitcoin-alpha/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM python -CMD /bin/bash - -# Install dependencies -RUN mkdir -p /install/ -COPY requirements.txt /install/ -RUN pip install -r /install/requirements.txt diff --git a/utils/gitcoin/gitcoin-alpha/README.md b/utils/gitcoin/gitcoin-alpha/README.md deleted file mode 100644 index a594235..0000000 --- a/utils/gitcoin/gitcoin-alpha/README.md +++ /dev/null @@ -1,118 +0,0 @@ -# Gitcoin-Helpers - -Scripts which may be helpful when working with Gitcoin Data and Allo Protocol. Contributions welcome! - -# Setup - -1. Set environment variables in a `.env` file. You'll need the following API keys: - - - ALCHEMY_KEY - - ETHERSCAN_KEY - - CHAINALYSIS_API_KEY - - THEGRAPH_API_KEY - - OPTIMISM_ETHERSCAN_API_KEY - -2. Check you have installed the necessary requirements in `requirements.txt` - -3. Download the necessary Dune snapshots as CSV files and move them to the appopriate directory. - - - ETH Infra: https://dune.com/queries/1934656 - - Climate: https://dune.com/queries/1934689 - - OSS: https://dune.com/queries/1934969 - -4. Using the Dune datasets, configure `confg/projects-list.json` so there is an array containing the project title, address, and round details for each project. - - For example: - - ``` - { - "title": "Otterscan", - "address": "0xb7081Fd06E7039D198D10A8b72B824e60C1B1E16", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure" - }, - { - "title": "BuidlGuidl", - "address": "0x97843608a00e2bbc75ab0c1911387e002565dede", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure" - } - ``` - - Note that project "bundles" are stored in `bundles-list.json`. - -5. Review the other files in `config/*.json` to ensure that all directories, filenames, and other settings are correct. - -# Organization - -- `/data/csv`: snapshots of on-chain data taken using Dune Analytics and exported as CSV files (requires paid API); also includes work-scope overrides -- `/data/allowlists`: CSV files containing the addresses donating to each Gitcoin Grant (one CSV per project) that are eligible for hypercerts fractions (1 DAI = 1 hypercert fractional unit); to be stored on IPFS -- `/data/donorlists`: CSV files containing the addresses donating to each Gitcoin Grant (one CSV per project) -- `/data/images`: cropped and resized banner images for hypercert artwork; to be stored on IPFS -- `/data`: local versions of project data from Round Manager graphs; exports of relevant project data - -# Modules - -## get_grants_data.py - -This script queries The Graph API (using a Round ID and an API_KEY stored in `.env`) to gather data about all projects in a given round. It exports data on all the projects into a JSON file called `/data/graph-data.json`. Data is gathered from the mainnet subgraph and IPFS. - -## allowlist.py - -This script ingests a list of CSV files generated from Dune Analytics queries. It generates a unique allowlist (exported as a CSV file) for each project. An allowlist contains the following information: -| index | address | price | fractions | -| -------- | -------- | -------- | -------- | -| 0 | 0x... | 0.0 | 20 | -| 1 | 0x... | 0.0 | 15 | -| 99 | 0x... | 0.0 | 1 | - -The queries used to generate the allowlists can be viewed here: - -- ETH Infra: https://dune.com/queries/1934656 -- Climate: https://dune.com/queries/1934689 -- OSS: https://dune.com/queries/1934969 - -The `allowlist.py` module makes assumptions about how amounts donated to each project translate into hypercert fractions. The current assumptions award a fraction for every $1 donated using a `floor` function. For example: - -- $5.60 donated --> 5 fractions -- $5.20 donated --> 5 fractions -- $0.52 donated --> 0 fractions - -The `screen_allowlist.py` module utilizes the Chainalysis API to log and exclude any wallets that appear on sanctions lists. - -After running these script, the allowlists should be stored on IPFS and the CID should be updated in `config.json`. - -## serialize_project_data.py - -This script creates a `canonical-project-data.json` by parsing the `graph-data.json` file with information about each project. - -## serialize_address_data.py - -This script updates `canonical-project-data.json` by adding on-chain informationa bout each wallet, including ENS names, Safe multisigs, 0xSplits, and ETH tokens on Optimism. - -## serialize_hypercert_data.py - -This script reads project data and default assumptions for the grants round to create hypercert metadata for each project. This script also updates `canonical-project-data.json`. - -## process_images.py - -This script creates a local copy of each project's banner image and resizes it to the hypercert required dimensions. After running this script, the updated images should be stored on IPFS and the CID should be updated in `config.json`. - -## create_hypercert_minting_url.py - -This script converts `canonical-project-data.json` to urls used for populating the hypercert minting form. It also exports several tables in markdown, CSV, and HTML format to facilitate operations in `data/project_urls.*`. - -# Recommended workflow - -1. Complete the setup instructions and download the necessary CSV snapshots from Dune Analytics -2. Review each of the config files, including `/config/projects-list.json` to ensure that all projects are correctly listed for each round -3. Run `get_grants_data.py` to pull all the grant data from the round -4. Run `allowlist.py` to generate (and sanction screen) the allowlists -5. Bulk upload the allowlist CSVs to a web3.storage; copy the CID -6. Update the `allowlistBaseUrl` property in `config.json` with the new CID base -7. Run `serialize_project_data.py`, then `serialize_address_data.py`, and finally `serialize_hypercert_data.py` to prepare a complete version of `canonical-project-data.json` -8. Run `process_images.py` to resize and crop the banner images -9. Bulk upload the images to a web3.storage; copy the CID -10. Update the `bannerImageBaseUrl` property in `config.json` with the new CID base -11. Run `python create_hypercert_minting_url.py` -12. View the complete URL sets and datasets in `/data/project_urls.*` diff --git a/utils/gitcoin/gitcoin-alpha/allowlist.py b/utils/gitcoin/gitcoin-alpha/allowlist.py deleted file mode 100644 index 86af298..0000000 --- a/utils/gitcoin/gitcoin-alpha/allowlist.py +++ /dev/null @@ -1,94 +0,0 @@ -import json -import math -import os -import pandas as pd - -from utils import create_project_filename - - -CONFIG = json.load(open("config/config.json")) -ALLOWLIST_DIR = CONFIG["localPaths"]["allowlistDirectory"] -DONORLIST_DIR = CONFIG["localPaths"]["donorlistDirectory"] -DUNE_EXPORTS = CONFIG["localPaths"]["duneSnapshots"] -MULTISIG_DUMP = CONFIG["localPaths"]["multisigTransactionExport"] -MATCH_DONORS = CONFIG["localPaths"]["payoutExports"] - - -# Functions for assigning hypercert fractions based on contribution amounts - -def floor(amt, min_amt): - return int(math.floor(amt/min_amt)) - -def buffered_floor(amt, min_amt, buffer=.05): - amt = amt if amt > min_amt else amt * (1+buffer) - return int(math.floor(amt/min_amt)) - -def ceil(amt, min_amt): - return int(max(1, math.ceil(amt/min_amt))) - -def rounder(amt, min_amt): - return int(round(amt/min_amt,0)) - - -# Allow-listing modules - -def ingest_dune_export(csv_path): - - df = pd.read_csv(csv_path) - df['address'] = df['donor'].apply(lambda x: "0"+x[1:]) - df.drop(columns=['donor'], inplace=True) - df['source'] = csv_path - return df - - -def remove_duplicates(df): - counts = df['address'].value_counts() - dups = counts[counts>1].index - - dup_rows = (df['address'].isin(dups)) & (df['source'] == MULTISIG_DUMP) - return df[~dup_rows] - - -def prepare_allowlist(dataframe, project_title, min_usd, func): - - df = (dataframe - .query("title == @project_title") - .sort_values(by='usd', ascending=False) - .reset_index(drop=True) - .copy()) - - df = remove_duplicates(df) - df.index.name = 'index' - df['price'] = 0.0 - df['fractions'] = df['usd'].apply(lambda amt: func(amt, min_usd)) - - return df - - -def batch_create_allowlists(paths, min_usd, fraction_func): - - df = pd.concat([ingest_dune_export(f) for f in paths], axis=0) - - project_list = df['title'].unique() - - for project in project_list: - filename = create_project_filename(project) + ".csv" - - dff = prepare_allowlist(df, project, min_usd, fraction_func) - dff[['title', 'address', 'usd', 'fractions']].to_csv(f"{DONORLIST_DIR}{filename}") - - dfff = dff = dff[dff['fractions'] > 0] - dfff[['address', 'price', 'fractions']].to_csv(f"{ALLOWLIST_DIR}/{filename}") - - -def main(): - paths = DUNE_EXPORTS + [MULTISIG_DUMP, MATCH_DONORS] - batch_create_allowlists( - paths=paths, - min_usd=1, - fraction_func=buffered_floor - ) - - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/utils/gitcoin/gitcoin-alpha/check_multisigs.py b/utils/gitcoin/gitcoin-alpha/check_multisigs.py deleted file mode 100644 index 12544b5..0000000 --- a/utils/gitcoin/gitcoin-alpha/check_multisigs.py +++ /dev/null @@ -1,102 +0,0 @@ -import json -import pandas as pd - - -CONFIG = json.load(open("config/config.json")) -QF_EXPORTS = CONFIG["localPaths"]["qfData"] -MULTISIG_PATH = CONFIG["localPaths"]["duneMultisigsList"] -MULTISIG_DUMP = CONFIG["localPaths"]["multisigTransactionExport"] -MULTISIG_MAP = json.load(open(CONFIG["localPaths"]["multisigMapping"])) -PROJECTS = json.load(open("config/projects-list.json")) - -ETH_DAI_RATE = 1586 # close on January 31 - - -def convert_token(token, amount): - if token == 'ETH': - return amount * ETH_DAI_RATE - return amount - - -def ingest_qf_export(csv_path): - - # need to determine which round the project belongs to since there may - # be some wallet addresses shared by "unique" projects in multiple rounds - if "oss" in csv_path: - this_round = "Open Source Software" - elif "climate" in csv_path: - this_round = "Climate Solutions" - else: - this_round = "Ethereum Infrastructure" - - project_mapper = { - x["address"].lower(): x["title"] - for x in PROJECTS - if x["roundName"] == this_round - } - - df = pd.read_csv(csv_path) - df.rename(columns={'source_wallet': 'address'}, inplace=True) - df['address'] = df['address'].apply(lambda x: x.lower()) - df['usd'] = df.apply(lambda x: convert_token(x['token'], x['amount']), axis=1) - df['title'] = df['destination_wallet'].str.lower().map(project_mapper) - - gdf = (df - .groupby(['address', 'title'])['usd'].sum() - .reset_index() - .set_index('address')) - - return gdf - - -def split_multisigs(multisig_df): - data = [] - for m in MULTISIG_MAP: - current_address = m["address"].lower() - mapping = m["mapping"] - mdf = multisig_df[multisig_df["address"] == current_address] - for _, donation in mdf.iterrows(): - for (new_address, share_of_donation) in mapping.items(): - data.append({ - "donor": new_address.lower(), - "title": donation["title"], - "usd": donation["usd"] * share_of_donation - }) - new_df = pd.DataFrame(data).set_index("donor") - return new_df - - -def check_multisigs(paths): - - df = pd.concat([ingest_qf_export(f) for f in paths], axis=0) - - ms = pd.read_csv(MULTISIG_PATH) - multisig_list = set(ms['address'].str.lower()) - dff = df[df.index.isin(multisig_list)] - - print("Multisig analysis:") - print( - len(dff), - "wallets | ", - len(dff) / len(df) * 100, - "pct of all wallets" - ) - print( - "USD", - dff['usd'].sum(), - "donated | ", - dff['usd'].sum() / df['usd'].sum() * 100, - "pct of all donations" - ) - - split_df = split_multisigs(dff.reset_index()) - split_df.to_csv(MULTISIG_DUMP) - - - -def main(): - check_multisigs(paths=QF_EXPORTS) - - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/utils/gitcoin/gitcoin-alpha/config/bundles-list.json b/utils/gitcoin/gitcoin-alpha/config/bundles-list.json deleted file mode 100644 index 96606e5..0000000 --- a/utils/gitcoin/gitcoin-alpha/config/bundles-list.json +++ /dev/null @@ -1,62 +0,0 @@ -[ - { - "title": "Bundle: Agriculture", - "address": "0x78Dc08c6f14e26B2C91edAE9a6e03eed7Ae5218B", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions" - }, - { - "title": "Act Now Climate Change Bundle", - "address": "0x221966004b2001a0dA1274024d67cd09FEbD0b94", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions" - }, - { - "title": "Bundle \u26a1\ufe0f\u267b\ufe0fRenewable Energy", - "address": "0xFC148c92062Ae30D788d48031b89B45237f27AF7", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions" - }, - { - "title": "Bundle: Climate Research Alpha Round", - "address": "0x29C40842a76B0aa28865EbF7c916ec820233b7bB", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions" - }, - { - "title": "Bundle: Oceans & Forests", - "address": "0x48f2696FB6FAB7ac0956175b2E25B456E61B3FCf", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions" - }, - { - "title": "Bundle #3: Verification Infrastructure (Impact Certs, Measurement, Reporting & Verification (MRV) and Oracles)", - "address": "0xb0b0c51D98d3c49f7a5E61735db4f084d62954A1", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions" - }, - { - "title": "Bundle: Carbon Markets", - "address": "0xE07b0f3c2A669b656476e4D6A054F4922D539D3D", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions" - }, - { - "title": "Community Engagement - Bundle 6", - "address": "0x315E6c37077cC5772709Bb7fEcd6d7606b4443c4", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions" - }, - { - "title": "Bundle: Emerging Economies and Indigenous Communities", - "address": "0x4574e76CbB9891A90d46b0788cC4094B9275b61E", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions" - }, - { - "title": "Bundle: Creative Works", - "address": "0x2129fCc2baD30a0c7A448FE802265A14643092df", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions" - } -] diff --git a/utils/gitcoin/gitcoin-alpha/config/config.json b/utils/gitcoin/gitcoin-alpha/config/config.json deleted file mode 100644 index 70909ad..0000000 --- a/utils/gitcoin/gitcoin-alpha/config/config.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "version": "1.0.0", - "hypercertCreateUrl": "https://hypercerts.org/app/create/#", - "allowlistBaseUrl": "https://bafybeiah37sarihszhoe3mzydrqctinpust2hej2g2k34umqf3i4dwhpoy.ipfs.w3s.link/allowlists/", - "bannerImageBaseUrl": "https://bafybeifrnuuehyhnky3zwgwkxwjmpuzkmewj3hfvfzmyqjnycfevfom6tq.ipfs.w3s.link/images/", - "hostedCidBaseUrl": "https://cloudflare-ipfs.com/ipfs/", - "localPaths": { - "graphData": "data/graph-data.json", - "canonicalDataset": "data/canonical-project-data.json", - "exportsDirectory": "data/", - "donorlistDirectory": "data/donorlists/", - "allowlistDirectory": "data/allowlists/", - "imagesDirectory": "data/images/", - "duneSnapshots": [ - "data/csv/Donors_Climate.csv", - "data/csv/Donors_EthInfra.csv", - "data/csv/Donors_OSS.csv" - ], - "qfData": [ - "data/qf/climate_grant_votes.csv", - "data/qf/ethereum_grant_votes.csv", - "data/qf/oss_grant_votes.csv" - ], - "duneMultisigsList": "data/csv/Dune_SafeMultisigList.csv", - "workScopeOverrides": "data/csv/Notion_WorkscopeOverrides.csv", - "payoutData": "data/csv/Gitcoin Alpha Round - Matching Allocations - data.csv", - "payoutExports": "data/csv/Donors_MatchingPoools.csv", - "multisigMapping": "config/multisig-mapping.json", - "multisigTransactionExport": "data/csv/MultisigDonations.csv", - "bundleDataset": "data/climate-bundle-data.json", - "bundleProjectsDataset": "data/climate-bundle-project-data.json" - } -} diff --git a/utils/gitcoin/gitcoin-alpha/config/gitcoin-settings.json b/utils/gitcoin/gitcoin-alpha/config/gitcoin-settings.json deleted file mode 100644 index 073cdc7..0000000 --- a/utils/gitcoin/gitcoin-alpha/config/gitcoin-settings.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "defaultDims": { - "workTimeStart": 1663819200, - "workTimeEnd": 1673829248, - "impactScopes": "all", - "impactTimeEnd": 0, - "rights": "Public Display" - }, - "defaultArt": { - "banner": "bafkreifn5av7znw7c6fgwq7g5k4be56tutofdgqiatwm2edekewvdf5xqm", - "icon": "bafkreiejljnf6xf6kwcvh3wjef5xa3n7gscdumrmurmt4otkozbx5524r4" - }, - "properties": [ - { - "trait_type": "Funding Platform", - "value": "Gitcoin Grants" - }, - { - "trait_type": "Funding Round", - "value": "Alpha Round" - } - ], - "resources": { - "grantExplorerBaseUrl": "https://grant-explorer.gitcoin.co/#/round/1/", - "hostedCidBaseUrl": "https://gitcoin.mypinata.cloud/ipfs/", - "subgraphId": "BQXTJRLZi7NWGq5AXzQQxvYNa5i1HmqALEJwy3gGJHCr" - }, - "flags": { - "MULTISIG": "We detected that your project's Gitcoin payout address is a multisig. Unfortunately, multisig addresses will NOT work on Optimism. Please ensure that your project has a wallet or multisig that it controls on Optimism before minting your hypercert. It will also need a small amount of opETH to cover gas fees.", - "opETH": "We detected that your project's wallet address does not have any ETH on Optimism yet. You may need to bridge a small amount of ETH (eg 0.01) from Ethereum Mainnet to Optimism in order to cover the gas fees of minting a hypercert.", - "TITLE": "Review your hypercert's title and consider giving it something more descriptive.", - "LOGO": "Your Gitcoin Grant did not a logo image, so we've assigned you a default image. You can keep the default or add a link to a new logo image in the hypercert create form.", - "BANNER": "Your Gitcoin Grant did not a banner image, so we've assigned you a default image. You can keep the default or add a link to a new banner image in the hypercert create form.", - "DESCRIPTION": "The description in your Gitcoin Grant was over 500 characters, so we truncated it. You should prepare a shorter description about the work your project did leading up to Alpha Round to copy-paste into the hypercert create form." - } -} diff --git a/utils/gitcoin/gitcoin-alpha/config/multisig-mapping.json b/utils/gitcoin/gitcoin-alpha/config/multisig-mapping.json deleted file mode 100644 index 219878a..0000000 --- a/utils/gitcoin/gitcoin-alpha/config/multisig-mapping.json +++ /dev/null @@ -1,8 +0,0 @@ -[ - { - "address": "0xc8CB1D94d994805D6601257fB328A752aA74b536", - "mapping": { - "0xbd0531975D4D273e557E40856320304B39806AD8": 1.0 - } - } -] diff --git a/utils/gitcoin/gitcoin-alpha/config/projects-list.json b/utils/gitcoin/gitcoin-alpha/config/projects-list.json deleted file mode 100644 index 95a2fc8..0000000 --- a/utils/gitcoin/gitcoin-alpha/config/projects-list.json +++ /dev/null @@ -1,1115 +0,0 @@ -[ - { - "title": "Otterscan", - "address": "0xb7081Fd06E7039D198D10A8b72B824e60C1B1E16", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0x0cdbfe30f8bfea9a33a297e1812c0ff146d326a3afa5832e24dc941a2e415b8f" - }, - { - "title": "BuidlGuidl", - "address": "0x97843608a00e2bbc75ab0c1911387e002565dede", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0x2fa0c5a9ec73a08b88a971be79bc374f319f50588732a00e4018111196e89337" - }, - { - "title": "Ethereum on ARM", - "address": "0x7f06Ac71366631157551D97559b82975c293FdBa", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0x429927c3a14cbe156749adb31371f385749150ac3604513b24d0ddfb6e7b8b90" - }, - { - "title": "Chainlist", - "address": "0x08a3c2A819E3de7ACa384c798269B3Ce1CD0e437", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0x46de99c3a4e0542fde6d77bfa1ff6d19e107f253ea5254f7fdb59869b30e2b7a" - }, - { - "title": "L2BEAT", - "address": "0x6c5a2688c83C806150cA9DD0b2f10f16F8f1c33e", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0x4a8d8bb79a51a2b0e3d136c15b672ea87c9fd7dc5b0c3cd76674d5ebe4f7dac0" - }, - { - "title": "wagmi", - "address": "0x4557B18E779944BFE9d78A672452331C186a9f48", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0x50f3dbb23d121a397941e827ce2f10a0aea7f5cf311de6e3abcfe3847c56c405" - }, - { - "title": "Lighthouse by Sigma Prime", - "address": "0xC9a872868afA68BA937f65A1c5b4B252dAB15D85", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0x68bf035f1ecb5914aede9bcae5512d0f3efa2c9f4cd7e3c7a69c7cb5836418b4" - }, - { - "title": "Somer Esat Ethereum Staking Guides (Ubuntu)", - "address": "0x32B74B90407309F6637245292cd90347DE658A37", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0x6912f9b68921b6f227dfd5b321f38a531d73fe560c6d1055c01ed1c6b00d5ee1" - }, - { - "title": "rotki", - "address": "0x9531C059098e3d194fF87FebB587aB07B30B1306", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0x755e5c4d042c1245555075b699e774c2ed0f0f1499460201fc936a0595e91683" - }, - { - "title": "EthStaker", - "address": "0xD165df4296C85e780509fa1eace0150d945d49Fd", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0x76eabce511626d1d54bdae4770c3dc172bffca39ba53d82c27defe44ddb94cfa" - }, - { - "title": "Optimism DAppNode Package", - "address": "0xA47669cBc53985333423e4d3D00188f4049fB695", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0x218820f6e3edc6a007e830331ba1435144e4a5db5aff9a3f40025cc07371f087" - }, - { - "title": "smol-evm", - "address": "0xD41BDBD4101e02057b7F621f681540ef3Ac81e55", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0x7e9c8fa1694bdebd30515fb4ccebd4eb6a5a4f489228dab49a4e60af1c13a424" - }, - { - "title": "beaconcha.in", - "address": "0x9d4E94dB689Bc471E45b0a18B7BdA36FcCeC9c3b", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0x8eefdebc0d05e186432826739fca36c15ce59d940b8b37a2df5854e16168fd47" - }, - { - "title": "NiceNode: Run a node \u2014 just press start", - "address": "0x9cce47E9cF12C6147c9844adBB81fE85880c4df4", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0x99b81016d61f8b9115282b1055649d4876f38619759064b783478047ca61b714" - }, - { - "title": "PLUME: Pseudonymously Linked Unique Message Entities, aka Verifiably Deterministic Signatures on Ethereum", - "address": "0x23aDa6E6A9E9D4EcDDd185e3ec353163BCeeBF2a", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0x9cf538295b69125db2e7036df4bee5d9f40ce2966577064a1af58f60985d98a4" - }, - { - "title": "Stereum - Ethereum Node Setup", - "address": "0x6E41fe2F8303b89c9dbcCABE59A7F7f8F4312cA9", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0xaa09ef03fe5e4d9a0aa3d49a203ea8d1d89969e19cfe8af2135ecec38f035ae0" - }, - { - "title": "Lodestar", - "address": "0xc8F9f8C913d6fF031c65e3bF7c7a51Ad1f3a86E5", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0xb901109e1791c6a48f7315a198536a9e2211834e3fe4b47d48fde0528f118ae4" - }, - { - "title": "ethers.js", - "address": "0x8ba1f109551bD432803012645Ac136ddd64DBA72", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0xe0acd0898fada5b0a3f1a6a918858f39fdb7f8408f62a0f583afb70fe488022b" - }, - { - "title": "Ape Framework", - "address": "0x187089b65520D2208aB93FB471C4970c29eAf929", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0xe619c469f518291bc793096e0416512755edaee8cd66ce0c65ef286d73c6291f" - }, - { - "title": "Blockscout 2.0 - Premium Open-Source Block Explorer", - "address": "0x242ba6d68FfEb4a098B591B32d370F973FF882B7", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0xe9ff6b7f6d8ef7844830ef3506a8a2d06b1dcf567e3ae71ee0308f86a1db2a1e" - }, - { - "title": "Ethereum Magicians", - "address": "0xB35cD25e91B376EAfbA79AbE71D78814dEC3401a", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0xf1922b59f3eb4f496bf8b083d6bbfb3bac092119127a84e7c50eefa9461dc9ca" - }, - { - "title": "TrueBlocks and the Unchained Index", - "address": "0xf503017d7baf7fbc0fff7492b751025c6a78179b", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0xfb5b07f162ab081bf8608d275e9d595a331e0b36b2e445a9a67a2baad6195444" - }, - { - "title": "Solarpunk Nomads: building the first two Public Goods adventure vehicles", - "address": "0x474716e617FEa8898D4fa9D891AA67B5BEDd6C4b", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x0299d145933e3abc9bee2251589d080e0b12765e7e211e72e5209d0ac1889d33" - }, - { - "title": "ReFiDAO X Commons Stack: ReFi Commons Prize", - "address": "0x8D860D4f254eD45946F5FB0e3243C1db63a4ea2f", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x0d85d55a968bc9929c4f7ddfef2e6008b4ad8b77be65f7c08e89eab7cb760cc6" - }, - { - "title": "Atlantis", - "address": "0xfbCA78474A09E2BF3543f4Fc1037152ea2c6C32d", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x13fdb2715bc255356cf8f34ec8d40f3ffd0e2d38299b5533ee2c7772e2948e5b" - }, - { - "title": "BETTER", - "address": "0x0F7272F8873B68b2a2F52685311822D831afC8b4", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x21cf1e3113b6bc01f3bc0517be60f2bcf495ba9e6ba9be416ec0fb863c8c1ec7" - }, - { - "title": "ReFi Spring", - "address": "0x14CB60F6Aca2b2A68d975743baCb33F01f587da5", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x2971da13feca9a170191e5ee5850beb57acbab9f5850e96b50f5d2ab15a351f2" - }, - { - "title": "Bloom Network", - "address": "0xF64bBc221f89cc882fBa507908bbE4Ae3Ad2F470", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x29ebfa45b1d708eda13c20e04a999053361a809a89c48041ffe67890329aefd1" - }, - { - "title": ".basin - perpetual place-based climate & nature finance", - "address": "0xD2584c1CF7E3fF11957195732d380DC886F5f05b", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x2e4e97b9d9c36923cf2c1062f16c6cb83259c1e0b9a10ac466bf20cec9589ae1" - }, - { - "title": "Barichara Regeneration Fund \u2013 Prototyping a Bioregional Regenerative Economy", - "address": "0xFd9F8A0f4bdEaC72F08AF1c708023cC31dD2E3BE", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x329170e769ace967de0a1467dbeb2c3eaee2580099ccb9dc650452ab10216821" - }, - { - "title": "ReCommon", - "address": "0xd704C5F9826191F3Bd06caE867d0f20CAfA8AeBA", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x34da3ca2039af745fdf37add512a3cb5fdd7b7b0a5c95fd74877742b534222b3" - }, - { - "title": "dMeter", - "address": "0x788bd114C3f625600b547d5a08EC38E0ee90A06e", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x3f9ed1884e631b7684ab9421a7ad3b4b532308268bac91bdd772d483f0363131" - }, - { - "title": "The Solar Foundation", - "address": "0x5B625088Ee2E0E9E3D0BD8AB6Ba3839d68886d2D", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x42799cfce3b14376285e960875ef687cd7d1b32439a2ac3316304536f2c16509" - }, - { - "title": "Avano", - "address": "0x3C8281c8786ab29Bcab5B33566968f8011ea6A59", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x43655e0e22d8654df1d008ab61aa8170f3459124f87253b6a60e728138fb2f44" - }, - { - "title": "Endangered Tokens: Endangered Trees as ReFi Biodiversity Assets ", - "address": "0xCe849efC35A0a0a046E67c76B477c5432E4BA58b", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x49b116df324396ec3f9ff3fd3f6d9d1d50e1412f887316ca6152d1372af8ad36" - }, - { - "title": "Regens Unite: building public goods and a community to support all regens from web3 and beyond", - "address": "0x371ca2c8f1d02864c7306e5e5ed5dc6edf2dd19c", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x505b62acc15bf844c19bb19e8c6e24401f8c97c9efce376982e015003ea3354d" - }, - { - "title": "Saving forests in Colombia with KOKO DAO", - "address": "0x7f722b8b013Ac7Bd654B3B102Acc7573A32DB9bc", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x5c31eaad4f03c467e71bdc6edbc2360a014b2001045b0d583167544c032a8fde" - }, - { - "title": "Natives in Tech", - "address": "0x2DeE5D7e77A1212b21139Bc1d98B249DCc52055D", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x70d59317f7bfd1fb5b9a757c3f30f52f536ad7eb219504a5dc8e8414a2fcb66b" - }, - { - "title": "Shamba Ecological Oracle and DMRV Network", - "address": "0x86579EBcE57605929Da73d8cE17f40960c3b052a", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x7352c239d0dd8c39062300c7a507aed952f61908a44b0a0e146d8b6eec846e58" - }, - { - "title": "WaterDAO", - "address": "0xF427EbbEb0AeE1b06C99333001009188B5086934", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x78b858009ecfa46c866a7765cf0665699dd097eaadc3bdf9fc4f1f2229823bf5" - }, - { - "title": "ReSci Network", - "address": "0x9D120Bee68ed792884D340f911D8434306b28605", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x7c08d17ecd83e74334fa1bf2a0110224bced6b68ea852943f35641aa6f11469e" - }, - { - "title": "Kokonut Network", - "address": "0x0ea26051F7657d59418da186137141CeA90D0652", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x82c3e8a9200b9f87d9b025a8bb3f9fc6720a7c315773e0ec990915430529db51" - }, - { - "title": "The Impact App + Eco Labs", - "address": "0x59490C362C54C1b60158F19CE499C82aa3669820", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x84e5ecb55ea744764c11c1600cdaba725af5cd9bef1456cfb4f1b16069f3f6a7" - }, - { - "title": "Silvi", - "address": "0xa7CA400d49BBa87EB606ee05af93689BD21FaB99", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x9575cc4fc36454d4fd20fe68f980a72247e115363927b4ffba3a59f713f65351" - }, - { - "title": "$Earth - Solarpunk Dao", - "address": "0xd6b97e042d03EdBDc100Eb55fbE43Eb75f2e3036", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x9b8fd21ff33280aa6dddb9d073a527ab490b07fd3ebd91850b6b0f2065542af5" - }, - { - "title": "TaterDAO", - "address": "0xCbbd18d3aC27ab0FFfD04BCCd091B2802c92e0ca", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x9c9f6f054c70be233af788cafeb5073d41df5667a572819ce21b60f5424caff5" - }, - { - "title": "Astral Protocol", - "address": "0x41DdE2Dc7f718D5F764fc97e8d122864587642d4", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x9e8896090abff240885c74b27cd32f3917d2471e504e82db21e309360bbf2903" - }, - { - "title": "Impact DAOs Research + Podcast + Book : Impact DAO Media Season 2 ", - "address": "0xb6e780438882f2daa11dA0972807f4D12166af8b", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0xa35e52635d40be090a49c587e58fab7410c30b9cff7ad5cc66b547d88cb93200" - }, - { - "title": "CyberBox ReFi NFT Marketplace", - "address": "0x65eD9a7CD4890E23Ac5bc8D51498ae955aF00724", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0xa367f29625986a243fea7298958367a08679e748a57d3de6ae17a8a0317fef49" - }, - { - "title": "The CM Guild", - "address": "0x18ddbb6e344B11eeDff5A49fA0C0f1a03cc1097E", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0xa429920058b543ded8fc02ca3aa69a9353faf3f1346b7f1b39e7b5ae5bac3777" - }, - { - "title": "Treejer Protocol", - "address": "0x81c776d0D7F7d9D3699851993EcAa88A46187F11", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0xa8570318dc5eb4618cb030b0f06ea912302efedecf23d819710ae76ff9f238ad" - }, - { - "title": "AgroforestDAO", - "address": "0xdD866169DBCf639ed57f0020c5C9F4F4E1AAB263", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0xb63a68c4f785e348b96618bf48d466ffeabad13402f4f4ce93da66ede1cf3a98" - }, - { - "title": "MRV Foundation (previously MRV101)", - "address": "0x1b4463971582f485138879F0e509C160BeB8D5e6", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0xbd90cd76d77905c0600a5d21e5f8120ac756385175f1c2345efd88e2d39d4554" - }, - { - "title": "Hibiscus DAO", - "address": "0x1a6ef6cc28cf60aa0504cfb21cdffa48cfe3a8fb", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0xc3b35b0cb696ab824b9d2d0a515ffd79fc1cf3950442bc0ca91a3c6441cdfa7a" - }, - { - "title": "The Angry Teenagers - democratising investment in reforestation projects", - "address": "0x3460BF837B6741035d20Ea2D894A4423A859af12", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0xc8c5d94192210bb9b341f13bab13b64a04a893fd50fc554fd6661b6b58fd5360" - }, - { - "title": "Myseelia \ud83c\udf44", - "address": "0x16d46098e455A04Cf7F3e43c3b2706614fDbEC85", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0xcaa2f99f0e54943da441af228296cf621a7a1eab4949305785e51e342a5afd15" - }, - { - "title": "Carbon DAO", - "address": "0x035A1F3419DD223293e5411133d9C786f5885425", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0xdbcd05ba701119f00aafd0212c87aded137112a007f4cc56340dc9124515e329" - }, - { - "title": "Scaling Grassroots Commons for Local Regeneration in E. Africa and S. E. Asia", - "address": "0xd68e5b216FC2AF2854152EAC501F9E00807d8C1d", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0xdbce25d3279d12e5a6de4a541b1ccb6669e1271f53f180442b5c5d527ebd0f58" - }, - { - "title": "Earthist - Decentralize Hemp Seeds", - "address": "0xc2d706398A978b8c5Aa4EFCd824b57E978841107", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0xdfa4e3f6ae4072b9dee18452491dc0212ff00714b1d7469d6768ff0af8ad8444" - }, - { - "title": "LOA Labs : ReFi by South", - "address": "0xd2993E8217063c72BBE8c736404c7fC02adC9761", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0xe94883624f3bd962753c133346b353817cf0c2accec7259d3eb59219dd2761ba" - }, - { - "title": "Web3beach", - "address": "0xEFEdaf9c07E6eB56BB8F82f30018e4461B1c5F4c", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0xea014245840ff70f7c7060ed89882aa30b1da5246b7c4000b6a9e85930f97613" - }, - { - "title": "Plants And Pillars", - "address": "0x1C4a70EaDeCc48e436Efd0E997445D71DF57a4ED", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0xedd3049723764122bbed15c36557ab9c5057fded298af97b68dc226969cc3664" - }, - { - "title": "web3swift", - "address": "0x6A3738c6299f45c31697aceA647D49EdCC9C28A4", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x0d1d9c4e5785c2d5e3cb1df956dfec6cc3f3729d64cf53989653960e4a80e2df" - }, - { - "title": "Lenstube", - "address": "0x01d79BcEaEaaDfb8fD2F2f53005289CFcF483464", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x0f1d31d427400106f3d2958225dd235ae60b6a7572fb5155201b723e1ae79632" - }, - { - "title": "ECHO", - "address": "0xB67FD6f4B908d702c2CF0E2b9d30d52D4EA5B2bC", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x0f648ff5caf73611e70ebaaa9df9bf0dc81f5a633af3996672c6a5e44df791b1" - }, - { - "title": "Chaineye", - "address": "0xE6D7b9Fb31B93E542f57c7B6bfa0a5a48EfC9D0f", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x128a79c5f52d33bc49f5677dd0fcd695e44f22916b920dc3490c18f10099db66" - }, - { - "title": "UBI", - "address": "0x1D6cB99ff20223d730Ae5D4680EC5154B7FdAefe", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x1ceee39da9972d78ca42f37445a55a7252d549d58c4546f521766c7900753f48" - }, - { - "title": "White Hat DAO", - "address": "0x7bD7De26eBD064465Bb9c272513Bb3bcBdDb1E93", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x20632d089357836c07c38ae6a8b50449fa86c9eef6fd494afee9156474ce8d0c" - }, - { - "title": "devpill", - "address": "0xEee718c1e522ecB4b609265db7A83Ab48ea0B06f", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x2a42d7a39be87557896cdfde9b096df6cf49fdfad9e4949cea8c1b94fd364348" - }, - { - "title": "DefiLab.xyz", - "address": "0x9fe6764778db6AD5c5ED86242485d1a868a8c52A", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x2fc1f04d7ca2fe96643cd2f25bbb0cc3e67cc7de03ad54693040ea0d578a7699" - }, - { - "title": "Dweb Movement", - "address": "0x81Bbc5E83901CA95bb85e3D1916D04D434e7f2bD", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x33f99ab46fef5cc3e9dd080f68b059afcfe2608579d3476286a7eae6ad2bc938" - }, - { - "title": "Loanshark", - "address": "0x7D658841f8Ba93299970f6e765C2CE205f1E70DD", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x3b839e762e389f72b3c43b70aeb7bb5c43a3781feda8683c29d5ae4896c6166c" - }, - { - "title": "Optinames | ENS on Optimism", - "address": "0x1208a26FAa0F4AC65B42098419EB4dAA5e580AC6", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x3e4b3f7089aa5cb6614b67e235624d01364febe418419bc1b165e77d8589e5a2" - }, - { - "title": "Jolly Roger", - "address": "0xF0D7a8198D75e10517f035CF11b928e9E2aB20f4", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x42528ac5ae7f27b36de1e40649628a762a8746d07b1440c32d30ded000ff125c" - }, - { - "title": "0xDeadList", - "address": "0x799B774204A348E1182fE01074C51444bA70A149", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x43b94c544e8ac90c535752b8624e730820a5a752b361776cda996b40c5e2dbfc" - }, - { - "title": "DefiLlama", - "address": "0x08a3c2A819E3de7ACa384c798269B3Ce1CD0e437", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x46ddc886ac23d5bc2cbc96cd2aa990627bcd98c881a953070f94c15e03267707" - }, - { - "title": "LexDAO", - "address": "0x5a741ab878Bb65f6AE5506455FB555eaf3094B3F", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x49fd9097e9f5e67cc4b74c22972fc61f7656f6c9e63e93a3e6ce8fa2d82fb39e" - }, - { - "title": "ITU Blockchain", - "address": "0xBEC643BD5b7F5e9190617CA4187ef0455950C51C", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x4cd41869f9b2d95c05e2cb13643f1ab7ae05ebd439349c0024aeba44a249b1d8" - }, - { - "title": "Jolocom", - "address": "0xF3CF346DB5DAb30d73d272499CBAe6E6C0eE2C60", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x4dbc1f9c5c14a5765714e42b9d7384a43eff941394faa6fab4b1dd85dde55052" - }, - { - "title": "Lume Web", - "address": "0x63cd2C691632720Ff2ABDD0b6AABA2466D3Fe468", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x4e11571892e7edbb6aa03c8327aad0325faa2297559fbccc82ac93a369267948" - }, - { - "title": "Vocdoni", - "address": "0x74D8967e812de34702eCD3D453a44bf37440b10b", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x50356583bb0c943b4f40667525a63a2cbf23cf0c2ac3928f12fcbc9dac959016" - }, - { - "title": "Web3 OSS Libraries by DePay", - "address": "0x4e260bB2b25EC6F3A59B478fCDe5eD5B8D783B02", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x526dfc66cd504a06e7908438a4041aa473e73677492d91849f69f45fe81e160f" - }, - { - "title": "WTF Academy", - "address": "0x25df6DA2f4e5C178DdFF45038378C0b08E0Bce54", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x534b17d4d90d3721b24cab299dfe9c93dae7bbea9ca5af2292b4278989d7831a" - }, - { - "title": "eth.limo", - "address": "0xB352bB4E2A4f27683435f153A259f1B207218b1b", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x5f7d0b7bbd1a9ced352c05253be291d2d0e2d66d4744ee6712d67fd35d7c3747" - }, - { - "title": "The Future of Work is Decentralized", - "address": "0x0406Bf2dAE6A42d567b4e3DbA6ADA99069622fF1", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x60964adb4b2ea1db78bfd5edf4007328c459c1128d4596a6b81a09677b4e98d1" - }, - { - "title": "JediSwap", - "address": "0x18aa467E40E1deFB1956708830A343c1D01d3D7C", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x60c037f9dfa5daee0f07bc26fb73393ef924e36c73c41ea6bd58029e1724de36" - }, - { - "title": "CirclesUBI", - "address": "0xd525fF26F45f3B7D20cfEf170E2cb9E601A0b4dA", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x6579377403e6dedd052e60ec6281d9505db7e6119cc7669d04f17913245fab11" - }, - { - "title": "word block", - "address": "0x65a0Af703047dfDd270361659d02f4f0E8547202", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x6645c813734620e96c3915bc39abefefb682bbe6058353db8b99ce7235920804" - }, - { - "title": "StarkDeFi", - "address": "0x9D100F017095e53b24d81296BcA1D26742f1800F", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x67583b52562147ffe4d7b9c4422c6109d0d18a596c25355eea583e13e146224b" - }, - { - "title": "Malicious Contract Detector", - "address": "0xA3c2e3d65206deE0456416F8189de7CF4fccbB22", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x6853d9b86fb7e544d688ff111e1b4dd95636716635e58243bc883a17d4783c8d" - }, - { - "title": "ENS Spoofing Bot", - "address": "0x7b736FE138775D1fCD2CFE4E1D6158BfF3a2F28e", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x68a7e0b8472089e4c4db7167b630f0df2303784635126bb3fc82f02e9032055f" - }, - { - "title": "Krebit", - "address": "0xd6eeF6A4ceB9270776d6b388cFaBA62f5Bc3357f", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x68d7168d2ed92300f3c30b1b6c7d2c822ea71c24ec55e18d8777eb47ae998905" - }, - { - "title": "W3.work", - "address": "0x70B20209c83ec8D01e3c7F2ec77BDe7c40cDF2F6", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x7083c3a699944ea48bd0204eb74dfeac1414e90443a7e8efbafbcfffd3f01133" - }, - { - "title": "Esteroids - a community .eth websites search engine", - "address": "0x71c7252Cc1AfC181704ff7fDED27486f5cCd9205", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x718ead66c1598336d76118607afea7d152b63b087e52f5b9c1f81398e4c06235" - }, - { - "title": "Fileverse - file sharing & collaboration between addresses", - "address": "0x4aF147188bfE1c02D18D752eD5E473d8394F2300", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x76667ee469d4e3b8dcbca33d612ebd437cceb3ffc8aab8908a0e0f5fd94248c3" - }, - { - "title": "The MoonMath Manual to zk-SNARKs", - "address": "0xA8A4912938549d50EF3E7c698C890E18D73408Ee", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x79b218176d10d2bfacebaaaa267078d4f1b4e6865716863619a0ab257456fe47" - }, - { - "title": "Rings Network", - "address": "0xf7FeA1722F9b27B0666919A5664BaB486a4b18D3", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x7bb77e89022db7997754ef378a7e6f0270cba4eebaaa23d29cc00cc8510c8593" - }, - { - "title": "Soul Wallet", - "address": "0xFe97E32a873AA2f926FBfc560AbEEf01f753C128", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x8029c7cda58d70a6cd81ac56a6a678e8ccfb560f153eb86b1f5b5c3ca4566e82" - }, - { - "title": "The Science Commons Initiative", - "address": "0x3EcB9640ea6cC9bd9D5040713F854634Fd0FCf8a", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x816250172a2aef95d8221d37ea7cb8a7691112478e3e8ebf1a87934a8c419df4" - }, - { - "title": "Kredeum NFTs Factory", - "address": "0xBC0b437C95c7165F7d1F7C966cb2227DA52a27d7", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x89a0a4ae11c70d1fdb328d25d16c56c49949d679ae17c22b3858a4bfdf9712f7" - }, - { - "title": "Scam Sniffer", - "address": "0x79A9c3aEE79793c2873E6686C22EBf2311778C19", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x8b4c72d7b905fe5f514970024119ae06c4d97a5b1a1a31bfa3dc73b222aa370b" - }, - { - "title": "Proof of Humanity", - "address": "0x2AF4125c8fE208a349ef78d3cb980308ab1Ed34f", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x91db8779fa1b15d75761e358fe57683892c68d5cad11a4f9d19c468876d3c402" - }, - { - "title": "Lighthouse", - "address": "0x29b1d432a40f40F5418DA2d4ABf740e5E491629B", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x92abc70736a869d913735481b1dfacc6e53939dfed81d8d89590619878f9ee30" - }, - { - "title": "zkREPL", - "address": "0x5B3920527cfe207100312f4685E048ee032Fa391", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x958a27cbbf604752b32e4593aa7d3801d5de011248d5732360bccac67024ca85" - }, - { - "title": "Dapp-Learning", - "address": "0x35C6d9117F66943C881E8354138434b8a0727988", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x97d1779d1e478d5f58246af8c595cbf8f00aae86706524fc21b051bb20c002a9" - }, - { - "title": "Web3MQ", - "address": "0xA126F99e0DEFc3bFa963064314c4b1D54c872DCc", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x9b5419814f45cb2091991b0d2379f7db9d8ea17cecb6bc2117b26c6acfd6ce15" - }, - { - "title": "Voting Contracts", - "address": "0x5514f4a2BC7194664B12A48E238876Aa53140350", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x9ca823959474851a1e54a315cd1e78637c114d5f4dcf7db7ba0daacc263ad785" - }, - { - "title": "Seedle", - "address": "0x5c34386552091744717b1c0154b9d48d35f5f435", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x9e659b60cc9a7658c25b161d535ae6b1a66c309130962e5b95110c2f1c4f4746" - }, - { - "title": "Umbra", - "address": "0x57EA12A3A8E441f5FE7B1F3Af1121097b7d3B6A8", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x9fb5b0d0698dc64cbd3a01c5205ebc5ef609e7d20c21ce20ee2c73905a8309a0" - }, - { - "title": "Friends of Pooly", - "address": "0xC876bEC4e02EACc92df0F7b6EEee90c2aD794E50", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xa78a0c71a020745ba9199556d142f6878fe27638346977fe060a16927d250e3e" - }, - { - "title": "Starksheet", - "address": "0x7A0857D314f62d383341b4ED8FE380e7C98Fb978", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xa9956ceed5830e7f1c9e820c38453edc222265ff98e8592d25544464570266a1" - }, - { - "title": "minipent by pentacle", - "address": "0x8EFEF51d19EF3844C00076ab9d02847B9C70f94A", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xaa48be1f472efc5f5ee4d7f4fc1f2be1fbbc3507acd813dffdd322d9a4e8e6d5" - }, - { - "title": "Rouge Ticket", - "address": "0xEb439EED5642641968f9D8b52F2788e0F19B443B", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xad3348a8338210c5d7eca4187a0267507d9dd8683fe02d253c4a17a952c5ef3c" - }, - { - "title": "1Hive Gardens", - "address": "0x1B8C7f06F537711A7CAf6770051A43B4F3E69A7e", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xad56d803c2be49755c3e74705f1dbc6c03197fe10df1698bde59822fc89dea03" - }, - { - "title": "Punk Domains - Modular Web3 Names Protocol", - "address": "0x12e838f846ffdade34b2e006f84117a370d71687", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xae97e83e49806ee023655c5ce84bb7837c7ad4fab73129d6ac089a3d48bfe268" - }, - { - "title": "ETH Leaderboard", - "address": "0xD0AeA65bb96b823cb30724ee0a6B7588c77dE486", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xaedbc3eaef477409f3c3b5113f9674940e1dd80d4a783736607fdd9ab750c966" - }, - { - "title": "Geo Web", - "address": "0xDE798cD9C53F4806B9Cc7dD27aDf7c641540167c", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xaf455647fcbc71f77390600d31dfe88e9c347634916d9f740197ac09e6ebe820" - }, - { - "title": "Tally Ho! - Open Source and Community Owned Wallet", - "address": "0x99b36fDbC582D113aF36A21EBa06BFEAb7b9bE12", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xafb022ea11846bceb90516c35155defd6404e4948697cbfca25f5d34cf5321fb" - }, - { - "title": "IDriss - A more usable web3 for everyone \ud83d\udc9a", - "address": "0x531Eb60b2dDE9a841BA358EE033533AAF90D1feA", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xb6a332decc38c703130a537ce7fcfe5a24bd85e52e0769994bc752d04e182cca" - }, - { - "title": "Giveth", - "address": "0x4D9339dd97db55e3B9bCBE65dE39fF9c04d1C2cd", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xb746c0f648f9b930ea4568cf8741067a7fc7eb3928ac13cced8076212cf3cf37" - }, - { - "title": "LunCo: accelerating Lunar Colonization with opensource", - "address": "0xA64f2228cceC96076c82abb903021C33859082F8", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xb8a2970cb5c24a12cd631f757560b2c765a32bc1d48b010d8cd1f23cc645ea68" - }, - { - "title": "Blaine Bublitz - ETH/ZK Infrastructure & Ecosystem developer", - "address": "0x0E4d2ec48f03a9eD9068EeA2926dE34b6AB8646b", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xbab9b95ccf5784b8ba2a96627e10a71190820d2fee3c5034157c79e5945b77ab" - }, - { - "title": "Vyper Smart Contract Language", - "address": "0x70CCBE10F980d80b7eBaab7D2E3A73e87D67B775", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xbccb2617f0d5ddaf2d8d010d682575f679e73545ad74048dd8e20374ee3ff37a" - }, - { - "title": "Lenster", - "address": "0x3A5bd1E37b099aE3386D13947b6a90d97675e5e3", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xbe519f8c8f7ff2acb359dd757c5d2bf25b05d9fd29b8684885aa27f1fa487fcf" - }, - { - "title": "IDENA", - "address": "0x8917418aBe36E6E788068E96EF5A47d7484C06b1", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xc11f49e0d04bfd2eb724cf01aeab92bf2329568859d21fe3e3d72741be73d4b4" - }, - { - "title": "ZeroPool", - "address": "0x947F8A49640B4770A8c7fE3C1E69FfC974295448", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xc290dd8e51ac35480d9872ce4484aac23bb812c47c0567bfd4beb9113726ed11" - }, - { - "title": "vfat.tools", - "address": "0xeF0Ca09fbf9a5f61E657Fb208b46b8685c1d4766", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xc5b3ff259773efe69ed973d346afa656a1a6195bc7156098d2e7fc3ede11cf44" - }, - { - "title": "Spect", - "address": "0x55B23ed53Fe13060183b92979c737A8eF9A73b73", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xb701f16a30a2ed49d7820ad83352ee1c048b2bff81a1d9734cdd7a27708c72c6" - }, - { - "title": "BanklessDAO Projects", - "address": "0xf26d1Bb347a59F6C283C53156519cC1B1ABacA51", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xc87ab7d2537f30cbf929f26a9ac8d760411a56f129fb9c6e2cbd3529f136a010" - }, - { - "title": "Pepemon: Degen Battleground", - "address": "0xB614B1464c561EB2fD0d7d3475feB52B5a34dEc0", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xc8fca067d1ecb57b625e640263d153190fe1258c34e8a4ae85396fe502fd6164" - }, - { - "title": "CryptoStats", - "address": "0x69aa21403244889832609963B0028e337a834953", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xc99a1b5395a53118fcd4be537cb89c6f4ed5e98d6e00211cf7c31fbb14b882e2" - }, - { - "title": "POAPin", - "address": "0x5Afc7720b161788f9D833555b7EbC3274FD98Da1", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xcc6d33fe291d0fafb19cf8b833dc27d2f469fac52e3cc1f050ca4a0d83d66c74" - }, - { - "title": "Relay", - "address": "0x0cb27e883E207905AD2A94F9B6eF0C7A99223C37", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xd1b13c5816a63928dfce0aa47bdc3262a1bdf2eec24800b465b1fd3ddee2f2af" - }, - { - "title": "Gitcoin China Ecosystem Development", - "address": "0x521aacB43d89E1b8FFD64d9eF76B0a1074dEdaF8", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xd3bd2111f80027d538cc252a13afacad8eb0b1565a58d0655eda3b718b88e767" - }, - { - "title": "Faster API for resolving ENS names and avatars for web3 projects", - "address": "0xC9C022FCFebE730710aE93CA9247c5Ec9d9236d0", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xd58acf63d9a2800eca8752855dd9da3214f67a4321a3a40a6355f5ea3ca2f2a6" - }, - { - "title": "ETHRank - The open source achievement system for every Ethereum address", - "address": "0x0D538d6253Eb5CeBaEf94a873a7d3DF22D6F936c", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xd8e0de535ba58db6a7226c577a7f8f51afaa8461a026bfe7ab9ba3a32e83e344" - }, - { - "title": "Inverter Network - Fund and build in web 3 with ease", - "address": "0x10666d9c6295E838d3b8B84ffcC97d62EF7e6120", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xdbcfdc1e2ba83ed0c8d392a3abcd107bdff361f345e011e052366a7be05b37a3" - }, - { - "title": "Zero Knowledge Podcast", - "address": "0x0b0E6486648FBBb8E9ab33e3ae9D0B44B6faa701", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xdce910ac23823b6f29196e90eda26ad6fb42e7726a49a7affe24b4780eaf6c80" - }, - { - "title": "datalatte", - "address": "0x690315449eFad5f8B06a356f16eecFC41F475F70", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xdeffc2d190ddec88d06ba86e1eb09abe5a9ccb49ab1dc1a6005ebd7afae0489f" - }, - { - "title": "Electronic Frontier Foundation", - "address": "0x640C28441f9e73537C63576A0D6f44643a577E32", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xe1ae0696ac9550ffde401be8421f3ed3fc89d8c2a672797263be1d32dfe5eb43" - }, - { - "title": "Nimi.eth", - "address": "0xdE81d67Af572EC0F22841da702C1EdC25608dBBB", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xe2f4ea6f46ef9d67818f71b8c40403b8528768af11f7fe0c2d10cd2afe21de62" - }, - { - "title": "Commons Stack", - "address": "0x8110d1D04ac316fdCACe8f24fD60C86b810AB15A", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xe6424ab2ed95b21ba758a64a72e3a4583a01cad6b12419420ae7286c70ecae83" - }, - { - "title": "Optinames | ENS on Optimism", - "address": "0x1208a26FAa0F4AC65B42098419EB4dAA5e580AC6", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x3e4b3f7089aa5cb6614b67e235624d01364febe418419bc1b165e77d8589e5a2" - }, - { - "title": "BrightID \ud83d\udd06 Universal Proof of Uniqueness", - "address": "0x4B8810b079eb22ecF2D1f75E08E0AbbD6fD87dbF", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xe9dfc4da2e9fbcf33042b9c978322967e52985162659fa8a0627bc8573cbbb59" - }, - { - "title": "Revoke.cash - Helping you stay safe in web3", - "address": "0xe126b3E5d052f1F575828f61fEBA4f4f2603652a", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xf05829c76e3da92a8942378240ab4dc70c8c509f558eca9b0621c61054e9342c" - }, - { - "title": "MetaMail", - "address": "0x3806a85D9b8E017d2714B5a240f3e7737279a3Ba", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xf22becdb87631f44c3cf5839e471811ed21c4200324cc9e5e16771703d03e819" - }, - { - "title": "OpSci Society: The Open Science DAO", - "address": "0x33359285F30E7B3386dE70ca500F4fe27853765B", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xf315ffb4e59dd53cdd1d0d14e03e756a7d9f6abbec449b1d577993c1cbb2277a" - }, - { - "title": "Upala \ud83e\udd16 Price-of-forgery digital identity", - "address": "0x0230c6dD5DB1d3F871386A3CE1A5a836b2590044", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xf84c0ab44e4012f6f20be3e08fe0a775835df0c091fdf0fa9e0a20ca6e0de53f" - }, - { - "title": "DeFi & Web3 Developer Roadmap", - "address": "0xB25C5E8fA1E53eEb9bE3421C59F6A66B786ED77A", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xb6c349a5461b888f265c039d0081fdff98cab0bd51a31458437acdacc117b237" - }, - { - "title": "Bundle: Agriculture", - "address": "0x78Dc08c6f14e26B2C91edAE9a6e03eed7Ae5218B", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x0b84bfa1e358e2c7816e5244258c16e4d6d06930fb4cf20f2d714ce35d330308" - }, - { - "title": "Act Now Climate Change Bundle", - "address": "0x221966004b2001a0dA1274024d67cd09FEbD0b94", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x42c5410440da06b29d782ee691783aad21d76b0de61c1034432f816af89aa57f" - }, - { - "title": "Bundle \u26a1\ufe0f\u267b\ufe0fRenewable Energy", - "address": "0xFC148c92062Ae30D788d48031b89B45237f27AF7", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x52f41f0f49803ae47f13977a8a5dd1b170348e82e2d59303861efb83d1413b50" - }, - { - "title": "Bundle: Climate Research Alpha Round", - "address": "0x29C40842a76B0aa28865EbF7c916ec820233b7bB", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x5b82b9d0cb3d0d14c8fe693502b197cfbc0f55115446632448549da20538c96c" - }, - { - "title": "Bundle: Oceans & Forests", - "address": "0x48f2696FB6FAB7ac0956175b2E25B456E61B3FCf", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x89c4fbe0d97ba25cba17b36c837c27cb7b39c96ccc8b43a99df2dfaca9732763" - }, - { - "title": "Bundle #3: Verification Infrastructure (Impact Certs, Measurement, Reporting & Verification (MRV) and Oracles)", - "address": "0xb0b0c51D98d3c49f7a5E61735db4f084d62954A1", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x95adaaef6d0a11b862f47a236bbca9d93dcfe35d1ae044edc0223d5485e1bfbb" - }, - { - "title": "Bundle: Carbon Markets", - "address": "0xE07b0f3c2A669b656476e4D6A054F4922D539D3D", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0xd716c3a7c353f0458ff8387fb435606934e25b631a83db017e5eb9a0022358f0" - }, - { - "title": "Community Engagement - Bundle 6", - "address": "0x315E6c37077cC5772709Bb7fEcd6d7606b4443c4", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0xe8017af6c0a19b08c86e8ef94d9b3dadcbe8f55bc446d7359a6f294d68227b84" - }, - { - "title": "Bundle: Emerging Economies and Indigenous Communities", - "address": "0x4574e76CbB9891A90d46b0788cC4094B9275b61E", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0xedc8c2863195c102234eb522c94568c4aabd91d4eb2df52d2c4dc9f953e01295" - }, - { - "title": "Bundle: Creative Works", - "address": "0x2129fCc2baD30a0c7A448FE802265A14643092df", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0xf39a20c932f2445f48214e8726d305bac89d54b3c99940d601a168e2b8745014" - } -] diff --git a/utils/gitcoin/gitcoin-alpha/config/rounds-list.json b/utils/gitcoin/gitcoin-alpha/config/rounds-list.json deleted file mode 100644 index 759b55c..0000000 --- a/utils/gitcoin/gitcoin-alpha/config/rounds-list.json +++ /dev/null @@ -1,30 +0,0 @@ -[ - { - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "backgroundColor": "green", - "backgroundVectorArt": "circles", - "matchPoolSize": 333333.33, - "matchPoolDonors": [ - { "0xE25C73435702fED11E9C5584cE6EFE7CbFf71739": 0.8 }, - { "0xB2b6B480c1c4891278CE2BF627F0C750c21e0908": 0.1 }, - { "0xC5BFCe27e0e7A7d7731bC23B92eBC62B9Ed63B83": 0.1 } - ] - }, - { - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "backgroundColor": "blue", - "backgroundVectorArt": "contours", - "matchPoolSize": 333333.33, - "matchPoolDonors": [{ "0xC5BFCe27e0e7A7d7731bC23B92eBC62B9Ed63B83": 1.0 }] - }, - { - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "backgroundColor": "purple", - "backgroundVectorArt": "octagonals", - "matchPoolSize": 333333.33, - "matchPoolDonors": [{ "0xC5BFCe27e0e7A7d7731bC23B92eBC62B9Ed63B83": 1.0 }] - } -] diff --git a/utils/gitcoin/gitcoin-alpha/create_hypercert_minting_urls.py b/utils/gitcoin/gitcoin-alpha/create_hypercert_minting_urls.py deleted file mode 100644 index 6e57121..0000000 --- a/utils/gitcoin/gitcoin-alpha/create_hypercert_minting_urls.py +++ /dev/null @@ -1,319 +0,0 @@ -import csv -from dotenv import load_dotenv -import json -import os -import requests -import urllib.parse - -from utils import create_project_filename - - -load_dotenv() -CUTTLY_API = os.environ['CUTTLY_API'] - -CONFIG = json.load(open("config/config.json")) -SETTINGS = json.load(open("config/gitcoin-settings.json")) -JSONDATA_PATH = CONFIG["localPaths"]["canonicalDataset"] -PROJECTS_DB = sorted(json.load(open(JSONDATA_PATH)), key=lambda d: d['roundName']) - -EXPORTS_DIR = CONFIG["localPaths"]["exportsDirectory"] -LOGO_IMG_BASE = SETTINGS["resources"]["hostedCidBaseUrl"] -BACKUP_LOGO_CID = SETTINGS["defaultArt"]["icon"] -BACKUP_BANNER_CID = SETTINGS["defaultArt"]["banner"] -FLAGS = SETTINGS["flags"] -ALLOWLISTS_BASE = CONFIG["allowlistBaseUrl"] -BANNER_IMG_BASE = CONFIG["bannerImageBaseUrl"] -DAPP_BASE_URL = CONFIG["hypercertCreateUrl"] -ERC1155_PROPS = SETTINGS["properties"] - -ROUNDS = json.load(open("config/rounds-list.json")) -ROUND_MAPPINGS = {r["roundId"]: r for r in ROUNDS} - -BUNDLES_DATA = json.load(open(CONFIG["localPaths"]["bundleProjectsDataset"])) - -MAXLEN_DESCR = 500 -SHORTEN_URL = False - - -def url_parse(val): - return urllib.parse.quote(val, safe='') - - -def safe_url_attr(name, value): - parser = lambda k,v: url_parse(k) + '=' + url_parse(v) - if isinstance(value, list): - url_field = "&".join([parser(f"{name}[{i}]", x) for (i, x) in enumerate(value)]) - else: - url_field = parser(name, value) - return url_field - - -def shorten_url(url): - - userDomain = '1' - base_url = 'http://cutt.ly/api/api.php?key={}&short={}' - r = requests.get(base_url.format(CUTTLY_API, url)) - short_url = json.loads(r.text)['url']['shortLink'] - return(short_url) - - -def edit_description(text): - blobs = text.split("\n") - if len(blobs) == 1: - return text[:MAXLEN_DESCR] - new_text = blobs[0] - idx = 1 - while len(new_text) <= MAXLEN_DESCR and idx < len(blobs): - new_text = "\n".join([new_text, blobs[idx]]) - idx += 1 - return new_text - - -def create_url(project, short_url=SHORTEN_URL): - - name = project['title'] - filename = create_project_filename(name) - logo_cid = project["projectLogoCid"] if project["projectLogoCid"] else BACKUP_LOGO_CID - round_id = project['roundId'] - round_data = ROUND_MAPPINGS[round_id] - properties = ERC1155_PROPS.copy() - properties.append({'trait_type': 'Matching Pool', 'value': project['roundName']}) - params = dict( - name = name, - **project['hypercertData'], - description = edit_description(project['projectDescription']), - externalLink = project["projectWebsite"], - logoUrl = LOGO_IMG_BASE + logo_cid, - bannerUrl = "".join([BANNER_IMG_BASE, filename, ".png"]), - allowlistUrl = "".join([ALLOWLISTS_BASE, filename, ".csv"]), - metadataProperties = json.dumps(properties), - backgroundColor = round_data['backgroundColor'], - backgroundVectorArt = round_data['backgroundVectorArt'], - ) - params = "&".join([safe_url_attr(k,v) for (k,v) in params.items()]) - url = DAPP_BASE_URL + params - - if short_url: - url = shorten_url(url) - - return url - - -def create_bundle_project_url(project, short_url=SHORTEN_URL): - - name = project['title'] - filename = create_project_filename(name) - logo_cid = BACKUP_LOGO_CID - round_id = project['roundId'] - round_data = ROUND_MAPPINGS[round_id] - properties = ERC1155_PROPS.copy() - properties.append({'trait_type': 'Matching Pool', 'value': 'Climate Solutions (Bundles)'}) - params = dict( - name = name, - **project['hypercertData'], - description = edit_description(project['projectDescription']), - externalLink = project["projectWebsite"], - logoUrl = LOGO_IMG_BASE + BACKUP_LOGO_CID, - bannerUrl = LOGO_IMG_BASE + BACKUP_BANNER_CID, - allowlistUrl = "".join([ALLOWLISTS_BASE, filename, ".csv"]), - metadataProperties = json.dumps(properties), - backgroundColor = round_data['backgroundColor'], - backgroundVectorArt = round_data['backgroundVectorArt'], - ) - params = "&".join([safe_url_attr(k,v) for (k,v) in params.items()]) - url = DAPP_BASE_URL + params - - if short_url: - url = shorten_url(url) - - return url - - -def create_markdown_row(project): - - name = project['title'] - filename = create_project_filename(name) - allowlist_csv = "".join([ALLOWLISTS_BASE, filename, ".csv"]) - minting_url = create_url(project) - - if len(project['projectDescription']) >= MAXLEN_DESCR: - flag = f"Description length" - else: - flag = "" - - return "|".join([ - name.replace("|","∙"), - f"[Hypercert]({minting_url})", - f"{project['fractionsTotalSupply']}", - flag - ]) - - -def create_markdown_export(): - - md_filename = EXPORTS_DIR + "project_urls.md" - with open(md_filename, 'w') as f: - - matching_pool = "" - for project in PROJECTS_DB: - if matching_pool != project['roundName']: - matching_pool = project['roundName'] - f.write(f"\n\n# {matching_pool}\n") - f.write("| Project | Project Links | Fractions | Flags |\n") - f.write("| ------- | ------------- | --------- | ----- |\n") - - markdown = create_markdown_row(project) - f.write(f"|{markdown}|\n") - - f.close() - - -def add_csv_flags(project, json_data): - """ - Adds flags to a CSV export for CRM'ing with projects - See `config/gitcoin-settings.json` for list of flags. - """ - flags = [] - if project['addressType'] != 'EOA': - flags.append("MULTISIG") - elif project['optimismBalanceEth'] == 0: - flags.append("opETH") - if project['workscope'] == project['title']: - flags.append("TITLE") - if not json_data['projectLogoCid']: - flags.append("LOGO") - if not json_data['projectBannerCid']: - flags.append("BANNER") - if project['flagDescription']: - flags.append("DESCRIPTION") - if flags: - return "\n".join([ - f"{num+1}. {flag}: {FLAGS.get(flag)}" - for (num,flag) in enumerate(flags) - ]) - - -def create_csv_export(): - - csv_filename = EXPORTS_DIR + "project_urls.csv" - with open(csv_filename, 'w') as f: - - writer = csv.writer(f) - cols = ['title', 'roundName', 'mintingUrl', 'address', 'ensName', 'addressType', 'optimismBalanceEth', - 'fundingTotalDollars', 'donorsTotal', 'fractionsTotalSupply', 'hypercertEligibleDonors', - 'flagDescription', 'workscope', 'flags', - 'projectWebsite', 'projectTwitter', 'projectGithub', 'userGithub'] - writer.writerow(cols) - - for project in PROJECTS_DB: - p = project.copy() - p['mintingUrl'] = create_url(project) - p['address'] = "https://etherscan.io/address/" + project['address'] - p['optimismBalanceEth'] = p['addressScan'].get("optimismBalanceEth") - p['flagDescription'] = (len(p['projectDescription']) != len(edit_description(p['projectDescription']))) - p['workscope'] = p['hypercertData']['workScopes'] - p['flags'] = add_csv_flags(p, project) - if "bundle" not in p["title"].lower(): - writer.writerow([p[c] for c in cols]) - - f.close() - - -def create_bundle_csv_export(): - - csv_filename = EXPORTS_DIR + "bundle_project_urls.csv" - - with open(csv_filename, 'w') as f: - - writer = csv.writer(f) - cols = ['title', 'bundles', 'twitter', 'mintingUrl'] - writer.writerow(cols) - - for project in BUNDLES_DATA: - p = project.copy() - p['mintingUrl'] = create_bundle_project_url(project) - url = p['projectWebsite'] - if "twitter" in url: - p['twitter'] = url - else: - p['twitter'] = "" - p['bundles'] = p['hypercertData']['workScopes'] - writer.writerow([p[c] for c in cols]) - - f.close() - - -def create_html_export(): - - header = ''' - - - - - - - - - - - - - - - - - - ''' - - footer = "
RoundProjectLogoBannerHypercert URLFractionsProject Wallet AddressWallet Type
" - - td = lambda row: f"{row}" - body = [] - - for project in PROJECTS_DB: - - grantName = project['title'] - filename = create_project_filename(grantName) - grantPage = project['projectWebsite'] - logo_cid = project["projectLogoCid"] if project["projectLogoCid"] else BACKUP_LOGO_CID - logo = LOGO_IMG_BASE + logo_cid - banner = "".join([BANNER_IMG_BASE, filename, ".png"]) - url = create_url(project, short_url=False) - - address = project['address'] - row = "\n".join([ - "", - td(project['roundName']), - td(f'{grantName}'), - td(f''), - td(f'Hypercert URL'), - td(project['fractionsTotalSupply']), - td(f'{address[:5]}...{address[-3:]}'), - td(project['addressType']), - "" - ]) - body.append(row) - - html = header + "\n".join(body) + footer - html_filename = EXPORTS_DIR + "project_urls.html" - with open(html_filename, "w") as f: - f.write(html) - - -if __name__ == "__main__": - #create_markdown_export() - create_csv_export() - create_html_export() - create_bundle_csv_export() \ No newline at end of file diff --git a/utils/gitcoin/gitcoin-alpha/data/allowlists/README.md b/utils/gitcoin/gitcoin-alpha/data/allowlists/README.md deleted file mode 100644 index 6d57347..0000000 --- a/utils/gitcoin/gitcoin-alpha/data/allowlists/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Allowlist Data - -Directory for allowlist CSV files generated by `allowlist.py`. - -This directory should contain one CSV file per project. - -A copy of the CSV files should also be stored on IPFS. diff --git a/utils/gitcoin/gitcoin-alpha/data/canonical-project-data.json b/utils/gitcoin/gitcoin-alpha/data/canonical-project-data.json deleted file mode 100644 index 201f547..0000000 --- a/utils/gitcoin/gitcoin-alpha/data/canonical-project-data.json +++ /dev/null @@ -1,5810 +0,0 @@ -[ - { - "title": "Otterscan", - "address": "0xb7081Fd06E7039D198D10A8b72B824e60C1B1E16", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0x0cdbfe30f8bfea9a33a297e1812c0ff146d326a3afa5832e24dc941a2e415b8f", - "projectDescription": "Otterscan is an open-source, fast, local, laptop-friendly Ethereum block explorer", - "projectWebsite": "https://otterscan.io", - "projectLogoCid": "bafybeigoyezwswvwbedbf4b2gsr66tl5vfq5qdfiq3huwsivp37qmwd5ce", - "projectBannerCid": "bafybeidh22fvqahrapg4j5nuzkmsox3nrcghgqdkjn6zdvvaswaglh3b34", - "projectTwitter": "otterscan", - "projectGithub": null, - "userGithub": "wmitsuda", - "fundingTotalDollars": 14597, - "donorsTotal": 725, - "fractionsTotalSupply": 14402, - "hypercertEligibleDonors": 618, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "Otterscan", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0xb7081Fd06E7039D198D10A8b72B824e60C1B1E16", - "rights": ["Public Display"] - } - }, - { - "title": "BuidlGuidl", - "address": "0x97843608a00e2bbc75ab0c1911387e002565dede", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0x2fa0c5a9ec73a08b88a971be79bc374f319f50588732a00e4018111196e89337", - "projectDescription": "A curated group of Ethereum builders creating products, prototypes, and tutorials to enrich the web3 ecosystem.", - "projectWebsite": "https://BuidlGuidl.com", - "projectLogoCid": "bafkreigwapqamrot3qlayerrra22ud3jzoc6w7y7qttbelj3hp3psltp54", - "projectBannerCid": "bafkreiftoy6owlsffsd2pkgmtzdltgixbbuberr25yb3omu5j5ym3wxrhm", - "projectTwitter": "buidlguidl", - "projectGithub": "BuidlGuidl", - "userGithub": null, - "fundingTotalDollars": 14706, - "donorsTotal": 690, - "fractionsTotalSupply": 14513, - "hypercertEligibleDonors": 579, - "ensName": "buidlguidl.eth", - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0x60Ca282757BA67f3aDbF21F3ba2eBe4Ab3eb01fc": "adamfuller.eth", - "0xa81a6a910FeD20374361B35C451a4a44F86CeD46": "signer.buidlguidl.eth", - "0x221CAB7Fedb291e8ADA476Abe8195C04c9c0f825": "austingriffith.argent.xyz", - "0x97843608a00e2bbc75ab0C1911387E002565DEDE": "buidlguidl.eth", - "0x34aA3F359A9D614239015126635CE7732c18fDF3": "austingriffith.eth" - }, - "safeUsers": { - "signer.buidlguidl.eth": 0.68, - "austingriffith.eth": 0.27, - "0x97843608a00e2bbc75ab0C1911387E002565DEDE": 0.01, - "adamfuller.eth": 0.01 - } - }, - "hypercertData": { - "workScopes": "BuidlGuidl", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "buidlguidl.eth", - "rights": ["Public Display"] - } - }, - { - "title": "Ethereum on ARM", - "address": "0x7f06Ac71366631157551D97559b82975c293FdBa", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0x429927c3a14cbe156749adb31371f385749150ac3604513b24d0ddfb6e7b8b90", - "projectDescription": "Help us to build a <$400 PnP Ethereum full/archive/staking node based on ARM boads that uses only ~10 watts of power to run.\n\nEthereum on ARM provides a PnP Ubuntu server image for the Rock 5B and the Raspberry Pi 4 that run both Execution and Consensus clients as a Systemd service and automatically turns the device into a full Ethereum EL+CL node or a home staking box.\n\nThis is what we've been at these last months (thanks to your contributions): \n\n- Support and include more Ethereum clients. Current list: Geth, Erigon, Besu, Nethermind, Prysm, Nimbus, Teku and Lighthouse\n- Testing and releasing an image for the Radxa Rock 5B device\n- Updating the documentation and translating to Spanish\n- Research and include other blockchain components in the image: IPFS, Swarm, Status, StarkNet\n- Research on Layer 2 solutions such as Polygon and Arbitrum\n- RISC V: Continue to research and try to run an node on this architecture. Wouldn\u2019t It be great to run an Ethereum node on Open Hardware?.\n\nOther info:\n\nWe are running a $365 Ethereum stake device with 3 validators using 10 watts \n\t\t\thttps://twitter.com/EthereumOnARM/status/1597889744821944320\n\nThanks for your donations and support. \n\nOur repository\n\nhttps://github.com/diglos/ethereumonarm\n\nDocumentation page\n\nhttps://ethereum-on-arm-documentation.readthedocs.io\n\nDiscord Channel\n\nhttps://t.co/LvKzLMSXlZ\n\nCheck our twitter account for updates\n\nhttps://twitter.com/EthereumOnARM\n\nEthereum on ARM is An EOA Blockchain Labs, S.L. company project.", - "projectWebsite": "https://ethereum-on-arm-documentation.readthedocs.io/", - "projectLogoCid": "bafkreiggxot2tb7ise574vc2br225z2cenov25sgbm5e5ylkyvh63puvx4", - "projectBannerCid": "bafybeiat3evblpuozjnykv7n2thytfc7rq3vdz5ognbjuwfrlpmzxusjiy", - "projectTwitter": "EthereumOnARM", - "projectGithub": "", - "userGithub": "diglos", - "fundingTotalDollars": 16822, - "donorsTotal": 818, - "fractionsTotalSupply": 16600, - "hypercertEligibleDonors": 705, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "Ethereum on ARM", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x7f06Ac71366631157551D97559b82975c293FdBa", - "rights": ["Public Display"] - } - }, - { - "title": "Chainlist", - "address": "0x08a3c2A819E3de7ACa384c798269B3Ce1CD0e437", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0x46de99c3a4e0542fde6d77bfa1ff6d19e107f253ea5254f7fdb59869b30e2b7a", - "projectDescription": "We track all RPCs available for all chains, monitoring their latency and privacy policies, so users can evaluate RPCs without having to waste their time waddling through all their docs and legalese.", - "projectWebsite": "https://chainlist.org/", - "projectLogoCid": "bafkreiea4y67orw4wx62n5x265qyma66veukuo77d6doc27oqbfa6momfm", - "projectBannerCid": "bafkreieiiw3ru2wt4ykqpsujyich57252ta3b2bsost5ckae3ojlwyscmq", - "projectTwitter": "DefiLlama", - "projectGithub": "DefiLlama", - "userGithub": "0xngmi", - "fundingTotalDollars": 49915, - "donorsTotal": 2753, - "fractionsTotalSupply": 49107, - "hypercertEligibleDonors": 2594, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.7097828508620031 - }, - "hypercertData": { - "workScopes": "Chainlist", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x08a3c2A819E3de7ACa384c798269B3Ce1CD0e437", - "rights": ["Public Display"] - } - }, - { - "title": "L2BEAT", - "address": "0x6c5a2688c83C806150cA9DD0b2f10f16F8f1c33e", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0x4a8d8bb79a51a2b0e3d136c15b672ea87c9fd7dc5b0c3cd76674d5ebe4f7dac0", - "projectDescription": "L2BEAT is an analytics and research website about Ethereum layer two (L2) scaling.\n\nWe provide a comparison of the various Ethereum L2 systems available today. Because of our commitment to education, we present different non-trivial metrics aside from Total Value Locked (TVL). We have carefully examined each L2 project to determine its technology's inner workings and associated risks. We act as an objective watchdog and develop public goods in the L2 space. \n\nIn the future, we plan to introduce more metrics, upgrade the risk framework, automatize our monitoring, and build special-purpose tools for various L2s that empower users to execute operations like forced transactions or view the L2 state from the perspective of L1.\n\nBy donating to this grant, you support our continuous efforts to bring education and transparency to the L2 space.\n\nThank you very much for your support!", - "projectWebsite": "https://l2beat.com", - "projectLogoCid": "bafkreigereu6gzsxtdd5ehhr5taxyq7wqgh76fgoxacwshgnqe5ipvdfhe", - "projectBannerCid": "bafybeid5sznby6tdturjdtnbwmjygxos5etrbv4boyxa3dx5l6ko4trplm", - "projectTwitter": "l2beat", - "projectGithub": "l2beat", - "userGithub": null, - "fundingTotalDollars": 43040, - "donorsTotal": 1867, - "fractionsTotalSupply": 42500, - "hypercertEligibleDonors": 1738, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0xf043ACd67296892E649719a1836CEb39e6B171e3": null, - "0x7373feB7AE3Dd2040C4B2230e8F7aCA9025fdC43": null, - "0xBDba4E8d7B5defF5F629F08ABCB2E4637426cDbf": null, - "0xeeCaC6995082d754F064871D059B92A73ECa5ff8": null - }, - "safeUsers": { - "0x6c5a2688c83C806150cA9DD0b2f10f16F8f1c33e": 0.3333333333333333 - } - }, - "hypercertData": { - "workScopes": "L2BEAT", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x6c5a2688c83C806150cA9DD0b2f10f16F8f1c33e", - "rights": ["Public Display"] - } - }, - { - "title": "wagmi", - "address": "0x4557B18E779944BFE9d78A672452331C186a9f48", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0x50f3dbb23d121a397941e827ce2f10a0aea7f5cf311de6e3abcfe3847c56c405", - "projectDescription": "wagmi is a collection of React Hooks containing everything you need to start working with Ethereum. It\u2019s used at organizations like ENS, Sushi, LooksRare, WalletConnect, Stripe Crypto, and Gitcoin. wagmi makes it easy to \"Connect Wallet,\" display ENS and balance information, sign messages, interact with contracts, and much more \u2014 all with caching, request deduplication, and persistence.\n\nYour contributions support the entire wagmi project. The funds collected are used to support the core team and compensate significant contributions to the project. Our work on wagmi is only sustainable thanks to the generous financial backing of our Gitcoin donors.", - "projectWebsite": "https://wagmi.sh", - "projectLogoCid": "bafkreiamlbvahwmdj4enqlqohsgr632tga2rt6fo5sjunmcse67o6iu5qa", - "projectBannerCid": "bafybeicwsvrnwljplqcius7uflb2razcay3ns5wuelzagdazt5gfsgbt3m", - "projectTwitter": "wagmi_sh", - "projectGithub": "wagmi-dev", - "userGithub": "wagmi-dev", - "fundingTotalDollars": 21203, - "donorsTotal": 990, - "fractionsTotalSupply": 20923, - "hypercertEligibleDonors": 864, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0xB0623C91c65621df716aB8aFE5f66656B21A9108": "johnpalmer.eth", - "0x6aCBe090725d8b1cD59FE5f3e0c9C3685Ebb77af": null, - "0xA0Cf798816D4b9b9866b5330EEa46a18382f251e": "awkweb.eth", - "0xa682242375460EB30C1AD2E82F0429cF79983e0e": null, - "0xd58c6c47c9d15D3780E3ceF0bBda8B27706d5647": null - }, - "safeUsers": { - "awkweb.eth": 0.375, - "0x4557B18E779944BFE9d78A672452331C186a9f48": 0.041666666666666664 - } - }, - "hypercertData": { - "workScopes": "wagmi", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x4557B18E779944BFE9d78A672452331C186a9f48", - "rights": ["Public Display"] - } - }, - { - "title": "Lighthouse by Sigma Prime", - "address": "0xC9a872868afA68BA937f65A1c5b4B252dAB15D85", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0x68bf035f1ecb5914aede9bcae5512d0f3efa2c9f4cd7e3c7a69c7cb5836418b4", - "projectDescription": "Lighthouse is an Ethereum consensus-layer client. We provide a stable, performant and open-source implementation which is relied upon by a significant portion of the Ethereum network.\n\nWe're actively engaged in research, specification and implementation. Providing a safe and scalable base-layer is our commitment and passion.", - "projectWebsite": "https://github.com/sigp/lighthouse", - "projectLogoCid": null, - "projectBannerCid": null, - "projectTwitter": "sigp_io", - "projectGithub": "sigp", - "userGithub": "", - "fundingTotalDollars": 17198, - "donorsTotal": 815, - "fractionsTotalSupply": 16976, - "hypercertEligibleDonors": 712, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "Lighthouse", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0xC9a872868afA68BA937f65A1c5b4B252dAB15D85", - "rights": ["Public Display"] - } - }, - { - "title": "Somer Esat Ethereum Staking Guides (Ubuntu)", - "address": "0x32B74B90407309F6637245292cd90347DE658A37", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0x6912f9b68921b6f227dfd5b321f38a531d73fe560c6d1055c01ed1c6b00d5ee1", - "projectDescription": "Hello,\n\nI have created a series of Ethereum mainnet and testnet staking guides on Ubuntu for: \n\n- Ethereum Consensus Clients: Lighthouse, Nimbus, Prysm, Teku, and Lodestar.\n\n- Ethereum Execution Clients: Besu, Erigon, Geth, and Nethermind.\n\nThese guides are intended for new/intermediate users, and are hopefully a reasonable and pleasant onboarding vehicle for newcomers to the Ethereum staking community.\n\nUpcoming Edits: \n\n- Instructions for withdrawals.\n\n- Migration guides to encourage client diversity.\n\nYour support is appreciated <3\n\nSomer", - "projectWebsite": "https://someresat.medium.com", - "projectLogoCid": "bafkreiagtlbhkjgglue3jdfohnx5aavgzbzwsay7op6nu5txujbartn4rm", - "projectBannerCid": "bafybeigfrkb4n4dab5zzup42vdwlx3iq2jhd6shplxiaccim4lyrmvawmu", - "projectTwitter": "SomerEsat", - "projectGithub": null, - "userGithub": "SomerEsat", - "fundingTotalDollars": 10207, - "donorsTotal": 541, - "fractionsTotalSupply": 10062, - "hypercertEligibleDonors": 439, - "ensName": "somer.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.05960115134970108 - }, - "hypercertData": { - "workScopes": "Ethereum Staking Guides (Ubuntu)", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "somer.eth", - "rights": ["Public Display"] - } - }, - { - "title": "rotki", - "address": "0x9531C059098e3d194fF87FebB587aB07B30B1306", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0x755e5c4d042c1245555075b699e774c2ed0f0f1499460201fc936a0595e91683", - "projectDescription": "Rotki is an open source portfolio tracking, accounting, analytics and tax reporting tool that protects your privacy.\n\n\n\nThe mission of Rotki is to bring transparency into the crypto and financial sectors through the use of open source. Most importantly unlike virtually every other competing service which consists of closed source SaaS onto which you are forced to hand over all your financial data, with Rotki your data is stored encrypted locally in your computer. It enables you to take ownership of your financial data.", - "projectWebsite": "https://rotki.com", - "projectLogoCid": "bafkreiglt4vux2nfbqlmcc4lxnmiuqqoniummtm52ak5a5pq25c6jche5q", - "projectBannerCid": "bafybeidhdawf7wo6qwlgr72vybrgca3mmnhdko56zwlndy5xff367uqnpa", - "projectTwitter": "rotkiapp", - "projectGithub": "rotki", - "userGithub": "rotki/rotki", - "fundingTotalDollars": 15907, - "donorsTotal": 870, - "fractionsTotalSupply": 15687, - "hypercertEligibleDonors": 768, - "ensName": "rotki.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.1912909149310675 - }, - "hypercertData": { - "workScopes": "rotki", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "rotki.eth", - "rights": ["Public Display"] - } - }, - { - "title": "EthStaker", - "address": "0xD165df4296C85e780509fa1eace0150d945d49Fd", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0x76eabce511626d1d54bdae4770c3dc172bffca39ba53d82c27defe44ddb94cfa", - "projectDescription": "EthStaker is a welcoming first, knowledgeable second community dedicated to supporting Ethereans in safely and securely staking their ETH by creating guides, instructional videos, educational content and technical support. ", - "projectWebsite": "https://ethstaker.cc/", - "projectLogoCid": "bafkreifodkbfb3i6cm3a6wwjhtonesbep5bv2b564i54jlii37k72pu26q", - "projectBannerCid": null, - "projectTwitter": "ethStaker", - "projectGithub": "eth-educators", - "userGithub": null, - "fundingTotalDollars": 39738, - "donorsTotal": 1309, - "fractionsTotalSupply": 39379, - "hypercertEligibleDonors": 1181, - "ensName": "ethstaker.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.04805 - }, - "hypercertData": { - "workScopes": "EthStaker", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "ethstaker.eth", - "rights": ["Public Display"] - } - }, - { - "title": "Optimism DAppNode Package", - "address": "0xA47669cBc53985333423e4d3D00188f4049fB695", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0x218820f6e3edc6a007e830331ba1435144e4a5db5aff9a3f40025cc07371f087", - "projectDescription": "This package allows home users to run a full Optimism node on their DAppNode.\n\nI am raising funds to be able to dedicate more time getting the package ready for the upcoming Optimism Bedrock update\n\nA little funding will go a long way with this project \ud83d\udd34\ud83c\udf31", - "projectWebsite": "https://github.com/DanieleSalatti/DAppNodePackage-optimism", - "projectLogoCid": "bafkreidaaaxr3dxful3vowgh53nrtn3wcjrsbynhirtfiakfajpdt5eyo4", - "projectBannerCid": null, - "projectTwitter": "DanieleSalatti", - "projectGithub": "DanieleSalatti", - "userGithub": "DanieleSalatti", - "fundingTotalDollars": 40140, - "donorsTotal": 1326, - "fractionsTotalSupply": 39765, - "hypercertEligibleDonors": 1202, - "ensName": "ledger.salatti.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.008779511128978852 - }, - "hypercertData": { - "workScopes": "Optimism DAppNode Package", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "ledger.salatti.eth", - "rights": ["Public Display"] - } - }, - { - "title": "smol-evm", - "address": "0xD41BDBD4101e02057b7F621f681540ef3Ac81e55", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0x7e9c8fa1694bdebd30515fb4ccebd4eb6a5a4f489228dab49a4e60af1c13a424", - "projectDescription": "A hacker-friendly Python implementation of the Ethereum yellow paper from scratch.", - "projectWebsite": "https://smol-evm.glitch.me", - "projectLogoCid": "bafkreif7sn3j35yppxo7ncbln54mn5bibt6rpuxmcagosdns5wkyjdiduu", - "projectBannerCid": "bafybeif5ehakrpd5be4fiewpwp2x3fkhkylqbrvdwfnv7rjnpfyft2flhi", - "projectTwitter": "smol_evm", - "projectGithub": null, - "userGithub": "karmacoma-eth", - "fundingTotalDollars": 6692, - "donorsTotal": 433, - "fractionsTotalSupply": 6578, - "hypercertEligibleDonors": 328, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "smol-evm", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0xD41BDBD4101e02057b7F621f681540ef3Ac81e55", - "rights": ["Public Display"] - } - }, - { - "title": "beaconcha.in", - "address": "0x9d4E94dB689Bc471E45b0a18B7BdA36FcCeC9c3b", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0x8eefdebc0d05e186432826739fca36c15ce59d940b8b37a2df5854e16168fd47", - "projectDescription": "beaconcha.in is an open source explorer that provides users with an easy and accessible way to explore the Ethereum network. \n\nOur explorer is designed to be user-friendly, making it accessible to non-technical users. In addition to our web-based explorer, we also offer an open source mobile app for iOS and Android, providing users with the ability to monitor their validators on the go.\n\nOne of our key features is the integration of both the consensus layer and the execution layer in a single explorer. \nThis allows users to easily access and analyze data from both layers, providing a more comprehensive view of the network.", - "projectWebsite": "https://beaconcha.in/", - "projectLogoCid": "bafkreifgi3b4nik2ujd3zmtpd4zo76pr43casvbhuo5cju7qcs3vkppmlm", - "projectBannerCid": "bafybeigxur27d3coppebqx3izx7lnzpoitx4eq53umcpjuie6tmf3jshvy", - "projectTwitter": "beaconcha_in", - "projectGithub": "", - "userGithub": "Buttaa", - "fundingTotalDollars": 19460, - "donorsTotal": 709, - "fractionsTotalSupply": 19266, - "hypercertEligibleDonors": 592, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.09715400672172587 - }, - "hypercertData": { - "workScopes": "beaconcha.in", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x9d4E94dB689Bc471E45b0a18B7BdA36FcCeC9c3b", - "rights": ["Public Display"] - } - }, - { - "title": "NiceNode: Run a node \u2014 just press start", - "address": "0x9cce47E9cF12C6147c9844adBB81fE85880c4df4", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0x99b81016d61f8b9115282b1055649d4876f38619759064b783478047ca61b714", - "projectDescription": "\nThe current options to run a node require technical skills to open a terminal and run commands or install a new operating system. Running a node should be as simple as downloading an app.\n\n\n\nI started NiceNode to solve this. NiceNode is an app that runs, monitors, and controls a node. \n\n\n\nYour contributions will fund a whole new and improved UI/UX, more node options, and a foundation for staking with validators!\n\nNiceNode is currently available for Linux (tested on Ubuntu), Windows, and macOS and the alpha release is ready for downloading and testing. Please try out NiceNode and give feedback and suggestions! Report a problem or request a feature on NiceNode\u2019s Github.\n\n\n\nFor now only Execution clients (Besu, Nethermind, and Geth) and Consensus Clients (Lodestar, Nimbus, Teku, Lighthouse, and Prism) are supported by NiceNode, but stay tuned as the next releases will include the ability to run Layer 2 nodes and other Ethereum ecosystem nodes, and testnet nodes! \n\n\n\n\"Hey, client teams and others!\" -> Open a Github pull request to add a node or modify the default config of an existing now!", - "projectWebsite": "https://nicenode.xyz", - "projectLogoCid": "bafkreiemylta64tmyfsjn6nmiygtchcrknzknxf4xml5xfsbf23qphj7vu", - "projectBannerCid": "bafybeigzdqudd3aao54je43ttj7qzck3wjtwan225b7ubufvdkckfqnd64", - "projectTwitter": "NiceNodeApp", - "projectGithub": "nicenode", - "userGithub": "jgresham", - "fundingTotalDollars": 18030, - "donorsTotal": 879, - "fractionsTotalSupply": 17804, - "hypercertEligibleDonors": 766, - "ensName": "nicenode.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.02 - }, - "hypercertData": { - "workScopes": "NiceNode", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "nicenode.eth", - "rights": ["Public Display"] - } - }, - { - "title": "PLUME: Pseudonymously Linked Unique Message Entities, aka Verifiably Deterministic Signatures on Ethereum", - "address": "0x23aDa6E6A9E9D4EcDDd185e3ec353163BCeeBF2a", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0x9cf538295b69125db2e7036df4bee5d9f40ce2966577064a1af58f60985d98a4", - "projectDescription": "Verifiably deterministic signatures on Ethereum make it possible to have a unique, anonymous identity. Developing this cryptographic primitive into wallets will unlock sybil-resistant anonymous apps like zk nullifiers for anonymous unlinked airdrops, anonymous decentralized voting which only allows one vote per account, and message boards with a consistent identity. We think that fully executing this work will create a whole new class of dapps and web3 social apps with pseudonymity.\n\n\n\nThis grant will go to helping to integrate a new, non-interactive signature scheme into wallets such as Metamask, filing an EIP, and engineering the zero knowledge cryptography behind it. Note that this scheme offers an improvement to semaphore or tornado cash nullifiers, because the first few people who sign up will not have small anonymity sets. The grant will also help to publish the paper that proves the security of the scheme via a DDH-VRF argument, and pay for conference expenses so it can be presented more widely. It will be split amongst Kobi, Aayush, Richard, Piotr, and anyone else who would like to help productionize this work!\n\n\n\nWe will likely call the final version your plume -- a privately linked unique message entity. In other words, we will deploy verifiably deterministic signatures on Ethereum.\n\n\n\nIf you'd like to read the paper, it can be found at https://aayushg.com/thesis.pdf. The slides to fully explain the new scheme are found here: https://docs.google.com/presentation/d/1mKtOI4XgKrWBEPpKFAYkRjxZsBomwhy6Cc2Ia87hAnY, and the code is here: https://github.com/zk-nullifier-sig/zk-nullifier-sig. The academic paper is here: https://eprint.iacr.org/2022/1255. A blog post is here: https://blog.aayushg.com/posts/nullifier. DM @yush_g on Twitter with questions or in the Personae Discord! Initial research was funded by a $4k grant from 0xPARC and done as part of an MIT masters thesis.\n\n\n\nUPDATE: Your money has gone to good use! Due to your generosity, we were able to push forward a lot of progress, including that we were able to develop a Metamask snap (deployed at nullifier.xyz) and push an independent Javascript implementation that discovered an overflow bug in both of the Rust implementations! We also are building towards a burner wallet integration and EIP, both of which we are actively polishing drafts on. This project is now being developed to power future anonymity tech at Personae Labs.", - "projectWebsite": "https://github.com/zk-nullifier-sig/zk-nullifier-sig", - "projectLogoCid": null, - "projectBannerCid": null, - "projectTwitter": "yush_g", - "projectGithub": "personaelabs", - "userGithub": "divide-by-0", - "fundingTotalDollars": 6416, - "donorsTotal": 513, - "fractionsTotalSupply": 6284, - "hypercertEligibleDonors": 419, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "PLUME", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x23aDa6E6A9E9D4EcDDd185e3ec353163BCeeBF2a", - "rights": ["Public Display"] - } - }, - { - "title": "Stereum - Ethereum Node Setup", - "address": "0x6E41fe2F8303b89c9dbcCABE59A7F7f8F4312cA9", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0xaa09ef03fe5e4d9a0aa3d49a203ea8d1d89969e19cfe8af2135ecec38f035ae0", - "projectDescription": "\ud83c\udf44 THE PROBLEM \n\nSetting up an Ethereum Node is technically demanding and needs a lot of research & preparation to do. Being confronted with this challenge a lot of nontechnical people therefore, even if they are in the position of owning 32 ETH, are choosing to use a staking service to not risk their funds, which in turn slowly centralises the network. \n\n\ud83c\udf44 OUR SOLUTION \n\nStereum is our answer to this problem, a toolkit to simplify the process of setting up and maintaining an Ethereum/Gnosis Node using an intuitive GUI to abstract the installation process down to a few clicks, lessening the technical entry barrier for the average person. \n\nTo use Stereum, you download the launcher & connect remotely to your fresh Ubuntu server. \n\nIn three clicks, Stereum configures all necessary prerequisites your server has to meet, installs and runs Ethereum client software, and ensures that your node is properly connected and synced with the network. \n\nBy setting up your own node with Stereum you are able to participate in Solo Staking in your preferred network and validate transactions and blocks. The node also serves as your gateway to the network for data science, dApp usage and development. \n\nWith Stereum you also have the opportunity to run different node related protocols (like SSV, etc.) & profit off of there unique architecture. \n\nStereum, our Ethereum Node Installation, Setup & Management tool aims to be the most flexible way to leverage your node for ETH staking, data science dApp hosting & development. \n\nWe hope to explore every hermit\u2019s dream with you! \n\n\ud83c\udf44 USE OF FUNDS \n\nYour contribution is greatly appreciated by the team and will be used in various ways \u2013 development, testing and security audits. We spend the funds generated through grants and donations purely on tasks, that will benefit the progress of the project and therefore the decentralisation of Ethereum as well as protocols on it. \n\n\ud83c\udf44 FURTHER LINKS\n\n\t\ud83c\udf44 Project Website - https://stereum.net/\n\n\t\ud83d\udd28 GitHub - https://github.com/stereum-dev/ethereum-node\n\n\t\ud83d\udcac Discord - https://discord.gg/DzAwgnSXtB\n\n\t\ud83d\udcf0 Twitter - https://twitter.com/stereumdev\n\n\t\ud83d\udcfa YouTube - https://www.youtube.com/@Stereum\n\n", - "projectWebsite": "https://stereum.net", - "projectLogoCid": "bafkreidw5c4datoqfpmpsegdiibglqkj3dv32as7brwpbqo64hwuttdole", - "projectBannerCid": "bafybeihzfpfkkyssyvejaqv4ozafbwkd2rrghsd6n7cdxcf54iv7goqjwe", - "projectTwitter": "stereumdev", - "projectGithub": "stereum-dev", - "userGithub": "stefa2k", - "fundingTotalDollars": 8921, - "donorsTotal": 561, - "fractionsTotalSupply": 8779, - "hypercertEligibleDonors": 449, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "Stereum", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x6E41fe2F8303b89c9dbcCABE59A7F7f8F4312cA9", - "rights": ["Public Display"] - } - }, - { - "title": "Lodestar", - "address": "0xc8F9f8C913d6fF031c65e3bF7c7a51Ad1f3a86E5", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0xb901109e1791c6a48f7315a198536a9e2211834e3fe4b47d48fde0528f118ae4", - "projectDescription": "Lodestar is a Typescript ecosystem for Ethereum consensus, developed by ChainSafe Systems.\n\nOur flagship product is our production-capable beacon chain and validator client.\n\nIn addition, we maintain public repositories of useful tools for public use. Some of these libraries include BLS, SSZ, Discv5, Gossipsub, and Noise.\n\nWe are committed to maintaining these critical libraries for use in our client and for the wider community.\n\nLodestar's niche is in its implementation language, Typescript. Our software and tooling is uniquely situated as the go-to for researchers and developers for rapid prototyping and browser usage. Millions of developers around the world are familiar with Typescript, and Lodestar's high-quality codebases are excellent introductions to the Ethereum world.\n\nLodestar has also been a leader in light client research, standardization, and implementation of Ethereum light clients. We strive to work with other client implementers, researchers and developers to demonstrate the importance of having browsers utilize trustless data directly from blockchain.\n\nA demo of our light client is available at https://lodestar-lightclient.chainsafe.io/.\n\nVisit us at https://lodestar.chainsafe.io", - "projectWebsite": "https://lodestar.chainsafe.io", - "projectLogoCid": "bafkreiaga3hosplhruxrr4w5be7lyali7iks4pzp4sksuybtvaovdmd3di", - "projectBannerCid": "bafkreib37bg5krjh3725gljlubfbksrfakqqtxtho2omotr5652bjoojdm", - "projectTwitter": "lodestar_eth", - "projectGithub": "chainsafe", - "userGithub": null, - "fundingTotalDollars": 13070, - "donorsTotal": 807, - "fractionsTotalSupply": 12872, - "hypercertEligibleDonors": 691, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "Lodestar", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0xc8F9f8C913d6fF031c65e3bF7c7a51Ad1f3a86E5", - "rights": ["Public Display"] - } - }, - { - "title": "ethers.js", - "address": "0x8ba1f109551bD432803012645Ac136ddd64DBA72", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0xe0acd0898fada5b0a3f1a6a918858f39fdb7f8408f62a0f583afb70fe488022b", - "projectDescription": "The ethers.js library is a complete and compact library for interacting with the Ethereum Blockchains and their ecosystem.\n\nWith over 4 million npm installs per month, it can be used to create dapps, wallets and utilities as well as debug and analyze blockchain data.", - "projectWebsite": "https://ethers.org", - "projectLogoCid": "bafkreiba4ex3nvm6bdnc75yb4ejzqcvccbdc5ci6gjjt6zc43iugsxkc24", - "projectBannerCid": "bafybeia5lgtuhubvlgk7ssjoo55rsxt3zpwbaxddybq2rqrox345j4mvfa", - "projectTwitter": "ricmoo", - "projectGithub": "ethers-io", - "userGithub": "ricmoo", - "fundingTotalDollars": 21771, - "donorsTotal": 891, - "fractionsTotalSupply": 21532, - "hypercertEligibleDonors": 786, - "ensName": "ricmoo.firefly.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "ethers.js", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "ricmoo.firefly.eth", - "rights": ["Public Display"] - } - }, - { - "title": "Ape Framework", - "address": "0x187089b65520D2208aB93FB471C4970c29eAf929", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0xe619c469f518291bc793096e0416512755edaee8cd66ce0c65ef286d73c6291f", - "projectDescription": "Ape is a smart contract development tool for Pythonistas, Data Scientists, and Security Professionals working on Ethereum and other EVM and non-EVM blockchain ecosystems.", - "projectWebsite": "https://apeworx.io", - "projectLogoCid": "bafkreigkj3mtsaxx2xtruqaeip724dgu34cynv2otbic3ovhwggjjs6674", - "projectBannerCid": "bafybeicsnnqj6p2o6nvb4q7kjl5tav7nbuhmiogbs7ryehlhybpcaqc2ii", - "projectTwitter": "ApeFramework", - "projectGithub": "ApeWorX", - "userGithub": "fubuloubu", - "fundingTotalDollars": 8976, - "donorsTotal": 660, - "fractionsTotalSupply": 8798, - "hypercertEligibleDonors": 550, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0x9174e7B00F46FDFB19a23203f83462D2722a8543": null, - "0x7C5D550fbB1A3B37e4e893c1B1673eaD320DC548": null, - "0x1C277bD41A276F87D3E92bccD50c7364aa2FFc69": "fubuloubu.eth" - }, - "safeUsers": { - "fubuloubu.eth": 0.75, - "0x187089b65520D2208aB93FB471C4970c29eAf929": 0.08333333333333333 - } - }, - "hypercertData": { - "workScopes": "Ape Framework", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x187089b65520D2208aB93FB471C4970c29eAf929", - "rights": ["Public Display"] - } - }, - { - "title": "Blockscout 2.0 - Premium Open-Source Block Explorer", - "address": "0x242ba6d68FfEb4a098B591B32d370F973FF882B7", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0xe9ff6b7f6d8ef7844830ef3506a8a2d06b1dcf567e3ae71ee0308f86a1db2a1e", - "projectDescription": "\nPROBLEM\n\nEtherscan provides a great block explorer for web3, much like Alphabet provides a great search engine for web2 and Microsoft provides a great OS for businesses. However, core Ethereum values run counter to a closed-source, single-solution ideology for a decentralized blockchain network. Open-source alternatives are absolutely required to augment, improve, and democratize the block explorer experience. \n\nEthereum-based blockchains and L2s need better open-source explorer options to support: \n-Checks and balances (is the data accurate?)\n-Redundancy and resiliency (what if Etherscan is down?)\n-Community-driven features and innovation (I want to improve and customize that explorer!)\n-Transparency (How does it work?)\n-Quick, cost-effective implementation (I don\u2019t have much capital but I need to spin up an explorer yesterday!)\n-Trustlessness (I trust the code, not any single entity in charge of all data presentation.)\n\nSOLUTION\n\nBlockscout has been in production for nearly 5 years. We provide an open-source explorer used by more than 100 chains in the space, including public goods support for an Ethereum mainnet instance. \n\nBlockscout has been used by small chains, big chains, private chains, test chains, L2 chains and many others to quickly spin up an instance and provide transactional transparency right away for their users...AND we know that Blockscout needs to be improved to compete with and provide a viable alternative to closed-source explorers.\n\nHOW FUNDING WILL BE USED\n\nWe\u2019ve started working on a major overhaul called Blockscout 2.0. It aims to provide all the views, functionality and UX you expect from a premium block explorer. In addition, new features including Rollup support, an optimized API layer, DApp marketplace, and a new microservices infrastructure written in Rust are all in active development. More on the 2.0 roadmap -> https://docs.blockscout.com/about/roadmap/blockscout-2.0\n\nBlockscout 2.0 is currently being built, and with your help we can bring it to the community much faster, with many more features, and with much greater impact. We are particularly excited about the new React UI for users and Rust microservices for developers. With this new architecture in place, our team as well as the greater developer community will be able to easily customize functionality without compromising performance.\n\nWe will also devote grant funding resources to improving rollup support. Rollup usage is growing every day, and we need to provide comprehensive views to support this ever-expanding world of layer 2 data. \n\nAs we continue to decentralize the future, the tools and infrastructure supporting decentralization must also follow this pattern. We appreciate your funding to support a transparent, open-source, premium block explorer! ", - "projectWebsite": "https://www.blockscout.com", - "projectLogoCid": "bafkreiamkeivqatsinylojalkta5ccodrau5fvqhyw32365hnx4eavwh5e", - "projectBannerCid": "bafybeicqpem6vp2i7apaxt4qjydmv5xoneipk72z6n6okpdrk7zvmpzozu", - "projectTwitter": "blockscoutcom", - "projectGithub": "https://github.com/blockscout", - "userGithub": null, - "fundingTotalDollars": 18226, - "donorsTotal": 847, - "fractionsTotalSupply": 17998, - "hypercertEligibleDonors": 725, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0xD5531a23868185f52e40b20A741acF39520C7da0": null, - "0xA36eD4EB1B80a37b7DEdFaF1E695fD1024767990": null, - "0xA84944735B66e957Fe385567dcc85975022Fe68A": null - }, - "safeUsers": { - "0x242ba6d68FfEb4a098B591B32d370F973FF882B7": 0.05555555555555555 - } - }, - "hypercertData": { - "workScopes": "Blockscout", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x242ba6d68FfEb4a098B591B32d370F973FF882B7", - "rights": ["Public Display"] - } - }, - { - "title": "Ethereum Magicians", - "address": "0xB35cD25e91B376EAfbA79AbE71D78814dEC3401a", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0xf1922b59f3eb4f496bf8b083d6bbfb3bac092119127a84e7c50eefa9461dc9ca", - "projectDescription": "TL:DR Ethereum Magicians continues to support coordination and development in the ecosystem. Funds raised through this grant will be used to pay people to coordinate and navigate community to better educational resources, educate community, encourage people to work and build in open source, support Ethereum Core development.\n\n\n\nThe Ethereum Magicians is a Community of Individuals collaborating on improving the Ethereum Protocol. FEM (Fellowship of Ethereum Magicians) forum provides a high signal noise free space for discussing any Ethereum Protocol Improvements, supporting the community in protocol decision making, and providing space for high quality discussions.\n\n\n\nThe Ethereum Magicians community is focused mainly around Ethereum Improvement Proposals (EIPs) and Ethereum Request for Comments (ERCs). We provide a key communication channel (forum) for core developers and the community to discuss anything EIP or Ethereum Improvements and Protocol related. \n\nWe are hanging out on https://ethereum-magicians.org/ forum and sometimes in person at bigger events. \n\n\n\nThe ongoing benefit that we bring to the community is that our work empowers decision-makers to gather feedback and move the tech forward, and encourages developers and researchers to collaborate closely via the Magicians' Forum. This helps make Ethereum the best technology that it can be!\n\n\n\nFunds received will be managed by members of the Operations Ring, a group which manages resources for the Fellowship of Ethereum Magicians, organises events, and maintains the Forum. Your donation will be used to organise upcoming events and discussions, operate and pay for maintaining and moderating the FEM forum and expenses related to these activities.\n\n \n\nAll contributions to our grant highly appreciated \ud83d\ude4f", - "projectWebsite": "https://ethereum-magicians.org", - "projectLogoCid": "bafkreigbyhxet3mcl5h73nn2hs6yzt53xgc2nxgiwqmvpqvc5umj6rkrq4", - "projectBannerCid": null, - "projectTwitter": "https://twitter.com/EthMagicians", - "projectGithub": null, - "userGithub": null, - "fundingTotalDollars": 13319, - "donorsTotal": 641, - "fractionsTotalSupply": 13153, - "hypercertEligibleDonors": 541, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0xAB3094EB3912a17De15434E09F957e19b32441E8": "planett.eth", - "0x4Cb2ccbF80ddF2C12f8199b75c849CfA658BA9B5": null - }, - "safeUsers": { - "0xB35cD25e91B376EAfbA79AbE71D78814dEC3401a": 0.016666666666666666, - "planett.eth": 0.3, - "sajz.sismo.eth": 0.016666666666666666 - } - }, - "hypercertData": { - "workScopes": "Ethereum Magicians", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0xB35cD25e91B376EAfbA79AbE71D78814dEC3401a", - "rights": ["Public Display"] - } - }, - { - "title": "TrueBlocks and the Unchained Index", - "address": "0xf503017d7baf7fbc0fff7492b751025c6a78179b", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure", - "projectId": "0xfb5b07f162ab081bf8608d275e9d595a331e0b36b2e445a9a67a2baad6195444", - "projectDescription": "TrueBlocks and the Unchained Index are open-source, local-first indexing solutions for any EVM-based blockchains. It provides censorship-resistant, private, and fast access to immutable data--there is no \u201crecentralization\u201d of chain data. \n\nTrueBlocks uniquely: \n\n- Creates an address-optimized index allowing for 18-decimal-place-accurate-reconciliation,\n- Provides local-first queries, caching, and transformations without the fear of third-party snooping,\n- Produces and distributes\u2014for the public good\u2014an \u201cequitably\u201d maintained and low-cost index through content-addressable storage,\n- Retains the integrity of the data through a \u201creproducible\u201d extraction process,\n- Offers a set of technologies that can be used as building blocks for \u201ctruly\u201d decentralized applications,\n- Scales in a way natural to web3 by leveraging content-addressable storage (IPFS) to shard and cache received data.\n\nFrom their desktop, users can/will be able to privately access their own historical blockchain activity. Accomplishing:\n\n- Monitor token holdings and market values over time,\n- Manage securely and view NFT holdings,\n- Determine gas fees paid over time,\n- View and export fully reconciled transaction histories by account/asset\n- Watch for and notify about airdrops\n- Track activity with other addresses\n- Receive off-chain email notifications/triggers of activity on addresses (future...)\n- Watch DAO activity (What proposals are pending? Must I vote on something? Who has voted for what in the past?)\n- Conduct DAO-level monitoring and accounting\n- Manage ENS names and expiration dates\n- Programmatically and quickly filter, sort, and enhance blockchain data\n- Consolidate data across accounts/addresses\n- Build testing algorithms (e.g. \"digital twins\") to facilitate smart contract testing, auditing, ongoing monitoring, and simulation\n- Take our highly efficient and precise indexing engine, metadata layer (time and name databases), and query functionality and add more specialized, use-case-focused, features (e.g. different UIs, data visualization, exporting options).", - "projectWebsite": "https://trueblocks.io", - "projectLogoCid": null, - "projectBannerCid": "bafybeicb4fgjmsuqz6hdwsbwb5c64y4ekendau2e6e4k3773qe3fb664yq", - "projectTwitter": "tjayrush", - "projectGithub": "TrueBlocks", - "userGithub": "tjayrush", - "fundingTotalDollars": 8952, - "donorsTotal": 684, - "fractionsTotalSupply": 8773, - "hypercertEligibleDonors": 568, - "ensName": "trueblocks.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.9977608326533066 - }, - "hypercertData": { - "workScopes": "TrueBlocks", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "trueblocks.eth", - "rights": ["Public Display"] - } - }, - { - "title": "Solarpunk Nomads: building the first two Public Goods adventure vehicles", - "address": "0x474716e617FEa8898D4fa9D891AA67B5BEDd6C4b", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x0299d145933e3abc9bee2251589d080e0b12765e7e211e72e5209d0ac1889d33", - "projectDescription": "Since April 2022, we have been facilitating the collective rise of Solarpunk nomadism and gathering a tribe of nomadic changemakers. After focusing on concept development and community building, it is time to build the first Solarpunk Nomads vehicles. These vehicles will be community-owned and used for accelerating the transition to a more sustainable society \u2600\ufe0f \ud83d\udd0b \u26a1\ufe0f \ud83d\ude90\n\n\n---------------------------------------------------------\nWHO ARE THE SOLARPUNK NOMADS\nChangemakers, dreamers, and builders who live nomadic or semi-nomadic lifestyles using zero-carbon emission vehicles (EV vans, EV bikes, sailboats, etc.) powered by renewable energies.\n\ud83d\udc49 These nomads are always connected to the internet with satellite connections and are proactive in building a Solarpunk society. \n\ud83d\udc49 These nomads will be the storytellers and main instigators of a society where advanced technology and eco-wisdom will create a brighter future for everyone.\n\n---------------------------------------------------------\nWHAT WE WANT TO BUILD [NOW] \n\ud83d\udd1c Set up the first two Solarpunk Nomads vehicles to be used in education and promotion programs, including being present at ReFi and crypto events in Europe and India.\nThe 1st vehicle is a solar-powered E-bike with a trailer, stationed in locations in central Europe. The 2nd is an eco-vehicle, partially powered by solar panels, stationed in Southern India and used for educational activities and expeditions to document Climate Change (developed in collaboration with AtlantisDAO).\n\ud83d\udd1c Replenish the social treasury for nomads in need.\n\ud83d\udd1c Fund new artists to further develop the collective image of Solarpunk Nomadism.\n\ud83d\udd1c Complete the Solarpunk Nomadism digital guidebook.\n\n---------------------------------------------------------\nWHAT WE HAVE BUILT SO FAR [2022]\n\u2714\ufe0f Kickstarted this new concept.\n\u2714\ufe0f Created over 50 original visual artifacts in collaboration with artists.\n\u2714\ufe0f Promoted Solarpunk Nomadism with over 500k views on Twitter and over 50 Twitter Spaces.\n\u2714\ufe0f Defined a social treasury with guidelines for Solarpunk Nomads in need.\n\u2714\ufe0f Created a digital hub for nomads on Discord.\n\u2714\ufe0f Built an ongoing virtual art exhibition about Solarpunk Nomadism (https://spatial.io/s/Solarpunk-Nomads-exhibition-6315b520c490500001340a6b?share=4245792330981123574)\n\u2714\ufe0f Kickstarted the new concept of Solarpunk Safe Place and Regen Lab.\n\u2714\ufe0f Launched the Solar Punk Cafes.\n\u2714\ufe0f Introduced the concept of Proxy Solarpunk.\n\u2714\ufe0f Founded the Solarpunk Guild, a collective that supports SP-inspired projects.\n\n---------------------------------------------------------\nTEAM\n\ud83c\udf0d Earthbasedsoul, a wildlife biologist and visionary, has spent the last years spreading awareness on social media about the Climate Emergency and Biodiversity crisis.\n\ud83d\udc3b Marco Bear runs Climate Change Countdown (a daily digital art project and expedition to document causes, effects, and solutions of Climate Change). You can find him in the Alps doing wild camping and around web3 climate spaces.\n\n---------------------------------------------------------\nWHY IS SOLARPUNK NOMADISM A CLIMATE SOLUTION? \n\ud83c\udf33 Promotes zero-carbon mobility, solar energy, and electric mobility.\n\ud83c\udf33 Leverages nomadism to promote the Solarpunk vision.\n\ud83c\udf33 Helps changemakers to adapt to the Climate Emergency and to maintain functionality in challenging times.\n\ud83c\udf33 Helps to reduce the carbon footprint of the community.\n\ud83c\udf33 Promotes minimalism and a rethinking of lifestyle toward sustainability.\n\ud83c\udf33 Has very high potential scalability inside and outside the Web3 Space.\n\ud83c\udf33 Could become the backbone of positive climate action communication.\n\ud83c\udf33 Facilitates low carbon IRL connections between changemakers, projects, events.\n", - "projectWebsite": "https://tinyurl.com/SolarpunkNomads", - "projectLogoCid": "bafybeihlw25dpneicps46rwblvw3xpqn2qszx275gbfd3ec7v2zm3ky7xi", - "projectBannerCid": "bafybeidnatloov4map4lecdaxczl7tbl4njsrizzf5jd2jrtm4lnbkvaru", - "projectTwitter": "SolarpunkNomads", - "projectGithub": null, - "userGithub": "BearMarco", - "fundingTotalDollars": 15156, - "donorsTotal": 416, - "fractionsTotalSupply": 15045, - "hypercertEligibleDonors": 389, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "Solarpunk Nomads", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x474716e617FEa8898D4fa9D891AA67B5BEDd6C4b", - "rights": ["Public Display"] - } - }, - { - "title": "ReFiDAO X Commons Stack: ReFi Commons Prize", - "address": "0x8D860D4f254eD45946F5FB0e3243C1db63a4ea2f", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x0d85d55a968bc9929c4f7ddfef2e6008b4ad8b77be65f7c08e89eab7cb760cc6", - "projectDescription": "We are raising $100k to accelerate the growth of the ReFi movement by hatching three local startup commons. \n\nThis is a new joint venture between ReFiDAO and Commons Stack that will pilot a new concept called a \u201cReFi Commons\u201d across three local startup communities in 2023.\n\nBACKGROUND\n\nReFiDAO is a founder-led startup community that accelerates impact for people and the planet.\n\nOver the last 12 months we\u2019ve laid the foundation for the cultural home of regeneration in web3 by supporting over 300 founders at various stages of their journey. \n\nWe are now raising money to launch a ReFi Commons Incubator with Commons Stack. The idea of a ReFi Commons is new, and we are super excited to share it with you! \n\nBut first, an update.\n\nGR15 UPDATE\n\nAs a result of the $69,040 we received from the Gitcoin community in GR15, over the last three months we were able to achieve many key milestones:\n\n- Support 152 founders in FC02\n- Onboard over 70 community managers into the CM Guild\n- Onboard over 20 regen investors \n- Reach 1700 newsletter subscribers\n- Co-launch the $1M grant pool with Future Quest, Celo, Polygon, and others\n\nREFI PASSPORT & KNOWLEDGE GRAPH\n\nAfter consulting with the Gitcoin Passport team, we decided to delay ReFi Passport due to the rate of change for the Gitcoin Passport codebase in Q4 2022. \n\nWe\u2019ve been iterating a prototype of the knowledge graph around MRV (\u2018Measurement, Reporting & Verification\u2019) with an alpha version in the works. \n\nWe\u2019ve expanded our directory to include people, content, deals and events\u2014all of this aimed at helping onboard more talent and capital into the work of regeneration.\n\nTHEORY OF CHANGE\n\nWe believe that in order to realize a global regenerative economy, we need to fulfill three objectives:\n\n1. A global startup movement rooted in diverse local communities\n2. Hundreds of radical startup experiments drive exponential impact\n3. Global coordination between private, public and civil society organizations\n\nREFI COMMONS INCUBATOR\n\nTo test this evolved theory of change, we are raising money to launch a 6-month ReFi Commons Incubator with Commons Stack to accelerate the growth of local startup communities that fulfill three objectives:\n\n1. Onboard new talent and capital into ReFi\n2. Create radical startup experiments for exponential impact\n3. Build public, private and civil society partnerships\n\nThe goal is to pilot the incubator with an initial cohort of three communities and to build a regular program that incubates ReFi Commons all over the world.\n\nWHAT IS A REFI COMMONS?\n\nA ReFi Commons is a founder-led impact DAO that exists to regenerate the earth through radical startup experimentation and innovation. \n\nA ReFi Commons could be created as a startup community in a specific city (Lisbon, Bangalore) or a startup ecosystem focused on a shared problem space (such as plastic pollution or biodiversity). \n\nThe models and methods of regeneration are unique to each community, but there are a few key criteria:\n\n1. Mission, vision, and values statements establish the commons\n2. All funds must be held in a public treasury \n3. Community curates governance parameters and procedures\n4. Impact activities must be publicly verifiable\n5. Funded startup ventures must be open source\n6. Impact and finances are reported quarterly\n7. Three or more founding members make a 7-year commitment to realize their mission and vision of regeneration while upholding the commons\u2019 values\n\nThe idea for a ReFi Commons takes inspiration from Eleanor Ostrom\u2019s 8 Principles, Charles Eisenstein\u2019s Sacred Economics and Brad Feld\u2019s Startup Community Way. \n\nIt is rooted in the belief that governments and corporations cannot solve climate change alone. \n\nWe need a social movement that creates new economic models and provides an alternative to our extractive system.\n\nWHAT DOES A REFI COMMONS DO?\n\nWhile we recognize that regeneration looks differently according to the context, we believe there are a number of key behaviors that contribute to the three core objectives of a ReFi Commons. \n\nThe key behaviors are:\n\n1. Hold regular meetings and events\n2. Create shared work spaces\n3. Collaborate with other startup communities\n4. Build in public\n5. Support entrepreneurs and innovators\n\nTHE REFI COMMONS PRIZE \n\nThe ReFi Commons Prize will be the genesis cohort of the ReFi Commons Incubator focused entirely on starting ReFi Commons in strategic local communities. \n\nIt\u2019s an opportunity for regens all around the world to submit proposals to become a ReFi Commons with the full support of ReFiDAO and Commons Stack with a strong core contributor team:\n\n- Griff Green\n- Tamara \n- Liviade\n- Usama\n- Daryl Edwards\n- John Ellison\n\nThe genesis cohort will award prizes to three local ReFi Commons to implement an adapted Commons Stack framework in a strategic physical community over six months culminating in the launch of a governance token via an augmented bonding curve or other market mechanism. \n\nThe first three Commons will be selected by a community-led governance process with details to follow.\n\nThe expectation is for each ReFi Commons to participate in the global ReFiDAO community and to provide a critical onramp of talent and capital to accelerate impact for people and the planet.\n\nFINANCIALS\n\nWe are looking to raise $100k to cover operating expenditure for the ReFi Commons Prize for three months. This is half of the program, but there are some fixed up-front costs that reduces the overal expenditure. We need at least $75k to launch the program.\n\nAll funds raised will go towards the ReFi Commons Prize.\n\nBEAR MARKET GRATITUDE\n \nWe have been so grateful to everyone in the Gitcoin community for their incredible support over the last 12 months. \n\nWe will continue to steward the funds received with maximum capital efficiency, respecting the conditions of the market and the long-term horizon of the challenges at hand.\n\nWe are not building this startup movement for this cycle, or for next, but to see a global regenerative economy\u2014and beyond.\n\nREGENERATION FOR ALL \n\nGiven that the vast majority of climate projects are rooted in the global south, we commit to a balanced representation of founders and communities supported through the ReFi Commons Incubator.\n\nThe vision of regeneration requires radical inclusion\u2014especially for traditionally marginalized groups. We appreciate the Gitcoin community supporting us in this effort and are super excited to bring it to life!", - "projectWebsite": "https://refidao.com/", - "projectLogoCid": "bafybeiagpsv26wwewu6ucsy6kvgj3p3owb2chifzhzhzixx6gzf2te2m7e", - "projectBannerCid": "bafybeih2jb2nvp5ycpaaqzgts73f5xhv2egrfnl7ctb2jcxi4eyzznqldq", - "projectTwitter": "ReFiDAOist", - "projectGithub": null, - "userGithub": "climateXcrypto", - "fundingTotalDollars": 40088, - "donorsTotal": 843, - "fractionsTotalSupply": 39890, - "hypercertEligibleDonors": 793, - "ensName": "refidao.eth", - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0xDA47bdcC48f26FB4709f90316341D9104cB1fb89": "daryledwards.eth", - "0xCaD3887923B39cD2b0B6d13538C4ecB7C5EE9825": null, - "0xD2b4E046B3AE52078275f44Ef81BC19b4ED2872F": null, - "0x6d30cba67943f9D380b8b8e1e8a87316c9524E64": null - }, - "safeUsers": { - "0x8D860D4f254eD45946F5FB0e3243C1db63a4ea2f": 0.04, - "daryledwards.eth": 0.28 - } - }, - "hypercertData": { - "workScopes": "ReFi Commons Prize", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "refidao.eth", - "rights": ["Public Display"] - } - }, - { - "title": "Atlantis", - "address": "0xfbCA78474A09E2BF3543f4Fc1037152ea2c6C32d", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x13fdb2715bc255356cf8f34ec8d40f3ffd0e2d38299b5533ee2c7772e2948e5b", - "projectDescription": "\ud83d\udd31 THE PROBLEM\n\nSeeded in 2022, Atlantis is a social network dedicated to powering credible climate action.\n\nA problem like climate change requires billions of people coming together. Today\u2019s social networks are not designed to facilitate this moment at speed & scale because it lacks the efficiency & incentives to mobilize people for improved climate resilience & financing.\n\n---------------------------------------------------------\n\n\ud83d\udd31 OUR SOLUTION\n\nWith state-of-the-art technology grounded in natural science developed from the frontiers of climate change, Atlantis is a social network specially designed to incentivize a wide range of credible climate actions. It is designed to be borderless & inclusive, to mobilize large amounts of people while continuing to be personal & rewarding.\n\nAtlantis is solving this by designing a decentralised community-owned social network that will power the next generation of social impact, regenerative economies & carbon/impact credits.\n \n---------------------------------------------------------\n\ud83d\udd31 WHO ARE WE \nWe are builders & changemakers from the frontlines of climate change. Fueled by social and climate injustice, we are driven to reimagine the way humans come together to solve one of humanity\u2019s biggest challenges, global warming.\nOur team consists of passionate engineers, climate experts, designers & social entrepreneurs who are building viable business models that impartially reward all stakeholders for their impact. \n---------------------------------------------------------\n\ud83d\udd31 WHY IS ATLANTIS A CLIMATE SOLUTION?\nA social network which will allow users to collaborate better & take credible climate action while getting incentivized for it (Atlantis Citizen App)\nInteresting features and their benefits to users:\n\ud83c\udf31Social Profile - A user\u2019s social profile within Atlantis, is a compostable social identity layer which acts as a next-generation social capital opening up access and recognition across the internet & IRL. \n\ud83c\udf31Earn - Complete digital/physical climate bounties, earn in your favourite token/currency & pick up a whole lot of good karma along the way.\n\ud83c\udf31Marketplace - Choose from a wide range of products/services from vetted green brands, curated specially for Atlantis users. The best part: you can burn your earned Karma to unlock huge discounts. \n\ud83c\udf31Maps - A location-based registry recording impact and vital eco data that broadens users\u2019 understanding of climate change and help them visualize climate action like never seen before.\n\ud83c\udf31Impact Certificates - Verified and Immutable proof of Impact for a user\u2019s actions.\n \n---------------------------------------------------------\n\ud83d\udd31 WHAT WE HAVE BUILT SO FAR [2022]\nJanuary - March 2022\n\ud83d\udc9a Completed design phase of Atlantis Citizen App (dApp leveraging blockchain technology)\n\ud83d\udc9a Setup Media Team and Launch Atlantis Twitter Handle\nApril - June 2022\n\ud83d\udc9a Raised grants from Arcana and Mercy Corp ventures (total: $125,000)\n\n\nJuly - September 2022\n\ud83d\udc9a Launched an on-ground pilot project in rural India, Chikmagalur focusing on climate action around water\n\ud83d\udc9a Partnership with Shamba Network, leveraging their GIS expertise for developing on-ground projects in Rural India\nOctober - December 2022\n\ud83d\udc9a Launched an on-ground pilot project in rural India, Gokarna focusing on climate action around food forests (thanks to GR15)\n\ud83d\udc9a Organized India's first-ever ReFi summit, ReFi India, which hosted 100+ guests,15+ speakers\n\ud83d\udc9a Completed frontend & smart contracts on Solana blockchain for the Atlantis Citizen App \n\ud83d\udc9a Grew our community on Twitter to 1500+ followers with over 10k average daily impressions and hosted over 50+ Twitter spaces\n\ud83d\udc9a Co-founded the Solarpunk Guild, a collective that supports SP-inspired projects\n---------------------------------------------------------\n\ud83d\udd31 TEAM\nAtlantis is founded by two mechanical engineers, Irthu and Nakul, decade-long friends who spent the last 5 years building climate solutions. \n\nTheir first venture, Hydrop, was a decentralised water network that served over 11,000 users in Bangalore. Bootstrapped & profitable, this helped them build out their bigger vision in the form of Atlantis.\nIrthu S is a Mechanical Engineer & Product Designer with 10Y in Startup Saas & Ecommerce before getting into Climate tech.\n\nNakul R is a Mechanical Engineer, specialised in leading Operations & Finance. \nBefore joining Irthu, Nakul spent over 5 years in the Aviation and Medical Sector. \n\nOver the last 5 years, both founders have accumulated vast amounts of experience building climate solutions on-ground across different terrains and geographies within India. \n---------------------------------------------------------\n\ud83d\udd31 WHO DOES THIS BENEFIT?\nFor Individuals\n\ud83c\udf33 Helps you to coordinate & collaborate better for climate action\n\ud83c\udf33 Helps you to easily transition to green consumerism through products/services from verified Green brands\n\ud83c\udf33 You can build/join local smart grids that are climate-resilient with your friends/community\nFor Founders/Experts\n\ud83c\udf33 10X easier & affordable for you to set up on-ground carbon credit/impact projects\n\ud83c\udf33 Provides you with a wide range of financing options for deploying on-ground carbon/impact projects\n\ud83c\udf33 Educators, experts & researchers can cross-share their knowledge with ease\n\ud83c\udf33 Facilitate interoperability between DAOs working towards regenerating the planet\n \nFor Investors\n\ud83c\udf33 Access to a wide range of on-ground projects of all sizes and impact\n\ud83c\udf33 Ultra transparent funding mechanism with real-time tracking & impact certificates\nFor All\n\ud83c\udf33 Whether it is time, energy, or money spent on the network, EVERY action gets you rewarded \n---------------------------------------------------------\n\n\ud83d\udd31 WHAT\u2019S NEXT FOR ATLANTIS\n\nImmediate Goals:\n\n\ud83d\udfe2Launch Citizen App V1 on Solana blockchain in February, onboarded 200+ users for beta testing\n\ud83d\udfe2Co-host the Green Pill festival; a 5-day event in Atlantis Sanctuary, Gokarna, with ReFi India\n\nBusiness Goals:\n\n\ud83d\udfe9Onboard 50+ DAOs & 10,000 network users (Chikmagalur 3K, Gokarna 2K, Global 5K)\n\ud83d\udfe9Explore strategic partnerships with carbon marketplaces, standards & ReFi projects\n\ud83d\udfe9Build an eco-vehicle, partially powered by solar panels, in partnership with the Solarpunk Nomads (https://twitter.com/SolarpunkNomads). Stationed in Southern India, it will be used for educational activities & expeditions to document Climate Change\n\ud83d\udfe9Facilitate/Host more IRL/virtual ReFi & ReAg workshops for spreading climate awareness & increasing adoption\n\nEngineering Goals:\n\n\ud83d\udc9aFurther develop the Atlantis interoperable protocol layer with key features & partnerships\n\n", - "projectWebsite": "https://www.notion.so/atlantian/Atlantis-d22850ad241b469eb9c06d8d0c800ca4", - "projectLogoCid": "bafkreicxh6rkvpmtfdwifdqd2bbcz6zf6lisctz7dldk3f5vw5cex3foum", - "projectBannerCid": "bafybeiegcx32don2paaogta7nunxatkuzl2ubfkpuqhilmq33ce3bq4aty", - "projectTwitter": "AtlantisDAO1", - "projectGithub": null, - "userGithub": "Atlantian001", - "fundingTotalDollars": 18676, - "donorsTotal": 462, - "fractionsTotalSupply": 18578, - "hypercertEligibleDonors": 430, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "Atlantis", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0xfbCA78474A09E2BF3543f4Fc1037152ea2c6C32d", - "rights": ["Public Display"] - } - }, - { - "title": "BETTER", - "address": "0x0F7272F8873B68b2a2F52685311822D831afC8b4", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x21cf1e3113b6bc01f3bc0517be60f2bcf495ba9e6ba9be416ec0fb863c8c1ec7", - "projectDescription": "\nTL;DR: \nBETTER is building a web3 movement for planet positive impact \ud83d\udc4b \ud83c\udf0e Because Earth is non-fungible. So let\u2019s not burn it.\n\udb40\udc20\nWEB3 IS GREAT. NOW LET\u2019S TRY AND MAKE IT TO WEB4. \n\nLaunched by a team of creatives and crypto enthusiasts \u2013 whose track record includes working with the likes of Nike, Google, Facebook, The North Face, and more \u2013 and supported by advisors spanning the worlds of product development, climate science and technology, BETTER aims to subvert the doom and gloom narrative on climate change, empower action in new ways, and foster a community of people looking to make a difference. \n \nA huge thank you to everyone who supported us in the GR15 Fundraising round, making BETTER one of the top projects in Gitcoin Climate Solutions \ud83d\ude4c \n \n \udb40\udc20\n\u27a1\ufe0f WHAT WE\u2019RE BUILDING IN Q1 2023. \n\nWhile there is a lot we\u2019re working on for the larger vision of BETTER, here are a few things we are excited about in the near term:\n\n\ud83d\udd1c \ud83c\udf0e BETTER GOODS \nIn our aim to turn attention into action on climate change, we\u2019re building a storefront at the intersection of web3 and web2. Filled with BETTER-branded products that straddle the line of provocative social commentary and real-world goods, the store will raise awareness around climate change and ReFi, while also driving value directly to the BETTER CLIMATE FUND. \n\n\ud83d\udd1c \ud83c\udfa5 BETTER FILMS \nFollowing on the success and reception of the BETTER DAO PSA released in November, members of the DAO from the entertainment and advertising industry will continue to raise awareness about the urgency of climate change with the call to join the BETTER DAO to take action. Supported by industry professionals, new BETTER Films will bring attention to the DAO\u2019s planet-positive initiatives, new products, and storefront. \n\n\ud83d\udd1c \u270c\ufe0f CLIMATE FUND ENHANCEMENTS \nOur team is currently working on integrations with existing protocols to streamline the BETTER CLIMATE FUND, making it easier to deploy holdings for impact initiatives, as well as creating easier ways to contribute to the fund and govern it. New B2B and B2C solutions will provide novel ways to engage with projects, community members, and onboard new users to create direct planet-positive impact. We\u2019re also in the early stages of developing a front-end UI to showcase the real-world impacts and initiatives currently funded in real time. \n\n\ud83d\udd1c \ud83c\udf3f BETTER BUDDIES REWARDS \nNFT staking, upgrades, and exclusive product access are in the works for holders of our genesis collection. \n\n\ud83d\udd1c \ud83e\udd1d BETTER COLLABS \nOngoing collaborations with brands, projects, and companies (we can\u2019t announce publicly yet) from web3 to web2 will bring new users, products, and utility to the BETTER ecosystem. \n \n\udb40\udc20\n\u2705 Q3-Q4 2022 (GR15 Update)\n\n\u2192 \ud83c\udf0e BETTER BUDDIES: Our first collection of 2,050 planet-positive NFTs, launched 12.12.22 on the Ethereum blockchain. \n\n\u2192 \ud83c\udfac BETTER DAO PSA: Members of the DAO from the entertainment industry created a public service announcement (PSA) to raise awareness about the urgency of climate change with the call to join the BETTER DAO to take action. Currently 120k+ YouTube views, 12k+ Twitter Impressions. Supported by director Daniel Stessen (Dream Corp LLC on Adult Swim and in development at Bento Box Ent. with John Krasinski and The Office co-creator, Stephen Merchant) production from Miniac (clients include Adidas, Lululemon, Mirror and more), and editorial/VFX executed by Revel. \n \n\udb40\udc20\n\ud83c\udf31 CLIMATE IMPACT\n\nBETTER gives its community members a tangible mechanism for creating planet positive impact IRL through the BETTER CLIMATE FUND, which is controlled by the community through a DAO. Our growing list of Climate Advisors helping to steward the best possible use cases for the Fund include policy and strategists from Climate Resolve, Toucan and MIT. \ud83e\udd1d \n \nThe future of the BETTER CLIMATE FUND is in the hands of the community, meaning it could expand into any number of different areas including conservation, new forms of tokenized climate impact credits, individual donations to compelling causes, and more. \ud83c\udf3f\n \nFor more info on how the DAO powers the Climate Fund, our team, and our advisors, please visit our website.\n\n\udb40\udc20\udb40\udc20\udb40\udc20\n\udb40\udc20WHY GITCOIN GRANTS?\n\nGrant funding will assist in Development, Business, and Marketing. \u200b\u200bCurrent Alpha Round funding will help:\n \n\u2705 BETTER CLIMATE FUND development costs and back-end support\n\u2705 Film production and marketing for BETTER GOODS and merch\n\u2705 BETTER STORE web2+web3 integrations, front-end and back-end development \n\u2705 BETTER BUDDIES NFT staking rewards, smart contract development, back-end support, deployment fees\n\u2705 Audit of existing smart contracts\n\u2705 Fixed business costs\n \n\udb40\udc20\nThank You \u270c\ufe0f\n\n", - "projectWebsite": "https://betterdao.io", - "projectLogoCid": "bafkreiaiidaszfzfo5vsccxdtr4rgtw5u46lukf6ucqh2jrtgrqls5oy5y", - "projectBannerCid": "bafybeifuz277vheu354fr5aoyakpji4hypv2yxrzu2ohh4axhq5b2xwbju", - "projectTwitter": "hodl_better", - "projectGithub": null, - "userGithub": "betterdao", - "fundingTotalDollars": 13189, - "donorsTotal": 378, - "fractionsTotalSupply": 13097, - "hypercertEligibleDonors": 353, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0x74E0792148dbA52932e4E333194c27958864Ad72": null, - "0x1EA3350584748b217c41f29f4506a1bb90de7A0B": null - }, - "safeUsers": { - "0x0F7272F8873B68b2a2F52685311822D831afC8b4": 0.01 - } - }, - "hypercertData": { - "workScopes": "BETTER", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x0F7272F8873B68b2a2F52685311822D831afC8b4", - "rights": ["Public Display"] - } - }, - { - "title": "ReFi Spring", - "address": "0x14CB60F6Aca2b2A68d975743baCb33F01f587da5", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x2971da13feca9a170191e5ee5850beb57acbab9f5850e96b50f5d2ab15a351f2", - "projectDescription": "TLDR - Let\u2019s make ReFi accessible for all! Gitcoin support will enable support for IRL events establishing places of belonging for the ReFi Movement.\n \n Our Why?\n \nImagine a regenerative economy, a financial system that serves humanity and our collective home - Earth.\nWithin web3, the ReFi movement aims to cultivate this vision within a new economic system. ReFi Spring exists to support its emergence across a rich diversity of global networks by facilitating strong bonds between individuals through human IRL interaction. \n \nWhat does ReFi Spring do?\n \nReFi Spring is a nonprofit working to enable global IRL ReFi events to create new communities in the ReFi ecosystem. We do this by providing free, accessible, full-range event support services and educational content, including: \n \nHow we do it\n \nEvent Toolkit: This toolkit contains all the information event organisers need to run a successful ReFi event, including event frameworks, marketing materials, tips for press engagement, workshop plans, and more.\n \nEvent Funding: Every ReFi event can apply for event funding; however, our funding criteria is weighted towards supporting events by and for marginalised communities. We recognise the importance of justice, equity, diversity, and inclusion as fundamental values supporting the healthy growth of the ReFi ecosystem. \n \nEvent Organizer Cohort: Providing upskilling sessions and the networking environment to grow the community of ReFi on-the-ground leaders.\n \nIntro to ReFi Course: ReFi Spring is currently curating an \u201cIntro to ReFi\u201d online learning course for new and native audiences to understand and engage in the ReFi ecosystem. \n\nReFi Rabbithole: Supporting the creation set of interconnected materials that explain what ReFi is to new audiences\n \nWe offer all of the above and so much more as a public good to the ReFi Community.\n \nGR15 Update\n \nThanks to GR15 support, we enabled a further five events for a total of 27 events for Season 1 of ReFi Spring \n \nReFi COP16 was series of talks, workshops, and panels addressing the use blockchain to increase the efficiency of the global fight against the climate emergency led by Regen Network at COP16.\n\nReFi Mercadito Verde - A ReFi Spring event focused on social currencies which promote a circular economy and a network of exchanges in Monteverde, Costa Rica.\n\nReFi India - A hugely successful first ReFi event in Bangalore, with over 100 participants and 15+ speakers.\n\nReFi Primavera Regenerativa - In Minas Gerais, Brazil, this event kicked off a season of meet-ups between web3 natives and agroforestry practitioners.\n\nDescentraliza BH - The first Bankless Brazil IRL event introducing newbies to Web3 and Web3 natives to the ReFi movement, this was the first event to address ReFi in the city of Belo Horizonte in Minas Gerais, Brazil.\n\n\n \nAlpha Round Goals\n\nGoals for Alpha Round\n \n$5000 can fund 2 events + support our ongoing operational costs and the development of further open-source event materials\n$10000 can support 4 more events in 2022 + \u201c \u201d\n$20000 can support 8 more events in 2022 + \u201c \u201c\n$50000 can support 20 more events in 2023 + \u201c \u201c\n\n\nIn recognition of the exclusive nature of the Alpha round and our strong desire to continue to see the growth of the ReFi movement, ReFi Spring will drip 25% of the total of donations to gitcoin projects that support underserved communities and that are actively supporting Regenerative projects and education. \n \n \n\n \nThank you for your support and for being part of this movement! There\u2019s never been a more vital need to regenerate the Earth.\n", - "projectWebsite": "https://refispring.com", - "projectLogoCid": "bafkreiaziofnnzmxumf5qtdxwjy6mlaiowmde6ajsayunno4s7sbmfdj5e", - "projectBannerCid": "bafybeico3hrjr4a56cqddgvul7dbea4dwio5lqr2qwlhjhmam6mjrd3rou", - "projectTwitter": "@RefiSpring", - "projectGithub": null, - "userGithub": "", - "fundingTotalDollars": 45357, - "donorsTotal": 445, - "fractionsTotalSupply": 45262, - "hypercertEligibleDonors": 419, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "ReFi Spring", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x14CB60F6Aca2b2A68d975743baCb33F01f587da5", - "rights": ["Public Display"] - } - }, - { - "title": "Bloom Network", - "address": "0xF64bBc221f89cc882fBa507908bbE4Ae3Ad2F470", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x29ebfa45b1d708eda13c20e04a999053361a809a89c48041ffe67890329aefd1", - "projectDescription": " \n\ud83c\udf0d Bloom is a cyber-physical social network that helps people find and participate in grassroots climate actions where they live. https://bloomnetwork.earth\n\nToday, we are 30,000 people on the ground in 22 local Bloom hubs across 9 countries doing rapid climate repair and adaptation.\n\n\ud83d\udc40 Problem\n\n67% of people feel there is a climate emergency, but they don't know what they can do about it. Meanwhile, there are plenty of solutions happening on the ground, but they lack media visibility and funding, so they remain underground.\n\n\ud83c\udf3b Solution\n\nLocal Bloom hubs connect existing projects in their region. They plant community gardens, teach people to form agroforestry co-ops, and build regional token economies focused on land and water stewardship. Online, we share knowledge P2P as a global community to implement climate repair more quickly and cost-effectively.\n\nHere is a video produced by Diamante Bridge Collective, a local Bloom hub in Costa Rica. It tells the story of what's happening on the ground and how we use web3 to bridge the finance gap to local-led regeneration.\n\n\ud83c\udf3f https://youtu.be/ENPt3lednAM\n\nBloom's social network is a vibrant hub for people to see the beautiful work happening around the planet, to flip mainstream narratives from fear to constructive, empowered action of caring for one another.\n\n\ud83c\udf38\ud83c\udf38\ud83c\udf38 Our goal for 2023: Welcome 100 new local Bloom hubs. \ud83c\udf38\ud83c\udf38\ud83c\udf38\n\nWhat will we buidl with funds from this round?\n\nComplete the social interactivity on Bloom Platform : Connect Unlock member NFT to our sign-in system : Pilot our local/international member fee splits to jumpstart local Blooms : Complete our cooperative/DAO formation with the help of an all-women legal team. This will reduce risk for our longstanding communities as we teach them to use cryptocurrency.\n\nSince GR15:\n\nWe released the MVP of our multi-user blogging platform: regenerative action templates, action reporting (MRV), blogs, profiles, and automated local Bloom media feed pages. Lastly, our platform crew became an all-female team! \ud83d\ude4b\ud83c\udffd\n\n\ud83c\udfac Why Now\n\nLocal grassroots climate projects and Indigenous leaders have deep local ecosystem knowledge for how to repair soil, prevent deforestation, and reduce flooding risk. They are the key to accelerating climate action globally.\n\nWhy us \ud83d\ude4c\ud83c\udffd\n\nLocal Bloom organizers are master community builders, local food system stewards, and healers. Our tech team works with major television networks and dOrg.tech building DAO tooling. Lastly, our media team, based in Mumbai India, are creating the most wonderful graphics and communications from their experience as journalists and creatives! We sincerely welcome you to participate and support.\n\nTeam: Magenta Ceiba, Meg Rivers, Hannah Mitchell, Aishwarya Iyer, Manasa Suresh, Anita Caldera, Grace Moore, and 50+ local community organizers\n\nPartners: MetaGame, Giveth, ReFi DAO, All for Climate DAO, Cohere, Kolektivo, dOrg\n\n\ud83c\udf0a Twitter @ourbloomnetwork | https://bloomnetwork.earth", - "projectWebsite": "https://bloomnetwork.earth", - "projectLogoCid": "bafkreihe7f6mggku54yewycm4fmvypaodk32q6fkxwtb7zpkcrk6satshi", - "projectBannerCid": "bafybeiavpd5lwzfk2req2jpvz3c7fuewzgs7diaqgz2f4247fwghystbci", - "projectTwitter": "ourbloomnetwork", - "projectGithub": null, - "userGithub": "magentaceiba", - "fundingTotalDollars": 9528, - "donorsTotal": 492, - "fractionsTotalSupply": 9418, - "hypercertEligibleDonors": 456, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0xb4bAf33A95dbcE7B0B067A6F22017ad0B68c6d5b": null, - "0x1644F51c61bcBF511FfF1fE7678DF6F445F19ccA": null, - "0x152ad2E12E102aBF64280C5e3d70257EFfb0EDe0": null - }, - "safeUsers": { - "0xF64bBc221f89cc882fBa507908bbE4Ae3Ad2F470": 0.02127659574468085 - } - }, - "hypercertData": { - "workScopes": "Bloom Network", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0xF64bBc221f89cc882fBa507908bbE4Ae3Ad2F470", - "rights": ["Public Display"] - } - }, - { - "title": ".basin - perpetual place-based climate & nature finance", - "address": "0xD2584c1CF7E3fF11957195732d380DC886F5f05b", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x2e4e97b9d9c36923cf2c1062f16c6cb83259c1e0b9a10ac466bf20cec9589ae1", - "projectDescription": "\"What you seek is seeking you.\" - Rumi\n\n --------- \n\nThe systems and institutions that got us into this mess will not get us out. The climate and biodiversity crises will be solved from the bottom up: by People like you, Place by Place by Place, on Purpose.\n\nTLDR\n\n.basin is perpetual place-based climate and nature finance.\n\n.basin scales land, ecosystem, and carbon sink restoration and conservation to solve the climate, nature, and carbon crises.\n\n\"RISK\"\n\nThe crises we face are interconnected and not isolated from one another. \n\nLand-use change caused by development pressure has resulted in a decline of 69% in species populations since 1970. One million species, or 1 in 7, are now threatened with extinction, with another 40% in decline. Simultaneously, if we fail to limit temperature increases, climate change will exacerbate biodiversity loss.\n\nThe climate and biodiversity crises have two main things in common: risk and land use. Whether it be wildfires, flooding, heat, drought, habitat loss, income inequality, carbon sequestration, pollination, desertification, deforestation, etc, etc all pose serious risks to individuals, businesses, investors, and governments AND all interact with land in one way or another.\n\nHistorically, risk is not directly investable. But land, and real estate, are.\n\nINVESTABLE\n\n.basin makes climate risk and nature loss risk investable through the use of tried and true real estate investment fundamentals to attract agnostic and indifferent capital into climate solutions, climate resilience, and climate adaptation. \n\nThe .basin model combines law, technology, and finance to make climate and nature investable not only for institutional and private capital but also philanthropy.\n\nCLIMATE & NATURE PROJECT DEVELOPMENT\n\nClimate will be solved not only place by place by place but project by project by project. The .basin protocol scales individual climate, carbon, and nature projects through shared upside and reduced risk. \n\nThe .basin model of course works for forest projects but we take it several steps further to make projects that have enormous ecosystem service benefits (in addition to carbon) like wetlands, floodplains, peatlands, urban heat islands, estuaries, algae, biocrust, etc investable. The .basin model also works for embodied carbon in buildings, the plugging of methane/gas leaks, and keeping oil and gas permanently in the ground.\n\nRESTORATION & CONSERVATION\n\nWhile the .basin model works for any property, regardless of size or location, the focus is on carbon sink and ecosystem restoration and conservation for maximum climate impact.\n\nINDIVIDUAL & COLLECTIVE\n\nThe .basin model is designed to allow individuals to prosper while the collective flourishes. The flow of $STREAMS through $BASINS is a circular value exchange whereby collective success is only possible if individuals are successful and vice versa. All .basin's can be solely, jointly, or collectively managed.\n\nSPEED & SCALE\n\nThe organizational and operational model of .basin is deployable, repeatable, and scalable for any place on earth and any type of ecosystem. As a series of interrelated but independent entities .basin is built for both the challenges of today and the promise of tomorrow. Our main entities are trust.basin, foundation.basin, dao.basin and a series of llc.basin's.\n\nPLACE, PURPOSE & PEOPLE\n\nClimate and nature can be (over)simplified to Place, Purpose, and People. Each .basin represents a place, purpose, or person/people but each is deeply connected to the others.\n\nPLACE: as indicated by the name, .basin is primarily organized by watershed or basin. This is similar to how humans have organized for thousands of years before we labeled nations and states. But .basin's can also be an ecosystem, your town, a place you visited, a place you care about. We have even minted .basin's for individual trees. Any point on the globe can be a .basin. Examples: hudson.basin, indus.basin, flintriver.basin, congo.basin.\n\nPURPOSE: Just as we share common-place, we share common interests and common purpose. This could be a cause you care about, a movement, a hobby or even a sport. Most purpose .basin's are climate, nature and biodiversity focused. Examples: baldeagle.basin, beaver.basin, greensalamander.basin, wetlands.basin, carbon.basin, nature.basin.\n\nPEOPLE: people are the connection points to place and purpose. People are individuals, groups, organizations, companies, and even governments. Examples: tmo.basin, joebrewer.basin, will.basin, finley.basin, mckenna.basin\n\nUNDER THE HOOD\n\nAll .basins are ERC-721 NFT\u2019s energized with Charged Particles (@defiNFT). All .basin's can store and hold any number and combination of ERC-20\u2019s or NFT\u2019s inside. Many ERC-20's are yield bearing via Aave inside each .basin and can have time locks.\n\n.basin's are a store of and fund what is truly valuable. As perpetual purpose trusts and permanent endowments for natural capital and ecological assets .basin's hold financial value but also clean air, clean water, biodiversity, pollination, human health, and safety or any tokenized impact certificate. The more value a .basin holds the more $STREAMS it receives.\n\nCONTRACTS\n\nhttps://opensea.io/collection/basin\n\n$BASIN: https://polygonscan.com/token/0x4bf5a99ea2f8de061f7d77ba9edd749503d945da\n\nCharged Particles: https://polygonscan.com/address/0x0288280df6221e7e9f23c1bb398c820ae0aa6c10\n\n$CRK (CREEKS): https://polygonscan.com/token/0xf122a63f9fd807fa28a3495ad822ad84c934793d\n\n$STREAMS\n\n$STREAMS are the flows of value through the .basin ecosystem. Technically they will be either a fungible ERC-20 or a semi-fungible ERC-1155. $STREAMS are designed to incentivize positive outcomes and eliminate negative externalities. $STREAMS are governance, access, and utility but also a flow of absolute value from trust.basin distributions. \n\nPREVIOUS GRANT ROUNDS\n\nGitcoin has moved our work forward over the last 14 months. We have used the funds for:\n\n- Beta dApp: https://beta.basin.global\n\n- Gitbook: https://docs.basin.global/v1\n\n- Main website: https://www.basin.global\n\n- Formed our non-profit arm: https://www.basin.foundation\n\n- Formed https://basin.realestate which trust.basin owns 10% of. \n\n- Launched the .basin contract and minted 500+ $BASIN tokens (with more in the works).\n\n- Allowlisted the .basin contract with Charged Particles (@DeFiNFT).\n\n- Set up 25 Safes for regional .basins and prototyped financial flows between them ($STREAMS) (more Safe\u2019s coming)\n\n- Legal work for the DAO, Foundation, Trust, and LLC.\n\n- Pilot project with Aspen Valley Land Trust on the 141 acre Coffman Ranch which has a combination of riparian forests, shrublands, grasslands, and wetlands that provide a richness of wildlife habitat and activity.\n\n- Collaboration with TaterDAO, CougarDAO, and RWA Consortium for on-chain real estate purchases and open RWA standards.\n\n- Continued work on the basinStack a holistic assessment tool and methodology for real estate based natural capital credits, carbon credits, and impact certificates.\n\n- Minted $CRK (CREEKS) our internal test ERC-20 token.\n\n- Set up and tested 0xSplits for climate and nature project as .basin entity payments.\n\n- Evaluated SuperFluid for $STREAMS flows between Safes and .basins to mimic the water cycle.\n\nON DECK / UP NEXT\n\n- Working on running our own Gitcoin Protocol Quadratic Funding round with corporate and philanthropic partners with select .basins as grantees.\n\n- Formal build out of the .basin dApp with GIS and climate project development tools.\n\n- Minting .basin's for as many threatened and endangered species and places as possible.\n\n- Pilot projects to run the basinStack on and structure the climate.lease deals.\n\n- Corporate and civic partner pilot projects for surplus real estate and ESG goals.\n\n- Launching a ERC-1155 contract for individual .basin shares, $STREAMS ($STREAMS fill $BASIN's) and custom NFT projects.\n\n- Continue legal engineering work and tooling with KaliDAO, LexDAO, TaterDAO, and CougarDAO. \n\nUSE OF FUNDS & 0xSPLITTING\n\nThe funds will be used a) generally for our mandate of stewarding ecosystem services and the benefits nature provides to and for all living creatures present and b) specifically for the initiatives mentioned throughout this proposal.\n\nWe have set up 0xSplits to share the funds with dao.basin, trust.basin, foundation.basin, llc.basin as well as select Gitcoin bundles and projects (TBD):\n\nhttps://app.0xsplits.xyz/accounts/0xD2584c1CF7E3fF11957195732d380DC886F5f05b/\n\nMUCH THANKS\n\nA special thank you to all of our supporters, the Ethereum community, and the Gitcoin team! We could not do it without you!", - "projectWebsite": "https://beta.basin.global", - "projectLogoCid": "bafybeib7enyumre4jrfh4gxbefm2lposmkqyx5li2qlcpujw4kypp2dp5a", - "projectBannerCid": "bafybeic5q22qe6moyydeqqhtidgkn3hxc6glq5zg7k4ncfeksy5pzvkarq", - "projectTwitter": "basinDAO", - "projectGithub": "basin-global", - "userGithub": "tmoindustries", - "fundingTotalDollars": 4915, - "donorsTotal": 186, - "fractionsTotalSupply": 4879, - "hypercertEligibleDonors": 175, - "ensName": null, - "addressType": "0xSplits", - "addressScan": {}, - "hypercertData": { - "workScopes": ".basin", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0xD2584c1CF7E3fF11957195732d380DC886F5f05b", - "rights": ["Public Display"] - } - }, - { - "title": "Barichara Regeneration Fund \u2013 Prototyping a Bioregional Regenerative Economy", - "address": "0xFd9F8A0f4bdEaC72F08AF1c708023cC31dD2E3BE", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x329170e769ace967de0a1467dbeb2c3eaee2580099ccb9dc650452ab10216821", - "projectDescription": "About\nThe Barichara Regeneration Fund (BRF) supports the wholesale restoration of a 500,000-hectare territory in the Northern Andes of Colombia by developing and weaving together a network of individuals and organizations pursuing regenerative work on the individual, social, and ecological scale. Money received will be utilized to continue the ongoing work of the BRF to catalyze on-the-ground regenerative work in Barichara in service to the creation of a prototype of a bioregional regenerative economy that can be utilized worldwide.\n\nIntroduction\nThe town of Barichara, Colombia is uniquely positioned to cultivate large-scale regenerative work. Situated on a plateau, Barichara is at the center of a 500,000 hectare territory defined by its own regional climate system. The region possesses an incredibly unique ecosystem, the High-Andes tropical dry forest, that exists nowhere else on Earth with eighty percent of the species here being endemic, only existing in this territory. Unfortunately, the region has also seen intense monocrop agriculture, leaving only ten percent of the native forests intact. This, in turn, has led to soil degradation and erosion, the drying up of rivers, and the loss of the unique biodiversity of the territory.\n\nWhat Has Been Accomplished \nWe successfully raised $21,000 in the previous gitcoin round (GR15) and have made considerable progress in setting up a territorial foundation capable to oversee this territorial-scale regenerative work. This included hosting the #ReFiBarichara event in the first week of October that gathered like-minded people from the web3, crypto, and regenerative spaces.\n\nProjects we are supporting include:\n1.\t The Center for Syntropic Agroforestry to establish demonstration sites, train local farmers, and share technical knowledge about this powerful approach to reforestation and economic development.\n2.\tA community kitchen and store called Casa Comun that promotes the organic emergence of solidarity food exchanges while supporting local artists and craftspeople.\n3.\tA community reforestation project called Bioparque M\u00f3ncora that is a highly visible symbol of peace, reforestation, and ecological education that works with area schools and national universities.\n4.\tThe construction of a community theater called Canay Colibri where children learn the art of storytelling, filmmaking, and the performing arts \u2013 all in service to regeneration of the territory.\n5.\tThe Barichara Ecoversity that is weaving educational activities throughout the region with a special focus on watershed restoration, preservation of native ecology, and how to create regenerative economies at the bioregional scale.\n\nWith funds that we raise during this gitcoin round, we will continue weaving a tapestry of local projects and sharing what we learn with the rest of the world through Barichara Updates and learning journeys.\n\nLand and the Ecoversity\nThe BRF works to restore ecological health through a multifaceted strategy of weaving together current regenerative projects in Barichara, purchasing land for regenerative work, and creating groups and organizations to facilitate this work. Already, the BRF has raised $50,000 to purchase a heavily degraded plot of land, Origen del Agua, and has begun regenerative work on it.\n\nRecently, the BRF has secured a second piece of land, Las Albercas, that will be the future home of the central campus of the Barichara Ecoversity. Here an off-grid campus will be created to provide on-the-ground training in various regenerative techniques such as permaculture, rainwater harvesting, renewable energy solutions, and syntropic agroforestry. The Barichara Ecoversity will serve as an integrating hub for both research and education in the territory with the Las Albercas campus serving as a place for experts and students to gather to teach and learn the skills needed for restoring planetary health, all while cultivating a deep connection to the land.\n\nSyntropic Agroforestry\nOne of the central projects of the BRF has been spreading syntropic agroforestry throughout the territory. Syntropic agroforestry aims to foster climax ecosystems independent from outside inputs with an emphasis on plants geared towards maintaining food for human consumption. This works through the planting of food crops next to support species that aid with water retention, the fixing of nitrogen in the soils, the creation of shade, and the production of biomass to continually provide organic matter to cover the soil and enrich it over time. These methods encourage a process of ecological succession to occur as would happen in a natural process of forest expansion, just much faster and focused on supporting edible species. The process is one of syntropy with increased growth, diversity, density, and complexity throughout the entire system compared to conventional or organic agriculture.\n\nThe BRF has supported the creation of syntropic agroforestry projects throughout the territory. A syntropic agroforestry expert was brought to Barichara and has been teaching local farmers within the region. Specifically, two three-day design classes on syntropic agroforestry have been offered, giving participants a technical explanation of the principles of the technique and then hands-on instruction through the creation of two field sites. The demand for syntropic agroforestry has been great in the territory, and our aim is to continue supporting those wanting to learn on their journey towards transitioning to regenerative food production.\n\nOther Work\nThe work of the BRF is constantly evolving in relation to what is emerging on the ground in Barichara.\n\nA community council was set up to coordinate regenerative action in the territory with funds from the BRF being used to support fifteen local projects in the community, greatly facilitating the development of relationships among these projects in the territory.\nAs its successor, we are in the process of creating a Territorial Foundation to formally facilitate the reception of funds and mediate their use in a process ensuring consent and support from the local community.\n\nAll these efforts combine to form a cohesive and self-reinforcing Bioregional Investment Platform where the individuals and organizations dedicated to regeneration cyclically flow value amongst each other, creating a consistent spinning out of social and ecological value for the entire territory. With your help, the BRF aims to support this ever-evolving process of territorial regeneration.\n\nNext steps for the BRF\nThe work of the BRF has been ongoing for nearly three years, and much has been accomplished in that time. The relationships developed through this work and the land that has been acquired has given the BRF the foundation on which to pivot to long-term strategic planning to ensure the holistic restoration of the entire territory. One of our partners and collaborators, Commonland Foundation, has created a landscape investment framework currently utilized by fifteen territories around the world.\n\nTheir model is a five-step, twenty-year process to produce a self-sustaining regenerative economy, geared towards social and ecological improvement. Key to the success of this model is the formation of a core team with enough funds to dedicate themselves completely to this work all throughout the twenty-year period. This initial investment in a core team provides the supports necessary to ensure that the work reaches maturity, and a regenerative economy can form and begin to sustain the entire territory. This core team is currently in development and will continue the work of the ongoing regenerative projects in the area.\n\nThe development and funding of this core team forms one of three major funding efforts for the BRF. The second is the funding and construction of the Ecoversity, described above, and the third, the support of the current regenerative projects in the area. These three overarching projects will allow us to move towards holistic landscape regeneration at a bioregional scale. In total, this amounts to raising $500,000 in the next year to accelerate this work. The funds gathered through the Gitcoin grant round will be directed towards this purpose.\n\nBioregional Activators\nWe created a new community platform called Bioregional Activators to create a planetary network of regenerative economies \u2013 sharing what we learn from projects in Barichara to help other landscapes around the world. \n\nThis includes activating four bioregions in the Central Rockies that are all located in Colorado; an upcoming trip to Toronto and the Finger Lakes of New York to help form alliances among bioregions in the Great Lakes Region, and growing interest to have us work with landscapes in British Colombia, Mexico, Nicaragua, and Costa Rica.\n\nVision\nAll the activities of the BRF are in service to the creation of a real-world prototype of a regenerative bioregional economy. By weaving those that are on the ground, purchasing strategic pieces of land, integrating Web3 tools to monitor change in ecological health, and being continually open to new collaborative relationships as they arrive, the BRF intends to lay the groundwork for others to follow in their own territories. We hope that with the success of this model in Barichara, it can be used as a prototype worldwide and help regenerate the planet through regenerating local communities.\n\nLearn More\nBRF community council member Joe Brewer has made the effort to document its progress to English speaking audiences. He has formulated his thoughts on the process in his book, The Design Pathway for Regenerating Earth, and founded the Earth Regenerators network, a diverse platform with over 4,000 participants dedicated to restoring planetary health, to spread the model developed here, while learning from others\u2019 experiences. He and others from Barichara regularly provide updates on their progress in videos and articles on the network. \n\nTo learn more about regenerative work in Barichara visit: https://www.regeneratebarichara.org\n\nTo learn more about Earth Regenerators visit: \nhttps://earth-regenerators.mn.co/\n\nTo learn more about the planetary network of Bioregional Activators visit: \nhttps://bioregional-activators.mn.co/", - "projectWebsite": "https://www.regeneratebarichara.org", - "projectLogoCid": "bafybeigeqhk7tfc7f52pg2jkcai54gkqwpj3r6bhcko3uc356nj25tn67a", - "projectBannerCid": "bafybeifxcep64xyzluvcmmvnlkd6c4mhv6fuflm5gn33gwl7yt4lhbjxgy", - "projectTwitter": null, - "projectGithub": null, - "userGithub": "circlejoe", - "fundingTotalDollars": 5732, - "donorsTotal": 201, - "fractionsTotalSupply": 5689, - "hypercertEligibleDonors": 188, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "Barichara Regeneration Fund", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0xFd9F8A0f4bdEaC72F08AF1c708023cC31dD2E3BE", - "rights": ["Public Display"] - } - }, - { - "title": "ReCommon", - "address": "0xd704C5F9826191F3Bd06caE867d0f20CAfA8AeBA", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x34da3ca2039af745fdf37add512a3cb5fdd7b7b0a5c95fd74877742b534222b3", - "projectDescription": "\u2600\ufe0f TLDR \u2600\ufe0f\n\n- ReCommon is facilitating the emergence of a planetary network of sovereign, interconnected regenerative bioregional communities.\n\n- The Commons Credit is a whole-systems accounting and valuation methodology and investment vehicle for community-held land.\n\n- ReCommon is the global DAO that weaves together the various place-based Bioregional Nodes with RegenCLT governance.\n\n- All funds raised via Gitcoin go towards increasing our operational capacity and implementing ReCommon systems into real-world, regenerative community development projects.\n\n\u27a1\ufe0f read our full litepaper and learn more at www.recommon.land\n\n\ud83c\udf31 SINCE GR15 WE HAVE WE HAVE... \ud83c\udf31\n\n- Continued the development of the Commons Credit whole-systems accounting methodology, bringing together a diverse group of stakeholders and experts for our Commons Credit Working Group\n\n- Participated in ReFi Barichara with the Regenerate Barichara Fund and an international group of Regens. Out of this have grown ongoing conversations with the Earth Regenerators and other partners about utilizing the Commons Credit as a funding and accounting mechanism for their bio-regional regeneration efforts\n\n- Initiated conversations with communities in Colorado around the formation of a Bioregional Node that will act as the flagship and real-world laboratory for ReCommon\u2019s innovative community land tenure systems.\n\n- Integrated our learnings from 2022 to prepare for a big 2023, including initiating a land-based project in the American West. \ud83c\udfd4\n\n\n\u2728 OVERVIEW \u2728\n\nAt ReCommon, our mission is to facilitate the reclamation and stewardship of common land by supporting the emergence of resilient place-based communities and regenerative economies. To achieve this, we leverage regenerative financial infrastructure and innovative governance frameworks to secure communally stewarded lands for both current and future generations to thrive on.\n\nReCommon draws inspiration from three foundational pillars: the Community Land Trust model of land tenure, ecological design, and distributed technologies. When woven together, these three pillars of thought pose a viable alternative to the current extractive paradigm of land use and ownership that is destroying the ecological systems we need to survive and thrive here on planet Earth.\n\nThis particular model of land tenure is both new and old, a mix of time-honored principles and modern wisdom. Our organization is a catalyst for both global and local communities to rise to the unique challenges of our times and emerge into a new era of abundance and connectedness.\n\n\"The story of land is older than the story of man. Land came first; no man created it. Every society, large or small, must devise ways in which its members will share this gift. This is allocation. Members of the society must also determine under what conditions the land will be passed on to the next generation. This is continuity. And they must decide if, when, and how it may be traded with others. This is exchange.\" - Robert Swann\n\nReCommon is creating an equitable land tenure framework for democratically managing the intricately connected processes of allocation, continuity, and exchange. It's a scalable, adaptable model that enables people to balance land wealth in private control with the needs of the community and the Earth for regenerative, perpetual stewardship of land.\n\n\u26f0 THE COMMONS CREDIT \u26f0\n\nThe Commons Credit is a whole-systems accounting and valuation methodology for community-held land.\n\nIt serves two primary functions. The first is to properly value any given piece of land, including the ecosystem health, economic capacity, housing, food production, etc. The second is to create a way for ethical investors to finance the purchase of land and get a return on their investment while keeping the ownership within a perpetual trust and stewardship within the community.\n\nThose who invest in \u2018Commons Credits\u2019 are considered Patrons, representing 20 percent of voting power on both the global ReCommon level and on the Bioregional Node level, depending on the origination of the commons credit.\n\nThe Commons Credit serves as the digital record of a piece of land that is in the ReCommon network. When a piece of land enters a Bioregional Node\u2019s stewardship, a Commons Credit is created as the digital representation of the value of that land at that moment and is forever tethered to that piece of land.\n\nAs regenerative practices and community infrastructure are put into place, they increase the wholistic value of the land, which is concurrently recorded and updated in the commons credit, using a smart-contract NFT such as Charged Particles. This ongoing assessment is the whole-systems valuation methodology, and as MRV (measurement, recording, and verification) tools improve over time, the rate at which this assessment happens will trend towards nearly live updates.\n\nThe Commons Credit becomes a way to finance community-centered land regeneration by serving as the fertile middle ground between philanthropic donation and conventional real estate investment.\n\nThe Patron who purchases a commons credit for a particular piece of land doesn\u2019t own that land, which is owned by the bioregional node\u2019s trust, but they are included in both governance and upside in the appreciation of the value of that land.\n\nThe value of the commons credit tracks with the holistic evaluation of that piece of land, which will increase through regenerative use and sustainable development. When the land value goes up, it is reflected in the Commons Credit, and the Patron (the holder of the Commons Credit) can choose to sell it on the open market for profit.\n\n\ud83c\udfdb GOVERNANCE MODEL \ud83c\udfdb\n\nAt the core of our work, we create tools to reclaim, protect, and regenerate land through the use of the Regenerative Community Land Trust (RegenCLT) model of land tenure and governance.\n\nThe RegenCLT model is designed to lower barriers to entry for communities seeking to acquire land through purchase or gift and to develop a permaculture master plan for the site. This place-based plan takes into account the current state of the land, its future uses, its connection to the local and regional economy and community, and the global community at large.\n\nThe RegenCLT model is uniquely capable of acquiring all types of land, returning it to the commons, and stewarding it sustainably for future generations.\n\nGovernance power is shifted from an elected board of directors to the community of members directly, similar to the distributed governance of digital communities like DAOs.\n\nWe combine a \u2018one-person, one-vote' system with the \u2018balanced bucket' structure used by classic CLT boards. The result is that each person has a vote, and each vote goes through a weighted bucket system that directly corresponds to how that voter is connected with the land or project in question.\n\nThese are the 5 voting buckets, each with equal categorical weight:\n- General Members (20%) - people that are members but don\u2019t belong to any delineated subgroup\n- Stewards (20%) - leaseholders of land in trust in the ReCommon network\n- Elders (20%) - rights of nature representatives and holders of indigenous wisdom\n- Patrons (20%) - financial investors and holders of Commons Credits\n- Partners (20%) - partner organizations that provide resources and support in various forms\n\nReCommon follows this governance structure on a global level, and as such anyone can participate. However, each Bioregional Node also follows this structure on a local level.\n\nTo be a member of a Bioregional Node and participate in governance, one must live in that particular bioregion. This leverages the network effects that come from global connectivity while honoring the specificity of place and putting local decision-making first.\n\nAdditionally, Bioregional Nodes may choose to adapt and modify this 5 bucket model to the unique needs and characteristics of their bioregional community.\n\n\ud83c\udf32 WHAT\u2019S A COMMUNITY LAND TRUST? \ud83c\udfd8\n\nAll community land trusts strike the balance between project organizer, developer, and steward. Fortunately enough, the community land trust is a community development tool of uncommon flexibility that can accommodate a wide variety of land uses and development projects. Over the decades since the idea first came to fruition, community land trusts have been pushing the limits of what is possible with this governance framework.\n\nAt ReCommon we are continuing the evolution of the community land trust, integrating decentralized governance and regenerative cryptoeconomics to improve upon existing models.\n\nThe community land trust movement started with radical roots and was part of the \u2018back to the land and village\u2019 revival movements of the 1960s that pursued justice, equality, freedom, and resilient local communities.\n\nHowever, in recent years the movement has taken a turn toward affordable low-income housing. This work is undoubtedly a critical component, but alone it\u2019s not enough to address the complexity of the systemic problems of our time. In many ways, ReCommon embodies a return to the spirit found in the roots of the community land trust movement.\n\n\u27a1\ufe0f join us and learn more at www.recommon.land\n\n\ud83c\udf31 \ud83d\ude4c ~ THANKS FOR YOUR SUPPORT ~ \ud83d\ude4c \ud83c\udf31\n", - "projectWebsite": "https://recommon.land", - "projectLogoCid": "bafkreifodjbnlw7bypyxutfxzcpjvyj3t7ezm6apyt7uyrthn4iwycbame", - "projectBannerCid": "bafybeihvoozwtk7udvxfvuk7ymbagovp6y3niawovj5z4kmngt2s4x5epa", - "projectTwitter": "regenclt", - "projectGithub": null, - "userGithub": null, - "fundingTotalDollars": 1879, - "donorsTotal": 193, - "fractionsTotalSupply": 1835, - "hypercertEligibleDonors": 177, - "ensName": "recommon.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "ReCommon", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "recommon.eth", - "rights": ["Public Display"] - } - }, - { - "title": "dMeter", - "address": "0x788bd114C3f625600b547d5a08EC38E0ee90A06e", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x3f9ed1884e631b7684ab9421a7ad3b4b532308268bac91bdd772d483f0363131", - "projectDescription": "MRV \u2192 Regenerative Finance \u2192 Regenerative Design and Development\n\ndMeter is creating a decentralized monitoring, reporting and verification (dMRV) system. We are in the beginning of this dMRV process and countless building blocks are still missing. There will be problems and limitations that we encounter, but as these gradually get addressed it will become possible to use this new set of lego building blocks to build things that we can hardly imagine today.\n\nA. MRV (monitoring, reporting, and verification) overview\n\nMRV consists of three distinct features, all of which are vital to conveying legitimacy of regenerative projects (such as tree planting) to stakeholders. Monitoring is the process of measuring the total ecosystem and social services provided by the project. Measurements may be collected through satellite, IOT, georeferenced imagery from boots on the ground, as well as surveys that empower experts & citizen scientists. Reporting involves describing i) measured data, ii) the methodologies that were used to collect and analyze the data, and iii) potential biases as well as assumptions that went into the data collection/analysis. Verification refers to the review process involving a third party that is utilized to ensure the confidence in the validity of the uploaded data and methodologies.\n\nDecentralized measurement, reporting and verification (dMRV) means that no single entity will own, manage or regulate how MRV is done. Instead a collective of people from many different organizations can build upon and improve this dMRV system. For current accreditation standards a combination of on the ground data collection, satellite sensing and IOT devices are used to back the credits. Utilizing web3 mentality, trust minimized data collection methods can be created. An example of this is to write open codes for actions that used to be performed by humans, like detecting a tree and the species of tree it is. Other data collection technologies can become integrated into this system as they become standard in the future.\n\nOnce the data is collected, open source reporting and verification methodologies can be utilized to analyze the data. Entities that collect the data and create the analysis methodologies are paid each time data is used and an analysis done. This inspires entrepreneurs to build specialized dMRV services which can benefit further regenerative projects. The entire dMRV allows for standardization, trustlessness, immutability, transparency, and open accessibility. This paves the way for decentralized data backed credits. These credits are tied to a specific regenerative action and entity who carried out the action continuously updated over time as more data is gathered. This data and the methodologies used to analyze it is stored permanently and immutably. The collectors of this data are the owners of it, allowing for sensitive data to be fully controlled by its owner. The dMRV would assist regenerative projects across blockchains and be interoperable with any new blockchain that came into existence. Every entity that is involved with this dMRV helps to iteratively improve upon it. With this, local communities can become more deeply involved with how the regenerative projects they carry out go through the dMRV process as well as tap into funding that was not previously available to carry out these projects. Along with that the diversity and veracity of Natural Capital assets being valued can exponentially increase.\n\nMonitoring \n \nIn this dMRV everything is open to where there is only one final layer of trust- the data itself. Trust minimized data collection can be done through a combination of remote sensing, IoT, and human sensing (such as with smart-phones). The data collected is stored permanently and immutably through current technology such as Filecoin Green. By multiple data sources backing up that a regenerative action has occurred, more accurate calculations can be created. When one of those inputs is inaccurate, the other data sources can openly show a dispute. When a dispute arises, the stakeholders of the dMRV system can confirm or deny the accuracy of the data. Scoring this data for quality, resolution, and temporal frequency can enable any entity utilizing the dMRV to compare the data sources they pay for. Allowing them to quickly choose the best dataset for their needs. Through this, data becomes highly available as many organizations strive to provide the best data for people\u2019s needs. This puts publishers on a level playing field and allows the companies with the best data to naturally succeed. Along with that publishers can not only benefit from the dMRV utilizing the data but other organizations that might want their data (such as parametric insurance). When individuals can decide who gets access to their data, they can ensure it is used ethically. They can also willingly give access to their data to those attempting to create good causes.\n\n Reporting and Verification\n\n Reporting and verification utilize algorithms. Algorithms are a set of instructions followed to solve a problem or accomplish a task (types of algorithms include standard, machine learning and AI). They are used to process data or information. For example georeferenced imagery can be analyzed using an algorithm that detects if a tree is present in that imagery. Another example is an algorithm can choose which data sources are the most appropriate for evaluating a regenerative action based upon how these data sources did previously. This is more efficient than a human could do, reducing the dMRV costs.\n\n Previous MRV organizations have developed their own algorithms. Some of these algorithms are open source and will become part of the dMRV system if there is no conflict with the creators in doing so. Oftentimes it is only the MRV organization that developed the algorithm that uses it. Allowing more entities to utilize the MRV algorithm, \u201calgorithms-as-a-service\u201d (AaaS) have arisen as a business model. AaaS allows entities of very small to large financial backing to benefit from them. For example, a small business might not have the resources to hire a data scientist to build and train a machine learning model or maintain the infrastructure needed to store the data that the model would be trained on. However, with AaaS, they can simply subscribe to a service and use the algorithms that have been created by someone else. Now through decentralization, algorithm providers can offer their services in a trust minimized and automated way. Along with that they can help financially support the providers of the data that was used to train that algorithm, which in turn gives data providers an incentive to provide high-quality and unique data that otherwise wouldn\u2019t be available for training. Algorithmic transparency allows regenerative actions to demonstrate the ecosystem services they provide in a trustless, decentralized and immutable manner. Which in turn will attract more ReFi investors to support these actions. The more funding that gets channeled towards regenerative actions, the more the dMRV system is used and with each iteration it improves.\n\n Infrastructure\n\n In order to host the data and distribute money to creators of algorithms, among other components of the dMRV system, decentralized infrastructure needs to be created. To permanently store the data collected, decentralized storage systems need to be utilized. For distributing that data to entities that would like to purchase it, data markets need to adequately display it. A new distributed system needs to be created for analyzing that data and paying for each time an analysis methodology is utilized. Some of these systems exist, however they can be improved upon to further support the dMRV system.\n\n Domain Experts\n\n For each regenerative action type there are domain specialists. For example an ocean scientist is unlikely to know how to appropriately value tree planting, vice versa. In order to develop analysis algorithms appropriate to each regenerative action type, this specialized knowledge needs to be brought into the dMRV system.\n\n As these domain experts are the ones likely to start creating tokens from the dMRV system (onboarding non web3 regenerative actions into this space) it is encouraged that a percent of their revenue goes towards supporting the dMRV system and if able provide grants for supporting the initial start of this. These organizations will not have control of the dMRV treasury.\n\nRevenue Sources\nThis dMRV system will be created bottom up from individuals and software, these individuals are who we aim to get rewarded through this software system. The flow of this system is planned to be as follows. An entity pays for collection of data, entities affiliated with this dMRV system collect the data using techniques that are part of this system. The data goes to decentralized storage which is paid for, then the entity that pays for the data is able to access it. The data is interpreted via methodologies either that the entity has proprietary control over or that is open source and part of the dMRV system. If the method is open source, a donation is channeled to the creators of the method for its use. The collected data is also marketed in a data marketplace, when people use the data they pay for the use of it. This payment goes towards both the marketplace and the data creator.\n\nSome of the business cases for dMRV are \ndMRV setup as a service\nRestoration project strategy for insurers\nEcosystem risk area assessment, regeneration plan, and MRV for insurers, municipalities, and eco-tourism enterprises\nEnvironmental Asset Creation- Carbon Credits\n\nHere are some empathy maps showcasing what each business case may be thinking- https://miro.com/app/board/uXjVP9wfNe8=/ \n\nCross Organizational Support\nBehind all of this are people. These people have formed their own decentralized organizations specializing in different aspects of the dMRV system. There are organizations specializing in data collection, analysis and domain experts. The organizations participating in the dMRV will continue to expand as the system builds continued support.\n\nHere\u2019s a complete map of the organizations that are part of dMeter: https://mm.tt/map/2252789449?t=NhUfVodAtw \n\nB. dMeter organizational structure\n\nThe Principles that dMeter Operates By Is:\n\nLegitimacy\nWe build with integrity, with high standards for quality of data and mindfulness with how it\u2019s collected. We build legitimacy with the communities, stakeholders, and internal contributors involved by striving for alignment of our highest intentions with the day-to-day working processes that move our work forward.\n\nTransparency of Process\nWhen facilitating data collection, making decisions, or building tools, we provide clear documentation of how it was done, enabling people to understand what went into a specific action, decision, or strategy. In this process we aim to be as holistic as possible. \n\nCollaborative interoperability\nData infrastructure needs to be highly interoperable so individuals can take their data with them and use it in different ecosystems, technologies, and use-cases. We create space for collaboration between organizations and focus on the standards that enable interoperability for ecodata.\n\nDistributed & decentralized\nWe distribute and decentralize power. There is no top-down hierarchy in dMeter where you answer to a boss. We self-organize around our strategy and allow leadership to organically arise from the recognition of valuable contributions by the community. We hold ourselves accountable to dMeter as a community and dMRV as a movement, not any individual. Along with that we empower systems that enable anyone anywhere to collect and provide data to the system in a trust minimized way. \n\nClear Responsibility & Accountability\nWe take initiative to define our responsibilities given our role and desires in dMeter, and hold ourselves accountable to these responsibilities on a day-to-day basis. We support each other to take responsibility and accountability by doing it in our own workflow and communications.\n\n\nSome additional info for a deeper dive into dMeter\u2019s strategy and operations can be found here: https://miro.com/app/board/uXjVPLq3DtI=/?moveToWidget=3458764537112892386&cot=14 \n\n \nWorking Groups \nWe\u2019ve adopted working circles. These circles focus on unique aspects of dMeter and work closely together to move forward in sync. Moving forward, we are open to having sub-circles and other circles created as there is a need for more unique work streams that fold into the purpose of dMeter.\n\nDemand Sensing: Understand and develop relationships with users / customers of dMRV \n\nWhat we do:\nAnalyze the potential markets for holistic ecosystem data collection and engage the relevant customers to identify customer needs and opportunities to add value.\nUnderstand unique needs and forge relationships with key users and customers for the holistic data collection and analysis process.\nDefine the use cases that will shape the Engineering circle\u2019s work on designing the data collection and analysis process.\n\nEngineering: Design and implement the ecosystem data collection and analysis process.\n \nWhat We Do:\nCo-create the process for setting up and engaging communities in ecosystem data collection with Demand Sensing\nDefine the process to decide on and implement the tech stack that\u2019s needed for each unique data collection scenario\nCo-create and implement standards for storing ecological data with others working in the MRV space\nWork on the ground with pilot projects to install the technology and engage \u2014\u2014 local stakeholders and independent operators\n\nGovernance and Operations: Steward the dMeter System; Develop dMeter\u2019s internal working structures and external appearance.\n\nWhat We Do:\nDefine the governance structure and roles that are necessary to empower the work of the other working circles.\nGrow the dMeter community and appeal to potential customers through creating and running external items like the website, social media, and community events.\nWork with the dMeter community and core group to define high level strategic direction and partnerships.\nWe Will Use the Funding We Raise to Help Complete Our Goals\nOur 1 Year Goals:\nBy November 2023, we aim to have\nHave a well functioning governance system that\u2019s aligned with our purpose, enabling greater capacity to execute collectively.\nResults:\nWe\u2019ve created clear roles, responsibilities, and decision making processes aligned with our purpose that are functioning smoothly\nOur governance token has been launched, distributed to initial team, and is clearly understood by all holders\nDesign a valuable, holistic, and usable data collection process\nResults:\nWe\u2019ve deployed full stack of data collection tools on at least 2 pilot sites\nTexas, Paraguay\nIOT, Human Sensing, Satellite Data, etc\nWe\u2019ve created a data storage framework and analysis algorithms to cross-reference and make data usable for primary market applications (insurance underwriting, eco or carbon credit creation)\nWe have an operationalized + documented process to design and coordinate flexible data collection setup in different geographical, cultural, and economic contexts\nPilot project selection algorithm based on Desci working group work.\nProve demand for our process in the market and initial financial sustainability/viability\nResults:\nAn organization has sold an asset based on dMeter data.\ndMeter has set up data collection for a project and turned a profit on the infrastructure and labor costs.\ndMeter has a clear idea of its customers and has at least 5 orgs or individuals that have agreed to paying for data collection setup.\nOur 3 Month Goals\nBy February 2023, we aim to:\nClarify our initial business model and forge relationships with potential customers\nResults:\n10 interviews / conversations with potential customers\nAt least 1 partnership that pays for data collection setup and access to the accompanying data\nBusiness model canvases and outline of financial feasibility\nResearch and prioritize business use cases for data and how they might evolve overtime.\nCreate the first concept for full stack data collection design process + conceptualizing the data storage structure\nResults:\nBegin receiving input from full stack of data collection tools on a pilot site\nResearch to find patterns in data structures used in established/emerging eco-credit methodologies, insurance underwriting and begin co-creating standards for data collection that fit the majority of current and future requirements\nV1 of standards\nConcept flow chart of how data collection is designed in different contexts + test process in a pilot.\nBuild a claims resolution layer for dMRV as outlined in Filecoin Grant: https://www.notion.so/040d8f92b2414720a90d242c1f15efb2 \nStart with environmental data\nMap out an aligned governance and tokenomics structure for dMeter DAO\nResults:\nImplement an engaging member onboarding and contribution process\nDefine essential roles for governance\nUnderstand major decisions that need to be made and conceptualize decision making processes for major decisions\nDefine token value prop and map scenarios of token value flows given the business model\nOutline technical blueprint or tools for implementing governance\nBegin to explore legal formats for dMeter\n\n \nOther Organizational Commitments!\nAvano, Ogallala Life & unnamed others have committed to donating 20% of what it raises from this Gitcoin Grant Round to dMeter", - "projectWebsite": "https://dmeter.super.site/", - "projectLogoCid": "bafybeib62g2lhj43uv6vgxsogxvnv4wwpgrfo7k67swhsnmftugyjxv6z4", - "projectBannerCid": "bafybeigdy3665doe3jqfrym7n6dyfi6qnx4jyjjpzyep27pucgrmc6awz4", - "projectTwitter": "dmeter4dMRV", - "projectGithub": null, - "userGithub": null, - "fundingTotalDollars": 2644, - "donorsTotal": 151, - "fractionsTotalSupply": 2608, - "hypercertEligibleDonors": 136, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0x63757e9c621AE7963F2DB2C7F02A1CDD89d6375D": null - }, - "safeUsers": null - }, - "hypercertData": { - "workScopes": "dMeter", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x788bd114C3f625600b547d5a08EC38E0ee90A06e", - "rights": ["Public Display"] - } - }, - { - "title": "The Solar Foundation", - "address": "0x5B625088Ee2E0E9E3D0BD8AB6Ba3839d68886d2D", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x42799cfce3b14376285e960875ef687cd7d1b32439a2ac3316304536f2c16509", - "projectDescription": "About \u2600\ufe0f\n\nThe Solar Foundation\u2019s mission is to fund solar to under-served communities in emerging markets and developing economies. We want to reinvent the non-profit and NGO model using the tools of web3 to create a new funding model. The new model will help underserved communities access clean energy and have an ownership stake in the solar deployed in their community. The Solar Foundation will fund these projects through donations, micro-loans, and other funding models. Public goods should empower communities; we believe access to electricity is a public good! Our long-term goal is to transfer 100% of the ownership to the communities we serve. \n\nUpdate\n\nSince GR15, our focus at the Solar Foundation has been on helping Ayowecca Uganda, a fellow Gitcoin Grantee in need of solar, to help improve the safety, security, and efficiency of its community-based agroforestry NGO. Ayowecca has made two project requests: 1. Solar lights for the Ayowecca tree nursery; 2. Solar + Storage for critical power needs at their office. We\u2019ve consulted with Ayowecca to determine their needs and how we can best help and have sent crypto to fund the solar lights for the tree nursery. The lights will be purchased from and installed by a local solar installer. \n\nFor the Ayowecca office, we learned that the organization is hoping to move to a new office next year, so ideally, the solar solution should be mobile. We have been researching mobile solar solutions and exploring a potential partnership with the Footprint Project (footprintproject.org). We hope to pursue a mobile solution that would meet Ayowecca\u2019s needs and provide workforce training and a new source of revenue for the community. We are also working with Footprint Project in Puerto Rico where we will be helping to find some of their work as a part of our GR15 funding commitments.\n\nProblem\n\nClimate change is an existential threat to humanity. The people most affected are in low-income and developing communities. They have directly suffered the most from dirty energy and industry. Electricity is an essential public good that drives economic growth, improves living standards, and alleviates poverty. We aspire to give this good back to the people. Many organizations have been working to solve this complex problem. If a centralized utility company tried to solve the problem, they would construct large fossil fuel-burning power plants and then build a grid of power lines to connect to customers. They would also keep all of the production and infrastructure ownership. This infrastructure does not exist in the parts of the world where energy poverty is an issue. Building traditional power plants and power grids is slow and costly, and the environmental impacts of creating this infrastructure are high. They would significantly contribute to furthering the devastation of climate change. \n\nSolution\n\nWe believe a decentralized approach will be required to solve this problem. Instead of large centralized entities burning coal and other fossil fuels, the Solar Foundation will build localized small solar microgrids and individual systems. These microgrids can supply power to small communities as close to the end-user as possible. Web3 has evolved and can provide the tools necessary to build new funding mechanisms (using the power of DeFi) so that we can focus on funding solar projects. Our vision is to create a foundation that can provide tax efficiency to donors and fund vital solar projects worldwide. Ownership, payments, and system monitoring can all be on the blockchain. This level of transparency, accountability, and ownership will empower the communities we serve. A collaborative approach is essential to solving this problem. We seek to form a strong coalition of web3 and ReFi projects and bring the voices of the communities we serve into the conversation. We will work with local installers to help us install solar to support local economies and continue to support the projects long term so that they have an impact for years to come. \n\nWho we are\n\nJon Ruth has over 15 years of experience developing, managing, and constructing over 400MW of C&I and utility-scale solar projects. He has also been on the nonprofit United Solar Initiative board for six years. Since 2016, Jon has been involved in cryptocurrency, including mining various cryptocurrencies. For 20+ years, Jon has studied climate change and has a passion for building sustainable solutions to one of the most significant challenges humanity faces. Jon is building his legacy by making the maximum impact possible in the fight against climate change. \n\nColeen Chase works on the Gitcoin Public Goods Operations team. She cares deeply about building solutions to address climate change. After adding solar to her family\u2019s home and realizing how difficult it is to implement a microgrid in her community, she is committed to helping implement an equitable transition to renewable energy so that people everywhere can experience a healthier, safer, more secure, and brighter future. \n\nJames loves the problem-solving required to bring new ideas to life. He has collaborated to launch 25+ products into the industrial biotech / renewable energy sector as a scientist, PM, and department manager. He is driven by his love for his kids and the fear for their future if we don't collectively fight to mitigate climate change. \n\nWhy Us\n\nThe Solar Foundation team members have the background to execute this vision because of our combined experience in solar, crypto, web3, and research and our determination to have an environmental and social impact with the projects we build. With a lengthy background in solar and sustainability, Jon is perfectly positioned to develop strong partnerships with solar providers around the globe. He has negotiated millions of dollars of construction contracts over his career and developed solar projects valued at millions of dollars. He has also been on the board of a non-profit developing and funding microgrid projects internationally. Coleen has a marketing background at both Microsoft and Apple along with 10 years experience writing and editing healthcare-related articles and books. She firmly believes in the capability of web3 to help address our urgent climate crisis and in the need for a just transition to clean energy worldwide. James has a passion for solving big problems in the world. Before entering the ReFi space, he was designing new models for tracking carbon and impact in his work in industrial biotech. James was excited earlier this year to find that a whole community was working on some of the problems he had been thinking about for years. He brings value to every project he contributes to and excels at project and people management, community building, and bringing great vibes.\n", - "projectWebsite": "https://solarfoundation.xyz", - "projectLogoCid": "bafkreicdrjubb2d3izz5u25ccj53fmn5ynkbnecnpsncjxsmvu45p4vxgi", - "projectBannerCid": "bafybeifamt5h6q75m535qohpagpspujvot2xaayeercitahneiepggrw5y", - "projectTwitter": "solar_FND", - "projectGithub": null, - "userGithub": null, - "fundingTotalDollars": 13029, - "donorsTotal": 451, - "fractionsTotalSupply": 12907, - "hypercertEligibleDonors": 406, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "The Solar Foundation", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x5B625088Ee2E0E9E3D0BD8AB6Ba3839d68886d2D", - "rights": ["Public Display"] - } - }, - { - "title": "Avano", - "address": "0x3C8281c8786ab29Bcab5B33566968f8011ea6A59", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x43655e0e22d8654df1d008ab61aa8170f3459124f87253b6a60e728138fb2f44", - "projectDescription": "About\nAvano is a proud member of Panvala League. Donations in PAN are much appreciated and can help us access additional matched funding. You can get PAN here: https://app.1inch.io/#/1/unified/swap/DAI/PAN. Avano is also a verified organization on Giveth. Donations on Giveth are much appreciated https://giveth.io/project/return-to-green \n\nThe original idea of Avano (our old name was Akorn) is presented here in an intro video: https://www.youtube.com/watch?v=lqbmqB3unuI. Since then our work has been separated into two primary sections. Firstly, furthering the creation of a decentralized monitoring, reporting and verification system (dMRV). Secondly, empowering synergistic emergence for public good, through art and web3. After the name of each of our sub orgs you can find the percent of funds that will be channeled from funds raised in this round. \n\nThe Avano DAO wiki can be found here: https://avano.gitbook.io/avano/avano and we readily share what we are up to through our Twitter. To check out other projects in the ReFi ecosystem, check out this map we created and feel free to add your organization: https://www.mindmeister.com/map/2145029803?t=AiP70N5AmZ \n\nWe Believe That You Should Hold What You Value. \nTreasury Management:\nWe Have Over 50 NFTs, Many of Which Are From Public Good Organizations including the first NFT created of an Endangered Tree Species from the Endangered Tokens Foundation\nWe have invested in both Eden DAO https://twitter.com/TheEdenDao and Basin DAO https://twitter.com/basinDAO \nWe Hold the Majority of Funding Received in Klima and Regen \n\nDecentralized Monitoring, Reporting and Verification (dMRV) Systems: dMeter 20% of Funds https://dmeter.super.site/ \n\n75% of funds raised from GR14 by Avano were channeled into a shared treasury initiating dMeter. dMeter is one of the first organizations of its kind. It is an organization of organizations that incentivizes cross organizational (decentralized) collaboration for monitoring, reporting and verification. This dMRV system is particularly geared towards data collection of regenerative actions (such as tree planting) and the benefits from them (such as benefits to water, soil, air, etc.). To further support dMeter\u2019s growth 25% of funds raised by Avano from GR15 were channeled to dMeter. Now 50% of the funds raised from this grant round (GR16), will go towards furthering the newly established Desci branch of dMeter. \n\nImportant Metrics\n\nEstablished dMeter's socials (138+ members in Discord currently)\n\nWG lead's elected (7 different working group leads, each from a unique dMRV organization)\n\nPilot project identified (Ogalla Life in Texas) with future pilots listed (Next likely to be in Paraguay and Colombia. Reddit: https://www.reddit.com/r/dMeter/comments/vgyf4f/irl_pilot_projects/ )\n\nMechanisms for incentivizing decentralized contributions established USD $1,000 per month for working group leads and Dework for further contributors: https://app.dework.xyz/dmeter \n\nHeld over 95 synchronous dMeter meetings and had input from dozens of individuals from different organizations on development trajectory since last Gitcoin grant round \n\nMapped out dMeter Discord members: https://sobol.io/d/refidao/team/hARhOQGmrr/overview \n\nIdentified and prioritized 12 different writings from past research that are now undergoing a Desci process for formalizing them into publishable papers: https://osf.io/pwr5j/?view_only=399530f253454609a320da3f7ba1c4ec \n\nAvano's founder is currently in New Zealand doing a PhD in regenerative cryptoeconomics and how web3 technology can be applied to hazards and areas impacted by natural disasters. In particular they\u2019re creating a machine learning algorithm for prioritizing conservation of existing ecosystems based on their ability to increase wellbeing and resilience of populations to natural disasters. \nhttps://osf.io/ujhkq/?view_only=3b818fd552fa489fb40e3a6f85dc88ae \n\nAvano\u2019s founder has also started an open source collaborative book that explores various web3 topics, found here: https://avano.gitbook.io/regenerative-cryptoeconomics-book/ \n\nStarted Staking Half of dMeter treasury with https://app.spirals.so/ to further support planetary regeneration \n\nFuture Fund Use\n\nFunds will be used to further incentivize contributions in dMeter. In particular to: \n\nFurther Desci community build and strategic design. As well as each working group that is part of dMeter\n\nWork on Publications. \n\nWork on Shared Infrastructure.\n\nResearch Design. \n\nStrategic Partnerships for Research Being Carried Out. \n\n\nArt and Public Good: Return to Green 20% of Funds Raised https://linktr.ee/returntogreen \n\nThe first ReFi Metaverse event raised 5.3 eth for environmental organizations on Giveth. Organizations responded that this funding allowed them immensely; they established a recycling center in El Salvador and doubled their treasury budget in Brazil for example. There was a full day of ReFi talks (recorded on our Youtube: https://youtu.be/8C3ya7dNulc) from leaders all over the world. Music was streamed into the metaverse from two different stages (12 hours each stage) and 52 NFTs from 40+ artists were auctioned for the environment! \n\nFrom the success of this event a following event was coordinated for September 9th in New Zealand around Mental Health as a public good. There was a custom metaverse space created for a Gender neutral, identity fluid, artist that is a DAO to portray their current work as well as stream the opening exhibition event into the metaverse. This event sent .18ETH to PeepTers, Sage to Saddle, Gravity DAO, and Happy DAO from NFTs sold during the event. Check out the space here: https://www.voxels.com/play?coords=N@4665W,2194S \n\nTo further support linguistic diversity in the crypto space, Return to Green hosted EthSantiago in their custom built boiler room space. This conference was entirely in Spanish. https://www.voxels.com/play?coords=W@2957W,3936N,0.5U \n\nCollaborated with AgroforestDAO to teach school children in Brazil how to build metaverse space and how planning in the metaverse can be useful for agroforestry principles. Can see the result of the collaboration here: https://www.voxels.com/play?coords=N@5196W,1814N \n\nBy working closely with Charged Particles, Return to Green became affiliated with Grandmother Grove https://grandmothergrove.org/ and is now the official voice of Grandmother Gove on Twitter. \n\nImportant Metrics\n\nFor more details on the success of our first event can go here: https://medium.com/@Avano/refi-metaverse-event-how-to-ad91ae69afd8 \n\n161 followers on our Twitter: https://twitter.com/ReFiNFT \n\nWe now own 2 metaverse spaces in Cryptovoxels and over 70 spaces in Over the Reality \n\nOver 700 visits to Agroforest DAO metaverse collaboration space\n\nOver 700 visits to EthSantiago space\n\nOver 6500 visits to our primary exhibition space: https://www.voxels.com/parcels/4147\n\nOver 400 visits to the Mental Health Event space \n\nFrom Our Impact Became a Verified Organization on Giveth https://giveth.io/project/return-to-green \n\nContinued collaboration with IRL artist venue XCHC https://xchc.co.nz/ \n\nFuture Fund Use\n\nFurther support web3 technology adoption (especially metaverse) in South America Through Strategic Partnerships: EthSantiago, Endangered Foundation, and Agroforest DAO \n\nPurchase of Streaming Hardware for New Zealand Based Events \n\nContinued Work WIth New Zealand Artist Community in Adopting and Utilizing Web3 Technology \n\nIncrease the Ability to Perpetually Plant Trees Through Grandmother Grove \n\nPublic Good NFT Marketplace: FeNXT NFT Marketplace 60% of Funds Raised\n\nFrom the efforts of Return to Green, the need for an NFT marketplace that supports public good projects on Giveth was identified. Raid Guild was contracted for a design sprint of this marketplace After the design sprint was completed the results were shared on various forums of organizations that support public good. With the word getting out that we were wanting to start fundraising to create an MVP of this marketplace we were approached by Inverter Network a branch of PrimeDAO, asking if we were interested in being one of the first web3 organizations to utilize their newly created fundraising system. We were very intrigued and are now going to be part of their trial run in February. Can learn more about this marketplace here: https://gov.charged.fi/t/fenxt-nft-marketplace \n\nImportant Metrics\n\nUSDC $8,000 was spent to contract Raid Guild on a Design Sprint\n\nCreated many forum posts sharing the idea, example post here: https://gov.charged.fi/t/fenxt-nft-marketplace \n\nReceived Brand Guide from Raid Guild: https://www.figma.com/proto/IW6RiBBq6JiUFpQNsIUGfw/PGNFTMKT-Brand-Design?node-id=4%3A10&scaling=scale-down&page-id=0%3A1&starting-point-node-id=4%3A10\n\nReceived Scope of Work for What Needs to Be Built From Raid Guild: \nhttps://hackmd.io/IgJL2pxfSXWo35UKhROuYg?edit\n\nAccumulated a Contact List of Organizations to Reach Out To When Launching Fundraising Campaign with Inverter in February \n\nFuture Fund Use\n\nMarket Fundraising Campaign \n\nHire DAO(s) (Raid Guild, General Magic, Buidl Guild etc.) to Build MVP of Marketplace ", - "projectWebsite": "https://linktr.ee/Avano_io", - "projectLogoCid": "bafkreian4i4hq457iodb22hhgatthmmbeebhlqrauiw4uuv77s6sop5npi", - "projectBannerCid": "bafybeicv7vydo4hnv5loneacbsg4h4lky2bgat2ivdy4dqcbemyexlhwny", - "projectTwitter": "Avano_io", - "projectGithub": "Avanoio", - "userGithub": "TerexitariusStomp", - "fundingTotalDollars": 1172, - "donorsTotal": 186, - "fractionsTotalSupply": 1134, - "hypercertEligibleDonors": 170, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "Avano", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x3C8281c8786ab29Bcab5B33566968f8011ea6A59", - "rights": ["Public Display"] - } - }, - { - "title": "Endangered Tokens: Endangered Trees as ReFi Biodiversity Assets ", - "address": "0xCe849efC35A0a0a046E67c76B477c5432E4BA58b", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x49b116df324396ec3f9ff3fd3f6d9d1d50e1412f887316ca6152d1372af8ad36", - "projectDescription": "\n\n\n\n\u2014---------------\n\ud83e\udea7 Summary \n\u2014--------------\nEndangered Tokens is a ReFi NFT community looking to revalue biodiversity by tokenizing endangered trees with web3 incentives and digital value added.\n\n( To see a rich text and full version of the grant description go to: https://hackmd.io/@vrXnknFqSEq7faTi-zgdxw/r1DIJgDys )\n\n\u2014-----------\nMission & Vision\n\u2014---------\nForm a decentralized investment community for Endangered Species and life preservation, giving value and governance to stakeholders through Crypto Assets. \n\nWe believe in a decentralized future where economies are driven by independent, sustainable and healthy ecosystems in which the community collabore adding value to accomplish complex tasks. We need to revalue biodiversity and living ecosystems through preservation of Endangered Species which are invaluable assets to the world. \n\u2014------------------------\n\ud83e\udd14 Why support us? \n\u2014------------------------\n\n\ud83d\ude35\u200d\ud83d\udcabProblem to Solve\n\n\ud83c\udf33Endangered trees are responsible for maintaining the health of most of the world's endangered forest ecosystems, but rarely produce relevant revenue for landowners (without being damaged) and even become financial liabilities, thus encouraging their illegal felling. \n\n\n\n\ud83d\udc4cEndangered Tokens\u2019 Solution\n\nLeverage web3 and digital art to incentivize the protection of these scarce beings by changing their status from merely the cost of maintaining a tree to a revenue producing Bio-Asset. \ud83c\udf0f\n\n\u2014------------------------------------\n\ud83e\udd37\u200d\u2642\ufe0f How will we accomplish this?\n\u2014------------------------------------\n\n\n\nEndangered Tokens is a ReFi & DeSci NFT community looking to revalue biodiversity by tokenizing georeferenced endangered trees. Each specimen is characterized and video recorded alongside a small verse description, and when owning one, you become the godfather of a scarce endangered tree! \ud83d\ude0a\n\nWith the funds raised we will help landowners finance the protection of endangered Forest with reforestation, verification of carbon credits from the forests and the creation of quality digital content & data to add value to the tokens, content like:\n\n-3D tourism experience of the protected forests thus reducing the footprint of real life tourism while also generating a continuous flow of revenue to keep supporting the protection of the forests. \n-Using the 3D replicas of each tree as a virtual asset for video games and/or augmented reality experiences\n-Recording data from the forest for research and enhanced digital experiences like music from the frequencies of the trees, bioacoustics, video recording of the ecosystems, climate data, water flow, among other relevant information.\n\n\nNFT holders will receive a portion of the revenue that will come from the NFT Sales, tourism experiences, data management and carbon credits, thus converting endangered trees from liabilities to biodiversity assets for the future. \n\n\n\n\u2014---------------------------------------------------\n\ud83c\udf33Which kind of trees are we talking about?\n\u2014--------------------------------------------------\n\nWe are currently working in Chile in South America, with the rare species Gomortega Keule (https://en.wikipedia.org/wiki/Gomortega), or locally known as Queule. These magnificent beings are the last one of the Gomortegacae Family, dating its evolution to Pangea times. It is estimated that there are no more than 4000 specimens alive in the world! (Scarcer than Bitcoin!)\n\n\n\n\n\u2014----------------------------------------------\n\ud83d\udcb8How will grant funding be spent?\n\u2014----------------------------------------------\n\n\u2014\n1\ufe0f\u20e3.-Production and development of the first web3 touristic Endangered Forest experience.\n\n*First mock-up video of one of the 3d model replicas of the tokenized trees.*\n[Youtube video link](https://https://www.youtube.com/watch?v=A2Je4vC5g50)\n\n\n\u2014\n2\ufe0f\u20e3.- Vital activities core team funding\n- [x] General administration\n- [x] Coding and development\n- [x] Marketing and community growth\n- [x] NGO's and landowners coordination\n- [x] Content creation and production\n\n\n\u2014\n3\ufe0f\u20e3.- Endangered Tokens Conservation program\n\n*\ufe0f\u20e3Tokenization, extensive cadastre & landowner agreements\n*\ufe0f\u20e3in-situ conservation actions to reduce threats. \n*\ufe0f\u20e3Ex-situ conservation actions and landscape restoration actions\n*\ufe0f\u20e3Sustainable local development & community engagement\n*\ufe0f\u20e3Research on species and their habitats\n*\ufe0f\u20e3Carbon Bonds verification, trading and retirement\n\n4\ufe0f\u20e3.-Marketing and community building\n\nWe have realized that a crypto community needs to be active, engaged and in constant growth in order to stay healthy. This is an important pillar of investment on top of a marketing lead within the team.\n\n5\ufe0f\u20e3.- Biodiversity Assets Research & Development\n\nIn order to fully convert our protected trees to biodiversity Assets we think a proper indicator with a Minimum Reliable Verification (MRV) of the health status of the trees and species must be accomplished. In order to achieve this we will foster a DeSci project that aims to gather Bio-Acoustic data from different forests with different conditions and generate a machine learning algorithm that can automatically diagnose the living conditions within an ecosystem. \n\n\u2014-------------------------------------------------\n\ud83d\uddbc\ufe0fState of the art & ongoing projects\n\u2014------------------------------------------------\n\n\u2638\ufe0fThe Tokents: Digital assets with ReFi purpose\n\nWe are creating NFT collections that help us fundraise and add value to our community. So far we have launched 2 collections: \n\n#\ufe0f\u20e3Elder ENTS NFT: Georreferenced tokenized Specimens of Endangered Trees. \n * 1st Collection Gomortega Keule - Elder ENT Queule# : **Founders Collection** \n\nBecome one of the **founder members circle** of the project by minting one.\n\n#\ufe0f\u20e3Entrees NFT: \n * 1st Collection CryptoKeules - Entrees CK# : Artist Diegong \n\n\n\nThe final visualization of our Preserve to Earn ecosystem includes 2 ERC Tokens to Interact with the NFTS:\n\n* #### $ENTS DAO Governance Token - Fungible ERC20 to vote in DAO discussions and other ReFi/DeFi applications \n\n* #### $ROOTS utility Token - Fungible ERC20 to use within dapp functions and utilities.\n\n\n\n\u2638\ufe0f\ud83c\udf33\ud83c\udf33\ud83c\udf33The Queule 3D virtual Experience\ud83c\udf33\ud83c\udf33\ud83c\udf33\n\nUsing Unreal Engine 5 we have modeled so far 10 of the 25 tokenized Queules. The first product that is ready-to-launch from this is the Queule 3D showroom to explore the modeled trees as a virtual experience. \nWe are developing a Virtual Reality Experience of the Endangered Queule Forest as a product to offer to our holders and also to Scale our ReFi Model. \n\n\n\u2638\ufe0f\ud83c\udfb5\ud83c\udfb6\ud83c\udfb5Music of the ENTS\ud83c\udfb5\ud83c\udfb6\ud83c\udfb5\n\nAlongside the virtual experience we are recording the frequencies of the endangered trees through a PlantsPlay device (www.plantsplay.com) as the first approach. Our vision is to be able to stream the music of the endangered trees live, so they can produce their own content to help them stay alive.\n\n\n\u2638\ufe0f DeSci projects to be developed \ud83e\uddea\n\n\n# Bio-Acoustic MRV\nIn order to understand the forest better, we need to learn how its sounds speaks regarding the health of the forest.This way we will be able to use a cheap and effective MRV for our forests and contribute to the ReFi community with more tools and infrastructure for better MRVs\n\n\n# Dendrochronology of long lived trees to understand climate change.\n\nWith the proper tools and scientific professionals measuring the age of long lived trees and its roots can help us understand more about their endangered situation. \n\n# Queule Frog studies \ud83d\udc38\nFrogs are very important bioindicators of the forest. There is a rare frog that only lives nearby Queule forests and we are already researching regarding their behavior and ways to protect them. \n\n\n\n\n\nLinks of Interest\n[Linktree](https://linktr.ee/endangeredtokens)\n\n( To see a rich text and full version of the grant description go to: https://hackmd.io/@vrXnknFqSEq7faTi-zgdxw/r1DIJgDys )\n\n\n\n", - "projectWebsite": "https://endangeredtokens.org", - "projectLogoCid": "bafkreievqv6lzqnkgmgu664ai4sipxyz4wsdom2hms2y2ag56z47ccvjky", - "projectBannerCid": "bafybeihz7rhrucypphmrtgwbiq4vb3blmksi7oj2voh5gevgbjpzeeybbm", - "projectTwitter": "ents_foundation", - "projectGithub": "EndangeredTokens", - "userGithub": "idpuga", - "fundingTotalDollars": 5124, - "donorsTotal": 172, - "fractionsTotalSupply": 5084, - "hypercertEligibleDonors": 158, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "Endangered Tokens", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0xCe849efC35A0a0a046E67c76B477c5432E4BA58b", - "rights": ["Public Display"] - } - }, - { - "title": "Regens Unite: building public goods and a community to support all regens from web3 and beyond", - "address": "0x371ca2c8f1d02864c7306e5e5ed5dc6edf2dd19c", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x505b62acc15bf844c19bb19e8c6e24401f8c97c9efce376982e015003ea3354d", - "projectDescription": "\ud83c\udf40 Who are we?\nRegens Unite DAO is a coalition of people on a mission to build public goods and create a network with and for regens. We consider everyone building regenerative solutions for themselves, for our communities and for the planet at large, a regen.\ud83c\udf31\n\n\ud83d\udc49\ud83c\udffc We organised several of \u201cRegens Unite\u201d IRL events and full week retreats in Brussels, Berlin (video), Amsterdam, Bogota to bring together people working on regenerative solutions for themselves, communities and the planet. And we wrote a handbook as a source for decentralised Regens Unite events.\n\n\ud83d\udc49\ud83c\udffc New events are planned in Amsterdam, Brussels (April, May and August) and Berlin (September) in the coming year, and we are working on regenerative offers to other DAOs. And we wrote a handbook as a source for decentralised regen events.\n\n\ud83d\udc49\ud83c\udffc Our next step in building the infrastructure\nNext step in accommodating the fast growing community is the development of a proper common website for the Regens Unite community, with a shared calendar and newsletter to facilitate the discovery of regen events, practices and knowledge. \n\n\ud83d\ude4f\ud83c\udffdFor this we need your support.\ud83d\ude4f\ud83c\udffd\n\n\n\ud83c\udf40 What do Regens need to Unite?\n\nRegens realise that there is no single silver bullet, no one-size-fits-all solution. It will take many different initiatives, many different projects, many different communities. That\u2019s why, instead of convincing each other, learning how to relate will be a key factor in joining forces to build viable solutions. We need to come out of our bubbles.\n\nThat is why \ud83c\udf31we need to unite\ud83c\udf31, we need to get to know each other, build trust and help each other be as successful as possible in building solutions.\n\nRegens Unite is a fresh way of bringing Regens together in real life, to build a strong web between all the different types of regenerative sectors, both in and outside of web3, so that we can learn from each other and foster new avenues of collaboration & unification. \n\nOur in-person events bring together regenerative thinkers and doers in DAOs, ReFi, DeSci, Platform Coops, Purpose Organizations, Climate Activism, NGOs, and Art to co-create & share projects, knowledge, food, kindness and hope.\n\n\ud83c\udf40 What are Regen Unite events like? \n\nPeople have expressed awe and surprise by whom they\u2019ve met and by the different approach Regens Unite events have taken. Regens Unite events are not typical conferences. No powerpoints, no convincing each other of solutions, but uniting in our common goal: regenerate ourselves, regenerate how we communicate & collaborate, and regenerate the planet.\n\nThese unconference-style events include:\n\u2b55\ufe0f Facilitated workshops\n\u2b55\ufe0f Round circle discussions\n\u2b55\ufe0f Co-creation spaces\n\u2b55\ufe0f Relaxation areas\n\nSome of the reactions we received in the feedback form on the question \u2018what surprised you?\u2019\n\n\u2728 Solid female presence, and people who didn\u2019t know what web 3 was (YES)\n\u2728 I was positively surprised, that not only people from crypto world attended\n\u2728 The leaning into regeneration as a personal, interpersonal human need as well as environmental regeneration\n\n\n\ud83c\udf40 How can we help your community?\n\nWe have developed an expertise in organising conferences where people can make new meaningful connections and feel rejuvenated. We learned how to create safe and brave spaces where people can meet other people outside of their bubble.\n\nWe can put that expertise of service to your community, to help you organise a Regens Unite Hub at your conference, a Regen Retreat, or find ways to bring more diversity to your community.\n\n\n\ud83c\udf40 What\u2019s next for Regens Unite?\n\nThere is a reason that greenpilling is such a strong movement: the understanding that we do not want to recreate current global system imbalances by building in a silo. We need to build bridges, we need to connect to our neighbours and to offline communities.\n\nThere is a lot more potential in the ideas behind Regens Unite. We are now organising to become a DAO to help each other create those spaces where Regens can unite in every city and every region.\n\nOur goal is to facilitate more events in 2023, produce great content around the movement, and help Regens unite around the world. Every donation helps us to move this mission forward!\n\n\n\ud83c\udf40 Our recent events\n\nBogot\u00e1 (Regen Hub @ Devcon) - October 11-14 2022\nhttps://regensunite.earth/bogota\n\n\u200dBerlin - September 16-17 2022\nhttps://regensunite.earth/berlin\n\nAmsterdam - September 22-24 2022\n\nBrussels - May 19-20 2022\nhttps://regensunite.earth/brussels\n\n\n\n", - "projectWebsite": "https://regensunite.earth", - "projectLogoCid": "bafkreigtkmwjy4xp6yhrhsydko4in3cswla75z7ybfbmpr6iibbfe6fhai", - "projectBannerCid": "bafybeifboruptxeva64enhwzhvfjvlfwxyfwkdwmwp7ugx7eq6kqbdzusm", - "projectTwitter": "regensunite", - "projectGithub": null, - "userGithub": null, - "fundingTotalDollars": 6871, - "donorsTotal": 193, - "fractionsTotalSupply": 6830, - "hypercertEligibleDonors": 182, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0xf11704511975cC5908f6dBd89Be922f5C86c1055": "xdamman.eth", - "0x945C7A4A827FBde56E48925A4eAFa8b81f141bE9": null, - "0x8041748a2A16e9B7A3980107f4376774421642c8": "badgerface.eth", - "0x76F536F370f89667804D1b02807e76d668ED4415": "roemers.eth", - "0xF9903c5d11E8f4bFebcf02747D53319E9c4a10c6": "sunnyleen.eth" - }, - "safeUsers": { - "xdamman.eth": 0.3, - "badgerface.eth": 0.3, - "roemers.eth": 0.25, - "sunnyleen.eth": 0.1, - "0x371cA2c8f1D02864C7306e5E5Ed5DC6edF2DD19c": 0.05 - } - }, - "hypercertData": { - "workScopes": "Regens Unite", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x371ca2c8f1d02864c7306e5e5ed5dc6edf2dd19c", - "rights": ["Public Display"] - } - }, - { - "title": "Saving forests in Colombia with KOKO DAO", - "address": "0x7f722b8b013Ac7Bd654B3B102Acc7573A32DB9bc", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x5c31eaad4f03c467e71bdc6edbc2360a014b2001045b0d583167544c032a8fde", - "projectDescription": "KOKO DAO is on a mission to reduce deforestation in Colombia \ud83c\udde8\ud83c\uddf4\n\nWe work closely with the local communities to create viable economic models as an alternative to deforestation.\n\n\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\n\n\nWhy Focus on Small Scale Forests? \ud83c\udf33\n\nRural communities and small land owners\u00a0have neither the resources nor sufficient amounts of land to receive compensation from forest preservation efforts through carbon offsets. This makes deforestation the most economically compelling option for them.\n\nFortunately, blockchains allow us to demonstrate the proof of impact of small scale conservation projects in a transparent and trustless way. \u2028This makes it possible for us to design new ways to compensate rural communities for preserving their land.\n\nWhy Colombia? \ud83c\udde8\ud83c\uddf4 \n\nColombia is the second most biodiverse country in the world, the first in varieties of birds, orchids and butterflies.\nThis biodiversity depends largely on the survival of ecosystems like forests. \n\n50% of Colombia\u2019s territory is covered by forests, however, we are losing 500 hectares of forests every single day.\n\nWhat is causing deforestation in Colombia? \ud83e\ude93\ud83d\udd25\n\n- Lack of opportunities and education in rural communities. \n- Solutions to forest preservation like carbon credits are not a sustainable economic model for small-scale forests.\n- Increasing deforestation in protected areas like national parks.\n- Cattle farming and extensive agriculture\n- Ilegal drugs production \n- Lack of infrastructure \n\nHow do we avoid deforestation? \ud83d\udc12\n\n\nOur model aims to create avoided deforestation credits for small scale forests and collectives. Supporting local communities to actively create and manage their own projects. \nMore info and model in our website www.kokodao.xyz \n\n\nWhere is the money going? \ud83d\udcb5\n\n- Onboarding non web3.0 impact projects to crypto\n- Recruiting team for social media and product development\n- Support local school in the creation of an endemic tree nursery\n- dMRV technology implementation in our pilot project: 15 hectares of native forest in Huila, Colombia.\n- Legal expenses. \n\n\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\n\nFind all our docs in: \n\nWebsite: https://kokodao.xyz/\n\nNotion: https://kokodao.notion.site/KOKO-DAO-c2250b8ab58548ad8a0cf487ff4f4522\n\nOther links: \nTwitter:@kokodaoxyz https://twitter.com/kokodaoxyz\n\nDiscord: https://discord.gg/B2vgk7NwHq\n\nYouTube video: https://www.youtube.com/watch?v=Q6a6fJ9W4Vg\nContact: hello@kokodao.xyz\n\nKokodaoxyz.eth \n\nThank you for your support \ud83d\udc9a", - "projectWebsite": "https://kokodao.xyz/", - "projectLogoCid": "bafkreifyiohonjowzayoeemo5cuoje63zklgt54sjbldfeqlph7h5bynwi", - "projectBannerCid": "bafybeiaobzaukind446e6ynsvjqyscvx4kyalzl35w4bkrd2yjaeg7ml4m", - "projectTwitter": "kokodaoxyz", - "projectGithub": null, - "userGithub": null, - "fundingTotalDollars": 4727, - "donorsTotal": 177, - "fractionsTotalSupply": 4680, - "hypercertEligibleDonors": 165, - "ensName": "anamariamb16.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "KOKO DAO", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "anamariamb16.eth", - "rights": ["Public Display"] - } - }, - { - "title": "Natives in Tech", - "address": "0x2DeE5D7e77A1212b21139Bc1d98B249DCc52055D", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x70d59317f7bfd1fb5b9a757c3f30f52f536ad7eb219504a5dc8e8414a2fcb66b", - "projectDescription": " \n\ud835\udd46\ud835\udd66\ud835\udd63 \ud835\udd44\ud835\udd5a\ud835\udd64\ud835\udd64\ud835\udd5a\ud835\udd60\ud835\udd5f\n\nTo cultivate a tech ecosystem of Native technologists crafting free and open source technology for Native communities\n\n \n \n\ud835\udd4e\ud835\udd59\ud835\udd60 \ud835\udd4e\ud835\udd56 \ud835\udd38\ud835\udd63\ud835\udd56\n\nA community of Native/Indigenous peoples and allies working to build open source projects, educate Native technologists, and onboard Natives into Web3\n\n \n \n\ud835\udd4e\ud835\udd59\ud835\udd52\ud835\udd65 \ud835\udd68\ud835\udd56 \ud835\udd52\ud835\udd63\ud835\udd56 \ud835\udd68\ud835\udd60\ud835\udd63\ud835\udd5c\ud835\udd5a\ud835\udd5f\ud835\udd58 \ud835\udd60\ud835\udd5f \ud835\udd5a\ud835\udd5f \ud835\udfda\ud835\udfd8\ud835\udfda\ud835\udfdb\n\n\ud83d\udd38 Lakota AI Code Camp\n\ud83d\udd382023 Conference\n\ud83d\udd38Native Job Board\n\ud83d\udd38Organizing members around Regeneration projects\n\ud83d\udd38Governance models, signaling and voting on proposals\n\ud83d\udd38Crypto education\n\ud83d\udd38Web3 stack education for Web2 developers\n\n \n \n\ud835\udd3d\ud835\udd66\ud835\udd65\ud835\udd66\ud835\udd63\ud835\udd56 \u2119\ud835\udd63\ud835\udd60\ud835\udd5b\ud835\udd56\ud835\udd54\ud835\udd65\ud835\udd64\n\n\ud83d\udd38Upgrade our open source project, \"Native-owned Businesses\" to use decentralized storage\n\n\ud83d\udd38Fund open source Web3 projects built by Native technologists to support:\n\n\u25fd\ud83d\udd39Regenerative agroforestry\n\u25fd\ud83d\udd39Media + education (e.g. participatory media, nature documentaries, knowledge content, created and distributed by local communities)\n\u25fd\ud83d\udd39Local natural research and biolearning\n\u25fd\ud83d\udd39Cost-savings on infrastructure like solar panels\n\u25fd\ud83d\udd39Land back\n\u25fd\ud83d\udd39Tribal Currencies", - "projectWebsite": "https://nativesintech.org", - "projectLogoCid": "bafkreicpvd7sn2ejfa3kuh2hic4aw34ojdp4vzb4ohnfc7fleezsg6dopq", - "projectBannerCid": "bafkreicaixlctocpmyo5x6pifmsbmbgxkegfmcciutcarwwd6xtxvgekbe", - "projectTwitter": "nativesintech", - "projectGithub": "nativesintech", - "userGithub": "hollygrimm", - "fundingTotalDollars": 2977, - "donorsTotal": 129, - "fractionsTotalSupply": 2951, - "hypercertEligibleDonors": 121, - "ensName": "nativesintech.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "Natives in Tech", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "nativesintech.eth", - "rights": ["Public Display"] - } - }, - { - "title": "Shamba Ecological Oracle and DMRV Network", - "address": "0x86579EBcE57605929Da73d8cE17f40960c3b052a", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x7352c239d0dd8c39062300c7a507aed952f61908a44b0a0e146d8b6eec846e58", - "projectDescription": "About Shamba:\n\nShamba is building a decentralized monitoring, reporting and verification (MRV) network to power regenerative finance - ReFi. Shamba also runs an ecological data oracle powering several web3 applications.\n\nWhat we have achieved since GR15:\n\nSince GR15 we have completed the development of our web app solution to support farmers getting into regenerative finance. We are now deploying this solution with farmers who want to start regenerative projects. (https://refi.shamba.app)\n\nBuilding off of our success deploying the first web3 ecological data oracle last year (learn more at https://docs.shamba.app), we are now aiming to roll out a full digital MRV solution to support the ReFi projects.\n\nLast year also saw us roll out tools for analyzing satellite imagery from various space agencies (https://insights.shamba.app) as well as tools for generating smart contract code that uses satellite data (https://contracts.shamba.app). These tools were developed to support the developer community to easily utilize ecological data in their web3 applications.\n\nWhy MRV: \n\n\nCarbon projects MRV has traditionally been expensive and oriented toward large-scale projects.\n\nOur goal is to make MRV affordable by leveraging satellite data, machine learning, geospatial modeling and ground sampling. We aim to combine this with a network of skilled people to provide the data needed to characterize natural landscapes and quantify the impact of regenerative actions.\n\nWe aim to provide a cost-effective alternative to traditional MRV which is unaffordable to the typical smallholder. Once deployed, our solution will enable smallholders to access MRV services at an affordable cost.\n\nAlpha Round Goal:\n\nIn this round, we aim to fund the collection of scientific data to establish carbon stock baselines. As we support farmers kicking off carbon project pilots in Kenya, we need to create datasets that reflect the above-ground and below-ground carbon stocks on these farmlands to act as baselines. This will allow farmers to quantify in the future the impact of their regenerative activities on carbon stocks by having a point of reference at the start of the activities.\n\nBaseline data:\n\nThe data we collect will be synthesized into carbon maps that will be available to anyone who needs such data. Open data is one of the most important classes of public goods and we believe the datasets we produce will impact multiple projects and serve multiple beneficiaries.\n\nThe data will benefit not only small farmers launching carbon projects but also researchers and policymakers who need to make data-driven decisions around the climate and agriculture.\n\nPilot sites:\n\nWe will begin by mapping out carbon stocks in several sites in Kenya where pilot projects are starting, then expand to cover other bioregions as we refine our techniques. The funds we receive on this Alpha round will inform the geographical extent we can map under this initiative.\n\nTarget datasets:\n\nWe aim to create soil maps and land use land cover maps to quantify below and above-ground carbon stocks. \n\nWe will use a combination of ground sampling, remote sensing, secondary data and geospatial modeling in creating these datasets.\n\nLearn More:\n\nGet more details on our plans to collect baseline data for carbon stocks across African farmlands by visiting this link:\n\nhttps://shamba.notion.site/Shamba-Gitcoin-Alpha-Round-Page-3cf3475e7bc64d8f9a649aadf4f4a37e\n\n\nVote of thanks:\n\nWe thank you for supporting us in developing our solution and look forward to your support as we roll ReFi out to rural farmers across the Global South.", - "projectWebsite": "https://shamba.network", - "projectLogoCid": "bafkreih6jg7hvrrgme7jnsuaaonyxeioroqnm7wldmqxg7hl4ra6qjjqja", - "projectBannerCid": "bafybeibjosjhc5m3k2e726eojfk4ecgnnsobotc6za56ccxyaieoufqhj4", - "projectTwitter": "shambanetwork", - "projectGithub": "shambadynamic", - "userGithub": "kenGIS", - "fundingTotalDollars": 8811, - "donorsTotal": 265, - "fractionsTotalSupply": 8743, - "hypercertEligibleDonors": 233, - "ensName": "shambadmrv.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "Shamba", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "shambadmrv.eth", - "rights": ["Public Display"] - } - }, - { - "title": "WaterDAO", - "address": "0xF427EbbEb0AeE1b06C99333001009188B5086934", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x78b858009ecfa46c866a7765cf0665699dd097eaadc3bdf9fc4f1f2229823bf5", - "projectDescription": "WaterDAO GR16\ud83d\udca7\n\nThis WaterDAO grant is a continuation of the ReFi DAO Water Circle grant made in GR15. Since GR15 the WaterDAO has grown quickly. The WaterDAO has already begun multiple research projects such as credit class development, solvent extraction desalination testing, and Solar energy desalination analysis tool feasibility. The WaterDAO also has two pilot projects planned to begin in 2023 to treat water. The goal of this grant is to help to bring the first RH2O credits on chain earlier than expected by focusing on developing automated monitoring systems and broadening our verification efforts. \n\nThe purpose of the WaterDAO is to create transparency around sources of water, how they are generated, and establish a water credit classification system. We believe this can be done by creating a trustworthy and verifiable water credit that can be easily purchased and used to offset water usage. This would allow companies to continue to focus on their operational efficiencies while supporting the replacement of their water usage with equally efficient water producers.\n\nThe purpose of the WaterDAO can be summed up through four main goals:\n\n1. Create a universally accepted water credit that is first supported by the Regenerative Finance (ReFi) community and eventually, by larger outside organizations. This credit class can serve as a building block for many types of water credits to be created.\n\n2. The WaterDAO will act as a support mechanism to verify credit quality. The DAO will oversee specific verification standards to provide a certain level of quality, standard for the credits issued through the DAO. \n\n3. Incentivize companies to be \"Water Positive\" or at lease Water Neutral. This will come as the DAO expands and gains more influence. The DAO will make the process of becoming \"Water Positive\" a significantly easier process than it was previously, leaving companies fewer excuses to maintain their indifference. \n\n4. Incentivize more environmentally friendly forms of desalination and other water treatments. This is done through a tiered credit system. For example, a water producer using desalination methods that require energy intensive methods and that has a potentially damaging runoff, would only qualify for second tier credits. To receive top tier credits, water producers must power their operations with cleaner and less energy intensive methods while mitigating harmful runoff. \n\nRH2O water credits will be validated through the Regen Network. \n\nIf you are interested in joining our mission, please visit our website and join the Discord channel to get involved, we look forward to seeing you!\n\nA little bit more information if you have read this far:\n\nThe WaterDAO will not only be validating water credits, but also actively working towards increasing the development of water treatment and credits by funding targeted areas that the DAO deems to be impactful. These areas will likely include:\n\n-Funding of specific tier 1 water treatment projects\n\n-Water technology development\n\n-Pilot projects leading to IP development\n\n-Sponsor water research and development\n\n-Acquisition of a specific water asset that can be licensed to water projects\n\nBy funding water treatment projects, the WaterDAO is able to further develop the water credit space. The WaterDAO treasury will hold assets that are created or purchased by that DAO. These assets can be licensed out to water producers to help them provide higher tiered credits. The DAO will get to vote on the licensing agreements for specific projects as well as which ventures will receive funding. \n\nValidating water credits:\n\nEach credit validated by the WaterDAO represents one cubic meter of additional treated water that is added back into the water system that is represented by the credit. Water generators who participate in the WaterDAO can mine water credits using Proof of Water (PoW). Once a water generating facility is certified to produce regenerative water (e.g. solar desalination), it will receive a blockchain-enabled IoT smart meter that communicates directly with the network through Proof of Water. PoW is a way to secure water by ensuring that every regenerative water credit (RH2O) is backed by a physical unit of water mined on the RH2O network. Water miners are rewarded with water credits by using Proof of Water to validate the generation of a unit of water and communicate the data associated with that unit of water through the IoT smart meter. In the future RH2O tokens will serve as water contracts where physical water can be collected. In addition, the physical mining of water ensures that the creation (supply) of water credits is limited by the capacity to generate physical water and the value of each RH2O token is a function of the balance between supply (miners) and demand (users).\n\nThe WaterDAO will have specific credit classes based on the Regen Network that water producers must fall under in order to produce a specific credit. The first water credit will be for desalination projects and will generate RH2O (Regenerative Water Credit) tokens. Each Regenerative Water Credit measures one cubic meter of treated water that is added back to a specific water system. In other words, these credits are localized and set to the specific water system in which the water has been added. RH2O credits are only produced when water is verifiably added back into a water system.\n\nWe will create three tiers of water credits based on the applications suitable for the quality of treated water. The credit tiers are based on a 100-point scale designed to promote the activities we deem to be the most advantageous for the health of the environment and to stimulate technological innovation.\n\nThose wishing to be funded through the DAO will be required to fill out an application form. Once completed, the DAO review committee will evaluate the results and assign values based on eight parameters.\n\nThe results of the application will designate the project as one of the three water credit tiers based off of Total Dissolved Solids (TDS) in the treated water.\n\nPotable Water Class: TDS less than 400 ppm and sterilized\n\nAgriculture Class: TDS less than 700 ppm and healthy for the environment.\n\nIndustrial Class: Water of any TDS with a pre-approved buyer or application.\n\nThe WaterDAO could really use your support both through GR16 as well as participation in the DAO. We hope to see you around. Thank you for your contribution \ud83d\ude4f.\n", - "projectWebsite": "https://www.rh2o.app/", - "projectLogoCid": "bafkreiaxav5skvd3rbqpp3krysistzgs2horksjpzk5mj6ymzbexdnqmru", - "projectBannerCid": "bafybeifhr3uqq3gl6oozrk6pioaanmry5wp3sk7z7rjjgeh6ai6fywo3mu", - "projectTwitter": "@_WaterDAO", - "projectGithub": null, - "userGithub": null, - "fundingTotalDollars": 15230, - "donorsTotal": 604, - "fractionsTotalSupply": 15079, - "hypercertEligibleDonors": 553, - "ensName": "ecotoken.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.1499373825998352 - }, - "hypercertData": { - "workScopes": "WaterDAO", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "ecotoken.eth", - "rights": ["Public Display"] - } - }, - { - "title": "ReSci Network", - "address": "0x9D120Bee68ed792884D340f911D8434306b28605", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x7c08d17ecd83e74334fa1bf2a0110224bced6b68ea852943f35641aa6f11469e", - "projectDescription": "**ReSci Network is leading ethical, ecosystem regeneration-centric Decentralized Science (DeSci)**\n\nWhat?\n\nIn many fields, industry bends the arm of science and casts a veil of validity via \u201cpeer reviewed studies\u201d to influence the public\u2019s perception of a product. \nHere on the emerging frontier of ecocredits, we have the opportunity to shift the paradigm of industry science away from centralized + corrupt to one that is decentralized + credible. ReSci posits that an entity benefiting financially from the creation and/or sale of a given ecocredit should not be involved in the process of reviewing a methodology for approval and adoption as an ecocredit. \nThus, ReSci Network aims to provide independent review in order to best prevent potential conflicts of interest. \n\n**Our essential responsibility is to assure that ethical science is at the core of ecocredit methodology development and peer review. To this end, we act as a community leader catalyzing the formation and flourishing of distributed communities of regenerative practice** \n\nHow? \n\nWe hold a 3-pronged approach for achieving our mission\n\n1. Scientist and Methodology Project Databases\n\nHuman capital and expertise are crucial to achieving a project\u2019s mission. We\u2019ve created a two-part database in a public-facing Notion so that projects developing methodologies can find scientists with appropriate expertise (and vice versa) to consult while they are in the early stages of developing their methodology concept. \n\nScientists: Please visit https://notionforms.io/forms/resci-network-scientist-directory-intake-form to complete database intake \n\nMethodology Projects: Please visit https://notionforms.io/forms/methodology-project-directory-intake-form to complete database intake. \n\nWe appreciate your participation!\n\n2. Communications Hub\nHosted in console.xyz, our communications hub is designed to natively host curated conversation as well as relevant resources such as Notion. Scientists and Methodology Projects alike can request access after completing intake to our database. The goal of the comms hub is to spark connection for collaboration and to support the methodology development and peer review sprints that we hold space for. \n\n3. Methodology Development and Peer Review Sprints \nMethodology Development sprints are intended for projects who have received approval of a concept note (from Regen Network or similar) and have not yet begun the process of methodology definition beyond a general outline. \nPeer review sprints are reserved for groups that have dedicated a significant amount of resources to the development of a methodology (specifically, collaboration with credentialed scientists). These projects are at the stage of a first draft whitepaper. \n\nWe at ReSci Network are passionate about the role of ethical science in ecosystem regeneration. We believe that holistic ecocredits, if implemented via methodologies developed by ethical science, can act as a crucial component in a flywheel mechanism for long term funding in environmental stewardship. \n\n___\nHow You Can Help\nPlease help us reach our goal of raising a total of $25k in Gitcoin\u2019s Climate Alpha round by making any donation that is accessible to you and by sharing our project link to others who are passionate about science\u2019s role in ecosystem regeneration. \n\nWith $25k, we will be able to perform a full scale alpha methodology development and peer review sprint. Funds will be allocated to sprint stewards, a communications steward, and scientists who contribute to the sprint. Within the container of an 8 week sprint, we aim to compensate scientists at a competitive rate of $50/hr for their expertise. Beyond the cost of the sprint, funds will be allocated to cover a. further research of appropriate legal entities that can meet the needs of a truly decentralized scientific community and b. basic legal costs of organization upkeep. \n\nWe were selected as a runner-up project in the December 2022 Future Quest Climate Pool and need funding to be able to sustain our momentum in building and weaving. Thank you for supporting our sustenance and nourishment through the winter. \ud83d\udc3b \ud83d\udc9a\n\nSincerely, \nSage and Ned\n", - "projectWebsite": "https://resci.network", - "projectLogoCid": "bafkreifal5y7aou2b5nw645e4hrsbucn264yey2vgt4n7zcdblbunxpxrm", - "projectBannerCid": "bafkreid6gs7go3w7ew2uyhpvnbcnxkxplwagars3ziraycinmgyutonal4", - "projectTwitter": "@ReSciNetwork", - "projectGithub": null, - "userGithub": null, - "fundingTotalDollars": 4562, - "donorsTotal": 238, - "fractionsTotalSupply": 4523, - "hypercertEligibleDonors": 227, - "ensName": "resci.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "ReSci Network", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "resci.eth", - "rights": ["Public Display"] - } - }, - { - "title": "Kokonut Network", - "address": "0x0ea26051F7657d59418da186137141CeA90D0652", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x82c3e8a9200b9f87d9b025a8bb3f9fc6720a7c315773e0ec990915430529db51", - "projectDescription": "### Wouldn't it be nice to create a perpetual protocol backed by natural assets unrelated to the crypto market, and eco-friendly and regenerative?\n\nI'm Wasabi, the founder of Kokonut Network. We are building a bridge to connect web3 and agriculture. We are creating a blockchain-based cooperative to develop and manage a network of coconut farms.\n\nOur main goal is to address the worldwide lack of funding for agricultural projects. We help farmers get the funds they need while creating opportunities for web3 communities by giving them access to perpetual natural assets.\n\n### TL;DR\n\nKokonut Network provides blockchain governance and open-source accounting to the agricultural industry. Our mission is to promote, organize, fund, and manage coconut farms. We collect funds from the community through the Kokonut DAO framework for decision-making and allocating treasury funds.\n\nKokonut Network can establish a lifetime partnership with its members through the Kokonut DAO by using a formula of Agriculture, Blockchain, Web3, Perfect Soil, and Weather. This opportunity does not have an expiration date, as coconut trees are replanted once they stop bearing fruits.\n\n**One-time contribution equals a lifetime of rewards and benefits.**\n\n## Why coconuts? Zero Waste Circular By Default Crop.\n\nCoconut is the most cultivated and vital palm tree in the world, as it is the main source of vegetable fat. It is one of the plants that provide a wide variety of products and by-products, serving as a primary source of food, drinks, and shelter for animals.\n\nKokonut V1 is a real-world eco-friendly agriculture project in its plantation phase. We have obtained planting permits and 620 acres of soil-tested land in optimal conditions, with access to water and the best weather in the region.\n\n**Coconut products market outlook**\n\nThe coconut products market size was valued at $11.5 billion in 2018 and is estimated to reach $31.1 billion by 2026, registering a CAGR of 13.6% from 2019 to 2026. In 2018, the coconut oil segment accounted for more than half of the total coconut products market share.\n\nCoconut is a versatile fruit with many health benefits. Its derivatives, such as coconut oil, water, milk, desiccated coconut, coir, and copra, are used in the food, beverage, cosmetic, and personal care industries.\n\n### Kokonut V1\n\nOur first plantation will yield 18 million coconuts annually, enabling us to generate multiple revenue streams in the food, health, and automotive industries.\n\nThis project will benefit the entire society of the Municipality of Las Salinas, Barahona Province, Dominican Republic. The coconut plants will be planted 7.5 x 7.5 meters apart, equating to ninety-six (96) plants per acre of land, or 60,000 plants across the six hundred and twenty (620) Acres of land. This variety of coconut yields approximately three hundred (300) fruits per plant, resulting in an annual yield of 18,000,000 units. The Kokonut DAO treasury will receive 100% of the profits.\n\nThe organization seeks to create 10,663 direct and indirect jobs through investments in this project. These jobs will focus on essential agricultural tasks such as weeding, applying pesticides and fertilizers, irrigation, and harvesting.\n\nLearn more: https://kokonut.network/kokonut-v1\n\n### **Kokonut DAO**\n\n*The DAO is the core vehicle for all fundraising, rewards distributions, and governance decisions.*\n\nKokonut Network is a platform built by and for people. At its core, Kokonut DAO seeks to empower anyone who adds value to the Kokonut Network ecosystem, regardless of their social status or prior accomplishments.\n\nLearn more: https://kokonut.network/dao\n\n### **Our Vision**\n\nKokonut Network was created with the aim of reducing the obstacles to agricultural development, and rural project funding, and democratizing investment in real-world projects. We will use blockchain technology to establish multiple plantations across the country, providing advantages to the global crypto communities and everyone in the network.\n\n### **What makes us different?**\n\nMany DAOs have great ideas, copywriting, and marketing, but without a solid business model. Unfortunately, many of these projects are rug-pulled or abandoned by users due to a lack of quality products.\n\nKokonut Network has a distinct approach. Rather than establishing our proposal or business plan by taking advantage of our users, and attempting to get them to purchase some non-backed token, we have created a resilient system over time. It is backed by coconut plants on our land and has a DAO for governance, funds allocation, and rewards sharing.\n\nLearn more: https://kokonut.network/about\n\n## How are we doing so far?\n\nHere is a simple list of completed tasks: budget research, business model, revenue streams, and technical details about the Kokonut Network.\n\n- Lifetime Profitable Business Plan\n- Government Agricultural Permits\n- Agricultural Company Registration\n- Core team Selection\n- Full Fledge Budget\n- 620 Acres of Land\n- Multilingual Agriculture Software\n- Kokonut v1 Soil Test\n- \u201cAs Seen On\u201d Public Speaking, Podcasts Interviews [https://link.kokonut.network/press]\n\nResources\n\n- https://www.kokonut.network/\n\n- Let\u2019s have a chat at https://link.kokonut.network/meeting\n\n- Web3 Workspace https://link.kokonut.network/charmverse <> Get a meeting for a Guest NFT :)\n\n- DAO Governance https://link.kokonut.network/dao\n\n- Join our Discord https://link.kokonut.network/discord\n\n- Kokonut Blog https://office.kokonut.network/blog", - "projectWebsite": "https://kokonut.network/", - "projectLogoCid": "bafkreifhuzqbc4v6lpjjiajnaiue6xc3ww6ho6xa7vzq65phfxar4oubfu", - "projectBannerCid": "bafybeigmr2frrdfc2xz6z5nz2akr6z773wecnhcwaeuzai2r6wlovpeb4i", - "projectTwitter": "KokonutNetwork", - "projectGithub": "", - "userGithub": "aaempire", - "fundingTotalDollars": 7212, - "donorsTotal": 349, - "fractionsTotalSupply": 7136, - "hypercertEligibleDonors": 330, - "ensName": "wasabinetwork.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.001640023901742431 - }, - "hypercertData": { - "workScopes": "Kokonut Network", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "wasabinetwork.eth", - "rights": ["Public Display"] - } - }, - { - "title": "The Impact App + Eco Labs", - "address": "0x59490C362C54C1b60158F19CE499C82aa3669820", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x84e5ecb55ea744764c11c1600cdaba725af5cd9bef1456cfb4f1b16069f3f6a7", - "projectDescription": "\n\ud83c\udf3f About \ud83c\udf3f\n\nThe Impact App (TIA) is a mobile dApp for on-boarding + paying Regenerators & verifying practice-based climate solutions.\n\nTIA is a project developed by Eco Labs, in coordination with key partners & collaborators: dMeter, Silvi, Digital Gaia, Regen Network open source methods registry, ReFi DAO, KokoDAO, Coffee & Carbon Collective, AgroforestDAO, ReFi Zone, Regen League, and Common Action / Myseelia. TIA will be complementary to other ReFi and dMRV projects and benefit the entire ecosystem by reducing on-boarding friction, and helping increase the supply of new ecological assets.\n\nTLDR: Eco Labs is a collaborative on-boarding ecosystem for regenerative action. TIA is a mobile dApp that does three things:\n\n1) Reduce friction by guiding people into ReFi projects that value impactful action\n2) Collect on-the-ground data used to issue ecological assets such as Eco Credits on Regen Network\n3) Pay Regenerators anywhere in the world by integrating with Celo\n\n\n\n\ud83e\udeb4 UPDATES: Thank you to all the regens who supported us in GR15 \ud83d\udc9a\n\nthis is what we've been up to the last few months:\n\n1) Methodology Development - we worked with Djimo from Silvi Protocol & Diogo from AgroforestDAO to submit a concept note to Regen Network for our \u201cAdaptive Agroforestry and Smallholder Stewardship'' methodology we\u2019ve been developing while in Colombia. We also launched a 9 week collaborative sprint where we brought together folks like Ana Maria from KokoDAO, Darina from Coffee Carbon Collective, and Charlie from ReCommon to support each other in writing and editing methodologies.\n\n2) Grants & Accelerators - we participated in batch 6 of Celo Camp, received an additional NSF grant to do 100 stakeholder interviews (starting February), and were honored to be one of the first 17 winners of the Future Quest grants! \n\n3) Pilot Projects - our team spent 3 months in Barichara, Colombia where we developed relationships with a network of regenerative projects, syntropic agroforestry food forests, and community farms. We learned a ton about regenerative practices and were able to begin development on the methodology mentioned above. The next step will be to return to Colombia this Spring and start implementing and testing the methodology & technology stack for dMRV with at least 3 specific pilot projects around Barichara.\n\n4) Technical Lead for Eco Labs - during our time in Colombia, we had the pleasure of getting to meet & befriend Jillian Burrows, an extremely talented & experienced programmer with a diverse & esoteric range of interests & knowledge. We\u2019re so excited to bring her on to Eco Labs as our technical lead, where she\u2019ll be helping us weave together the many collaborative pieces that make up our ecosystem & products. \n\n\ud83c\udfaf Q1 goals: \ud83c\udfaf\n\n1) additional fundraising - as we continue development of our tech stack, it\u2019s clear we\u2019ll need a lot more resources to successfully weave together an effective tool & platform. \n\n2) stakeholder research - we\u2019ll be conducting extensive research & interviews on the market potential for Eco Credits\n\n3) testing on-boarding & dMRV solutions on-the-ground in Barichara & other pilot locations around the world \n\n\n\ud83d\udcdc Full Description: \ud83d\udcdc\n\nThere is a growing number of people who want to take action to help regenerate our planet. This includes both existing land stewards who could benefit from more sustainable & resilient income, as well as communities who need to restore their local natural resources and build resiliency. One option for them to do so is to sell assets into the voluntary carbon or ecosystem services markets. However, the way that market is designed makes it difficult for would-be Regenerators to participate, as the costs for MRV (measuring, reporting, and verifying) their efforts are substantial, and therefore work only for large, professional projects.\n\nThere is simultaneously a growing amount of capital being raised to fund impactful activities, through for instance: NFT fundraising, individual donors, & companies who are committed to net-zero and other social good commitments. In expectation of increased demand, more and more markets for ecosystem services are being developed. As Nori founder Paul Gambil says \"demand (for high-quality carbon credits) is not the problem, supply is\".\n\nOne barrier for increasing supply is the lack of decentralized, low-cost MRV solutions. This remains a friction point for small-scale, community-initiated impact projects to start and scale quickly. Nonetheless, such projects represent the fastest and most robust path towards impact, as small communities form a ready-made, decentralized global community which has the capacity and incentives to develop a wide variety of local projects and maintain them over the long term.\n\nEco Labs aims to reduce the friction of these two forces connecting: Patrons (markets that support impactful activities), and Regenerators (people who want to get paid to take action). \n\n\u2747\ufe0f The Solution: \u2747\ufe0f\n\nThe Impact App is an app designed to on-board Regenerators into existing dMRV platforms and collect data in-app to provide additional basic dMRV solutions. It will include both a directory of user-friendly how-to guides for existing low-cost, transparent, and verifiable methods of impactful actions that anyone can get paid to do in their local environment, as well as versatile, adaptable, and modular solutions for innovative forms of smartphone based data collection. It will be built in collaboration with existing and newly forming communities & DAOs to seamlessly co-create custom methodologies that measure, verify, and compensate for regenerative actions of all types.\n\nThis mobile app & platform aims to help bridge the gap and reduce the friction between those who value impact (ReFi projects, carbon & eco credit registries & marketplaces, ImpactNFT collections, and Impact DAOs) and those who practice impactful & regenerative actions (Regenerators like farmers, land stewards, urban Regenerators, climate activists, etc.)\n\nBy aggregating, integrating, and partnering with existing dMRV platforms, TIA will be able to act as an index to guide Regenerators on exactly what options are available to them, how to start taking action & get educated on regenerative practices.TIA will build custom data collection tools built into the app to:\n\n1) on-board new Regenerators into both established and developing ReFi & dMRV ecosystems\n\n2) provide direct-to-impact financing for small-scale regenerative projects\n\n3) increase the supply of new carbon & eco credits to carbon market platforms by improving accessibility, awareness, and education\n\n4) facilitate knowledge exchange within communities by integrating with projects like Common Action\n\n5) ultimately increase the volume of net carbon sequestration, watershed & soil health, habitat biodiversity, ecosystem restoration, and other regenerative practices\n\nWhy build an app?\n\nAn app makes accessing & recording information simple, which can:\n\n1) Increase awareness of and make on-boarding easier for organizations that have ways of valuing impact, for example: Nori, Regen Network, Open Forest Protocol, EcoNavi, dClimate, Digital Gaia, Orgo, Pozzle Planet, Littercoin, TIST, and many more.\n\n2) Provide those who value impact that aren\u2019t currently implementing MRV solutions to create simple systems of data collection that verify impactful actions on-the-ground.\n\nHow will it work?\n\nThis Android and iOS mobile application will be built to serve multiple functions:\n\n1) List an index/directory of all actions one can take which already have a funding counter-party and an existing MRV methodology.\n\n2) Provide simple, user-friendly, step by step guides on how to utilize existing MVR methodologies & obtain a Bioregional Passport\n\n3) Facilitate in-app payments to regenerative actors by integrating with Celo, a mobile compatible blockchain.\n\n4) Register and verify information about its users using the Common Action ontology in order to filter what actions that individual can feasibly take part in (such as location, expertise, access to land + size and existing resources on that land, access to a vehicle, physical capabilities/disabilities, etc.) as well as link their profiles to Common Action to find experts, peers and resources that will help them on their regenerative journey\n\n5) Collect data for custom methodologies using in-app tools such as images, video, location, audio, & temperature. Upload that data in public and transparent formats using IPFS / Filecoin such that anyone is able to verify and cross reference.\n\n6) Provide resources & clear pathways for regenerative actors to obtain additional equipment or expertise which can increase the quality of data collected / increase pay. This could take the form of classes, obtaining certifications, purchasing IoT sensors or specialized measurement equipment needed to unlock higher paying methodologies.\n\n7) Optionally redirect funds paid for regenerative actions to purchase products in-app, such as dynamic NFTs which can showcase & illustrate ones impact over time, and merchandise / accessories / tools which aid the regenerative actions (UV-protective clothing, knee-pads, gloves, tools tailored to specific methodologies)\n\n\ud83e\udd1d Collaborations: \ud83d\udc96\n\nRegen Network Methodologies\nWith their many decentralized methodologies being developed, Regen Network will enable Project Developers to issue EcoCredits of all types. Eco Labs is working directly with the Regen Registries team to make the process of learning how to start taking part in that process simple & clear within the Regen specific actions listed in The Impact App, as well as developing our own methodology, currently titled Adaptive Agroforestry & Smallholder Stewardship.\n\ndMeter\nEco Labs is a founding organizational member of dMeter, where we are working to weave together dMRV techniques like human-sensing, sky-sensing, remote-sensing, and reputation-sensing as the low-cost, decentralized source of ground-truth used to issue and originate our Eco Credits. Leveraging the dMeter framework and ecosystem of partners will be key in our solutions.\n\nRegen League\nJan from Regen League has been working on a simple version of an on-boarding app to start mapping out regenerative projects, hubs, individual regenerators, and infrastructure platforms. This open database will provide a foundation for us to start building Regenerator on-boarding systems & user profiles that will be utilized in The Impact App.\n\nCommon Action / Myseelia\nCommon Action is an innovation network focused on accelerating climate and sustainability action, by connecting individuals and organizations with each other and to actionable knowledge and opportunities. The Common Action Ontology - MRV module will be developed as part of this project, to organize information about geographically-based impact needs, regenerative projects, and resource requirements. \n\nSilvi Protocol\nSilvi has been working on solving the human-sensing & tracking of tree planting using a mobile app. With the clear overlap in needs for human-sensing dMRV, Eco Labs & Silvi have partnered to build on top of the foundation of technology already developed, and use the Silvi app to perform human-sensing as part of the dMRV stack used to verify & originate Eco Credits. \n\nDigital Gaia,\nWe\u2019re working closely with Digital Gaia to apply our methodology within their active inference & digital twins system, so that our Eco Credits will have a Digital Gaia FERN score associated with them from the very beginning. This collaboration includes working on UI/UX tools for Regenerators, creating models for regenerative practices, and supporting each other as we try to solve the challenges of making regeneration an occupation. \n\nEco Art & Impact NFTs:\n\nEco Labs originated as a hub for collaborative, carbon negative NFT collections and ecological creativity. We're actively supporting and working with artists & creatives to inspire climate action, shape the narrative around regeneration, and help fundraise to support TIA development and compensate for regenerative practices once the platform is live. Here are some of our teams' current initiatives:\n\n1) The World After Us: Imaging techno-aesthetic futures is a traveling solo exhibition of sculptures, installations, prints, and photographs that combine plant life with electronic waste, and scientific experimentation with artistic exploration + Phoney Plants, an illustrated, cross-chain NFT collection based on this real world work\n\n2) Concerned Plant Society: a pfp project that is part of the ReFi NFT Coalition, ReFi Zone (a collaboration with ReFi Punks & Solar Sasquatch Squad)\n\n3) Dynamic NFT experiments - this year we hope to explore the ability to link an NFT directly to the regenerative projects it\u2019s associated with. More to come as we experiment with what\u2019s possible!\n", - "projectWebsite": "https://eco-labs.xyz", - "projectLogoCid": "bafkreiephqesggcpazke2t65oqdyxxrgqxxavtn2nlz4y4m7rxdqtsce7e", - "projectBannerCid": "bafybeihotlchmyggpkungtdrs7y2s7rqqx3mqnyeegmjxuqv6madr76pzy", - "projectTwitter": "EcoLabsDAO", - "projectGithub": "https://github.com/Eco-Labs", - "userGithub": "https://github.com/sevnightingale", - "fundingTotalDollars": 2577, - "donorsTotal": 139, - "fractionsTotalSupply": 2543, - "hypercertEligibleDonors": 129, - "ensName": "ecolabs.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "The Impact App", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "ecolabs.eth", - "rights": ["Public Display"] - } - }, - { - "title": "Silvi", - "address": "0xa7CA400d49BBa87EB606ee05af93689BD21FaB99", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x9575cc4fc36454d4fd20fe68f980a72247e115363927b4ffba3a59f713f65351", - "projectDescription": "Silvi is helping build economic and coordination tools to contribute to the trillion tree target.\n \nWe believe the bulk of the solution is twofold:\n \n\ud83d\udcb0\u23f3 Upfront project funding via Tree-Commitments (We\u2019re calling it Tree Forwards) to incentivize and reward performance-based tree stewardship\n\ud83d\udccd\ud83d\udd2d Extreme traceability and attribution of new trees, not just for accountability and inventorying, but to unleash the community effects needed for tree-planting to become a thing!\n \nLet's unpack that \ud83d\udc46\n \nTree Forwards:\nSilvi is collateralizing the net present value of New Tree Forwards by locking commitment budgets into performance-based schedules that reward tree stewards as tree milestones are verifiably met. This is built at the unit-economic level but scales indefinitely. Because there are 50-60k tree species, Silvi is supporting a p2p library of species-specific methodologies. Think of it as DeSci tree wikis for tree science and intelligence and citizen science participatory model for the ground work/truth\n \nGround truth and MRV:\nOur focus has been on building a stack to serve the human-centric stages of the tree lifecycle while setting a strong and reliable decentralized science and open data foundation from which other Monitoring, Reporting and Verification (MRV) can happen. We're collaborating with dMeter and Regen Network on a Filecoin grant delivering a Claim Resolution Framework. Further, we'd like to collaborate and interop with other projects and technologies on techniques for statistical sampling of ground truth as well as remote sensing inference. And ultimately, we'd like to vertically integrate with carbon-certifying projects. \n \nInterface:\nSilvi is building an app where we're leveraging social media mechanics with citizen science frameworks to develop a Pokemon-Go-like experience for gamified tree planting and stewardship\n \nTokenomics:\nSilvi has finally started bringing its data on-chain via NFTs, IPFS. After that our long term plans involve launching a native governance token issued through tree commitments. Governance tokens will spawn utility NFT pairs that contain all the data and contracts for each tree, as well as the instructions on unique release schedules and requirements for commitment budgets based on tree type, location, timeline, relationships and stakeholders.\n\nPilots:\nTo date, Silvi has already deployed several pilots in the United States, including planting of 5 hardwood species and pines in a retired golf course while partnering with a conscious festival called Fire Flies Forest and experimenting with sapling distribution to homes and neighborhoods in Florida. Additionally, Silvi is partnering with EcoLabs and AgroforestDAO on the development of an adaptive agroforest methodology leveraging Silvi's Tree Forwards.\n\nSilvi's biggest focus is currently in Kenya, where it is connecting communities such as schools and small holder farmers to Kenya's last rainforest, Kakamega forest. The project aims to build a methodology to help establish small, distributed nursery beds around the forest with the goal of improving supply of saplings. With the help of Gitcoin funding, Silvi has established operations in a dozen schools and 8 small holder farmers and approaching 100k trees propagated from seed. The project is in close conversation with the Forestry services and the Forest-run nurseries, Silvi is helping expand capacity of reforestation via its theory of change that a greater number of independent nurseries run by community members via a participatory model will help increase capacity and coordination. Silvi is close to being assigned an exclusive area for planting and forest management where our MRV and methodology will be put to the test over the following years.\n\nPartners:\nWe're so happy to be part of dMeter where other awesome dMRV projects like EcoLabs, Athena, Avano and Orgo are working together to solve planetary restoration and natural capital creation! We're partnering with Ecolabs and AgroForestDAO on the development of an agroforestry methodology and also a core member of dMRVNetwork, an MRV research group aimed at serving small holder farmers. We're also proud to be supported by Celo and the Climate Collective and incorporating Celo's stables for payouts in Kenya\n\nPlease reach out to us if you or anyone you know would like to be an early adopter of our tools and methodology towards hyperlocal reforestation ", - "projectWebsite": "https://silvi.earth", - "projectLogoCid": "bafkreia2lxh62vyemnumlun3kzafdqlsuszyvneipn67xacw6nfs445nd4", - "projectBannerCid": "bafybeif4gscd7hssgankvzfrs4a4i6tka5ewbc44ydw4bkrwl5zllkyida", - "projectTwitter": "https://twitter.com/SilviProtocol", - "projectGithub": null, - "userGithub": null, - "fundingTotalDollars": 2376, - "donorsTotal": 197, - "fractionsTotalSupply": 2328, - "hypercertEligibleDonors": 185, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "Silvi", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0xa7CA400d49BBa87EB606ee05af93689BD21FaB99", - "rights": ["Public Display"] - } - }, - { - "title": "$Earth - Solarpunk Dao", - "address": "0xd6b97e042d03EdBDc100Eb55fbE43Eb75f2e3036", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x9b8fd21ff33280aa6dddb9d073a527ab490b07fd3ebd91850b6b0f2065542af5", - "projectDescription": "Hey Solarpunk, stoked to have you here \ud83c\udf1e\n\nWe are building $Earth - First digital currency to be backed purely by climate solutions. Our goal is to -\n\n1. Mobilize over $ 5 Trillion/yr for the next 30 yrs to provide primary finance to projects in clean energy, regenerative agriculture, clean transport , ecosystem conservation and clean tech that will build the necessary infrastructure for a net zero world.\n2. Appropriately value natural ecosystems and their services while creating a monetary system that is backed by climate/ecology positive projects.\n3. Build the Solarpunk paradigm\n\n\n$Earth has been designed to make this happen by - \n\n1. Incentivizing users to purge their petro $$$ to mint $Earth directly at the protocol and use those $$$ to fund projects in renewables, permaculture, Ev charging stations, electric buses/trains , ecosystem conservation/regeneration, agroforestry, energy storage, clean tech etc\n2. Inherently ascribing value to ecosystem services created by the projects we fund, by selling $Earth at a premium to the $ value of projects in the neoliberal world. $Earth acts as a unit of account for the $ value of the projects in our treasury + potential yields these projects will generate and the positive externalities created by these projects ( healthy soil, carbon sequestration, clean air, biodiversity etc)\n3. Creating utility for $Earth by creating a network of regenerative/solarpunk merchants who are willing to provide their goods and services in exchange of $Earth. \n\n\nThanks to your love and support during GR 15 we have been able to -\n\n1. Onboard developers and designers to help us build our website ( love to have some CRITICAL feedback) which is now live. \n2. Our tech team has also been successful in encoding $Earth tokenomics into smart contracts on which we have now conducted over 1750 test transactions. \n3. We have also onboarded 3 solar energy projects in India, Malawi and Nigeria that we are going to pilot with (details on website) and are in talks with 5 more projects in regenerative agriculture and EV space that we will onboard in the coming weeks. \n4. Take active part in hosting Refi India\n\n\nThis Alpha round Grant money will now be used for - \n\n1. Compliance/Legal for $Earth and Solarpunk Dao\n2. Hiring for Community Building and Credit Risk\n\nWe are incredibly grateful for all the love and support all yall Solarpunk shower on us. We are building strong in this bear and truly appreciate any contributions you can provide to make anthropogenic climate change history and make the solarpunk paradigm a reality.\n\n10 % of the fund raised will be allocated to projects working at the intersection of Refi x Rwa. List will be announced on twitter. ", - "projectWebsite": "https://www.solarpunkdao.earth/", - "projectLogoCid": "bafkreic7sr4vs7bql7ta3tcrerrl5rkxjf4sduen4eebgk2si43rg6bohe", - "projectBannerCid": "bafybeiedqfk4rvzsw4tezhpq4shiy372mfacbnafvomig6o47spnj4zitu", - "projectTwitter": "https://twitter.com/solarpunkdao", - "projectGithub": "Solarpunk Dao", - "userGithub": "peacefulprogress25", - "fundingTotalDollars": 9563, - "donorsTotal": 341, - "fractionsTotalSupply": 9491, - "hypercertEligibleDonors": 309, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "$Earth", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0xd6b97e042d03EdBDc100Eb55fbE43Eb75f2e3036", - "rights": ["Public Display"] - } - }, - { - "title": "TaterDAO", - "address": "0xCbbd18d3aC27ab0FFfD04BCCd091B2802c92e0ca", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x9c9f6f054c70be233af788cafeb5073d41df5667a572819ce21b60f5424caff5", - "projectDescription": "TaterDAO is developing the legal and technical primitives to bring real estate on-chain.\n\nThis is an important problem to solve because the foundation of all sustainable efforts to reward and shape climate solutions are grounded in real estate.\n\nOffices, factories, solar farms, homes, farms, and every other real world asset touches real property (i.e. real estate). Low hanging fruit climate solutions involve LED lighting, solar power, biomass, soil capture, upgrading of HVAC systems, wind energy, etc. All of those efforts happen in or on a building, home, farm or other form of real estate.\n\nIn order to identify, create and develop climate solutions, we need to accurately identify and classify land and bring that land on-chain.", - "projectWebsite": "https://taterdao.com", - "projectLogoCid": "bafkreicixvulwarty26ezmxgur3njc43wjqt6e57yh6elrksrsiemxu254", - "projectBannerCid": "bafybeifneoabjokuzoaqqg7lwjojp2unzhxvrcedwl2tnetksgkn47wsxi", - "projectTwitter": "taterdao", - "projectGithub": "https://github.com/TaterDAO/app", - "userGithub": null, - "fundingTotalDollars": 4625, - "donorsTotal": 363, - "fractionsTotalSupply": 4537, - "hypercertEligibleDonors": 333, - "ensName": "nickjrishwain.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 1.0524638560226238 - }, - "hypercertData": { - "workScopes": "TaterDAO", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "nickjrishwain.eth", - "rights": ["Public Display"] - } - }, - { - "title": "Astral Protocol", - "address": "0x41DdE2Dc7f718D5F764fc97e8d122864587642d4", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x9e8896090abff240885c74b27cd32f3917d2471e504e82db21e309360bbf2903", - "projectDescription": "At Astral we build tools to enable the location-based decentralized web.\n\nOur vision is for to support peer-to-peer, user-controlled alternatives to common location-based apps we use every day. We want new category of dapps and protocols that use spatial data to be open, interoperable and composable.\n\n\nThe Astral Protocol has three components:\n\n- Astral's verifiable spatial data registries - smart contract-based registries of spatial data objects like points, lines, polygons and raster images, \n- Verifiable location credentials, to serve as presence claims in the Astral ecosystem, and \n- Web3-native geospatial data storage technologies so the data backing these systems is user-controlled, cryptographically verifiable, uncensorable and permanent.\n\n\nThese are linked components that will enable the ecosystem to build a Web3 map of the world, and location-based dapps that use that map.\n\nAstral tools and standards will be useful in a range of different use cases ranging: \n- Regenerative project development and dMRV\n- DAOs / digital governance: geofenced local and regional DAOs, local currencies, spatial demurrage\n- Mobility: defining policy areas like congestion zones, capturing the position of connected devices like IoT and smartphones\n- Natural capital currencies: defining ecological zones, storing physical measurements of ecosystem conditions\n- Metaverse / gaming: virtual land registries like Decentraland and Cryptovoxels, and AR games like Pokemon Go\n\n\nGrant contributions will fund the development team building these public goods. Specifically, we are developing a Solidity library of topological and geometric functions, Web3 GIS tools and a mobile SDK to create verifiable location credentials. \n\nTeam\n- Holly Grimm: Tech Lead\n- Daniel Serrano: Software Engineer\n- Tsondru: Software Engineer\n- John X: Architect\n\n\nAccomplishments so far:\n- KERNEL Genesis Block final presentation\n- Kolektivo project partner, developing GeoNFTs\n- Filecoin Development Grant for storing satellite imagery on IPFS using decentralized identifiers\n- Presenting to the Open Geospatial Consortium\n- Winner, Arweave Prize, Future of Blockchain 2020\n- Speaker, European Space Agency's Living Planet Symposium 2022\n- Grant recipient, dClimate\n\nAdvisory Positions:\n- Member, Celo Climate Collective\n- Core Leader of Analysis Working Group, dMeter\n- Advisor, CarbonPath\n- Advisor, SimplexDNA\n- Founding member, ReFi DAO\n- Co-leader, Regeneration Guild, KERNEL\n\nFunded:\n- zkMaps\n\nFor more on the verifiable spatial data registries we're developing, read our litepaper: https://docs.astral.global/astral-litepaper.\n\nAlso, we're excited to be a part of the Radicle Drips experiment! We're supporting Future Foundation, Natives in Tech, Bloom Network, Return Protocol, Kolektivo, Silent Auth, ReFi DAO, The Commons Stack and others with our drips streams \ud83d\udca7", - "projectWebsite": "https://astral.global", - "projectLogoCid": "bafkreifo4ja4zx7zmpbslprno7zrpfyev5ou35g24bmvd52c77ihmivjle", - "projectBannerCid": "bafybeie3fbdw7t5pbpkph4ymxrp2xmplgg3oqjolvjc7k7wvcydng25sky", - "projectTwitter": "AstralProtocol", - "projectGithub": "AstralProtocol", - "userGithub": "johnx25bd", - "fundingTotalDollars": 28766, - "donorsTotal": 656, - "fractionsTotalSupply": 28598, - "hypercertEligibleDonors": 615, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0x5eCD1ecd2fA5e9174B18057B4Ee44A5a3539e861": "tsondru.eth", - "0xBEdA48Ac95FC22b0Ee889A883a83324583F16c47": "dynamiculture.eth", - "0x25bdFF8dB8d80971935A7f38A0CF31DeC62f7696": "johnx25bd.eth", - "0x69bB1c44C470b43e4A827c047A8b95fA2e720EA4": "j-mars.argent.xyz", - "0xb4d7bEadd64CDd4d508FeBD274000ece06F430C8": null - }, - "safeUsers": { - "dynamiculture.eth": 0.5675675675675675, - "johnx25bd.eth": 0.40540540540540543, - "tsondru.eth": 0.02702702702702703 - } - }, - "hypercertData": { - "workScopes": "Astral Protocol", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x41DdE2Dc7f718D5F764fc97e8d122864587642d4", - "rights": ["Public Display"] - } - }, - { - "title": "Impact DAOs Research + Podcast + Book : Impact DAO Media Season 2 ", - "address": "0xb6e780438882f2daa11dA0972807f4D12166af8b", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0xa35e52635d40be090a49c587e58fab7410c30b9cff7ad5cc66b547d88cb93200", - "projectDescription": "We aim to create open source knowledge on Impact DAOs, the future of organizing for climate and social change. The knowledge we create will inspire millions to build in web3 and to effectively organize for causes on the internet as DAOs. \n\nThrough our research of mature Impact DAOs and sharing knowledge through books and other engaging media formats we plan to create awareness and inspire change for a better world. \n\nGitcoin donors (GR14+15) enabled us in Season1 to publish a book on Impact DAOs, launch a podcast, All About Impact DAOs (21 episodes) and conduct research on 12 mature Impact DAOs including Gitcoin, Proof of Humanity, Ukraine DAO etc.\n\nThe book is available for free at https://impactdaos.xyz/. Listen to ads free podcast on Impact builders sharing their stories at https://impactdaos.buzzsprout.com. \n\nIn Season 2 (Jan 15 to April 30), Impact DAO Media plans to:\n\n1. Conduct research on 8 mature Impact DAOs through one on one conversations.\n\n2. Publish 22 podcast episodes of authentic conversations with builders of Impact DAOs. \n\n\n3. Build a network of Impact DAOs learning, sharing and growing together.\n\n4. Break down Impact DAOs book in multiple media formats to make knowledge easy to understand.\n\nDonate to your sovereign, decentralized women led media DAO, Impact DAO Media. Your donation will help us stay independent and fearless in pursuing the truth on Impact DAOs. \n\nThank you to all our donors, past and new for believing in us. We\u2019re a team of passionate changemakers that\u2019ll make you proud. \n", - "projectWebsite": "https://impactdaos.xyz", - "projectLogoCid": null, - "projectBannerCid": "bafybeigb5kwsz3ruq3sla3vyuhg52t6qm3d6hkbdhh62eihfd5jwamogzm", - "projectTwitter": "https://twitter.com/impactdaos", - "projectGithub": "deeparocks", - "userGithub": "deeparocks", - "fundingTotalDollars": 2171, - "donorsTotal": 191, - "fractionsTotalSupply": 2119, - "hypercertEligibleDonors": 159, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.001922087974591008 - }, - "hypercertData": { - "workScopes": "Impact DAO Media", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0xb6e780438882f2daa11dA0972807f4D12166af8b", - "rights": ["Public Display"] - } - }, - { - "title": "CyberBox ReFi NFT Marketplace", - "address": "0x65eD9a7CD4890E23Ac5bc8D51498ae955aF00724", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0xa367f29625986a243fea7298958367a08679e748a57d3de6ae17a8a0317fef49", - "projectDescription": "CyberBox is a ReFi NFT Marketplace on the Celo Blockchain that helps anyone become carbon neutral by offsetting carbon (CO2) through NFTs. You can contribute to offset by trading any NFT in our site, since we utilize part of the trading fees to purchase tokenized carbon credits.", - "projectWebsite": "https://cyberbox.art/", - "projectLogoCid": "bafkreibgyx46agvo6oojboh7goqqxlmvmceoag7esdnupybihwrfewujby", - "projectBannerCid": "bafybeifs4vjggzwfbnxyzq6wadv4u7tb6sqwzpxcv26lxmw25vsnslvpo4", - "projectTwitter": "CyberboxArt", - "projectGithub": null, - "userGithub": "LordFernando", - "fundingTotalDollars": 3875, - "donorsTotal": 408, - "fractionsTotalSupply": 3776, - "hypercertEligibleDonors": 367, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "CyberBox", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x65eD9a7CD4890E23Ac5bc8D51498ae955aF00724", - "rights": ["Public Display"] - } - }, - { - "title": "The CM Guild", - "address": "0x18ddbb6e344B11eeDff5A49fA0C0f1a03cc1097E", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0xa429920058b543ded8fc02ca3aa69a9353faf3f1346b7f1b39e7b5ae5bac3777", - "projectDescription": "THE CM GUILD\n\n-The Concept-\n\n\nThe CM Guild, or Community Managers Guild, was born out of the idea that community managers and the ReFi community could really benefit from having a similar experience to that of founders within the ReFi Dao Founders Circles. With this in mind we are building this hub within the ReFi Dao server alongside, and with the guidance of the ReFi Dao team. The intention is to be another service within ReFi Dao, with Community Managers and ReFi community building as the focal point.\n\nThe Community Managers Guild is focused on creating a central hub for Community Managers from ReFi specific projects, to come together. A place to learn, teach, collaborate, and grow together. It is designed to be a safe place to enhance, learn new skills, and make connections in the space. The idea is for those who take part in the guild will become better at growing the ReFi community at large. With new skills and tools to build and attract more individuals to the ReFi space, and thus grow the overall impact being made.\n\n-The Initial Structure-\n\nThe CM Guild will hold weekly workshops hosted by professionals in the space with an expertise in a variety of fields that are directly related with growing and engaging communities. There will also be product showcases where tools for community managing are shared. Representatives from those tool protocols will provide walk through training, demonstrations, and answer questions from Community Managers. All of these workshops will be recorded to create a library of educational content for future members to engage with.\n\n-The Near Future-\n\nLike the Founders Circles, the CM Guild will establish a cohort where circles are formed based on community type, location, phase of community development, and other factors. This will help ensure the greatest possible outcomes for the participating members. Each cohort will last between 6 to 8 weeks initially.\n\nWith the Community Managers Circles, fellow CMs will become more connected, and strengthen the overall ReFi community. The bonds created between fellow CMs during this time will carry beyond the cohort to further foster collaboration and community growth within the space. Cross pollinating and establishing a more connected tightly knit ReFi community overall.\n\nWe are also looking to create training courses utilizing a learn 2 earn platform, as well as providing access or memberships to paid for services which are beneficial to a Community Manager.\n\nThe training courses would offer a verifiable way for a community manager to prove they have completed a specific course and possess certain knowledge. This could be beneficial to future job prospects, or even current jobs.\n\nThese L2E courses will expose CMs to the experience of educational content on a platform that benefits the user. Together within the guild, members will have the opportunity to begin creating ReFi specific educational courses to be shared with fellow ReFi communities.\n\n\n-The Immediate Impact-\n\nOne of the initial public goods the CM Guild will make available immediately, is the Gitcoin Grants Give-A-Thon. This is something one of our team members had started with another organization, and has decided to bring to the CM Guild believing it would be a better fit.\n\n\nThe Give-A-Thon is a marathon Twitter Spaces for ReFi grantees that takes place during the Gitcoin Grants Round. It plays host to a number of co-hosts from large organizations who are looking to support grantees in the round. Projects are invited to sign up for 10 minute slots and present their work and how the grant will help them achieve their goals. The intention is to give these amazing projects the extra exposure to potential donors, and grow the community.\n\n-The Goal-\n\nOne thing that is certain, is that climate change is a global problem. The more people we can on-board to the ReFi space the greater the impact we can achieve. Community Managers play an integral role in growing, shaping, and engaging the very communities which will generate that impact.\n\nBy being a member of The CM Guild, Community Managers will have the opportunity to not only expand on their own knowledge and learn new skills, but help shape the entire ReFi community as a whole.\n\nIt makes sense that we invest in the people who are building these communities up.\n\n-Use of Funds-\n\nFunds from the grant will be directly deposited into a Multi-Sig for the following uses.\n\n1\ufe0f\u20e3Operational costs, e.g. funding the Gitcoin Grants ReFi Give-A-Thon \n2\ufe0f\u20e3Creation of Learn 2 Earn courses designed for CMs as well as ReFi specific courses for the ReFi community\n3\ufe0f\u20e3Access to tools and materials for CMs\n4\ufe0f\u20e3A drip of funds to the communities that members represent, to be used specifically for community building events and campaigns to attract more individuals to the ReFi space\n\nFuture voting by well established members to determine best use of funds to help support and upskill Community Managers in the ReFi Space.", - "projectWebsite": "https://www.notion.so/refi-dao/Community-Manager-Guild-643e545b6f5d4417b9352bc170fc5491", - "projectLogoCid": "bafkreie7qhbhokqhzd27tydpgaet5ebli5fupjghxllp7zculh62zbzvsq", - "projectBannerCid": "bafkreibix5flnp3yxjm4zcbntlkksgw4nbv4nvxkc2gjbtvzhxvmduwit4", - "projectTwitter": "", - "projectGithub": null, - "userGithub": "", - "fundingTotalDollars": 1389, - "donorsTotal": 162, - "fractionsTotalSupply": 1343, - "hypercertEligibleDonors": 132, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0xe679Ad6068770700A77EA873ce0A97EdAe9222a2": "antidotedao.eth", - "0x029Acdbe5404114088b0824803FD04a7B9ee33A2": null, - "0x8ac698f95f186938774Dcbf321DF3bCb62cD9e4C": null - }, - "safeUsers": null - }, - "hypercertData": { - "workScopes": "The CM Guild", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x18ddbb6e344B11eeDff5A49fA0C0f1a03cc1097E", - "rights": ["Public Display"] - } - }, - { - "title": "Treejer Protocol", - "address": "0x81c776d0D7F7d9D3699851993EcAa88A46187F11", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0xa8570318dc5eb4618cb030b0f06ea912302efedecf23d819710ae76ff9f238ad", - "projectDescription": "Treejer is an open protocol connecting donors to rural planters worldwide. The project leverages cutting-edge concepts such as decentralized finance (DeFi), non-fungible tokens (NFTs) and smart contracts to unlock new opportunities in financing forest conservation and rural development.\n\nTreejer acts as a seamless, transparent bridge empowering local communities through crypto donations even in unbanked and remote areas. Treejer's approach incentivizes not only forest plantation but also conservation by locking up the funds in a smart contract and releasing it over time as planters and other data providers continue providing updates from forest status.\n\nThe protocol also provides proof-of-impact to donors in the form of dynamic tree NFTs that have real-world attributes. These NFTs are linked to each tree and are minted on Polygon network.\n\nTreejer protocol has several smart contracts and two main interfaces: a payment and forest tracking interface offered to donors on \"https://treejer.com\" and a dedicated mobile app for tree planters and rural ambassadors. They use it to submit new trees, provide updates and unlock conservation rewards.\n\nBesides using official interfaces, builders can integrate the tree planting plugin with their existing products.\n\n\ud83c\udf33 Product demo (v1):\nhttps://youtu.be/ZTcy-6IxT7U\n\n---=== The impact of QF donations ===---\nThis quadratic round will help us build the next iteration of Treejer protocol (v2.0) and expand the adoption of our current products. Please find an overview of the works we've done after each QF round on Gitcoin so far:\n\n\ud83c\udf33 cGrant profile:\nhttps://gitcoin.co/grants/1080/treejer-a-climate-action-protocol\n\n---=== Learn more about Treejer ===---\n\n\ud83c\udf33 Documentation:\nhttps://docs.treejer.com\n\n\ud83c\udf33 Discord:\nhttp://discord.gg/treejer\n\n\ud83c\udf33 Twitter:\nhttps://twitter.com/treejertalks", - "projectWebsite": "https://treejer.com", - "projectLogoCid": "bafkreigbovyjh2noqfyrq4gazjce5koyafawah2alzfro2wyep6zkbvzde", - "projectBannerCid": "bafybeidkgbti4vnunhyfigt6cahe2v7rxsujdmpjbpqpahw5bra4ld43di", - "projectTwitter": "TreejerTalks", - "projectGithub": "treejer", - "userGithub": "ermio", - "fundingTotalDollars": 10163, - "donorsTotal": 214, - "fractionsTotalSupply": 10108, - "hypercertEligibleDonors": 203, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "Treejer Protocol", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x81c776d0D7F7d9D3699851993EcAa88A46187F11", - "rights": ["Public Display"] - } - }, - { - "title": "AgroforestDAO", - "address": "0xdD866169DBCf639ed57f0020c5C9F4F4E1AAB263", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0xb63a68c4f785e348b96618bf48d466ffeabad13402f4f4ce93da66ede1cf3a98", - "projectDescription": "We are building a global community of support for those willing to engage with food, forest and culture as public goods.", - "projectWebsite": "https://rooted-club.web.app", - "projectLogoCid": "bafkreid7th45iisaeqf7jpdreeq7e7cwvm7elypiolntexo52hsvlrxecq", - "projectBannerCid": null, - "projectTwitter": "agroforestdao", - "projectGithub": "Rooted-Club", - "userGithub": "DiogoJorg3", - "fundingTotalDollars": 5162, - "donorsTotal": 225, - "fractionsTotalSupply": 5102, - "hypercertEligibleDonors": 199, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0x3Cc9F396430bC766AC8aa57fc28aeBc5919A5d81": null, - "0xe96056A9936C58e89D1703cF6bD97F134341EE44": null, - "0xF3Ad97364bcCC3eA0582Ede58C363888f8C4ec85": "diogoj.eth" - }, - "safeUsers": { - "0xdD866169DBCf639ed57f0020c5C9F4F4E1AAB263": 0.42857142857142855, - "diogoj.eth": 0.14285714285714285 - } - }, - "hypercertData": { - "workScopes": "AgroforestDAO", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0xdD866169DBCf639ed57f0020c5C9F4F4E1AAB263", - "rights": ["Public Display"] - } - }, - { - "title": "MRV Foundation (previously MRV101)", - "address": "0x1b4463971582f485138879F0e509C160BeB8D5e6", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0xbd90cd76d77905c0600a5d21e5f8120ac756385175f1c2345efd88e2d39d4554", - "projectDescription": "ABOUT\n \nMRV Foundation is a project that spun out of a founder\u2019s circle in the ReFi DAO. Effective measurement, reporting and verification (MRV) of soil regeneration, crops\u2019 health improvement and biodiversity enhancement is critical to help small scale farmers and growers navigate tough challenges of climate change.\n \n \n \nTHE PROBLEM\n \nTraditional MRV approaches are prohibitively expensive, often constituting 30-40% of the costs of implementing regenerative practices for large projects over 1200 hectares. What\u2019s worse, these expenses are always upfront but the project developers are not able to receive revenues until the credits are sold after 5 years or longer. Additionally, the current MRV methodologies are analog, difficult to understand, very lengthy processes and often do not include regenerative practices valued by the local communities. Data gathered during traditional MRV practices is usually kept in silos and has no useful application or benefits for smaller farmers.\n \nSmall farmers produce ~85% of the world's food supply and they don\u2019t have any viable solutions and support to switch to regenerative practices. This scenario offers us a significant opportunity for regenerative impact. MRV is a key component of building a system that can drive financial means to small-scale projects. Not only in agriculture - forestry, ocean, city regeneration.\n\n\n\nOUR SOLUTION\n \nTo help small scale projects get full benefits of carbon, ecocredits and other incentives for ecosystem services, MRV Foundation is working to publish MRV101, an open source software-based guide to help small projects to quickly understand and implement relevant MRV best practices and reap the rewards. In the guide\u2019s first edition, we are starting with agriculture, agroforestry, and small-scale farming examples.\n \n \n \nDELIVERABLES (Each Phase lasting ~ 9-12 months)\n \nPhase 1: Understanding traditional MRV approaches (Completed with the help and support from Solid World Carbon Expert, Mr. Durga Prasad)\n \nPhase 2: Learning relevant MRV practices for Small Scale Projects in the context of pilot projects based in India. \n \nPhase 3: Combining our learnings with on-ground best practices and publishing the guide.\n \n \n \nGR15 UPDATE \n\nWe raised ~$45,000 in Gitcoin GR15. We are grateful for the Gitcoin Platform, the whole Gitcoin team and everyone who believed and supported us during GR15. Over the last three months, we have worked on the following:\n\n- We did meetings with the ReFi leaders to learn how to best utilize the funds for MRV research.\n- We welcomed a few open contributors to the core team for the agenda of research. \n- We organised deep-dive sessions with experts in the field of IOT, ReFi and Carbon Space to provide us with guidance during our weekly meetings.\n- We invited pilot projects to submit project proposals as per the guidelines set by Bati.\n- We received 5 pilot project pitches during the submission phase.\n- The leaders of these pilot projects were also acting as open contributors for our MRV research. Hence, unfortunately, the question of conflict of interest started to arise. These leaders were also busy leading their own individual projects and were not able to contribute fully as per the needs of the MRV Foundation. These factors slowed down our research efforts and therefore, we unfortunately had to fully restructure our research team in December.\n- For research, instead of relying on project leaders to act as open contributors, we have decided to partner with the agriculture scientists who are already doing research in the field of MRV. As the first step, we are partnering with Junagadh Agricultural University to engage with the academic researchers.\n- We are also in discussions with a few farmer collectives to get access to their farmlands for implementing pilot projects.\n\n\n\nUSAGE OF FUNDS FROM THIS ALPHA ROUND\n\n- Providing stipend to academic researchers and core contributors - 50%\n- Documentation of research - 20%\n- Providing for operational expenses of the foundation - 20%\n- Providing for legal and compliance expenses of the foundation - 5%\n- Towards strengthening ReFi Space in India to ReFiIndia - 5%\n\n\n \n \nIMPACT AREAS\n \n- Incentivise smallholder farmers for doing regenerative practices and MRV documentation.\n- Improve the scope of VCM to include Biodiversity and other forms of credits.\n- Increase citizen participatory methods in VCM, ReFi and climate action.\n- Build collaboration with the DeSci community.\n- Bring existing MRV tools for the application in small scale projects.\n- Develop new tools where gaps are identified.\n\nCORE TEAM\n\n- Bhavesh Bati (https://twitter.com/Bati_ReFi)\n- Priyank Bakshi (https://twitter.com/0xClimate)\n", - "projectWebsite": "https://mrv.earth", - "projectLogoCid": "bafkreieezh3ibgiteyabnqn32d2jvxifwlatfoaj7q7af7bdja2fswv7cy", - "projectBannerCid": "bafkreidoebxh37edccxwyefwjurr2jlnyymb6mjx3w5nhzckczd3bzmi4e", - "projectTwitter": "MRVProtocol", - "projectGithub": null, - "userGithub": null, - "fundingTotalDollars": 3977, - "donorsTotal": 156, - "fractionsTotalSupply": 3946, - "hypercertEligibleDonors": 147, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "MRV Foundation", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x1b4463971582f485138879F0e509C160BeB8D5e6", - "rights": ["Public Display"] - } - }, - { - "title": "Hibiscus DAO", - "address": "0x1a6ef6cc28cf60aa0504cfb21cdffa48cfe3a8fb", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0xc3b35b0cb696ab824b9d2d0a515ffd79fc1cf3950442bc0ca91a3c6441cdfa7a", - "projectDescription": "What is Hibiscus DAO?\n\nHibiscus DAO is building the first transparent, open-source, community-owned toolkit for the fashion creator economy.\n\nWe want to return power + ownership to creators and producers - and eliminate negative human rights and environmental externalities from the fashion supply chain.\n\nWHY?\n\nCurrent Landscape of Apparel = Exploitation\n\nThe apparel and luxury market is growing exponentially: reaching $1.9 trillion globally in 2019 - and expected to surpass $3 trillion in the next decade.\n\nBut the industry's success is rooted in exploitation. Its business model is based around maximizing profit - by minimizing value returned to stakeholders.\n\nTraditional Fashion = Humanitarian Exploitation\n\nSlave, child, and sweatshop labor are all common in the supply chain of traditional brands.\n\nThese human rights violations are well-documented but suppressed via marketing and PR. \n\nTraditional Fashion = Creative Exploitation\n\nTalented young designers generate massive value for brands - often with little to no compensation.\n\nA successful, popular design will earn a brand millions, yet the designer behind it will see none of these earnings. Instead, their designs become the IP of the brand.\n\nTraditional Fashion = Environmental Exploitation\n\nFashion brands intentionally leverage planned obsolescence and instill an increasingly consumerist mindset based on overconsumption to feed their continued need for profit. \n\nWhen overconsumption is encouraged, true sustainability is impossible to achieve.\n\nWe\u2019re a **black-led** team and here\u2019s what we\u2019re working on:\n\nEnabling Profit Redistribution + Transparent Supply Chain + Community Ownership = Human Rights Impact\n\nHibiscus recently created the first ever on-chain profit redistribution contract for garment production - redistributing profits from FWB merch sales to supply chain participants.\n\nHibiscus is looking to build on this by onboarding sewers, pattern makers, printers & other workers from the garment industry who are \"stuck\" working for a factory with no access to profit redistribution - giving them ownership over the value they create.\n\nBuilding cryptographic profit sharing into our tooling enables the creator economy for apparel production by retaining and redistributing the value created in making and wearing apparel. \n\nCrypto technologies help share ownership with stakeholders:\n\n- Community owned ateliers vs. factories and manufacturers.\n- Fork-able concepts and tools can be validated and iterated on by community creators.\n- Designs registered as on-chain vectors - enabling proper credit and compensation.\n- Future royalties of products can be distributed back to creators and the community.\n- Locally accessible physical design and fashion resources.\n\nBuilding a Transparent Supply Chain\n\nCreating open source, end-to-end apparel production supply chain + tech infrastructure that allows creators to easily create new garments on existing bases - via on chain portfolios that can forked, remixed, and recombined.\n\nCreating \u201cProof of Ethical Production\u201d + Oracles\n\nEventually, we want to create a system of producing clothes that uses consensus-driven blockchain technology to verify products are being made ethically.\n\nFighting Fast Fashion = Environmental Impact\n\nAs a part of our stack - we are working on the first solution for holding fast-fashion polluters accountable.\n\nSince the last Gitcoin grants round, we\u2019ve created the first model for on-chain profit redistribution in fashion - successfully experimented with the on-chain profit redistribution to stakeholders who previously had no access to upside from their IP. We\u2019re almost ready to drop a case study - open-sourcing the process behind this historic collection.\n\nNow we want to enable supply chain provenance and environmental transparency in the garment production process: create and test the first functional model for an open-source apparel supply chain to show how the garments were produced and the corresponding environmental impacts. \n\nSupply Chain Accountability\n\nWhat does this look like in practice? \n\nNow that we\u2019ve experimented with profit redistribution - we want to run experiments to figure out how to capture garment production metadata on chain.\n\nAnd after that - putting these new data capture + manufacturing processes into practice by experimenting with a garment collection that incorporates provenance and accountability around environmental impacts of the collection.\n\nWe hope that our efforts will set precedent and can serve as a model for future apparel projects. The current landscape of crypto fashion is \u201cmerch\u201d that encourages wasteful consumption, enablement of existing exploitative power structures, and no regard for the environmental impacts.\n\nHibiscus seeks to change that by providing an alternative approach that enables sustainability which already reduces waste or gives accountability around environmental impacts of garment production.\n\nOpen-Sourcing a Model for Ethical Clothing Production\n\nThis experiment will inform the development of environmental oracles that will allow any apparel project to open-source their environmental impact and adopt new environmental standards - all done via leveraging supply chain metadata arising through the garment production process. \n\nThis supply chain experiment will be done with local supply chain participants in Toronto, Canada - with the hope of subsequently expanding out into other countries. \n\nHibiscus is creating and open sourcing the first model for a decentralized, transparent supply chain in fashion. \n\nHow = Utilizing L2s for Real-World Crypto Use Cases\n\nBlockchain technology is often criticized by naysayers as not having real-world uses. \n\nHibiscus\u2019 goal of creating an open-source, community-owned supply chain is one of the strongest examples of an IRL use case for crypto. \n\nIn order to create a truly sustainable, community-owned supply chain for clothing, Hibiscus needs to focus heavily on grassroots community work - onboarding sewers, pattern makers, textile producers, and other supply chain participants.\n\nIn many cases - these supply chain participants are members of underrepresented groups: people of color without much exposure to technology - who would be vulnerable to exploitation by traditional fashion industry structures and institutions.\n\nThese participants in the garment supply chain have never heard of blockchain before. \n\nOnboarding them onto Ethereum mainnet - and having them pay anywhere from a few dollars to a few hundred dollars in gas fees - is simply not feasible for this demographic.\n\nInstead we will work directly with these local supply chain participants to onboard them into crypto via L2s - which can provide an accessible, feasible entry point to these new ecosystem participants. \n\nWe hope to use L2 infrastructure as foundational substrates to build real world utility and onboard new non-crypto native users.\n\nWe will open-source this process to create onboarding resources and serve as a model to other projects who are building real world use cases on L2s - to help accelerate driving real-world adoption.\n\nWhat\u2019s next on the roadmap?\n\nWe\u2019ve hit our short term goal to use liquid 0xSplits to experiment with redistribution contracts for primary sales for garment workers since the last Gitcoin grants round.\n\nWe seek to build on this success by creating garments made using a transparent supply chain by open sourcing garment production metadata - proving out our model for supply chain accountability.\n\nThrough this process - we will onboard underrepresented communities onto Ethereum L2.\n\nAs mentioned above - we\u2019re working towards a system of producing clothes that uses consensus-driven blockchain technology to verify products are being made ethically, without negative human rights and environmental externalities. \n\nWith an improved model we can build better to do more, produce less, and return value to creators and users.\n\nFor a deeper dive into our ecosystem, we invite you to read the first edition of our whitepaper linked on our website: hibiscus.tech. ", - "projectWebsite": "https://hibiscus.tech/", - "projectLogoCid": "bafkreiaz2jwfowlu3shqoyo6354yynnd3aujqrlkngrnbnahcynokfqgj4", - "projectBannerCid": "bafybeidgibzxids55bfmkawolgolm4r45a7tsqbky5eawpyczqy2sy4m5i", - "projectTwitter": "hibiscusdao", - "projectGithub": "HibiscusDao", - "userGithub": "techspecc", - "fundingTotalDollars": 6597, - "donorsTotal": 269, - "fractionsTotalSupply": 6522, - "hypercertEligibleDonors": 238, - "ensName": "hibiscus.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.002141136889027099 - }, - "hypercertData": { - "workScopes": "Hibiscus DAO", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "hibiscus.eth", - "rights": ["Public Display"] - } - }, - { - "title": "The Angry Teenagers - democratising investment in reforestation projects", - "address": "0x3460BF837B6741035d20Ea2D894A4423A859af12", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0xc8c5d94192210bb9b341f13bab13b64a04a893fd50fc554fd6661b6b58fd5360", - "projectDescription": "\ud83c\udf33\ud83c\udf34\ud83c\udf32\ud83c\udf33\ud83c\udf34\ud83c\udf32 \nWhat can each of us do to help regrow the world's forests?\n\nSo far, the answer has been a very frustrating, \"not much\". \ud83d\ude21\n\nUnless you have a few million dollars to invest, until now you simply haven't been able to directly help plant forests in the places that most need them. So we've been forced to rely on governments and big companies. \n\n\ud83d\udc68\u200d\ud83c\udfa4\ud83d\udc79 THE ANGRY TEENAGERS ARE ANGRY ABOUT THIS \ud83d\udc79\ud83d\udc68\u200d\ud83c\udfa4\n\nNow we've channeled that anger and used to blockchain to build a solution. \n\nWe've created Angry Teenager tokens that each hold a vote in a DAO. The funds raised from selling tokens goes into the DAO wallet, and then they vote to release funds to plant trees in the real world. \n\nThis has involved innovation not only in the smart contracts that manage the DAO (check our white paper for more details on \"opt-out voting etc), but also in real world legal contracts \ud83d\udc73\u200d\u2642\ufe0f. All of that work is open sourced, of course. \n\nEach token is geo-located to a specific square within the project \ud83e\udde9. So buyers can see exactly where their money is going, and the piece of land that they have reforested. They can also watch \ud83d\udd2d the trees grow over time because the tokens regularly and dynamically update with photos and other data. \n\n\ud83d\udc63EARNING CARBON CREDITS\ud83d\udc63\nAs the trees grow, token holders earn carbon offsets which they can use to offset their carbon footprint. You can have 100% transparency and so 100% confidence in the work that is creating your carbon offsets. \n\n\ud83d\udcb0THE VALUE PROPOSITION\ud83d\udcb0\n=> Individuals and small companies can now fund the creation of a forest on a specific square of land in Africa, starting with investments as low as $150. \n\n=> They can watch that forest grow, and share photos and other media about the project with their customers and friends. \n\n=> They earn super high quality carbon credits that they can use to offset their carbon footprint. \n\n=> If Ever they want to stop earning carbon credits, they can sell their token on the open market - if the price of carbon credits has risen, this might even make them a profit :)\n\n********************UPDATES SINCE GR-15******************\n\n=> Smart Contracts fully audited\n=> Artwork. Beautiful artwork is complete. \n=> $10k Pre-Sale tokens sold to raise funding for the first test planting on 2 hectares. \n=> Verra Project Design Document 90% done. This allows us to generate Verra-authenticated carbon credits which have the highest value. \n\n********************END TRANSMISSION********************\n\ud83c\udf33\ud83c\udf34\ud83c\udf32\ud83c\udf33\ud83c\udf34\ud83c\udf33\ud83c\udf32\ud83c\udf33\ud83c\udf34\ud83c\udf33\ud83c\udf32\ud83c\udf32\ud83c\udf33\ud83c\udf33\ud83c\udf34\ud83c\udf33\ud83c\udf34\ud83c\udf34\ud83c\udf33\ud83c\udf33\ud83c\udf34\ud83c\udf33\ud83c\udf33\ud83c\udf32\ud83c\udf32\ud83c\udf33\ud83c\udf33\ud83c\udf34", - "projectWebsite": "https://angryteenagers.xyz", - "projectLogoCid": "bafkreiaakmi74dz7rkjcvyk2ryim2ejo3dactx6h3qfpg6a36ofbvnzvvu", - "projectBannerCid": "bafybeig7ip2u4akhi374jf6rt2b2r5lntt7dnvn2dv646bnka3blztx5kq", - "projectTwitter": "AngryTeensNFT", - "projectGithub": "eco-mint", - "userGithub": "benwhately", - "fundingTotalDollars": 3380, - "donorsTotal": 138, - "fractionsTotalSupply": 3344, - "hypercertEligibleDonors": 132, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "The Angry Teenagers", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x3460BF837B6741035d20Ea2D894A4423A859af12", - "rights": ["Public Display"] - } - }, - { - "title": "Myseelia \ud83c\udf44", - "address": "0x16d46098e455A04Cf7F3e43c3b2706614fDbEC85", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0xcaa2f99f0e54943da441af228296cf621a7a1eab4949305785e51e342a5afd15", - "projectDescription": "\ud83d\udd78\ufe0f \nWe are weaving information into a shared knowledge network, a coherent systems map for cultivating collective inteligence. \n\n\ud83d\udd25\nHumanity faces a converging cascade of interconnected crises: ecological, economic, geopolitical, educational, psychological.. without a shared map for collectively navigating away from collapse and towards a flourishing future for all.\n\n\ud83d\uddfa\ufe0f\nMyseelia means to map the pathways towards planetary regeneration by cultivating a federated knowledge graph, integrating individual perspectives and data silos into shared knowledge and wisdom.\n\n\ud83c\udf31\nWe are starting with people and projects already in the web3 impact space. By giving them tools to grow their own profiles with their wants, needs, ideas, values, claims etc, we can connect these subjective perspectives together into a coherent systems map via Myseelia.\n\n\ud83d\ude4b\nOur proposed solution, a searchable knowledge base, can address key questions:\n- How can I generate wealth aligned with what I love and what the world needs?\n- Who is already creating impact? How?\n- Where are there regenerative investment opportunities?\n\n\ud83d\udcbb\nWith funds from this grant we will build out the first stage of Myseelia, including\n- A backend graph database\n- Semantic search\n- Personalized recommendations\n- Graph visualization\n\n\ud83c\udf32\ud83c\udf44\ud83c\udf33\nOur future development will include integrating additional domains of data, AI assisted services, APIs, a decentralized graph database, a regenerative financial model, and decentralizing governance focused on commoning.\n\n\ud83e\uddd4\ud83d\udc69\ud83c\udffd\nOur team includes \nDarren Zal \nJenn Baez\n+ key collaborators in the web3 ReFi ecosystem.", - "projectWebsite": "https://notion.so/jennbaez/Knowledge-Network-for-Regeneration-82a964f84d204e978d665be22cc64bd4", - "projectLogoCid": "bafkreiddtoumf52t3haqvrwtg3v3c3pubhnh4qvxahcgx57kl4aoxakt7u", - "projectBannerCid": "bafybeiaplfu4rglnf5eenpw52k6oy5ituuna2skib3qfxhxg5vo4tx7phm", - "projectTwitter": null, - "projectGithub": "https://github.com/DarrenZal/Myseelia", - "userGithub": "https://github.com/DarrenZal", - "fundingTotalDollars": 1401, - "donorsTotal": 129, - "fractionsTotalSupply": 1371, - "hypercertEligibleDonors": 117, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "Myseelia \ud83c\udf44", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x16d46098e455A04Cf7F3e43c3b2706614fDbEC85", - "rights": ["Public Display"] - } - }, - { - "title": "Carbon DAO", - "address": "0x035A1F3419DD223293e5411133d9C786f5885425", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0xdbcd05ba701119f00aafd0212c87aded137112a007f4cc56340dc9124515e329", - "projectDescription": "Introduction\n\n\nBorn from Carbon DAO, The Aetlas Protocol is a ReFi protocol that is designed to connect the ReFi ecosystem and unlock new inflows of green capital. We designed a liquidity and retirement mechanism that offer the best of both a liquidity pool and an NFT marketplace. This offers the ReFi ecosystem a liquid marketplace that retains the unique values offered by each individual carbon project.\n\n\nWho\u2019s this for and what are their problems?\n\n\nThere are five types of users in the Aetlas Protocol:\n\n\ud83c\udf31 Project Developers: \nA user who manages a carbon sequestration or emission reduction project issuing carbon credits on a supported on-chain carbon offset registry. Their main objective is to sell the carbon assets they created. Their considerations are a balance between time to sell and price per carbon metric tonne. With greater liquidity in a carbon market, comes a significant reduction in time to market. However, liquidity focused markets often mean the project developer sacrifices any additional value of their individual project.\n\n\n\ud83e\udd1d\ud83c\udffd Carbon Traders: \nA users that buy and sell carbon assets for profit. They often look for opportune assets to buy and supply willing buyers who don\u2019t have the time to search themselves. The problem they face with existing pools is the additional fee they incur (up to 10%) for withdrawing carbon assets from liquidity pools. This reduces the number viability arbitrage trades which creates a less efficient market and creates barriers for new inflows of green capital.\n\n\n\u2747\ufe0f Liquidity Providers: \nA user looking to capitalise on 15x expected increase in demand for carbon in the next 7 years. They are users who hold carbon assets and who provides liquidity to the ReFi ecosystem. The problem they face is that carbon is a depreciating asset. An 2005 carbon credit is worth less than an identical 2020 carbon credit.\n\n\n\ud83e\uddfa Offset Funders: \nThis is a protocol or community who funds offsetting of the carbon emissions their users generate. The barrier for funders is the technical requirements, sustainability expertise and co-ordination to design an effective on-chain carbon portfolio.\n\n\n\ud83e\uddcdOffset Curators: \nThis can be an individual user or a sustainability focused DAO. They often have the time and sustainability expertise but lack the funds to execute their vision for a greener tomorrow.\n\nAetlas Protocol solves these dilemma by separating the retirement and carbon portfolio curation process from the transaction of funds. We have designed a series of deployable autonomous liquidity pools interconnected with a carbon NFT marketplace and powered by a carbon offset funding mechanism.\n\n\n\ud83c\udf31 Project Developers will have access to instant liquidity for their carbon assets but will be able to monetise their additional value post-sale. This is achieved by a Dutch auction held by the liquidity pool for all newly deposited carbon assets.\n\n\n\ud83e\udd1d\ud83c\udffd Carbon Traders benefit from zero % fees for withdrawing carbon from liquidity pools.\n\n\n\u2747\ufe0f Liquidity Providers have minimised exposure to the depreciation of individual carbon assets with a liquidity pool acting as a carbon index that actually generates a yield from the retirement of sold assets. The healthy connection between the NFT marketplace and liquidity pools also helps prevent stagnation older assets.\n\n\n\ud83e\uddfa Offset Funders are unlocked with an incredibly simple funding mechanism. It can be deployed as simply as \u201cSend X USDC to this address + a list of wallets who will curate your portfolio\u201d or the funding process can be integrated at a transactional level within the smart contracts.\n\n\n\ud83e\uddcd Offset Curators are empowered by the funding mechanism to design and implement any variety of impact investment strategy.\n\n\n\nThe Technicals:\n\n\nFunctions - Instance of the Tokenized Vault Contract\n\n\nDeposit Function: This function allows traders to deposit TCO2e tokens into the tokenized vault contract. The function first checks that the receiver's token is held by the smart contract, and that the sender has approved the contract to transfer their tokens. It then checks that the sender's tokens meets the pre-determined selection criteria using a function called isValidTCO2e. Upon depositing a TCO2e tokens, the function then calculates, mints and transfers the appropriate amount of xCLP to the sender using a function called calculateXCLP and the mintXCLP function. xCLP represents a percentage ownership of the underlying assets held in the smart contract. If the TCO2e token does not meet the criteria, the function will reject the tokens and return it to the user.\n\n\nWithdraw Function: This function allows users to withdraw TCO2e tokens from the contract by burning a corresponding amount of xCLP in the users wallet. The function should check that the user has sufficient xCLP and that the requested token is held by the contract. If these conditions are met, the function should burn the xCLP and transfer the requested TCO2e tokens to the user.\nRetrieveTCO2e Function: This function allows a user to retrieve an array of all the TCO2e tokens held by the tokenized vault contract.\n\n\nSwap Function: This function allows a user to swap a TCO2e tokens that is not held by the tokenized vault contract but meets the tokenized vault's pre-determined selection criteria with a TCO2e tokens that is already deposited and held by the tokenized vault contract. The function takes three arguments: the address of the sender (the trader who is sending their TCO2e tokens), the ID of the sender's TCO2e tokens, and the ID of the receiver's TCO2e tokens (the TCO2e tokens already deposited in the tokenized vault contract). The function first checks that the receiver's token is held by the smart contract, and that the sender has approved the contract to transfer their tokens. It then checks that the sender's tokens meets the pre-determined selection criteria using a function called isValidTCO2e. If these checks pass, the sender's TCO2e token is transferred to the smart contract, and the receiver's token is transferred to the sender.\n\n\nisValidTCO2e Function: This function checks that a TCO2e token meets the pre-determined selection criteria for the tokenized vault. It takes a single argument: the ID of the TCO2e tokens. The function returns a boolean value indicating whether the token meets the criteria or not.\ncalculateXCLP Function: This function calculates the appropriate amount of xCLP to be minted or burnt when a TCO2e token is deposited or exchanged in the tokenized vault. It takes a two argument: the ID\u2019s of the TCO2e tokens and the quantity of each. The function returns a uint256 value representing the amount of xCLP to be minted or burnt.\n\n\nmintXCLP Function: This an internal function mints xCLP for a given wallet address. It takes two arguments: the address of the wallet and the amount of xCLP to be minted. The function updates the total supply of xCLP and the balance for the specified wallet address. The amount of xCLP minted is must be restricted to a 1:1 ratio with the deposited number of TCO2e tokens.\n\n\nFunctions - Instance of the Treasury Pool Contracts:\nFundOffsetUSDC Function: This function allows users to deposit USDC into the contract. Upon deposit, the function mints the ERC20 token OFT (Offset Funding Token) with a 1:1 ratio to USDC deposited and proportionally distributes it to a list of wallet addresses provided by the user. The USDC is then added to the contract's funds, dedicated to purchasing TCO2e tokens from any instance of the Tokenised Vault Contract.\n\n\nFundOffsetERC20 Function: This function allows users to deposit any ERC20 with a corresponding Uniswap USDC pair ****into the contract. Upon deposit, the function swaps the ERC20 token for USDC using the correct Uniswap pair. After USDC is depoisted into the function mints the ERC20 token OFT (Offset Funding Token) with a 1:1 ratio to USDC deposited and proportionally distributes it to a list of wallet addresses provided by the user. The USDC is then added to the contract's funds, dedicated to purchasing TCO2e tokens from any instance of the Tokenised Vault Contract.\nRetire Function: This function allows users who received OFT to retire specific TCO2e tokens held by any instance of the Tokenised Vault Contract. The calculateXCLP function in the relevant instances of the Tokenised Vault contract holding the specified TCO2e tokens is called to retrieve an array including each xCLP and the corresponding amount required for the transaction.The calculateUSDC function is called for the array of xCLP required returning value for the requiredUSDC. The OFT equal to requiredUSDC is transferred from the user to the Treasury Pool Contract. The swap function on the UniSwap USDC/xCLP pool contract is called to exchange the USDC for a corresponding amounts of each xCLP. The function should then call the **Withdraw** function of the relevant instances of the Tokenized Vault Contract to exchange the xCLP for a specific TCO2e token held by the contract. After the exchange is complete, the function should burn the OFT and route the TCO2e tokens through the Retirement aggregator contract.\n\n\ncalculateUSDC Function: This function calculates the appropriate amount of USDC required to swap for a list of xCLP variants.It takes a two argument: the ID\u2019s of the xCLP tokens and the quantity of each.The function calls the quoteExactOutputSingle function in the Uniswap USDC/xCLP pool returns a uint256 value representing the amount of USDC required for the swap.RetrieveTotalFunding Function: This function allows a user to retrieve a uint256 value for the total amount of USDC deposited.\n\n\nOther functions:\n\nRetrieveSourceOfFunding Function: This function allows a user to retrieve an array of all the total amount of USDC deposited by each corresponding address (AKA funder).\n\n\nRetrieveFunderContribution Function: This function allows a user to retrieve a value for the total amount of USDC deposited by a specific address (AKA funder).\n\n\nRetrieveTotalRetirement Function: This function allows a user to retrieve a uint256 value for the total amount of TCO2e tokens retired.\n\n\nRetrieveCurators Function: This function allows a user to retrieve an array of all the total amount of TCO2e tokens retired by each corresponding address (AKA curators).\n\n\nRetrieveFunderContribution Function: This function allows a user to retrieve a value for the total amount of TCO2e tokens retired by a specific address (AKA curators).\n", - "projectWebsite": "https://carbon-dao.com", - "projectLogoCid": "bafkreidxhjq7bj7aeh4dw7anq3i7fhgyita5e2kgzrrj36hzadt2wcsp6i", - "projectBannerCid": "bafybeidmitno76ts5cf2ma75kxivmbt262ox7vq5lmjajueg3frcugz6ei", - "projectTwitter": "carbondao", - "projectGithub": null, - "userGithub": null, - "fundingTotalDollars": 6081, - "donorsTotal": 380, - "fractionsTotalSupply": 5985, - "hypercertEligibleDonors": 348, - "ensName": "rasxt.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "Carbon DAO", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "rasxt.eth", - "rights": ["Public Display"] - } - }, - { - "title": "Scaling Grassroots Commons for Local Regeneration in E. Africa and S. E. Asia", - "address": "0xd68e5b216FC2AF2854152EAC501F9E00807d8C1d", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0xdbce25d3279d12e5a6de4a541b1ccb6669e1271f53f180442b5c5d527ebd0f58", - "projectDescription": "The essential preliminary data required to formulate a hypothesis around decentralized technology, ecological data, and regenerative economics is not visible to us.\n\n\nMeasurement, results, and verification of ecological health, as well as transparent accounting are not recorded in a standardized and secure manner. \nThis siloes grassroots savings cooperatives from the formal economy of climate financing.\n\n\ud83c\udf31\n\nResearch Narrative\nChamas operate as commons of ecosystem regeneration and community finance. They are however excluded from the billions of dollars of Climate Financing due to a lack of proof of regeneration and inadequate KYC/AML.\n\n\nUsing existing open ledger technologies and participatory verification; our project will develop a framework to explore the integration of these economies into the global financial system in order to sustain viable livelihoods of land stewards. \n\nIn so doing, we make their value legible to open up new pathways for funding and support, and to forward planetary regeneration.\n\n\ud83c\udf31\n\nRegen Foundation will steward a research study into the existing governance systems of regenerative savings groups called Chamas. \n\nThis research is a pilot study to establish a baseline framework on how Chamas can integrate ecological monitoring technologies with ecosystem service markets for the development of viable local regenerative economies. \n\n\ud83c\udf31\n\nWith the amount raised in #GR15, we have worked on\n1. Identifying Chamas in regeneration\n2. Initial stakeholder meetings \n3. Advisor and expert search \n4. Feasibility studies\n5. ReFi Literacy gap identification \n\n\ud83c\udf31\n\nThe proceeds from Alpha Round will be used for\n1. ReFi bootcamp for land stewards \n2. Web3 Encyclopaedia development\n3. Feasibility study into DAO tooling for Chamas \n4. Video content generation on the powerful work these groups are doing \n\n\ud83c\udf31\n\nWe invite you to support our work by contributing to our grant.\n\nMore information on Chama DAO is available at https://bit.ly/3XGZ0Cn\n\nContact details : contact@regen.foundation\n\n\n\n", - "projectWebsite": "https://regen.foundation", - "projectLogoCid": "bafkreifpzpuln7f75acbc4ygnp4bgr7bnz646tjzshup76kdxhjgnrjiti", - "projectBannerCid": "bafybeidloip3ejod5ihjtiithxbrevxinuki6xp7yhrpvvphlthgerabjq", - "projectTwitter": "RegenFdn", - "projectGithub": null, - "userGithub": null, - "fundingTotalDollars": 1823, - "donorsTotal": 112, - "fractionsTotalSupply": 1799, - "hypercertEligibleDonors": 105, - "ensName": "regenfoundation.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "Chama DAO", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "regenfoundation.eth", - "rights": ["Public Display"] - } - }, - { - "title": "Earthist - Decentralize Hemp Seeds", - "address": "0xc2d706398A978b8c5Aa4EFCd824b57E978841107", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0xdfa4e3f6ae4072b9dee18452491dc0212ff00714b1d7469d6768ff0af8ad8444", - "projectDescription": "\u2757Problem Statement\n \nThe financial and political incentives to fight climate change, soil degradation and systemic degeneration are insufficient to mitigate and reverse the risks we face as humanity.\n\n\ud83d\udcc3Our Proposal\n\n\ud83d\udfe2Why?\nToday, most commercial seeds available in the market are bound to intellectual property rights \u2013 the majority being owned by an oligopoly that is slowly becoming the owner of our food chain. \n\n\ud83d\udfe2What?\nHemp is an ancient plant that has been used for around 10.000 years, and one of our most powerful instruments for producing positive socio-ecological impacts. It has an extensive application range in various industries such as food, textile, construction and many more.\nDespite such functionality, the highly centralized ownership structure makes it harder to experiment with hemp and adopt sustainable & regenerative business practices with it.\n\n\ud83d\udfe2How?\n\ud83c\udf31Earthist considers heirloom seeds as public goods. We aim to protect nature\u2019s legacy and transfer it to future generations without degeneration. We work for sustainable land regeneration at scale through hemp farming and aim to incentivize small/family farmers to adopt decentralized MRV technologies for positive ecological impact while producing carbon-conscious raw materials.\n \n\ud83e\ude84Since GR 13:\n\u2705We have found and collected four different types of lost heirloom cannabis seeds from across the country and have safely stored them in our seed bank.\n\u2705Over 6.250.000 seeds were successfully planted and harvested by farmers in five different regions through our network.\n\u2705We have given away 70% of our hemp seed related products as a gift to the community in order to improve health and raise awareness about regenerative hemp farming and heirloom seeds.\n\u2705Collaborating with amazing climate projects such as dMRV Network, Atlantis and Digital Gaia (Augmented collective intelligence to integrate real-world data with natural models to continuously evaluate real global impact, using seeds as an ancient tool for cybernetic communication)\n\ud83c\udf31We\u2019ve invested in mechanization and bought a hemp seed dehulling machine to make the first local hemp hearts from heirloom seeds. \n\ud83c\udf31 We have opened a Gitcoin community-supported \"Everything-Hemp-Store\" in Istanbul \ud83d\udc9a Thanks to this, we will also have a small space for 9-10 people to host hemp and regeneration-related workshops.\n\n\u27a1\ufe0fNext\nGitcoin Alpha Round \ud83d\udc9a\n\nThe number of local farmers in the country by the end of 2021 was 512.000 as opposed to 1.122.000 in 2011. Moreover, with inadequate political and economic decisions given by the government, inflation rates in the country have risen to 181%. \nThere is a bottleneck between farmers and the market as a result of the lack of investment and equipment in our sector.\nAs Earthists: \n\ud83d\udfe2We have to be the market makers, farmers, producers, subject experts and consciousness changers all at the same time. This is not an easy task though!\nNow, \n\ud83d\udfe2We need to improve our machinery to accelerate the production of hemp goods. In this way, we can show the proven value and amazing potential of the nonpsychoactive variety of the cannabis plant with more than 96 different hemp-based products. All made by Earthists for health, cosmetics, textile, paper, construction etc.\n\ud83d\udfe2This is an amazing opportunity to show people that they can eat it, drink it, read it, tie it, wear it and live in it all while rapidly generating the soil and protecting the climate with your support! \n\ud83d\udc9cHemp is hope and a vital part of the solution to today\u2019s problems!\nThank you for your support.\n\nAll previous Gitcoin round supporters are invited to the store to pick up a free Earthist Garden Hemp Seed Oil by displaying their POAP!\n", - "projectWebsite": "https://earthist.notion.site/Earthist-Decentralize-Hemp-Seeds-Gitcoin-Alpha-d48f1494b9a94cfe9cb5d2a23770a63b", - "projectLogoCid": "bafkreiboym44w2hqgqhfvsdpfip6cmb2ayt644k3yvvovy5eopjt6k3goa", - "projectBannerCid": "bafybeifj3geh7cecy4l5s4ns7v4ftxqcnlhrv2g4jqvse477p5pvt3mwty", - "projectTwitter": "earthistdao", - "projectGithub": null, - "userGithub": "berksohto", - "fundingTotalDollars": 3704, - "donorsTotal": 143, - "fractionsTotalSupply": 3669, - "hypercertEligibleDonors": 136, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0x7bEc70fa7ef926878858333b0Fa581418e2ef0b5": "alienseeker.eth", - "0x5076f87610Ff3D5f859d562a050Dae82F6b3C63e": "earthist.eth", - "0xc91d300D342eC4EBbC61B3AE75dc5D7245109dD9": "unquale.eth" - }, - "safeUsers": { - "alienseeker.eth": 0.6666666666666666, - "earthist.eth": 0.3333333333333333 - } - }, - "hypercertData": { - "workScopes": "Earthist Network", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0xc2d706398A978b8c5Aa4EFCd824b57E978841107", - "rights": ["Public Display"] - } - }, - { - "title": "LOA Labs : ReFi by South", - "address": "0xd2993E8217063c72BBE8c736404c7fC02adC9761", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0xe94883624f3bd962753c133346b353817cf0c2accec7259d3eb59219dd2761ba", - "projectDescription": "ReFi by South is a community building project with a goal to localise and scale climate action - through technology and community organizing - (ReFi) in the global South. \ud83c\udf0d\n\nSupport Climate Action in the global south by contributing to our project. \n\nQuadratic funding rewards your support with a higher matching contribution from the common pool.\n\n\ud83c\udf32\n\nContext\nThe climate crisis has an undeniably more destructive and noticeable effect on communities living in the Global South.\n\nAt the same time, Climate action in the Global South can be substantially more permanent, effective, and impactful especially considering the populations and the solution opportunities available there.\n\n\ud83c\udf32\n\nOpportunity\nThere is an urgent need to build Climate change mitigation, adaptation, and resilience solutions. \nThis can be achieved faster and at scale by leveraging technology. The current systems of banking, finance, carbon markets, nature based solutions, and conservation are inadequate to serve planetary regeneration. \nBlockchain technology enables collaboration at scale, decentralized governance, and crowdsourced financial models to Climate Action. \n\nMost of this ReFi activity is concentrated in the global North.\n\nOur aim is to accelerate\n1. Education around Climate and Blockchain. \ud83d\udcd6\n2. Project discovery, Funding, and scaling. \ud83d\udcc8\n3.Supporting Proof of Concept's as well as\n4. Enabling \"interoperability\" conversations around Language, code, tokens and regulation.\ud83e\udd1d\n\n\ud83c\udf32\n\nPast work\nOver last year; we have been actively surfacing the global south across ReFi conversations in the ecosystem - supporting projects, individuals, and initiatives.\n\nSeptember 2022\nSupporting Founders in ReFi DAO with grant applications and a marketing guide in conjunction with ReFi DAO\n\nOctober 2022 \nLOA Labs organized the Greenhouse retreat under the BICOWG aegis with active participation from the global South\n\nNovember 2022\nIndia\u2019s first ReFi summit with active participation of Climate changemakers, ReFi Projects, Founders, Investors and Developers.\n\nDecember 2022\nGrants Roundtable with Gitcoin, Polygon, Celo, Climate Collective, Solana Foundation, Regen Foundation and Hbar Foundation. \n\nReFi Gratitude NFT collection\n\nTwitter spaces in local languages across Nigeria, Singapore, and India\n\n\ud83c\udf32\n\nOver the course of the year; we have supported projects across Australia, Japan, Abu Dhabi, Africa, and South America.\n\nIn order to bring this global need to local action, we need to leapfrog communities onto Web3.\n\n\ud83c\udf32\n\nGoing Forward.\nThe proceeds from this grant round would go towards\n\n1. Educating Climate(mitigation, adaptation, and offset) projects around leveraging tech(Web3) to scale MRV, project funding, market access, and interoperability\n2. ReFi Gokarna - India\u2019s first ReFi Hackathon at a biodiversity hotspot.\n3. ReFi Ambassadors across Singapore, India, Nigeria, Uganda and more\n4. Roundtables with Regen Investors and around raising Grants\n5. Documenting Climate(+ impact) blockchain projects as use cases for local Industry( and Regulatory ) engagement.\n6. Innovation corridor ( Accelerator model ) enabling cross pollination of capital ( nature based or otherwise), technology transfer, assimilation of indigenous nature based practices and Harmonization of Standards and practices across Language, code, and tokens\n\nThis would be in conjunction with Web2 and Web3 industry.\n \n\n\ud83c\udf32\n\nDrip\nFor the Gitcoin Alpha round, we shall be sharing the grant - with 5 % of proceeds going towards the ReFi Gokarna Hackathon. \n\n\ud83c\udf32\n\nWe cannot address climate change without onboarding the global south to technology and governance models that scale impact. \n\nWe invite you to contribute to this initiative to scale Climate Action through ReFi. \n\nFor more information on our work;\nplease visit our website and follow us on Twitter for updates.\n\nThank you for your support.\n\n\ud83d\ude4f", - "projectWebsite": "https://refibysouth.com", - "projectLogoCid": "bafkreiaukz23so5otpokyp4tgsm5oq7dgwfuasssffzumaoq2fh5jbiybi", - "projectBannerCid": "bafkreiedppai6zaryzhnfccsbjve7rqcfae2y4b6wiooigshw3vrxh3nqy", - "projectTwitter": "refibysouth", - "projectGithub": null, - "userGithub": "knome7337", - "fundingTotalDollars": 12786, - "donorsTotal": 212, - "fractionsTotalSupply": 12730, - "hypercertEligibleDonors": 186, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "ReFi by South", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0xd2993E8217063c72BBE8c736404c7fC02adC9761", - "rights": ["Public Display"] - } - }, - { - "title": "Web3beach", - "address": "0xEFEdaf9c07E6eB56BB8F82f30018e4461B1c5F4c", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0xea014245840ff70f7c7060ed89882aa30b1da5246b7c4000b6a9e85930f97613", - "projectDescription": "Accelerating web3 education and adoption through social and environmental impact. \"Impact Onboarding\" creates onramps and upward mobility in web3 for unbanked, disenfranchised, and historically overlooked communities. WEB3BEACH educates, coaches and empowers community leaders from diverse walks of life to use web3 tools in efforts to improve living conditions for all. This includes environmental impact, health services, education, recreation and the ability to carry out their own public goods initiatives through our mini grants program. As a byproducts, we're creating circular crypto economies in our communities. \n\nSince GR15: We've launched programs in five communities throughout Honduras and will continue to expand in 2023. We're also advising projects in other countries so they can adopt Impact Onboarding strategies in their region. \n\n\n\ud83d\udd0dTransparency Reports: We include expense reports with all of our events and currently working towards creating a standardized grantee reporting process. \n\n\nOur services include:\n\n\ud83c\udf0aEnvironmental Impact\n\ud83c\udfe5Health Services\n\ud83d\udc69\u200d\ud83c\udfebEducation\n\ud83d\udcb8Economic support for micro entreprenuers\n\ud83e\udef0\ud83c\udffeMini grants program\n\n\nCommunity Services offered since GR15:\n\nEnvironmental Impact - Beach clean ups \nhttps://twitter.com/web3beach/status/1597629431597903872\nhttps://twitter.com/web3beach/status/1603773200017784833\n\n\nMental Health services - Therapy for Honduran buidlers\nhttps://twitter.com/web3beach/status/1595500429898665985\n\nKids web3 education:\nhttps://twitter.com/web3beach/status/1592969376051105792\n\n\nSocial Impact - Training local teachers in Emergency First Response because we don't have hospitals or ambulances on our island:\nhttps://twitter.com/web3beach/status/1565425933686898688\n\n\nMini Grants Program -\nhttps://twitter.com/web3beach/status/1597670782121148416\n\n\nProgram Expansions\nWe plan to continue expanding our programs in LatAm and other regions. . Ultimately we'd like to create a model anyone can copy and paste anywhere in the world to benefit their local environment, economy, and the lives of their community.\n\nUse of Grant Funding:\nWe'll continue to use all of our funding for our community programs and will begin compensating our community leaders for their work. Web3beach founder (Carlos Melgar) will continue to work without pay or benefits from grant funding.", - "projectWebsite": "https://web3beach.io/", - "projectLogoCid": "bafkreih4es2d5t6twhario7f2xopopz77f3pqpux46so4xgvjzhaos632y", - "projectBannerCid": "bafkreiatmypzrrw6rrnxdxs6wzkubzr7eskm243t3b4kfuz6g3k3bwerqa", - "projectTwitter": "web3beach", - "projectGithub": null, - "userGithub": null, - "fundingTotalDollars": 4122, - "donorsTotal": 266, - "fractionsTotalSupply": 4051, - "hypercertEligibleDonors": 233, - "ensName": "web3beach.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 1.1287535204635235 - }, - "hypercertData": { - "workScopes": "Web3beach", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "web3beach.eth", - "rights": ["Public Display"] - } - }, - { - "title": "Plants And Pillars", - "address": "0x1C4a70EaDeCc48e436Efd0E997445D71DF57a4ED", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0xedd3049723764122bbed15c36557ab9c5057fded298af97b68dc226969cc3664", - "projectDescription": "About\n\n- Plants and Pillars is a decentralized organization that aims to encourage people to plant more trees and make Earth a better place to live in.\n- We aim to build a community of enthusiasts who'll help us achieve our goal of solving some environmental problems by incentivizing them and gamify their contributions to the environment.\n\nCore Objectives and Future Plans -\n\n\ud83d\udd17Connecting: Our aim is to connect and make people aware of the importance of trees to human mankind.\n\ud83d\udcb5Award: We'll randomly award our supporters to add a P2E environment to this projection in order to keep the people engaged in this project which will eventually help mother Nature.\n\ud83d\udd14Update: With the help of the PUSH protocol, users are notified whenever they get anything credited/ debited.\n\ud83d\udcc8Streaming Money: Send money over time with the integration with Superfluid.\n\ud83d\udcdaEducation: Our Organization will also make people aware of the current situation on Earth and educate them regarding the global issues of SAVE SOIL, GLOBAL WARMING, etc.\n\ud83c\udf0dPlants and Pillars DAO: This will help our community take all the essential decisions and help in the smooth functioning of the project.\n\ud83c\udfafGOAL: Our Ultimate Goal is to reduce and neutralize carbon emissions by planting more and more trees and educating people about our current environmental issues.\n\nRoadmap\n\nCurrent MVP\n\n- Plants and Pillars Web App where people can participate in a lottery game by minting the photo of the plant they planted as an NFT.\n- Wride.io where people can publish blogs regarding current environmental issues and can spread awareness among people.\n- We\u2019ve started building the Plants And Pillars Mobile App for both iOS and Android.\n\n2023 Q1\n\n- General availability of Plants And Pillars Web App and we'll be using these Gitcoin grants to incentivize the devs for their contributions to improve this open source project.\n- General availability of Plants And Pillars Mobile App for both iOS and Android.\n\n2023 Q2\n\n- Launch the Plants And Pillars DAO which will give equal rights to all the users to take decisions about the future plans of the project.\n- Collaborate with different open-source projects to scale the platform.\n\nWhat we did after GR15?\n\n- Started working on the Mobile Game\n- Made an MVP of the blog platform - Wride.io\n- Onboarded 50+ writers from all around the world to write about climate solutions and several different topics to spread awareness among the people.\n- Started working on the Game mechanics and incentivization techniques.\n\nWhy a Gitcoin Grants?\n\n- We want to make the web app more accessible so that people can get a better way to contribute to the environment by getting incentivized.\n- We are looking for blockchain developers to develop the Web App.\n- We will be looking for mobile app developers to develop and ship Plants And Pillars iOS and Android apps.\n\nTech Stack For Now\n\n- Next.js as a frontend framework\n- TailwindCSS for design\n- Lens Protocol for user profiles\n- Polygon for on-chain storage\n- IPFS for file and metadata storage\n- Chainlink for the Lottery Game\n\nWeb App - https://www.plantsandpillars3.com\n\nBlog Platform - https://www.wride.io\n\nTwitter - https://twitter.com/plantspillars3\n\nNotion Page - https://subsequent-guilty-25d.notion.site/Plants-And-Pillars-95884cb336794be7ad0f883a0e771411", - "projectWebsite": "https://www.plantsandpillars3.com", - "projectLogoCid": "bafkreibkh4yv7fipyzlkajhqa3bewxhnxfx23kech2jn7wsd6hkgmnw54q", - "projectBannerCid": "bafybeihfcw6cpnnsanxo6wqyfhf7cnc7cqy4lhn6wbvvwyim7ch2mfdlre", - "projectTwitter": "plantspillars3", - "projectGithub": "Plants-And-Pillars", - "userGithub": "aviral10x", - "fundingTotalDollars": 4203, - "donorsTotal": 180, - "fractionsTotalSupply": 4158, - "hypercertEligibleDonors": 166, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "Plants And Pillars", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x1C4a70EaDeCc48e436Efd0E997445D71DF57a4ED", - "rights": ["Public Display"] - } - }, - { - "title": "web3swift", - "address": "0x6A3738c6299f45c31697aceA647D49EdCC9C28A4", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x0d1d9c4e5785c2d5e3cb1df956dfec6cc3f3729d64cf53989653960e4a80e2df", - "projectDescription": "A full-featured native iOS/macOS library that provides Web3 functionality in Swift with native ABI parsing and smart contract interactions on the Ethereum network.\n\nWe are working on a universal library that provides web3 functionalities in Swift language so that developers can build full-featured native dApps on the Mac/iOS ecosystem. \n\nDevelopers can find out-of-box functionalities that they usually need in our library, such as web3 web view kit, ABI parsing and decoding, smart contract interactions, etc. Moreover, since Swift allows compilation to WebAssembly, the library also supports WebAssembly. This allows iOS/MacOS developers to work in their native interfaces. As a result, the library greatly improves developer productivity, and helps fulfill the vision of decentralized applications.\n\nThere are several other open-source projects in the field of web3swift, such as [Web3 (0.4.1)](https://github.com/Boilertalk/Web3.swift), [Web3Swift.io](https://github.com/zeriontech/Web3Swift), [web3swift.pod](https://github.com/bankex/web3swift), etc. But in terms of the technologies adopted, our library is yet the most advanced one tha\u3119 most of them, since we have full support of such features as **TxPool, ENS, event loops, etc**. Our library is therefore more widely used by the community.\n\n\nWe provide the community with **convenient tools** to work with Ethereum blockchain in Swift. Developers can therefore attain the ability to **quickly create secure decentralized applications** for Apple devices, without studying cryptography beforehand. This allows developers to focus on the content quality and UX/UI in DApps, which in turn **increases the adoption** of Ethereum blockchain and facilitates community growth.\n\nThe library was an essential part in several winning projects at ETHBerlin2018 and ETHDenver2019. We made it possible to work with Ethereum from mobile devices. Nowdays, our library is one of the most used iOS/MacOS libraries for Ethereum, and it was used in almost all ETH-related hackhathons.\n\nOur project is in great demand, more than 10 dApps have been using our [codes in production](https://github.com/matter-labs/web3swift#projects-that-are-using-web3swift), such as [Loopring](https://github.com/Loopring/loopr-ios?files=1), [PeepETH](https://github.com/matter-labs/PeepethClient), [ENSWallet](https://github.com/barrasso/enswallet), and many others. We have [more than 1000 references](https://github.com/search?p=4&q=pod+%27web3swift%27&type=Code) in GitHub.\n\nAs the library is so popular, our users also keep pushing for updates. There are [several new features requests (25 open issues for now)](https://github.com/matter-labs/web3swift/issues). But since this is the team's open-source side project, we can't spend the money we raised with Matter Labs to support it, especially when it's unrelated to the main goal of Matter Labs: To scale Ethereum.\n\nWe already put in a vast amount of work to support the most used functionalities, including the following:\n\n- \u26a1 Swift implementation of [web3.js](https://github.com/ethereum/web3.js/) functionality\n- \ud83d\udcad Interaction with remote node via **JSON RPC**\n- \ud83d\udd10 Local **keystore management** (geth compatible)\n- \ud83e\udd16 Smart-contract **ABI parsing**\n- \ud83d\udd13 **ABI deconding** (V2 is supported with return of structures from public functions. Part of 0.4.22 Solidity compiler)\n- \ud83d\udd78 **(ENS) support** - a secure & decentralised way to address resources both on and off the blockchain using simple, human-readable names\n- \ud83d\udd04 **Smart contracts interactions** (read/write)\n- \u26e9 **Infura support** , partial Websockets API support\n- \u2692 **Parsing TxPool** content into native values (ethereum addresses and transactions) - easy to get pending transactions\n- \ud83d\udd87 **Event loops** functionality\n- \ud83d\udcf1 Supports Web3View functionality (WKWebView with **injected "web3" provider** )\n- \ud83d\udd75\ufe0f\u200d\u2642\ufe0f Possibility to **add or remove "middleware" that intercepts** , modifies and even **cancel transaction** workflow on stages \"before assembly\", \"after assembly\"and \"before submission\"\n- \u2705 **Literally following the standards** (BIP, EIP, etc):\n\n - [**BIP32**](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki) **(HD Wallets),**[**BIP39**](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki) **(Seed phrases),**[**BIP44**](https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki) **(Key generation prefixes)**\n - [**EIP-20**](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md) (Standart interface for tokens - ERC-20), [**EIP-67**](https://github.com/ethereum/EIPs/issues/67) (Standard URI scheme), [**EIP-155**](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-155.md) (Replay attacks protection)\n\n - **And many others** _(For details about this EIP's look at [Documentation page](https://github.com/matter-labs/web3swift/blob/master/Documentation/))_: EIP-681, EIP-721, EIP-165, EIP-777, EIP-820, EIP-888, EIP-1400, EIP-1410, EIP-1594, EIP-1643, EIP-1644, EIP-1633, EIP-721, EIP-1155, EIP-1376\n- \ud83d\udddc **Batched requests** in concurrent mode\n\n- **RLP encoding** Base58 encoding scheme support\n", - "projectWebsite": "https://github.com/web3swift-team/web3swift/", - "projectLogoCid": "bafybeibnguyv4ykek3fh6ur7y7uprnzkkh4vt2hr2aivxeu53p4lhu7pie", - "projectBannerCid": "bafybeig4mswudhxo7rlpi2urdvukjmflj6zte5vswf26j5svcuropens3e", - "projectTwitter": "skywinder", - "projectGithub": "", - "userGithub": "skywinder", - "fundingTotalDollars": 3985, - "donorsTotal": 509, - "fractionsTotalSupply": 3856, - "hypercertEligibleDonors": 452, - "ensName": "web3swift.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.03933502791317038 - }, - "hypercertData": { - "workScopes": "web3swift", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "web3swift.eth", - "rights": ["Public Display"] - } - }, - { - "title": "Lenstube", - "address": "0x01d79BcEaEaaDfb8fD2F2f53005289CFcF483464", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x0f1d31d427400106f3d2958225dd235ae60b6a7572fb5155201b723e1ae79632", - "projectDescription": "Decentralized video-sharing social media platform, built using Lens protocol. \ud83c\udf3f\n\nWe aimed to develop a decentralized video-sharing app, where content creators own their video content. By storing videos permanently in Arweave and the metadata stored permanently on-chain, no one can restrict users from creating content of their choice. Creators can always monetize their content with various means like nft modules and tips.\n\n- Features\n\n\n\ud83d\udcfa Create channels.\n\n\ud83d\udcc0 Publish any video content or NFTs.\n\n\ud83d\udd28 Collect video as NFT.\n\n\ud83e\ude9e Mirror and share videos across Lens Dapps.\n\n\ud83d\udcb0 Set membership fees to your channel.\n\n\ud83d\udd14 Notifications about new members, comments, mirrors, and mints.\n\n\ud83d\udcb2 Customize who can collect your video and associated fees.\n\n\u2764\ufe0f Support any creator by sending a Tip.\n\n\ud83d\udc4d Like and comment on videos.\n\n\ud83c\udfa5 Short videos called Bytes\n\n\ud83c\udf3f Watch later and recently watched videos library.\n\n\ud83c\udff7 Video Categories\n\nand more.\n\n - Links\n\nhttps://twitter.com/lenstubexyz\n\n", - "projectWebsite": "https://lenstube.xyz", - "projectLogoCid": "bafkreicowrkp5yfzvr2smtpk57yhjwvmfx36mbpr3tiqti4x7z6wsqx5ge", - "projectBannerCid": "bafybeibvfmuckpzz7hkaptacrydt3pllmdedkvh66odkmryjtyjwroqpxq", - "projectTwitter": "lenstubexyz", - "projectGithub": "lenstube-xyz", - "userGithub": "sasicodes", - "fundingTotalDollars": 39925, - "donorsTotal": 8879, - "fractionsTotalSupply": 37638, - "hypercertEligibleDonors": 8465, - "ensName": "sasi.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.000890253492355041 - }, - "hypercertData": { - "workScopes": "Lenstube", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "sasi.eth", - "rights": ["Public Display"] - } - }, - { - "title": "ECHO", - "address": "0xB67FD6f4B908d702c2CF0E2b9d30d52D4EA5B2bC", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x0f648ff5caf73611e70ebaaa9df9bf0dc81f5a633af3996672c6a5e44df791b1", - "projectDescription": "ECHO is the first decentralized social engagement protocol based on Arweave. \n\nOur goal is to provide the fundamental infrastructure of Web3 social by introducing the first comment widget that can be deployed on any Web3 website with permanent data storage, so that users can speak up for themselves in a decentralized, permissionless, and censorship-resistant environment. It is our conviction that every person deserves to be heard, and we strive to create the right tool to make that happen. \u201cLong live our opinion\u201d, as our slogan goes.\n\nMore importantly, as we are providing a multi-chain, multi-platform, and multi-disciplinary solution, ECHO will energize the social mobility in an aggregated manner to address the current social segregation issue in Web3. And our protocol-based data structure of social activities both on-chain and off-chain will be the cornerstone of the future Web3 social paradigm.\n\nOur opinion is our intellectual assets. People don\u2019t own their voice in Web2, and people have no tool to own their voice in Web3. People are awakening that decentralization should not be limited to finance, but also in other fields. And we need a product so that people can speak freely and equally without worrying about censorship and privacy issue. And Arweave is a much better storage solution than IPFS that the technology is mature to make this happen. \n\nECHO provides a neutral commenting tool that can be used to comment on anything, including Gitcoin grants.\n\nWe have established partnerships with companies and products such as Arweave, .bit, everPay, Mirror, Mail3.me and permaFacts.\n", - "projectWebsite": "https://0xecho.com", - "projectLogoCid": "bafkreift6xd2sfqcftpsnaue5xovdz6qvjpdzbq3vcndomtc77dogbkdae", - "projectBannerCid": "bafkreih7xjji7i3jxzfjudbfc4nxhepmu6tp35pbdxjkfstnht77c3uxtu", - "projectTwitter": "0x_ECHO", - "projectGithub": "0x-echo", - "userGithub": "airyland", - "fundingTotalDollars": 8128, - "donorsTotal": 1561, - "fractionsTotalSupply": 7726, - "hypercertEligibleDonors": 1502, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "ECHO", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0xB67FD6f4B908d702c2CF0E2b9d30d52D4EA5B2bC", - "rights": ["Public Display"] - } - }, - { - "title": "Chaineye", - "address": "0xE6D7b9Fb31B93E542f57c7B6bfa0a5a48EfC9D0f", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x128a79c5f52d33bc49f5677dd0fcd695e44f22916b920dc3490c18f10099db66", - "projectDescription": "ChainEye aims to build the world leading free and open source omnichain analytical tools for retail investors. Launched in the Q4 2021, Chaineye has a total of over 100k user visits.\nCurrently, it has the following core functions:\n \nBridgeEye - a multi-chain bridge comparison tool. Users can use this tool to find the optimal bridge option given the source chain, destination chain and the amount of asset. Supported Chains include ethereum, polygon, avalanche, bnb chain, aurora, fantom etc. \n \nCEX transfer fee - Uses can check all the CEXs deposit and withdrawal status without logging into CEX. Users can find the cheapest route between CEX & On-chain transfer by sorting out the withdrawal fee. The data is updated every 10 minutes.\n \nMultichain Gas - Users can check the gas history and hour distribution for various chains in one page.\n\nETH Staking - Users can find eth staking metrics such as 7 Days apy, effective apy, TVL, stakers, liquidity, volume, rewards cycles etc. for different staking protocols. \n\nRPC List - Users can find the best public rpc in terms of height, latency , 24 hour status, provider information etc. We provide the most complete rpc public nodes in the market for the following chains: Etherum, BNB, Polygon, aurora, fantom etc. \n\nStable Coins Dashboard- Key data metrics include native chains where stable coins are issued, price, month off peg , market cap ,market cap changes, collateral value, collateral composition, audit report etc. \n\nChainMap(coming soon) - Users can find interesting participating opportunities on each chain such as yield farming, swap&lending,NFT mining, airdrop, DAO governenance etc. We will start with Optimism and expand to other chains later on.", - "projectWebsite": "https://Chaineye.tools", - "projectLogoCid": "bafkreifj4zsebd6taptf4vlwjnssn5h5nelfoeqwtbz5ugczxigdk4337y", - "projectBannerCid": "bafkreialbihpudovcg44jew4ompuxqhruco5fp2nlkn2kalqpk7epltxva", - "projectTwitter": "biteyecn", - "projectGithub": "DeFiEye", - "userGithub": "DeFiTeddy", - "fundingTotalDollars": 14193, - "donorsTotal": 2700, - "fractionsTotalSupply": 13505, - "hypercertEligibleDonors": 2636, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "Chaineye", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0xE6D7b9Fb31B93E542f57c7B6bfa0a5a48EfC9D0f", - "rights": ["Public Display"] - } - }, - { - "title": "UBI", - "address": "0x1D6cB99ff20223d730Ae5D4680EC5154B7FdAefe", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x1ceee39da9972d78ca42f37445a55a7252d549d58c4546f521766c7900753f48", - "projectDescription": "Universal Basic Income aims to address economic inequality and provide security for every human on Earth. Let's fight poverty with $UBI\ud83d\udca7", - "projectWebsite": "https://ubi.eth.limo", - "projectLogoCid": "bafkreibvjxo4rz2vtdigha46gik7tecbzqhdrsb6wwvakpqwrxwcdrboka", - "projectBannerCid": "bafybeid4ozvu6ksqtjipaxxpteehfkiftokhbps3yjtjw6g26jsskxvrye", - "projectTwitter": "ubidoteth", - "projectGithub": "DemocracyEarth", - "userGithub": "santisiri", - "fundingTotalDollars": 4001, - "donorsTotal": 683, - "fractionsTotalSupply": 3823, - "hypercertEligibleDonors": 642, - "ensName": "ubi.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "UBI DAO", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "ubi.eth", - "rights": ["Public Display"] - } - }, - { - "title": "White Hat DAO", - "address": "0x7bD7De26eBD064465Bb9c272513Bb3bcBdDb1E93", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x20632d089357836c07c38ae6a8b50449fa86c9eef6fd494afee9156474ce8d0c", - "projectDescription": "Safety and security should be at the heart of all platforms, especially public goods services, which is why we are passionate about reporting on the safety of web3 projects and protocols. The team aims to use its knowledge to give back to the Ethereum and wider web3 community with our due diligence and smart contract testing. Our website launched in the final week of 2022, marking the public launch of our safety ratings platform. The platform is a public resource that aggregates information on projects and their teams, token ratings, price information, available liquidity pools, and more. Our aim is to make interacting with the blockchain as safe and secure as possible.", - "projectWebsite": "https://whitehatdao.com", - "projectLogoCid": null, - "projectBannerCid": "bafybeie6w57ksrrv67djlhbh6schefbafrnpfuvb4qv6r6u65zemlumtt4", - "projectTwitter": "White_Hat_DAO", - "projectGithub": "WhiteHatDAO", - "userGithub": "NF-Thinker", - "fundingTotalDollars": 2325, - "donorsTotal": 391, - "fractionsTotalSupply": 2213, - "hypercertEligibleDonors": 327, - "ensName": "whitehatdao-treasury.eth", - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0x722Ec2142d22b54D1030470529ff1F001837fAb8": null, - "0xB5455a962BB9cBcaeaC4E2E746F84affF01282D4": null, - "0x05DDc4894611c4d3930df76d7401C077fd464bA4": null, - "0x663e9f1945668739821B88E8D7CB1F36222D2FA3": null, - "0xe9Fe2650C9c753aDF76849EF8CfbE85733B65100": null, - "0x2C8D2e50Ee03f98A2f4CCFbe1A61552b79bDF6fa": "nfthinker.eth", - "0x00627E45624C979a8ebC8C8A77f81C7b64c6867f": null - }, - "safeUsers": { - "nfthinker.eth": 0.32, - "0x7bD7De26eBD064465Bb9c272513Bb3bcBdDb1E93": 0.04 - } - }, - "hypercertData": { - "workScopes": "White Hat DAO", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "whitehatdao-treasury.eth", - "rights": ["Public Display"] - } - }, - { - "title": "devpill", - "address": "0xEee718c1e522ecB4b609265db7A83Ab48ea0B06f", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x2a42d7a39be87557896cdfde9b096df6cf49fdfad9e4949cea8c1b94fd364348", - "projectDescription": "DevPill.me - A public good blockchain development guide. \nhttps://gitcoin.co/grants/4975/devpillme-a-public-good-blockchain-development-gu", - "projectWebsite": "https://devpill.me", - "projectLogoCid": "bafybeigegllxawn4taovpqwm3edg2qcuvu73ll5fip57hmsrda5nl5sjzu", - "projectBannerCid": "bafkreifzd5d7cqtb3gno7deor7f7zqp2gflgvon26fuwqq4fumysspxi2e", - "projectTwitter": "dcbuild3r", - "projectGithub": "dcbuild3r", - "userGithub": "dcbuild3r", - "fundingTotalDollars": 2692, - "donorsTotal": 670, - "fractionsTotalSupply": 2548, - "hypercertEligibleDonors": 640, - "ensName": "dcbuilder.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 3.71862 - }, - "hypercertData": { - "workScopes": "devpill", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "dcbuilder.eth", - "rights": ["Public Display"] - } - }, - { - "title": "DefiLab.xyz", - "address": "0x9fe6764778db6AD5c5ED86242485d1a868a8c52A", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x2fc1f04d7ca2fe96643cd2f25bbb0cc3e67cc7de03ad54693040ea0d578a7699", - "projectDescription": "Building \u2606 Tools \u2606 for the Defi Community\n\n\n\nSmall independent team creating tools to help Defi Users quantify the risks and the rewards of providing Liquidity to various Defi Protocols.\n\nAll our tools are Open-Source and free to use.\n\n\n\nDevelopment updates:\n\nQ2 2021\nCreation of Uniswap V3 Simulator --> https://defi-lab.xyz/uniswapv3simulator\nCreation of Polygon Network dashboard (Gas fee calculator) ---> https://defi-lab.xyz/polygonnow\n\nQ3/Q4 2021\nBacktester Functionality added to Uniswap V3 Simulator\n\nQ1/Q2 2022\nOpen source Uniswap V3 Backtester functionality --> https://github.com/DefiLab-xyz/uniswap-v3-backtest\nCreation of Perpetual V2 Simulator --> https://defi-lab.xyz/perpetualsimulator\n\nQ4 2022\nSupport different Network (Optimism, Arbitrum, Polygon, Celo)\nBacktester improvments", - "projectWebsite": "https://defi-lab.xyz/", - "projectLogoCid": "bafkreid2vjfkrvifojgfxxciq5ehut6u2ym7sdtirao4umy6yedypwgyyq", - "projectBannerCid": "bafkreig7llxd5usx5zrnj3kapuosj4zftuzm7wlv4folgwdn6oudnfpn3y", - "projectTwitter": "DefiLab_xyz", - "projectGithub": "DefiLab-xyz", - "userGithub": "staceb", - "fundingTotalDollars": 3968, - "donorsTotal": 848, - "fractionsTotalSupply": 3779, - "hypercertEligibleDonors": 763, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "DefiLab.xyz", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x9fe6764778db6AD5c5ED86242485d1a868a8c52A", - "rights": ["Public Display"] - } - }, - { - "title": "Dweb Movement", - "address": "0x81Bbc5E83901CA95bb85e3D1916D04D434e7f2bD", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x33f99ab46fef5cc3e9dd080f68b059afcfe2608579d3476286a7eae6ad2bc938", - "projectDescription": "A movement to create a Decentralized Web that serves all, not just a select few", - "projectWebsite": "https://getdweb.org", - "projectLogoCid": "bafkreicqtwre3num2keszw3pyfuvdsorc2khzufd7csrvag37rst53sesm", - "projectBannerCid": "bafybeigkzinsaxjpmhbrpessdnewsj2utin6thbtpwo7pnicbz5cs6crjy", - "projectTwitter": "GETDWeb", - "projectGithub": null, - "userGithub": "https://gitlab.com/getdweb/dweb-gatsby/-/blob/master/README.md", - "fundingTotalDollars": 1328, - "donorsTotal": 106, - "fractionsTotalSupply": 1303, - "hypercertEligibleDonors": 92, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "Dweb Movement", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x81Bbc5E83901CA95bb85e3D1916D04D434e7f2bD", - "rights": ["Public Display"] - } - }, - { - "title": "Loanshark", - "address": "0x7D658841f8Ba93299970f6e765C2CE205f1E70DD", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x3b839e762e389f72b3c43b70aeb7bb5c43a3781feda8683c29d5ae4896c6166c", - "projectDescription": "Introduction:\nLoanshark is an aggregation and automation platform created for DeFi borrowers.\n\n\n\nOur Motivation:\nWe identified a few key issues with the current state of DeFi.\n- High operational burden to constantly monitor yields and health factor especially if users have multiple positions\n- Low capital efficiency from a lot of manual operations\n- Poor UX from a lack of support for tools like automation/notification bots\n\n\nOur Solution:\nLoanshark offers the following features:\n- Automated position management toolbox that allows users to create workflows that span multiple protocols (e.g. Set up a workflow that automatically withdraws funds from farms and then repay your debt based on health factor and/or interest rates)\n- Simple and protocol agnostic interface for borrowers to originate loans\n- Aggregated liquidity across different lending platforms to offer the lowest rates\n\n\nDemo video:\nhttps://www.youtube.com/watch?v=5sO5kgp_CJg\n\n\nJourney since GR14\nJuly: Joined \"Startup with Chainlink\" Program and demoed on Binance Live.\nAugust: Launched our closed beta\n\n\nJourney since GR15\nOctober: Added automatic debt repayment as a possible workflow action\nNovember: Rebranding with a complete UI refresh\nDecember: Added action history to allow users to check all their automation history\n\n\nRoadmap \nFebruary: Public V2 Testnet (Get whitelisted at https://forms.gle/uTZVqZDPezYhtf2v6.)", - "projectWebsite": "https://loanshark.tech", - "projectLogoCid": "bafkreihar773ybi6fe3ylfjdi4jwcrznibfhhg6afwyicfkxxlfh3wan34", - "projectBannerCid": "bafkreidci533bt5tqtooy65k6al7ye3iewjdo5qsjvg2ljhaod2xtanjaq", - "projectTwitter": "loansharktech", - "projectGithub": "loansharktech/loanshark_frontend_v2", - "userGithub": null, - "fundingTotalDollars": 21031, - "donorsTotal": 3218, - "fractionsTotalSupply": 20219, - "hypercertEligibleDonors": 3007, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.1159199032438727 - }, - "hypercertData": { - "workScopes": "Loanshark", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x7D658841f8Ba93299970f6e765C2CE205f1E70DD", - "rights": ["Public Display"] - } - }, - { - "title": "Optinames | ENS on Optimism", - "address": "0x1208a26FAa0F4AC65B42098419EB4dAA5e580AC6", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x3e4b3f7089aa5cb6614b67e235624d01364febe418419bc1b165e77d8589e5a2", - "projectDescription": "What are Optinames?\n\nOptinames are tradable and transferable sub-domains wrapped as ERC721s & fully integrated with the Ethereum Name Service (ENS). They can be resolved on L1 Ethereum by utilizing an off-chain resolver.\n\nImportant Links:\n\nGithub: https://github.com/stevegachau/optimismresolver\n\nOff-chain Resolver on L1 - https://etherscan.io/address/0x9fb848300e736075ed568147259bf8a8eefe4fef#code\n\nSubdomain NFTs on Optimism - https://optimistic.etherscan.io/address/0x9fb848300e736075ed568147259bf8a8eefe4fef#code\n\nSubdomain Example on ENS App - https://app.ens.domains/name/nick.ecc.eth/details\n\nSubdomain Example on Etherscan - https://etherscan.io/enslookup-search?search=nick.ecc.eth\n\nSubdomain Example on Rainbow Wallet - https://rainbow.me/nick.ecc.eth\n\nSubdomain Example on Opensea - https://opensea.io/assets/optimism/0x9fb848300E736075eD568147259bF8a8eeFe4fEf/2\n\n\nWhat We Do:\n\nThis project is leading the charge in making it easier & cheaper to acquire and utilize ens domains. We are implementing the latest technologies released by the ENS team (CCIP Read & Off-chain resolution) to make it possible for users to register subdomains on Optimism while making them available & resolvable on L1 Ethereum.\n\nIn addition to providing free ENS subdomain on Optimism (currently ecc.eth), OptiNames is partnering with NFT projects & gaming communities building their games on any Layer 2. These communities will be utilizing our tech and smart contracts to provide free usernames & gamer-tags that double up as ENS subdomains.\n\nAdoption:\n\nThe first project utilizing Optinames to issue subdomains to their community is ECC Name Service. ECC Name Service has since grown to become the Number 1 domain collection on Optimism.\n\nRegistrations: 17,725\n\nWhat Next?: Optinames is working on and will soon be launching ENS Wildcards on L2\n\nMany NFT communities on Ethereum and L2s have expressed a desire to use ENS names and subdomains to identify and connect with their users and holders. However, requiring each NFT holder to manually register an ENS subdomain can be cumbersome. This creates unnecessary friction for NFT holders, who often stand to benefit greatly from the usability improvements offered by ENS names.\n\nWildcard subdomains offer a solution to this problem by allowing every NFT holder to receive an ENS name automatically at no cost & without any registration step. The process for the ENS domain holder is simple: just link their domain name to the NFT collection they want to support. From there, digit subdomains (linked to an NFTs token ID) will automatically point to and resolve to the current owner of the NFT in the chosen collection.\n", - "projectWebsite": "https://optinames.eth.limo", - "projectLogoCid": "bafkreig6io7p6k3q53wbu4h3qz7cbnkcrldatu54tlxioej4ovby2gd7yq", - "projectBannerCid": "bafybeidzfmpm6ua2lviqprjznrp4qcj54ihyuiaoliry5ldktygaysthhq", - "projectTwitter": "OptiNames", - "projectGithub": "stevegachau/optimismresolver", - "userGithub": "stevegachau", - "fundingTotalDollars": 37384, - "donorsTotal": 4334, - "fractionsTotalSupply": 36239, - "hypercertEligibleDonors": 4144, - "ensName": "opti.ecc.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.005292506414766423 - }, - "hypercertData": { - "workScopes": "Optinames", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "opti.ecc.eth", - "rights": ["Public Display"] - } - }, - { - "title": "Jolly Roger", - "address": "0xF0D7a8198D75e10517f035CF11b928e9E2aB20f4", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x42528ac5ae7f27b36de1e40649628a762a8746d07b1440c32d30ded000ff125c", - "projectDescription": "Jolly Roger is a complete SDK for building decentralised application\n\nit includes:\n\n- hardhat-deploy: (https://github.com/wighawag/hardhat-deploy) the most popular hardhat plugin for contract deployment that supports unique features to easily deploy contract, track them and test them. Plus it include Hot Contract Replacement to easily test complex scenario for the frontend\n- web3w: (https://github.com/wighawag/web3w) a library to handle wallet and connection while tracking transaction state\n- ethereum-indexer: (https://github.com/conquest-eth/ethereum-indexer) a typescript indexer module that support in-browser indexing allowing application to have zero backend and only require the user to have a wallet connected to an ethereum node, nothing else.\n- jolly-roger the template : (https://github.com/wighawag/jolly-roger) which include everything organized to develop applications easily\n\n(Note that currently repository are spread on different account, the plan is to consolidate all of this under Jolly Roger umbrella, all of this work has been done my myself, see my previous grant)\nThe goal is to continue provide the best SDK for decentralised applications.\nI use it for my onchain games since 2019", - "projectWebsite": "https://jolly-roger.eth.limo", - "projectLogoCid": "bafkreiewzcnhazxn4xaqbjhyv23jcsjd2cispeztb6voweooib4hexgwne", - "projectBannerCid": "bafkreiao7to6dtmg6fcxceqc2r6kd77et76d3qp5loqeauo4ajfqat6g4u", - "projectTwitter": "wighawag", - "projectGithub": null, - "userGithub": "wighawag", - "fundingTotalDollars": 2054, - "donorsTotal": 518, - "fractionsTotalSupply": 1951, - "hypercertEligibleDonors": 488, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "Jolly Roger", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0xF0D7a8198D75e10517f035CF11b928e9E2aB20f4", - "rights": ["Public Display"] - } - }, - { - "title": "0xDeadList", - "address": "0x799B774204A348E1182fE01074C51444bA70A149", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x43b94c544e8ac90c535752b8624e730820a5a752b361776cda996b40c5e2dbfc", - "projectDescription": "Inspiration\nWhen we say that an Ethereum account has been lost, it refers to two cases:\n\nThe owner forgets the private key, which means the assets are permanently lost.\nThe owner leaks the private key, which means anyone with the private key can act the same as the original account owner.\nOur project aims to protect account owners of the latter case, which is very dangerous: the account owner loses the exclusive right to use the account, which indicates the account is not secure anymore.\n\nFor leaked accounts, DApps should be aware of them on time to protect the original owners of these accounts. For example, when one reports that her account is leaked:\n\nMulti-signature wallets (e.g., Gnosis Safe) should ban this account.\nWeb3 email providers (e.g., MetaMail) in which users log in with signatures should suspend everybody's access to emails of this account to protect the privacy of the original owner.\nElectronic agreements based on ETH accounts (e.g., ETHSign) should disqualify this account from signing new agreements. Because the new agreements signed may not be authorized by the original owner.\nTo solve the above problems, we propose the 0xdeadlist.io project to maintain a list of addresses whose private keys have been leaked. By rewarding the burier NFT (Non-fungible token), 0xDeadList encourages users and hackers to report accounts with leaked private keys, and stores the information of these leaked accounts on the chain to facilitate DApps project parties to query these insecure accounts.\n\nWhat it does\n0xDeadList is a public good that encourages users to collect and report addresses whose private keys are leaked. Users can directly log in to 0xdeadlist.io to report the leaked address. The main contract of 0xDeadList provides two steps (lock address and bury address) to report leaked addresses under the following considerations:\n\nPreventing the reporter's NFT reward from being stolen by front-running attacks.\nEnsuring the reporter has enough time before the private key of the leaked address is fully disclosed.\nIn step 1, the reporter locks the address to be buried, and the contract records the address of the reporter. At this time, the private key of the locked address will not be disclosed.\n\nIn step 2, the user uploads the private key of the locked address in step 1, and the reporter address recorded in the contract will receive an NFT reward, indicating that the address is buried, and the buried (or say, leaked) address will receive a tombstone SBT (Soul Bound Token), which is not transferable. In step 2, the private key of the buried address will be made public (recorded on-chain), ensuring the leaked address is indeed leaked.\n\nThe 0xDeadList project is fully open-sourced, and here are some resources:\n\nWebsite: https://0xdeadlist.io\n\nGitHub: https://github.com/0xDeadList\n\nContracts: 0x59451a98d772f2a53ca2241a884b1703f8c55218", - "projectWebsite": "https://0xdeadlist.io", - "projectLogoCid": "bafkreigdv5xynidonbbjmfeqiamlbbg3ae42zz5ckd3zbuibicziddnc7y", - "projectBannerCid": "bafybeicecz5fdbadlzyx4gfzwqaxpm2ngvqrkhybuizkwkd5wmm2wlixam", - "projectTwitter": "0xDeadList", - "projectGithub": null, - "userGithub": "colinlyguo", - "fundingTotalDollars": 2127, - "donorsTotal": 381, - "fractionsTotalSupply": 2048, - "hypercertEligibleDonors": 360, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0xEE12C640b0793cF514E42EA1c428bd5399545d4D": "metamailcolin.eth", - "0x045ff23cF3413f6A355F0ACc6eC6cB2721B95D99": "suneal.eth", - "0x51AE47d66E1434574632403a2EdE8E2d7CEE70b9": null - }, - "safeUsers": { - "suneal.eth": 0.42857142857142855, - "metamailcolin.eth": 0.2857142857142857, - "0xdeadlist.eth": 0.2857142857142857 - } - }, - "hypercertData": { - "workScopes": "0xDeadList", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x799B774204A348E1182fE01074C51444bA70A149", - "rights": ["Public Display"] - } - }, - { - "title": "DefiLlama", - "address": "0x08a3c2A819E3de7ACa384c798269B3Ce1CD0e437", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x46ddc886ac23d5bc2cbc96cd2aa990627bcd98c881a953070f94c15e03267707", - "projectDescription": "Open and transparent DeFi TVL and analytics", - "projectWebsite": "https://defillama.com/", - "projectLogoCid": "bafkreid5azwcyt3gqwus46rjg77j43qud5c3n4t25xjauzsdof53bhbwni", - "projectBannerCid": "bafkreiebqpvhoo5tlugo5nlfv3f4nrh66mrodrfovd7wg42wykfd4s5wjm", - "projectTwitter": "DefiLlama", - "projectGithub": "DefiLlama", - "userGithub": "0xngmi", - "fundingTotalDollars": 89122, - "donorsTotal": 13579, - "fractionsTotalSupply": 85210, - "hypercertEligibleDonors": 13159, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.7097828508620031 - }, - "hypercertData": { - "workScopes": "DefiLlama", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x08a3c2A819E3de7ACa384c798269B3Ce1CD0e437", - "rights": ["Public Display"] - } - }, - { - "title": "LexDAO", - "address": "0x5a741ab878Bb65f6AE5506455FB555eaf3094B3F", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x49fd9097e9f5e67cc4b74c22972fc61f7656f6c9e63e93a3e6ce8fa2d82fb39e", - "projectDescription": "LexDAO is a longstanding 'metaguild' member of the web3 community. \n\nWe are the schelling point for 'codeslaw' public goods & services. \n\nOur OSS projects include:\n\n* https://github.com/lexdao\n\n* https://github.com/kalidao\n\nOur growing community of core codeslaw OSS contributors include:\n\n1. Ross: https://github.com/Ro5s , https://github.com/z0r0z \n\n2. Shiv: https://github.com/nerderlyne\n\n3. Audsssy: https://github.com/audsssy\n\n4. Jordan: https://github.com/jordanteague\n\n5. Tenfinney: https://github.com/tenfinney\n\n6. bestape: https://github.com/bestape , https://ape.mirror.xyz\n\n7. Drllau: https://github.com/drllau\n\n8. Erich: https://github.com/ErichDylus\n\nCodeslaw is a meme of the \"code is law\" & \"work in public\" web3 virtues, integrated with the 'code deference' legal philosophy pioneered by LeXpunK army and refined by LexDAO contributors. \n\nIf we think of Solidity \"smart contracts\" as codeslaw initially invented by legal engineer Nick Szabo, then it's apparent that codeslaw is one of the most important forms of OSS in web3. \n\nCodeslaw is for the 'unlawed' what Proof of Work is for the 'unbanked' https://distributed-autonomous-society.quora.com/The-Unlawed . \n\nMost of our members are cryptolawyers and legal engineers, but that's not a requirement. All codeslaw fans are welcome!\n\nAs a DAO, we fund a variety of internal & external projects that span the multidisciplinary requirements of codeslaw public goods & services. \n\nLexDAO does a lot of codeslaw pro bono work, ensuring the funds we have get the job done regardless. Sometimes codeslaw is more important than money!\n\nAll donations to this Gitcoin Round will be used by our DAO to directly pay for OSS codeslaw development. Additionally, we always prioritize positive impact DAO and projects that offer valuable practical-web3-experience student education opportunities. \n\nIf you'd like to get involved in LexDAO governance, membership is open to everyone! Please visit http://lexdao.chat to join our community and subscribe to our newsletter at https://lexdao.substack.com .\n\nSupport codeslaw by proudly wearing this designer hat https://shop.metafactory.ai/products/codeslaw-hat !\n\nOur legacy cGrants page https://gitcoin.co/grants/4811/lexdao-providing-legal-aid-to-impactdaos-funded-by . ", - "projectWebsite": "https://lexdao.coop", - "projectLogoCid": "bafkreiewxqylj5oqtdsgpkrokydlxb67hk5hdf25msklw27govtzlc6wyu", - "projectBannerCid": "bafybeierh7worujpoelf2o5762growe55ptk5wbrj5fndrl25cntltnrh4", - "projectTwitter": "lex_DAO", - "projectGithub": "lexDAO", - "userGithub": "bestape", - "fundingTotalDollars": 3040, - "donorsTotal": 588, - "fractionsTotalSupply": 2931, - "hypercertEligibleDonors": 565, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0x425df00165FbF11E23060E036eBDFbAF4F0EDd20": "cimply.eth", - "0xCB0592589602B841BE035e1e64C2A5b1Ef006aa2": "shivanshi.eth", - "0x130093A5aEbc07e78e16f0EcEF09d1c45AfD8178": "worldlaw.eth", - "0xC316f415096223561e2077c30A26043499d579aD": "cattin.eth", - "0xECa5e3CE0774372e71cE9b3675CB07c6677C2d52": null, - "0x0D89421D6eec0A4385F95f410732186A2Ab45077": "bestape.eth", - "0x4BB241205586D48585e9706c6EFA7744F1e73BCF": "2spencer.eth", - "0xCbbd18d3aC27ab0FFfD04BCCd091B2802c92e0ca": "nickjrishwain.eth", - "0xbAEE49c72026bC7C4Baa6b446E288535Ec22F020": null, - "0xCC976F37b22B67660D78D9BA9157ABC2131c6F5d": "tertius.eth" - }, - "safeUsers": { - "0x5a741ab878Bb65f6AE5506455FB555eaf3094B3F": 0.02, - "digitalassetoasis.eth": 0.02 - } - }, - "hypercertData": { - "workScopes": "LexDAO", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x5a741ab878Bb65f6AE5506455FB555eaf3094B3F", - "rights": ["Public Display"] - } - }, - { - "title": "ITU Blockchain", - "address": "0xBEC643BD5b7F5e9190617CA4187ef0455950C51C", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x4cd41869f9b2d95c05e2cb13643f1ab7ae05ebd439349c0024aeba44a249b1d8", - "projectDescription": "ITU (Istanbul Technical University) Blockchain is the first university blockchain society in Turkey. We are organizing blockchain events and courses for everyone. We have many students who are ready to improve themselves in this technology.\n\nOur Free Solidity Course is Supported by Ethereum Foundation!!!\n\nWe've been published a free Solidity Course (https://youtube.com/playlist?list=PLby2HXktGwN4Cof_6a8YwlMrboX8-hs73) on our Youtube channel. The total duration of the course is approximately 20+ hours. The voiceover of the course was made in Turkish. As we continue to expand our Solidity course, we would like to announce that this education is supported by the Ethereum Foundation from now on.\n\n--ETH Barcelona--\n\nOur teammates took part in ETH Barcelona both as volunteers and as participants. Our volunteer friends have gained a lot of experience on how to organize an event on a global scale. They shared their experiences with us. With these experiences, we will make future events in Turkey better.\n\n--Cryptist Istanbul Meetup--\n\nWe organized and participated in Cryptist Istanbul, the first zero knowledge-focused community event in Turkey. We took part as a team in the event attended by very important speakers and we found various networking opportunities.\n\n--ETH Prague Hackathon--\n\nWe participated in the Ethereum Prague Hackathon with our project on sustainability. We had the chance to meet and communicate with expert developers in the ecosystem.\n\n--Avalanche Barcelona Summit | Hackathon--\n\nAs ITU Blockchain, we came back as the team that received the most rewards from Avalanche Barcelona Hackathon. We returned to Istanbul with 2 different rewards in total.\n\nLayerZero Best Usecase Reward\n\nCoinbase Best Team Reward\n\n--Avalanche Hacks Istanbul--\n\nWe've completed Hackathon at 2nd place. It was an event where we gained a lot of experience and knowledge.\n\nTwitter: https://twitter.com/itublockchain\nInstagram: https://instagram.com/itublockchain\nLinkedin: https://www.linkedin.com/company/itublockchain\nYoutube: https://www.youtube.com/@ITUBlockchain/", - "projectWebsite": "https://itublockchain.com", - "projectLogoCid": "bafybeidsdbrgzvxiql5shhsbv6czjegimiulltoowyg4kwafd7zsvmuuly", - "projectBannerCid": "bafybeiflxewjwbpbtutbozfas6bct46mrrcmtwyy3hqyuhy6jww2xdjobm", - "projectTwitter": "ITUblockchain", - "projectGithub": "itublockchain", - "userGithub": "ismailemin", - "fundingTotalDollars": 2461, - "donorsTotal": 303, - "fractionsTotalSupply": 2383, - "hypercertEligibleDonors": 279, - "ensName": "itublockchain.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "ITU Blockchain", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "itublockchain.eth", - "rights": ["Public Display"] - } - }, - { - "title": "Jolocom", - "address": "0xF3CF346DB5DAb30d73d272499CBAe6E6C0eE2C60", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x4dbc1f9c5c14a5765714e42b9d7384a43eff941394faa6fab4b1dd85dde55052", - "projectDescription": "Some of you already know us from around the \u2018decentralized\u2019 block. Jolocom has been supporting and driving the mission of Self-sovereign Identity since 2014. We are a founding member of DWeb, INATBA, Bundesblock and also long-time supporters and active members of DIF, the IIW and W3C. We joined the Gitcoin-Community in early 2022, together with our friends from DWeb and the Internet Archive. \n\n \n\nJolocom is committed to upholding the principles of SSI and has developed a fully open-source tech stack to that end, consisting of a library, an SDK and Smart Wallet for end users. During the infancy of digital identity, this has brought us to the forefront of development houses in Germany and Europe and also to the attention of regulators and lawmakers. Among other things, we are the chosen tech providers in three quarters of the German government\u2019s Secure Digital Identity showcase projects.\n\nNow, though, we are seeing the mature phase of digital identity approaching: by end of 2023, every EU citizen will be asked to hold an \"identity wallet.\" But will that identity be Self-Sovereign? In other words, will citizens and users finally be in control of their own identity data or will it be under the control of a monopolistic centralized authorities or oligopolistic federated actors?\n\n \n\nFor Jolocom to continue building open source, not-for-profit SSI solutions, as we have for the last eight years, and to further establish EU and global standards for interoperability in decentralized identity, we need to scale at the same speed as the growing market. And here we need your help. \n\n \n\nIn the aforementioned Secure Digital Identity (SDI) Projects of the German government we are building out the Jolocom SmartWallet to integrate different government services, bridge between different services and industry actors via the Jolocom Issuer and Verifier Agent, while also partnering with researchers and experts to prepare a UI/UX design ready for mass adoption. ", - "projectWebsite": "https://jolocom.io", - "projectLogoCid": "bafkreifojknikq3anxhvhouabaljsn3okgorsmnwgyghvc7vzec2vycvea", - "projectBannerCid": "bafybeifaogjolxoiu3imnx2s5wltv4xcxxqn7coy7ohazdem4y5psko3ci", - "projectTwitter": "GETJolocom", - "projectGithub": "https://github.com/jolocom", - "userGithub": null, - "fundingTotalDollars": 1439, - "donorsTotal": 133, - "fractionsTotalSupply": 1403, - "hypercertEligibleDonors": 109, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "Jolocom", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0xF3CF346DB5DAb30d73d272499CBAe6E6C0eE2C60", - "rights": ["Public Display"] - } - }, - { - "title": "Lume Web", - "address": "0x63cd2C691632720Ff2ABDD0b6AABA2466D3Fe468", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x4e11571892e7edbb6aa03c8327aad0325faa2297559fbccc82ac93a369267948", - "projectDescription": "Lume Web is the web3 hub that aims to bring decentralized technologies to the mainstream. We believe in creating a censorship-free internet that prioritizes privacy, data ownership, and accessibility. As web3 evolves, Lume Web will be at the forefront, providing your gateway and onboarding guide to this next evolution of the web.\n\nLume Web is web3 for the masses. A private, secure, and user-owned internet.", - "projectWebsite": "https://lumeweb.com", - "projectLogoCid": "bafkreicnovbolipmq3cqicxo4gljieh3slqqck3sr5bylricuogipf6lk4", - "projectBannerCid": "bafkreidde3ktpdv6db43jldh4j65ns2bt33plcxd5k4pnelaclxyrgsiwm", - "projectTwitter": "lumeweb3", - "projectGithub": "LumeWeb", - "userGithub": "pcfreak30", - "fundingTotalDollars": 1252, - "donorsTotal": 216, - "fractionsTotalSupply": 1196, - "hypercertEligibleDonors": 167, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "Lume Web", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x63cd2C691632720Ff2ABDD0b6AABA2466D3Fe468", - "rights": ["Public Display"] - } - }, - { - "title": "Vocdoni", - "address": "0x74D8967e812de34702eCD3D453a44bf37440b10b", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x50356583bb0c943b4f40667525a63a2cbf23cf0c2ac3928f12fcbc9dac959016", - "projectDescription": "TL;DR: Vocdoni is an open-source blockchain voting protocol that is scalable, auditable, censorship-resistant & anonymous\n\n---\nVocdoni's vision [1] is to improve democratic health and promote participatory governance using decentralized and open-source technology. To achieve that, we are building the Vocdoni Protocol, a censorship-resistant, secure, anonymous and transparent voting protocol to facilitate decision-making for communities and organizations regardless of whether they are digital natives or traditional organizations.\n\nFor implementing the voting protocol, Vocdoni developed the Vochain [2], a public voting blockchain, as well as a set of tools that facilitate its usage such as an API [3], an SDK [4] and a dApp. Today, this technology serves numerous organizations around the world by providing them with a secure, transparent, easy-to-use and low-cost voting system.\n\nThe main initiatives for the 2023 Roadmap are:\n1. Voting-as-a-service: Commoditize voting\n2. Enhanced Web3 protocol: Anonymous gasless voting with verifiable onchain execution\n3. Increase decentralization: Migrating to Proof-of-Stake blockchain\n\nMore info at:\nhttps://vocdoni.io\nhttps://developer.vocdoni.io\n\n [1] https://aragonorg.notion.site/Mission-Vision-Values-8cbbef15826d4e0889aaf7f35b3a622a\n[2] https://github.com/vocdoni/vocdoni-node\n[3] https://developer.vocdoni.io/category/vocdoni-api\n[4] https://developer.vocdoni.io/sdk", - "projectWebsite": "https://vocdoni.io", - "projectLogoCid": "bafkreidwmtunbranukh7tlapdehdcxb2sbjiiwn5h73upoibjoop2b4ywm", - "projectBannerCid": "bafkreibgj6f5aon7flfme3cl7e44xvc5u4ipuaxgo5isrspmiskgbcfene", - "projectTwitter": "vocdoni", - "projectGithub": "vocdoni", - "userGithub": "", - "fundingTotalDollars": 2533, - "donorsTotal": 375, - "fractionsTotalSupply": 2454, - "hypercertEligibleDonors": 348, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "Vocdoni", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x74D8967e812de34702eCD3D453a44bf37440b10b", - "rights": ["Public Display"] - } - }, - { - "title": "Web3 OSS Libraries by DePay", - "address": "0x4e260bB2b25EC6F3A59B478fCDe5eD5B8D783B02", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x526dfc66cd504a06e7908438a4041aa473e73677492d91849f69f45fe81e160f", - "projectDescription": "At DePay we strive to open source as much of our creations and internal libraries as possible. We deeply believe in the ethos of open source and want to push the industry as a whole.\n\nWe've already published dozens of Web3 OSS libraries on Github (https://github.com/depayfi), used by dozens of other projects in the space, like Larvalabs (https://github.com/larvalabs/cryptopunksmarket/blob/main/package.json#L12), RNS.id (https://rns.id), Vulkania (https://vulkania.io) etc.\n\nWith supporting this grant, you support our development of maintaining, improving and publishing even more OOS libraries to support Web3 development.\n\nSome Highlights:\n\nhttps://github.com/DePayFi/web3-mock\n\n\ud83e\udd21 JavaScript library to mock web3 responses either by emulating web3 wallets or web3 RPC requests.\n\n-\n\nhttps://github.com/DePayFi/web3-client\n\n\ud83c\udf10 A web3 client to fetch blockchain data just like you are used to with HTTP clients.\n\n-\n\nhttps://github.com/DePayFi/web3-payments\n\n\ud83d\udcb8 JavaScript library to scan crypto wallets for liquefiable assets and perform cost-effective, auto-converted payments on-chain.", - "projectWebsite": "https://depay.com", - "projectLogoCid": "bafkreih3xsyqvvvlhjylr7nsjigshhkxfjupi2hr57waisg5cpis5mbyvy", - "projectBannerCid": "bafybeigavc3rpx37fzzldnle5n35rzcicrlb2ucvuvfuaxdi5pkf2bdlhm", - "projectTwitter": "DePay", - "projectGithub": "depayfi", - "userGithub": "10xsebastian", - "fundingTotalDollars": 1377, - "donorsTotal": 179, - "fractionsTotalSupply": 1338, - "hypercertEligibleDonors": 161, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "DePay", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x4e260bB2b25EC6F3A59B478fCDe5eD5B8D783B02", - "rights": ["Public Display"] - } - }, - { - "title": "WTF Academy", - "address": "0x25df6DA2f4e5C178DdFF45038378C0b08E0Bce54", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x534b17d4d90d3721b24cab299dfe9c93dae7bbea9ca5af2292b4278989d7831a", - "projectDescription": "WTF Academy is a web3 open-source university for developers, aiming to onboard 10,000 developers to web3.", - "projectWebsite": "https://wtf.academy", - "projectLogoCid": "bafkreihkk6kmshladgkdcpq4tpgxfons2bsf5p6qlw5kwzbpyii26kri4e", - "projectBannerCid": "bafybeihvpmd5eshmpwd4t4i3t4o2hafbnicoozveldc6nrwcm2y3xdujeu", - "projectTwitter": "WTFAcademy_", - "projectGithub": "WTFAcademy", - "userGithub": "AmazingAng", - "fundingTotalDollars": 2616, - "donorsTotal": 385, - "fractionsTotalSupply": 2504, - "hypercertEligibleDonors": 346, - "ensName": "wtfacademy.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.023271896921406635 - }, - "hypercertData": { - "workScopes": "WTF Academy", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "wtfacademy.eth", - "rights": ["Public Display"] - } - }, - { - "title": "eth.limo", - "address": "0xB352bB4E2A4f27683435f153A259f1B207218b1b", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x5f7d0b7bbd1a9ced352c05253be291d2d0e2d66d4744ee6712d67fd35d7c3747", - "projectDescription": "eth.limo is a privacy-preserving ENS gateway, enabling users to access Ethereum-native dApps and content. LIMO represents a shift in dweb adoption by providing an alternative means of accessing ENS resolvable domains.", - "projectWebsite": "https://eth.limo", - "projectLogoCid": "bafkreico7g6kvn62eil32momfk7qjrcnrsdmhalvsz6iy4bhncov4i5d64", - "projectBannerCid": "bafkreif635dr3ajnljk43vrm3xeyqgv5mkflab7cdnmuhtapc36djfjfrq", - "projectTwitter": "eth_limo", - "projectGithub": "ethlimo", - "userGithub": "eth-limo", - "fundingTotalDollars": 15268, - "donorsTotal": 2299, - "fractionsTotalSupply": 14668, - "hypercertEligibleDonors": 2142, - "ensName": "ethdotlimo.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "eth.limo", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "ethdotlimo.eth", - "rights": ["Public Display"] - } - }, - { - "title": "The Future of Work is Decentralized", - "address": "0x0406Bf2dAE6A42d567b4e3DbA6ADA99069622fF1", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x60964adb4b2ea1db78bfd5edf4007328c459c1128d4596a6b81a09677b4e98d1", - "projectDescription": "talentDAO is a community of digital vagabonds, deranged scientists, and renegade internet natives, passionate about DAOs and the future of work. We believe DAOs can provide a path forward where knowledge is decentralized and talent is unlocked for the betterment of society. \n \nThere\u2019s just one problem: The science of DAOs is yet to be known; it must be explored. It must be learned. Traditional scientific settings are largely broken due to outdated institutional norms, obsolete academic infrastructure, and inefficient funding models. So without hesitation, a team of researchers has taken the plunge down the Web3 rabbit hole to find a new solution. \n Our focus is on building coordination software for the future of work, conducting applied research experiments with DAOs, and perpetuating decentralized work culture through art, media, education, and events.\n\nAt talentDAO we are studying layer zero and building human coordination experiments so that we might all benefit. In simplest terms, we are using science to fix DAOs and DAOs to fix science. To do this well will only be possible if science is given an infrastructure and culture upgrade. This is where we come in. \n\nZooming out\n\n \n\nDAOs create opportunities for global impact. Human coordination structures of this scale have never been available to solve challenges in scientific innovation until now. Over the next 20 years entire communities of scientists will organize using DAO structures. A digital nation of scientists operating as a DAO will dramatically improve the probability of achieving important sustainability goals mandated by the United Nations. We focus on four of them. \n\n \n\nGoal 8: Decent Work and Economic Growth\n\nEveryone should have access to decentralized working arrangements. To see that through, we\u2019re building the foundations required for a decentralized work economy starting with the talentDAO community. Our goal is to have the majority of members who wish to be bankless and self-sovereign workers a reality by 2030. Everyone should have the right to decent work, free from affliction and labor exploitation.\n \n\nGoal 9: Build infrastructure and foster innovation\n\nThe traditional academic process has stifled innovation. The scientific record of knowledge is vulnerable to the risks of centralized Web2 storage. TalentDAO is building all of its research on a completely decentralized publication that is censorship resistant, immutable, and safely secured on Arweave. We are fostering innovation by allowing for a bottom up approach to research by creating an open social graph of scientists built on Lens Protocol. \n \n\n \n\n \n\nGoal 10: Reduce Inequality\n\nEnsuring funding and educational resources are provided to all students across the world, not just the weird ones. Contributing to open source research that is accessible to all and with no paywall required. Traditional research publications systematically discriminate against students with less access to education resources. \n \n\nGoal 11: Sustainable cities and communities\n\n \n\nIn the future DAOs will be sovereign digital nations. At talentDAO, we aspire to create a Network State of interdisciplinary educational institutes, providing high quality education and research to all parts of the world, not just the privileged. We cannot go at this alone. That\u2019s why we\u2019ve teamed up with groups such as CityDAO and Sapien Network to scale together.\n\n\nWhat we are building\n\n \n\nWeb3 solutions for scientific peer review, funding, and publication. Making it easy for any education program to launch a journal and sub-DAO.\n\n \n\nOur first solution is a framework for a peer reviewed journal publication and open science social graph with native DAO governance on-chain integrated. We are building research primitives and governance technologies to help onboard the next 1000 web3 enabled research sub-DAOs. \n\nHow we educate and advocate\n\n \n\nProducts take time but our mission can\u2019t wait. That\u2019s why we began creating original applied research from day one. Several emergent research projects have formed that are entirely driven by community participation and championed by a talentDAO researcher. We do our best to provide resources to these groups and onboard more students to help create new ones.\n\n1. DAO Leadership: Sharing leadership is a key tenet of DAOs. Yet distributing leadership across members of a community is easier said than done: there are several instances of centralized leadership within the web3 ecosystem. For this reason we set out to study leadership in the decentralized world of work.\n\nOur researchers are the heart of talentDAO, and in 2022 we saw the Research Guild come to life.\n\nWe are proud to share with you a list of 8 projects that we\u2019ve been working on with our different community-operated teams. This is a summary of our milestones and things we will be working on during 2023, which promises to be an exciting year for the Research Guild. \n\n\n1) Network health survey\nIn decentralized organizations, we have the opportunity to analyze more data than ever before. Governance processes and other on-chain activity is made publicly available thanks to the blockchain and off-chain communication data is accessible through various API services. For example, both Discord and Discourse offer public APIs for data extraction.\n\nBut communication and on-chain activity still do not tell the complete picture of what is happening under the hood. We must also extract data on the psychosocial properties of the organization in order to have a complete understanding of the health of a DAO. To do so, our team has designed a survey that will collect the data necessary to understand the health of organizations so DAO leaders can take action to improve the experience of contributors. Learn more about our process of designing this survey and the theoretical discussion here.\n\nWe will be launching a series of organizational assessment pilot studies in 2023 with DAOs who want to use science-backed tooling to assess their community health. Survey participants will have access to a non-transferable proof of completion NFT made claimable at the end of the survey which will unlock access to future perks and drops. Survey participants will also have the option to opt into our data-sharing program and earn a share of transaction fees generated from our Data NFTs minted on Ocean Marketplace.\n\n2) Project L.I.O.N.\nL.I.O.N: Language Informatics on Organizational Networks\n\nProject LION is a joint DAO effort from talentDAO and LabDAO to build natural language processing systems for analyzing and maintaining community health.\n\nFor DAOs specifically, transaction data can provide insight into on-chain governance operations and degrees of decentralization. However, many DAO operations occur off-chain in the form of relational data. And there is a particular piece of information that is both deeply insightful and stored off-chain: communication.\n\nThis is a software project that will build a tool that will allow us to do research. It is in the development stage and the team is raising funds on Gitcoin. Be sure to check out their grant page if you are as excited about this project as we are. The project roadmap write-up can be found here.\n\n3) Decentralized Leadership\n\u201cDAOs don\u2019t have hierarchies\u201d \u201cYou don\u2019t have a boss\u201d \u201cDaos are leaderless\u201d\n\n-Is that so?\n\nAt talentDAO, we believe that leadership emerges naturally in any human organization. DAOs are no exception to this, so we decided to study how leadership works in a decentralized space. We began with an extensive literature review on organizational leadership where we covered the last 25+ years of academic research.\n\nThen we moved on to interview leaders from all over the world who work in different DAOs. We talked with more than 20 founders, core members, contributors with long experience in the space, and mentors. All that information is currently being qualitatively analyzed by our team, and we will present the results at ETHDenver and in a future publication.\n\nExpect early research results to be communicated in January 2023. A series of educational workshops, leadership coaching tools, and training seminars will be designed based on the findings of our research on Decentralized Leadership.\n\n4) Onboarding\nOne of the main pain points that DAOs suffer is trying to get a smooth onboarding experience that allows them to get and retain new members. Our team is working on a multi-phase study that aims to know more about the different strategies that the DAO ecosystem has to onboard new people, so we can identify best practices and strategies that suit the different kinds of DAOs. During 2022 the team focused on a literature review to examine existing frameworks to evaluate onboarding experiences (or induction processes, as traditional organizations call them). After that, those frameworks were adapted to the requirements of DAOs and now are ready to be tested in 2023.\n\nIn the coming months, phase 1 will be launched with the recruitment of mystery shoppers that will join different DAOs to experience their onboarding process. We will then evaluate this through ethnographic observations and surveys made with the frameworks we discovered through the literature review. Review more of the project deliverables on the team\u2019s Notion page. \n\n5) DAOversity\nThis study is a collaboration with BanklessDAO where we made a survey asking questions about inclusivity and underrepresented groups, so we could know if members felt comfortable in their space. This is a qualitative confidential study and we managed to collect more than 150 surveys. Right now we are preparing to analyze these responses so we can share the results with the broader community. We are eager to discuss these results to keep debating about people feeling included in DAOs and how we can improve their experiences.\n\n6) Discourse Knowledge Graph\nSo many DAO communities rely on Discourse to host their online forum discussions. These forum discussions are often focused on topics related to changes in the DAO\u2019s protocol or improvements in governance. For a data scientist, the Discourse knowledge base is a treasure trove of data. So why not study it to understand the meta-science of DAO governance? This study seeks to do just that. \n\nWhile the study is in its infancy it has quickly garnered interest within the talentDAO research community. Several data scientists have quickly volunteered to develop a proof of concept of a sensing tool that uses NLP to analyze topics.\n\nCheck out the research proposal cross-posted on the Smart Contract Research Forum to learn more about future directions: research forum post\n\nFor the DAO hackers out there the data notebook has been made public to explore the NLP models being used.\n\n7) Compensation\nAt talentDAO, we conducted a survey investigating the relationship between different compensation structures and contributors\u2019 attitudes like motivation, satisfaction, commitment, and fairness perceptions. Using an experimental vignette study we wanted to understand if certain DAO compensation strategies resulted in more favorable perceptions of organizational justice. The four incentive strategies studied were bounties, Coordinape, hourly payment, and salary. Not surprisingly, salary was viewed as the fairest payment method. Study participants vocalized pay stability as an important factor when determining if they perceived a work environment as fair. Very interestingly, as the DAO community size grew bounty systems were progressively viewed as less favorable. We believe these findings will help inform future DAO compensation design in the tooling space.\n\nThis project was a joint effort with BanklessDAO where we collected 166 respondents. Read more about the full study here: DAO Compensation study\n\nIn 2023 the team aims to do more analysis of this data and then present a written document to share with the community. We also plan to have several open working sessions and webinars related to DAO compensation.\n\n8) DAO Structure & Design study\nThe core objective of the DAO Structure & Design project is to create a well-researched body of knowledge about DAO structures and design. It is not an audit project about what exists, but more about how effective and impactful DAO structures should look like. This body of knowledge will be published so the broader community can discuss the results and make use of these insights.\n\nRight now the team is finishing the literature review so they can move on to do structure analysis and interviews with DAO cartographers (those who map the organizational chart of the DAO) in Q1 2023. After that, the project will move on to Stage 2 to do in-depth interviews with builders, community managers, and experts in the DAO ecosystem to ask about organizational structures in web3 and to see what works and what doesn\u2019t from their perspective.\n", - "projectWebsite": "https://talentdao.io", - "projectLogoCid": null, - "projectBannerCid": "bafybeietmnwfnfrnxyetclvnncjetanm7x4p62qtrivquxejvuoihund5m", - "projectTwitter": "talentdao_", - "projectGithub": "https://github.com/Talent-DAO", - "userGithub": "", - "fundingTotalDollars": 1400, - "donorsTotal": 153, - "fractionsTotalSupply": 1362, - "hypercertEligibleDonors": 140, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0x3e1f1605222D41EbBF6d5f6699A0e38523818ea0": "saulthorin.eth", - "0x8Bfa5014bDDE909A400710AABF3CDD5849b99239": null, - "0x263Dc311f8C89702ac9Cb78c6c2ea02Ce6746047": null, - "0x01b885F8e07A97016f480134e7439a21c4509424": "itamarg.eth", - "0xd25b8a4B94FbD494414ab209E97acDdd9625Aed0": "k3nn.eth", - "0xF9D987DB9BbCD35C4775e70A7Da11E7f22d3779B": "nemo-phd.eth", - "0xaA1c01aeCf1523F3b9AAd12E961521F83720ED9C": null, - "0x31D8bdcfd7e3823d3e5c8A22058f83c76350A26f": "inkwire.eth" - }, - "safeUsers": { - "saulthorin.eth": 0.14705882352941177, - "k3nn.eth": 0.11764705882352941, - "nemo-phd.eth": 0.058823529411764705, - "0x0406Bf2dAE6A42d567b4e3DbA6ADA99069622fF1": 0.04411764705882353, - "itamarg.eth": 0.04411764705882353 - } - }, - "hypercertData": { - "workScopes": "talentDAO", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x0406Bf2dAE6A42d567b4e3DbA6ADA99069622fF1", - "rights": ["Public Display"] - } - }, - { - "title": "JediSwap", - "address": "0x18aa467E40E1deFB1956708830A343c1D01d3D7C", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x60c037f9dfa5daee0f07bc26fb73393ef924e36c73c41ea6bd58029e1724de36", - "projectDescription": "Note: Donations for this grant are for development only. Do not expect anything in return.\n\n\nHighlights:\nThere is not a single person on any kind of contract in JediSwap. Everything is done by the community and 300+ contributors.\n\nJediSwap is one of the first protocols to receive a grant from Starkware. JediSwap is all time #1 project on Gitcoin Grant from the funders count.\n\nArgent-x(biggest wallet on StarkNet) integrated JediSwap to power swap functionality.\n\n\nWhat is JediSwap?\nJediSwap is a fully composable and permissionless AMM that enables users to swap assets and earn yields on their assets instantly with almost 0 gas fees. Builders can build more advanced applications on top of JediSwap without asking anyone's permission. JediSwap is completely open source for anyone else to use in any way they want.\n\nJediSwap is built on StarkNet - a Validity Rollup on Ethereum enabling unlimited scalability to web3 while relying on the security of Ethereum.\n\n\nJediSwap is an entirely community-driven project. Independent open-source contributors do everything, including development, design, and marketing. Anyone can come and start contributing by joining JediSwap Discord.\n\n\n\nWho is behind it?\nThe Mesh Finance community is leading the development of JediSwap, which has been building in DeFi for the last 24 months. Mesh has been deploying and experimenting with multiple blockchains, including Ethereum, Polygon, Arbitrum, and almost all top DeFi protocols.\n\nMesh community is bottom-up; anyone can start contributing and become a leader as they contribute. There is no power concentration. Mesh has developed a system to measure all kinds of contributions, including development, design, community management, growth, etc. Compared to most DAOs, Mesh is not just decentralizing governance but enabling operations and execution in a community-driven way.\n\n\n\nWhat is different?\nThe Mesh community believes that billions of people will come to crypto-only if it is cheap, secure, and easy to use.\n\nCheap - JediSwap will be one of the 1st gasless dapp on StarkNet.\n\nSecure - Thanks to StarkNet, JediSwap leverages the security of Ethereum. Users never rely on multisig bridges to leverage a cheaper and scalable ecosystem.\n\nSimplicity - JediSwap believes in simplicity both for users and builders. Users can swap or earn by adding liquidity in one single click. By keeping the simplicity rule on the smart contracts level, JediSwap also enables devs to build many different kinds of applications, which was impossible on L1s before. There are already 25+ teams building on top of JediSwap. These applications include creating on-chain games, metaverse projects, cross-chain apps, aggregators, and furucombo style dapps.\n\nCommunity - There is not a single employee at JediSwap, and everything is done by the community.\n\n\n\nWhy Validity Rollups (aka ZKRollups) and StarkNet?\nThe next wave of crypto will come for various non-financial applications like gaming. As a result, there will be a 100x number of tokens launching on scalable L2s instead of L1s. These users will prefer the cheapest tx and the most uncomplicated applications that are easy to understand and use. The Mesh community believes StarkNet is a front-runner in the Validity Rollup (also known as ZKRollup) ecosystem. The mesh community has been building on StarkNet since October 2021 and has seen a 20x increase in the number of builders building on StarkNet.\n\n\n\nWhat else is special?\nWhile building JediSwap, the Mesh community is publishing many public goods. Some of the published public goods include\n\nStarkNet React library - it saves hours of work for any builder building a frontend app on StarkNet\n\nBase64 encoding in Cairo - a primitive which can make generative art possible on Starknet\n\nDeFi Pooling(coming soon) - Enabling access to L1 apps by batching txs on StarkNet\n\nDAO tools and frameworks: \n- Ability to give Discord/Twitter contributors tokens/NFTs while preserving the privacy\n- An alert bot for Discord communities and contributors to make coordination easy\n\n\n\nRoadmap:\nCurrent:\nMainnet - JediSwap launched on StarkNet mainnet on 30th Nov 2022, and 10000+ users have used JediSwap since then.\n\nTestnet - JediSwap launched on StarkNet testnet on Jan 2022 and 150,000+ user have used the JediSwap on testnet since then.\n\nNext 3 months:\nIntegrations - focus on building integrations with 50+ dapps\nLaunch DeFi Pooling as a public good\nOnchain contributor profile\nProductionize DAO tools to make them usable by any community\n\n", - "projectWebsite": "https://jediswap.xyz", - "projectLogoCid": "bafybeiei72o7yjtpvce5ldpmjcrdcpnbi67jabs77hjveo6xggvfmwc3cm", - "projectBannerCid": "bafybeihfw2iiogtgc2vfhgk2zkiaolyh6fhql7s437eblx7ta7vepme6m4", - "projectTwitter": "jediswap", - "projectGithub": "jediswaplabs", - "userGithub": "jediswapintern", - "fundingTotalDollars": 58051, - "donorsTotal": 12752, - "fractionsTotalSupply": 54480, - "hypercertEligibleDonors": 12305, - "ensName": "jediswap.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 1.9997806046214774 - }, - "hypercertData": { - "workScopes": "JediSwap", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "jediswap.eth", - "rights": ["Public Display"] - } - }, - { - "title": "CirclesUBI", - "address": "0xd525fF26F45f3B7D20cfEf170E2cb9E601A0b4dA", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x6579377403e6dedd052e60ec6281d9505db7e6119cc7669d04f17913245fab11", - "projectDescription": "CirclesUBI is an unconditional basic income system for communities. With Circles, people can collectively self-organise their own wealth and give each other a basic income, without waiting for the state. \n\nSince launching in October 2020 the Circles community has grown, now 200k+ accounts deployed around the globe via the circles.garden interface (on Gnosis Chain).\n\n Since then, we have been busy improving our infrastructure, nurturing the Circles ecosystem and creating strong local connections with the Berlin Open UBI Pilot. Watch a video of how the ecological circular economy in Berlin works, powered by Circles: https://vimeo.com/769402776 \n\nUniversal basic income means that we are being valued just because we exist and that we do not have to pay rent for having been born on Earth. \nCircles leverages pioneering Web 3 technology to bring forth a more ecological and fair world into being. By funding Circles via this Gitcoin Grant, you help create a distributed, community-first basic income around the world. The funds you give us will go into improving our Circles-core infrastructure in order to give people a better experience when using Circles to pay and buy the things that they need to live, community building & lastly to our ongoing research pilot which combines novel network science with anthropological methods.\n\nSupport us!\n\n\nRead our white paper https://github.com/CirclesUBI/whitepaper\n\nOur code is open source https://github.com/CirclesUBI/\n\nGet more information https://joincircles.net/\n\nCircles Coop website (mainteners and developers of circles.garden) https://circles.coop/\n\nChat with us! https://t.me/CirclesUBIGeneralChat\n\nDeveloper chat: http://chat.joincircles.net/ ", - "projectWebsite": "https://joincircles.net", - "projectLogoCid": "bafkreiduhdohmihcykyvhmn75gjawkggmte3m67tfmjzspp5fy4xdihw3m", - "projectBannerCid": "bafybeiatgbdr2xc6hlsuhn5zcqsdqfli2r2fjqg254gvf5gonnrgkeca3i", - "projectTwitter": "twitter.com/circlesubi", - "projectGithub": "https://github.com/CirclesUBI", - "userGithub": null, - "fundingTotalDollars": 3975, - "donorsTotal": 565, - "fractionsTotalSupply": 3852, - "hypercertEligibleDonors": 515, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0x04B86C77271B97EF30AEc9eFB5d4cbC805144a7A": null, - "0x37d7C7c7AC09532aB607bFC4bAAd86beb35e493d": null, - "0x85beD5928b351892cd610a554C018978BA944A95": null, - "0xba52487EAd64FcF6C1D1707F842BdF4540004f25": null, - "0xD927B8d8Fc17965624d53AE24aC26B220df6fF7C": null, - "0xbc58Fd3beCf189232edf3f7Bf10F486c8ebB060D": null, - "0x33A32af54583428BD16cD9Fa034eBa3c5BA5A8a8": null - }, - "safeUsers": { - "0xd525fF26F45f3B7D20cfEf170E2cb9E601A0b4dA": 0.02 - } - }, - "hypercertData": { - "workScopes": "CirclesUBI", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0xd525fF26F45f3B7D20cfEf170E2cb9E601A0b4dA", - "rights": ["Public Display"] - } - }, - { - "title": "word block", - "address": "0x65a0Af703047dfDd270361659d02f4f0E8547202", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x6645c813734620e96c3915bc39abefefb682bbe6058353db8b99ce7235920804", - "projectDescription": "Wordblock is a block based note-taking tool with ownership control.\n\n-Wordblock extension\n\nYou can clip any text from any website, add tags, comments, and save the location (URL) as metadata.\n\nYou can write block-based memos, add tags and extra information(e.g. the real location: \ud83d\udccd\ud83d\udeb6\u200d\u2640\ufe0f38W,4S). For example, when you pick up a book in an antique bookstore, and you want to \"steal\" some words from it before you take it home.\n\nThe text is generated under the user's own DID signature, while data is stored on a distributed content storage network--IPFS to enable public search.\n\n- Wordblock.xyz - a global text block search engine\n\nAll the word blocks created will be pooled in one place for public search, or later public reference.\n\nFor example, you can process public block searches via tags, keywords, or user DID\n\nCompared with local storage note-taking tools like obsidian or central storage Roamresearch, the difference is in data storage in order to achieve public block search.\n\n- Use cases\n\n1) A social graph\nAfter collecting those text blocks, it is easy to form P2P social relations*(e.g. walletChat)* via tag matching.\n\n2) A decentralized multi-lingual literature library\nThe inspiration is when I visited an ancient Malatestiana library (the 1st public library in human history) in Cesena, Italy.\n\nEach codex is tied to the desk with a root ironed chain, so that precise objects could not be stolen, it is now a symbol of the arts of literature, copies include 20 years italian, french and german s copy by using humane scripture called \"literature antiqua\", text includes classical latin authors, churchenergy , greek\u2026\n\nIt's like a warm salute from afar history that tells how humans keep words and knowledge. In the context of today, we stand a chance to \"chain text\" differently and interestingly with technology.\n\nToday, we care less about \"preventing books from being stolen\" but about \"HOW things are connected\", so the desire to build a distributed literature dictionary(library) where people from anywhere in the world could contribute their input even in different languages.\n\nFor example, after I read the Chinese version of\u300aMr.Gywn\u300b, I para-read the original Italian version, then build the connections in between. It is one of the very fun techniques for acquiring a second language through intertextuality, while also a way to let the machine know how people from different linguistic computing systems tell the SAME story.\n\nRead more: https://mirror.xyz/0x65a0Af703047dfDd270361659d02f4f0E8547202/YmbixVzwGJ0l46X6PDtVBbYY64Jd-SfRSD8usBZUzno\n\n3) A data graph\nwe are in the early stage of defining data as an asset with maturing infrastructure like IPFS, Ceramic network, dataverseOS etc, the excitement of web3 is the data as streams that can be visualized and later used by individuals. We could first collect those fragmented attentions \ud83d\udc40 with ease, and then browse/ the data, or re-organize(reference) with personal signature.\n\n- Tech\n\n1) Ceramic Streams\nWordblock uses Ceramic Stream to store the JSON metadata of a block. Metadata includes BlockID, Creation Date, Source URL, Author, Tags, Type, and Content. The DID of the user submitting the block to the Ceramic network is also bound to the metadata. The Wordblock data model can be shared between anplications on the Ceramic network.\n\n2) web3.storage\nWordblock uses web3.storage for data backup and permanent storage. Our backend API can get all the blocks created by the given user DID to implement a global search on the wordblock.xyz page.\n\n- Reference\n[1] wordblock github\nhttps://github.com/fat-garage/wordblock\n\n[2]wordblock gitcoin\nhttps://gitcoin.co/grants/2445/fat-garage-the-word-block\n[3]wordblock on IPFS grant\nhttps://github.com/ipfs/devgrants/issues/278", - "projectWebsite": "https://wordblock.xyz/", - "projectLogoCid": "bafkreih62ihcmrs2vsipas5e4sbwfa4vbjcasqq5yjralc6axgdfjrbn7m", - "projectBannerCid": "bafybeifz44z5wsrxi4h4lej6ucvkgjcnm3p6uxregtikhz62vigzrb7rnu", - "projectTwitter": "https://twitter.com/JESSCATE93", - "projectGithub": null, - "userGithub": "https://github.com/fat-garage/wordblock", - "fundingTotalDollars": 682, - "donorsTotal": 84, - "fractionsTotalSupply": 665, - "hypercertEligibleDonors": 73, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.006590717389140812 - }, - "hypercertData": { - "workScopes": "wordblock", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x65a0Af703047dfDd270361659d02f4f0E8547202", - "rights": ["Public Display"] - } - }, - { - "title": "StarkDeFi", - "address": "0x9D100F017095e53b24d81296BcA1D26742f1800F", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x67583b52562147ffe4d7b9c4422c6109d0d18a596c25355eea583e13e146224b", - "projectDescription": "StarkDeFi is a suite of decentralized financial products (DeFi) that leverages the Zero-Knowledge (ZK) Rollup capabilities offered by StarkNet.\n\nWe aim to facilitate and simplify the onboarding process for the \"Next Generation User\" in the blockchain space.\n\nOur Products\n\n\u26a1\ufe0f Synergy Pool (Variable Rewards Mechanism) \n\n\u26a1\ufe0f AMM\n\n\u26a1\ufe0f Farm\n\n\u26a1\ufe0f Liq Locker \n\n\u26a1\ufe0f Launchpad \n\n\u26a1\ufe0f Mint (NFT/Token)\n\n\u26a1\ufe0f Staking Pool \n\nUtilizing StarkNet\u2019s scaling solution that will reduce gas fees and improve reliability, StarkDeFi is building a suite of financial products that will bridge the gap for the next wave of DeFi and crypto enthusiasts. With StarkDeFi's solutions, crypto enthusiasts, as well as technical users, will be able to access the benefits of StarkNet, the leading decentralized ZK-Rollup on Ethereum.\n\nStarkDeFi is ensuring that Starknet will be available to everyone. By creating a simple UI, with AI assistance we have our users at the forefront of what we are building and for projects wanting to launch on Starknet, we aim to tackle the issue of learning 'Cairo' by enabling projects to mint, lock liquidity and use our launchpad without the need to learn a new programming language, essentially bridging the gap between Ethereum and Starknet. \n\n", - "projectWebsite": "https://www.starkdefi.com", - "projectLogoCid": "bafkreiewtap6xhtqj24xzv2gdperl5lwf7dpgdklgzghm2b5wazfrx2zti", - "projectBannerCid": "bafybeifwy3s674emjqvwual47neuhpl3fnhdop65blyn347avtdz237veu", - "projectTwitter": "StarkDefi", - "projectGithub": null, - "userGithub": "https://github.com/Starkdefi/StarkDefi-contracts", - "fundingTotalDollars": 50131, - "donorsTotal": 11333, - "fractionsTotalSupply": 47136, - "hypercertEligibleDonors": 10915, - "ensName": "thestarkknight.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.00100835228972355 - }, - "hypercertData": { - "workScopes": "StarkDeFi", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "thestarkknight.eth", - "rights": ["Public Display"] - } - }, - { - "title": "Malicious Contract Detector", - "address": "0xA3c2e3d65206deE0456416F8189de7CF4fccbB22", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x6853d9b86fb7e544d688ff111e1b4dd95636716635e58243bc883a17d4783c8d", - "projectDescription": "The Malicious Contract Detector project aims to use advanced machine learning techniques to analyze the code of new contracts and identify potential issues or vulnerabilities. The project is divided into two main parts: research and development.\n\nIn the research phase, a variety of algorithms and feature sets will be analyzed, including function signature hashes, abstract syntax trees, opcodes, and even approximate source code, to determine the optimal approach for identifying malicious contracts. The goal is to create a finished machine learning model that can accurately classify contracts as safe or potentially harmful.\n\nIn the development phase, the bot will be created and the process of transforming contract code into a feature set for analysis will be optimized. The focus will be on ensuring that the bot can handle high volumes of incoming contracts in real-time, while maintaining a high level of accuracy and precision.\n\nThe project is currently in the alpha testing stage, with initial results indicating that the BERT transformer model has shown promising results in classifying malicious contracts. A set of bots using different models will be created in order to further improve the accuracy and reliability of the Forta bot.", - "projectWebsite": "https://github.com/venglov/Malicious-Contract-Detector", - "projectLogoCid": "bafybeidn4aldo5j5xozmnteoysgzyv7ia4jfnc2iwwbedjhwe262d2c7qy", - "projectBannerCid": "bafybeigu4slwqzynbetk6bt5fistsbodv2ijdcsfhw76valmvdxl72wi4e", - "projectTwitter": "vvlovsky", - "projectGithub": null, - "userGithub": "venglov", - "fundingTotalDollars": 1977, - "donorsTotal": 298, - "fractionsTotalSupply": 1906, - "hypercertEligibleDonors": 251, - "ensName": "venglov.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.08761727777226322 - }, - "hypercertData": { - "workScopes": "Malicious Contract Detector", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "venglov.eth", - "rights": ["Public Display"] - } - }, - { - "title": "ENS Spoofing Bot", - "address": "0x7b736FE138775D1fCD2CFE4E1D6158BfF3a2F28e", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x68a7e0b8472089e4c4db7167b630f0df2303784635126bb3fc82f02e9032055f", - "projectDescription": "ENS Spoofing Bot detects attacks in which someone registers a name visually similar to an existing one. Every ENS user can receive a notification if it happened to their name. \n\n\nThe problem\n\nNames in the Ethereum Name Service are unique, but there are no restrictions on registering look-alike names that are visually very difficult to distinguish from genuine ones. For example, having a name vitalik.eth, an attacker can register a similar name by replacing the symbol lowercase L with uppercase i: vitaIik.eth. The name is visually similar, but it is treated by the protocol as a completely different name, with its own hash, as well as an address bound to it. \n\nThis type of attack is called a homograph attack. Regarding the ENS protocol, it can be performed in the following ways:\n- Substitution of character pairs i/I, i/j, O/0, w/vv, m/rn, etc., which depending on the typeface, may be difficult or impossible to distinguish;\n- Replacing ASCII characters with visually similar ones from Unicode; for example, \u201cfa\u0441eboo\u0441k.eth\u201d uses the letters o and \u0441 from Cyrillic;\n- Use of invisible Unicode symbols; \n- Spoofing using uppercase letters; for example, bitcoin.eth may be spoofed as Bitcoin.eth. \n\nENS fights this attack pretty hard by normalizing names before they are registered, as well as warning against using non-ascii characters on its site. However, to save gas, such checks have been implemented off-chain, on the frontend side. Any user can register a name bypassing the official site by calling the protocol contract directly.\n\n\nThe solution\n\nDevelop a Forta bot that monitors on-chain contract events responsible for registering \".eth\" names. As soon as the bot detects a new registered name, it tries to normalize it and checks if a similar name has already been registered. If so, the bot fires an alert specifying the registered name, the existing normalized name, and the addresses of the accounts to which these names are bound.\n\nForta Protocol allows each user to subscribe to alerts involving their addresses, so if their name is spoofed, they will immediately receive a notification in one of the convenient ways: Email, Telegram, Discord, Slack or Webhook.\n\nIn addition, when combined with bots that detect subsequent stages of suspicious activity, we will have enough evidence to claim a scam attack. For example, the next follow-up checks could be obtaining tokens, selling them, and laundering funds through services like Tornado Cash. \n\nAs a result, the Forta ENS Spoofing Bot will play an important role in detecting scam attacks, maximizing the chances of their detection.\n\n\nAbout the Author\n\nI'm a Ukrainian developer, who has been developing bots for Forta Protocol since the beginning of the project. You may have seen me as a frequent contest winner as well as an active member of the community. At the moment I developed 19 bots, some of them are in the Forta Threat Detection Kit.", - "projectWebsite": "https://github.com/kovart/forta-ens-spoofing", - "projectLogoCid": "bafkreig2qp4nfb7tf2pjugznszykzpbk4eacrquglpxvooncwc252tungm", - "projectBannerCid": "bafybeibicei4a233miqwcqxezfgh463pm4hrs4mmqxq4efcx2z6uydshem", - "projectTwitter": "kovart_dev", - "projectGithub": null, - "userGithub": "kovart", - "fundingTotalDollars": 4573, - "donorsTotal": 800, - "fractionsTotalSupply": 4385, - "hypercertEligibleDonors": 702, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "ENS Spoofing Bot", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x7b736FE138775D1fCD2CFE4E1D6158BfF3a2F28e", - "rights": ["Public Display"] - } - }, - { - "title": "Krebit", - "address": "0xd6eeF6A4ceB9270776d6b388cFaBA62f5Bc3357f", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x68d7168d2ed92300f3c30b1b6c7d2c822ea71c24ec55e18d8777eb47ae998905", - "projectDescription": "Krebit uses Web3 verifiable reputation and escrow payments to build a fairer Web2 marketplace and help people Earn more.", - "projectWebsite": "https://krebit.id", - "projectLogoCid": "bafkreid465nrgxz4ygg7q7lvzdn6qxyccpftbfmxykwrnwluwptvwl7jd4", - "projectBannerCid": "bafybeiaoouxmuuknvho2jq5eynsrb5vx3gvcsyt6qy5kntfu367sbikkui", - "projectTwitter": "KrebitID", - "projectGithub": "KrebitDAO", - "userGithub": "krebit", - "fundingTotalDollars": 4368, - "donorsTotal": 729, - "fractionsTotalSupply": 4211, - "hypercertEligibleDonors": 687, - "ensName": "alerios.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.00062 - }, - "hypercertData": { - "workScopes": "Krebit", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "alerios.eth", - "rights": ["Public Display"] - } - }, - { - "title": "W3.work", - "address": "0x70B20209c83ec8D01e3c7F2ec77BDe7c40cDF2F6", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x7083c3a699944ea48bd0204eb74dfeac1414e90443a7e8efbafbcfffd3f01133", - "projectDescription": "W3.work - Events and Collabs in Metaverse\n\n[RESHAPING THE SOCIAL EXPERIENCES IN WEB3]\n\nWHAT IS W3.WORK?\nW3.work is a fully decentralized social Metaverse built on decentralized social protocols for Web3.0 professionals, which significantly improves the efficiency of social events, business networking, and remote working for Web3.0 teams.\n\nProblems\nLack of IRL connections, especially when online events are becoming more common during the post-pandemic era.\nLack of security and privacy, Web3 professionals are stuck with Web2 tools and social media.\nLack of credibility and trust, especially regarding business networking and collaboration.\n\nW3.work Provides:\nA Gamified Metaverse for events and social networking - connecting Web3.0 organizations, teams, VCs, and creators\nA trustful collaboration tool of Web3 - empowering innovation and creativity.\n\nW3.work is a business social Metaverse.\nW3.work is a business ecosystem.\nW3.work is your Web3 network.\nNot just online meetings...\n\nStart a W3.Events anywhere, anytime.\nW3.Events ensure the quality of online events, while also promising the best and the most immersive experience for both event organizers and attendees.\n\nA typical event day at W3.work consists of much more than yawning in countless Zoom meetings and twitter spaces in front of your laptop.\n\nWandering through the W3.work Metaverse, greeting your friends with GM to begin a lovely day.\nWith conferences, business development, remote collaboration, parties, and other engaging Web3 activities, one day at W3.work couldn't get any more fun and productive.\n\nW3.work is looking for massive adoption in the near future, with the hope of bringing Metaverse and social styles together for people to connect and collaborate in the Web3.0 economy.\n\nConsider a small donation to help us keep building this beautiful Metaverse!\nAll early funders will be Whitelisted to the latest features and be granted W3.work Early Supporter SBT(SoulBound Token)!\n\nAlpha Version\nOur alpha version is out! Welcome to try it out today at: https://alpha.w3.work/", - "projectWebsite": "https://alpha.w3.work", - "projectLogoCid": "bafkreihm4xrpmxrmd6kzw3sljpkibvzl4kgnvole4bkw7zbctiadvqbnqa", - "projectBannerCid": "bafybeiagsodjpcwdo7mraqe7pjxxmitvswr2oiskpeyw7fztfwnnou6lsm", - "projectTwitter": "w3_work", - "projectGithub": "laborigin", - "userGithub": "laborigin", - "fundingTotalDollars": 1021, - "donorsTotal": 209, - "fractionsTotalSupply": 972, - "hypercertEligibleDonors": 176, - "ensName": "cuegod.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.48528083382539106 - }, - "hypercertData": { - "workScopes": "W3.work", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "cuegod.eth", - "rights": ["Public Display"] - } - }, - { - "title": "Esteroids - a community .eth websites search engine", - "address": "0x71c7252Cc1AfC181704ff7fDED27486f5cCd9205", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x718ead66c1598336d76118607afea7d152b63b087e52f5b9c1f81398e4c06235", - "projectDescription": "Esteroids (esteroids.eth) is a community search engine for .eth websites! \n\nWhile the .eth web previously offered a variety of innovative .eth websites, it lacked the tools to collect, explore and showcase these websites to the community.\n\nWe, therefore, launched esteroids.eth in April 2021 in order to give .eth websites a dedicated search engine. \n\nWe see the .eth web as a fundamental piece of future Ethereum, and a community search engine as a fundamental infrastructure for this web.\n", - "projectWebsite": "https://esteroids.eth.limo", - "projectLogoCid": "bafkreiamvzdazyvxo7srsiit3x4zxsfog5suso633sonmwliaplh5ng5va", - "projectBannerCid": "bafybeigkznh4rc7q2mbpffvo4ihvvkysirnbn7jkwvh5iieysskhwqvrta", - "projectTwitter": "e_steroids", - "projectGithub": "esteroids", - "userGithub": "eyalron33", - "fundingTotalDollars": 1570, - "donorsTotal": 137, - "fractionsTotalSupply": 1542, - "hypercertEligibleDonors": 124, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "Esteroids", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x71c7252Cc1AfC181704ff7fDED27486f5cCd9205", - "rights": ["Public Display"] - } - }, - { - "title": "Fileverse - file sharing & collaboration between addresses", - "address": "0x4aF147188bfE1c02D18D752eD5E473d8394F2300", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x76667ee469d4e3b8dcbca33d612ebd437cceb3ffc8aab8908a0e0f5fd94248c3", - "projectDescription": "Your tool for file sharing and collaboration between addresses. Private, easy-to-use, and on-chain.\n\nFileverse.io gives you a taste of the non-financial, stress-free side of crypto. It\u2019s a simple on-ramp to experience the full extent of the web3 tech stack; all from the comfort of your wallet.\n\n\ud83d\udc7e Use Fileverse to:\n- Store, encrypt, and share multimedia files \n- Create encrypted chat rooms with your on-chain friends\n- Token-gate your files or chat rooms using your tokens or NFTs\n- Create & airdrop unique access-tokens (NFTs) with custom metadata (name, image, etc.) to any address(es) to token-gate your file(s) or chat room(s) \n- All for free thanks to Gnosis Chain and Polygon, while you and your friends can stay on Ethereum!\n\n\ud83d\udc7e Fileverse Solo \u2013 Experience the social web as sovereign individuals https://beta.fileverse.io/\n\n\ud83d\udd11 \u26e9\ufe0f Fileverse Portal \u2013 The new dApp is ready! Time to challenge Google Workspace and Microsoft Office together! Send us a DM or email to beta test it \ud83d\udc40\n\nAll this was possible thanks to your support during GR15-4-3. Thank you for making us one of the most successful Gitcoin grants!\n\n\ud83d\ude4f You can also help us in other ways.\n\n\u2735 Star our Github repo: https://github.com/fileverse\n\ud80c\udda3 Use our app and tell people about it: https://beta.fileverse.io/\n\ud80c\udd8f Become a contributor on Fileverse Github. Build your own Web3 portfolio by supporting public goods!\n\ud80c\udd5b Follow us on Twitter and Lens: https://twitter.com/Fileverse /\n\ud80c\udcd5 Donate to Fileverse: 0x4aF147188bfE1c02D18D752eD5E473d8394F2300\n\nIf you have any questions or want to say gm, feel free to follow us or contact us \u2013 https://twitter.com/Fileverse or hello@fileverse.io\n", - "projectWebsite": "https://fileverse.io", - "projectLogoCid": "bafkreigt3qmgeveme5vc4rnengowys7chc7mt5gw4boczj4evcglyuvinq", - "projectBannerCid": "bafkreia255oe2ajuok7cep3sf5rw2ibpxwzcee54nemn5ur47mp3mjzija", - "projectTwitter": "fileverse", - "projectGithub": "Fileverse", - "userGithub": "vijaykrishnavanshi", - "fundingTotalDollars": 5429, - "donorsTotal": 815, - "fractionsTotalSupply": 5239, - "hypercertEligibleDonors": 750, - "ensName": "archive.radicle.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.019438337048293067 - }, - "hypercertData": { - "workScopes": "Fileverse", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "archive.radicle.eth", - "rights": ["Public Display"] - } - }, - { - "title": "The MoonMath Manual to zk-SNARKs", - "address": "0xA8A4912938549d50EF3E7c698C890E18D73408Ee", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x79b218176d10d2bfacebaaaa267078d4f1b4e6865716863619a0ab257456fe47", - "projectDescription": "Most explanations struggle to clarify how and why they work, so zk-SNARKs remain somewhat \u201cmagical\u201d and elusive, deterring developers from exploring or utilizing them in projects. Resources are scattered across blog posts and GitHub libraries. This results in a high barrier to entry, thereby slowing the widespread adoption of zk-SNARKs and associated privacy-enhancing technologies. Even worse, implementing zk-SNARKs without understanding the fundamentals of how they work increases the potential for security issues.\n\nWe want to change that with our MoonMath Manual to zk-SNARKs, designed for an audience with only minimal experience in cryptography and programming.\n\nWhat is particularly unique about the MoonMath Manual is that it is designed to enable users to construct zk-SNARKs using simple pen-and-paper computations. Throughout the manual, users are encouraged to complete exercises that ensure they engage with the foundational building blocks of zk-SNARKs. While doing that, readers build the smallest possible \u2014 but fully functional \u2014 cryptographic stack to compute zk-SNARK internals without the need of a computer.\n\nAs users go through the manual, they will grasp mathematical concepts that are not only used in SNARKs, but also in other zero-knowledge proofs and cryptography more generally.", - "projectWebsite": "https://leastauthority.com/community-matters/moonmath-manual/", - "projectLogoCid": "bafkreifj2gcizc2756enj22latephx2wo7p5go4wzxonnvzrzwp6eb5tcy", - "projectBannerCid": "bafybeift25qgrwazy7vkobmsm3n2bwlswtcivtoadvfojcceluxobqwskm", - "projectTwitter": "LeastAuthority", - "projectGithub": "LeastAuthority", - "userGithub": "Liz315", - "fundingTotalDollars": 1679, - "donorsTotal": 354, - "fractionsTotalSupply": 1585, - "hypercertEligibleDonors": 295, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "MoonMath Manual", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0xA8A4912938549d50EF3E7c698C890E18D73408Ee", - "rights": ["Public Display"] - } - }, - { - "title": "Rings Network", - "address": "0xf7FeA1722F9b27B0666919A5664BaB486a4b18D3", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x7bb77e89022db7997754ef378a7e6f0270cba4eebaaa23d29cc00cc8510c8593", - "projectDescription": "Rings Network is a peer-to-peer private communication network, enabling users to interact among Web3 and Web2 applications.\n\n\n\nRings Network is based on distributed storage and aims to establish the basic ad-hoc & end-to-end network infrastructure for the next generation of Internet and Blockchain.\n\n\n\nWe want to reduce the cost of Internet communication, enhance the privacy of human connection, provide an excellent environment for the development of personality, pave the way for the transmission of knowledge, return to the origin of the Internet spirit, to deliver freedom, equality, and love.", - "projectWebsite": "https://ringsnetwork.io", - "projectLogoCid": null, - "projectBannerCid": "bafybeicphsos4i4bzbqfns4mmrurkfzfjcq2ujetrv46gqj3w7fcaah7ga", - "projectTwitter": "https://twitter.com/RingsNetworkio", - "projectGithub": "RingsNetwork", - "userGithub": "croath", - "fundingTotalDollars": 1746, - "donorsTotal": 362, - "fractionsTotalSupply": 1655, - "hypercertEligibleDonors": 312, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "Rings Network", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0xf7FeA1722F9b27B0666919A5664BaB486a4b18D3", - "rights": ["Public Display"] - } - }, - { - "title": "Soul Wallet", - "address": "0xFe97E32a873AA2f926FBfc560AbEEf01f753C128", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x8029c7cda58d70a6cd81ac56a6a678e8ccfb560f153eb86b1f5b5c3ca4566e82", - "projectDescription": "Next-gen Ethereum wallet for everyone.", - "projectWebsite": "https://soulwallets.me", - "projectLogoCid": "bafkreigftrbzy3iqvzjz7folx5jfxirftwrfabtw5qmzb5cnoipolfcffq", - "projectBannerCid": "bafybeig7ymr6ef2f5blnio4tay4euia5njey2axs55t7hw64qqxldmuzdq", - "projectTwitter": "https://twitter.com/soulwallet_eth", - "projectGithub": null, - "userGithub": "https://github.com/proofofsoulprotocol/soul-wallet-contract/blob/main/contracts/SmartWallet.sol", - "fundingTotalDollars": 15498, - "donorsTotal": 3053, - "fractionsTotalSupply": 14808, - "hypercertEligibleDonors": 2858, - "ensName": "soulwalletlab.eth", - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0x76755a45087Ac31a970cB7dd189A07cEcE7d9b1d": "soulwallet-david.eth", - "0x045ff23cF3413f6A355F0ACc6eC6cB2721B95D99": "suneal.eth", - "0xc3d696C268503Df52781E32085110C562f40333d": "onrecord.eth", - "0xE8c8f12cCB61fD25EcC5E391E99f69a971526C99": "yihaotian.eth", - "0x6D05723Bd4F3b0446920a5Bf0e89102b491A8C1e": null, - "0x871608cBA092105b91e91295A1d79fFC539BFb48": "asset3.eth", - "0xC38360bb436Fc0c79a7dDf9dD75b98Ea4D0A7555": null - }, - "safeUsers": { - "asset3.eth": 0.375, - "soulwallet-david.eth": 0.375, - "onrecord.eth": 0.125, - "suneal.eth": 0.125 - } - }, - "hypercertData": { - "workScopes": "Soul Wallet", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "soulwalletlab.eth", - "rights": ["Public Display"] - } - }, - { - "title": "The Science Commons Initiative", - "address": "0x3EcB9640ea6cC9bd9D5040713F854634Fd0FCf8a", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x816250172a2aef95d8221d37ea7cb8a7691112478e3e8ebf1a87934a8c419df4", - "projectDescription": "The Science Commons Initiative is a non-profit collaboration aimed at increasing the public's access to and participation in the scientific process. We find, spotlight, and fund technological and other strategic infrastructure to help scientists and researchers solve some of the world's most pressing problems, with an emphasis on engaging the public. We seek to make long-lasting changes to the way science is produced and communicated so that it is more open, more democratic, and more optimized to benefit the public.", - "projectWebsite": "https://thesciencecommons.org", - "projectLogoCid": "bafybeigmqyg33ksksjvmxde5rf5rkpolrn2ve2nqk2mkpcny4vzui6kiay", - "projectBannerCid": "bafkreiczzgxijlvy7jsplqvis3xf5xgv24moojckpls76nap6lxkx32nxe", - "projectTwitter": "TheSCInitiative", - "projectGithub": "TheSCInitiative", - "userGithub": "makeasnek", - "fundingTotalDollars": 2150, - "donorsTotal": 83, - "fractionsTotalSupply": 2129, - "hypercertEligibleDonors": 68, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0x01D8AEff110a65DA4052f140C19af10374E44525": null, - "0x665309C659EdCF23f86BCb6796Baa545ddFC2a3C": null, - "0x0b8598c72bEeb126439A57A78004f7e6723b468A": null, - "0x022651a913bf752773b85A34B8Bb84240bDDB14f": null, - "0x7a5FA63C8b26521bfC601Fa64e7FeEf8D06B95a9": null - }, - "safeUsers": { - "0x3EcB9640ea6cC9bd9D5040713F854634Fd0FCf8a": 0.2 - } - }, - "hypercertData": { - "workScopes": "The Science Commons Initiative", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x3EcB9640ea6cC9bd9D5040713F854634Fd0FCf8a", - "rights": ["Public Display"] - } - }, - { - "title": "Kredeum NFTs Factory", - "address": "0xBC0b437C95c7165F7d1F7C966cb2227DA52a27d7", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x89a0a4ae11c70d1fdb328d25d16c56c49949d679ae17c22b3858a4bfdf9712f7", - "projectDescription": "Kredeum NFTs Factory : Mint it right !\n\nThe easiest way to create you own Collections and mint your NFTs\nWith innovative features like AutoMarket NFT and SoulBound Multichain NFT\n\nA powerful factory composed of 3 different tools :\n\u2192 the Kredeum Dapp, a NFT Wallet giving you access to all your NFTs\n\u2192 the Kredeum Plugin for WordPress, in order to easily sell your NFTs directly on your website, just with the help of WordPress shortcodes\n\u2192 the Kredeum Smarcontracts, with it's smarcontract templates, using the new OpenNFTs component library, to create various NFT collections\n\nAvailable on multiple blockchains: Ethereum mainnet, Arbitrum, Optimism, Polygon, Avalanche, xDai, Fantom and Bsc\n\n\n\nHOW WILL WE USE THE FUNDS RECEIVED IN THIS ROUND ?\nWith the funds received in this round we will expand Kredeum NFT plugin, to enable the creation of your dedicated NFT marketplace on your WordPress website.\nTo allow you to sell autonomously your web content \u2014 images, photos, blog articles \u2026 \u2014 as NFTs, without the need of any global centralized marketplace.\nYou will be able to control your sells, with the options to define and enforce royalties\n", - "projectWebsite": "https://www.kredeum.com", - "projectLogoCid": "bafkreigeogscmsbmcey4mu7xl4tuu3gnnrryhbohyyfywoo6xvdrherqne", - "projectBannerCid": "bafybeiamr566f5gx3wxom6ah3rpbmyffxggros56abxmdqnqhcaay34ujy", - "projectTwitter": "kredeum", - "projectGithub": "kredeum", - "userGithub": "zapaz", - "fundingTotalDollars": 899, - "donorsTotal": 181, - "fractionsTotalSupply": 859, - "hypercertEligibleDonors": 161, - "ensName": "kredeum.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.01 - }, - "hypercertData": { - "workScopes": "Kredeum NFTs Factory", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "kredeum.eth", - "rights": ["Public Display"] - } - }, - { - "title": "Scam Sniffer", - "address": "0x79A9c3aEE79793c2873E6686C22EBf2311778C19", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x8b4c72d7b905fe5f514970024119ae06c4d97a5b1a1a31bfa3dc73b222aa370b", - "projectDescription": "\nHow to protect Web3 individual users from malicious websites is always a massive challenge due to blockchain\u2019s native nature of anonymity and immutability.\n\nScam Sniffer provides two solutions for the community:\n\n### Chrome extension\n\nProvide real-time protection through the browser extension for individual users. It covers many tricks used on many malicious sites, such as:\n- Fake wallet for stealing seed phrase\n- EIP-712-based malicious signature request (NFT Listing, EIP-2612)\n- Honeypot NFT detection\n\n### Scam Database\n\nWe have open-sourced a blacklist since a few months ago, this blacklist contains the most-updated malicious domains detected by us, It can help products like wallets block these sites proactively!\n\nIn only a few months, this blacklist has now grown to 17000+ domains.", - "projectWebsite": "https://scamsniffer.io", - "projectLogoCid": "bafkreiff67w2l7zqset63dnynx2extns5lslacclk7avxscxwcqcae5jvm", - "projectBannerCid": "bafybeihe2ybkbnq7e2fag6k7ky72mq5tgmx7vvdsh2uvefytjomlicusii", - "projectTwitter": "realScamSniffer", - "projectGithub": null, - "userGithub": null, - "fundingTotalDollars": 3072, - "donorsTotal": 874, - "fractionsTotalSupply": 2916, - "hypercertEligibleDonors": 806, - "ensName": "scamsniffer.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "Scam Sniffer", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "scamsniffer.eth", - "rights": ["Public Display"] - } - }, - { - "title": "Proof of Humanity", - "address": "0x2AF4125c8fE208a349ef78d3cb980308ab1Ed34f", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x91db8779fa1b15d75761e358fe57683892c68d5cad11a4f9d19c468876d3c402", - "projectDescription": "Sybil-resistant registry of Humans using social verification on Ethereum. Streaming $UBI \ud83d\udca7 & building a decentralized democracy! ", - "projectWebsite": "https://proofofhumanity.eth.limo", - "projectLogoCid": "bafkreih7wlfag6alcuhe223gelth2y4ktaj2hmrbxm2nsmh7vw6eysqh54", - "projectBannerCid": "bafybeidbfxda6zrrggrhvlaf5aq6gvulnuvoxtsqz4tddk7yg5ak4645b4", - "projectTwitter": "pohdao", - "projectGithub": "OpenProofOfHumanity", - "userGithub": "santisiri", - "fundingTotalDollars": 22208, - "donorsTotal": 4828, - "fractionsTotalSupply": 21131, - "hypercertEligibleDonors": 4548, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "Proof of Humanity", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x2AF4125c8fE208a349ef78d3cb980308ab1Ed34f", - "rights": ["Public Display"] - } - }, - { - "title": "Lighthouse", - "address": "0x29b1d432a40f40F5418DA2d4ABf740e5E491629B", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x92abc70736a869d913735481b1dfacc6e53939dfed81d8d89590619878f9ee30", - "projectDescription": "Perpetual storage protocol allowing users to pay for storage forever with one-time fee", - "projectWebsite": "https://www.lighthouse.storage/", - "projectLogoCid": "bafybeig7yx3cm7ljn2jcrufznx2l3qsnguwoveifqv6msa3nec6jp76p6y", - "projectBannerCid": null, - "projectTwitter": "LighthouseWeb3", - "projectGithub": "lighthouse-web3", - "userGithub": "nandit123", - "fundingTotalDollars": 5314, - "donorsTotal": 974, - "fractionsTotalSupply": 5093, - "hypercertEligibleDonors": 872, - "ensName": "nanditmehra.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.15590926092717897 - }, - "hypercertData": { - "workScopes": "Lighthouse", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "nanditmehra.eth", - "rights": ["Public Display"] - } - }, - { - "title": "zkREPL", - "address": "0x5B3920527cfe207100312f4685E048ee032Fa391", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x958a27cbbf604752b32e4593aa7d3801d5de011248d5732360bccac67024ca85", - "projectDescription": "zkREPL is an online playground for zero knowledge circuits", - "projectWebsite": "https://zkrepl.dev", - "projectLogoCid": null, - "projectBannerCid": "bafybeihkqu6xsy4tpuroqzt6g5y6cgjvfrcxewkfxeoztux2glop2osqzq", - "projectTwitter": "zkrepl", - "projectGithub": "0xPARC", - "userGithub": "", - "fundingTotalDollars": 4105, - "donorsTotal": 1135, - "fractionsTotalSupply": 3884, - "hypercertEligibleDonors": 1052, - "ensName": "zkrepl.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "zkREPL", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "zkrepl.eth", - "rights": ["Public Display"] - } - }, - { - "title": "Dapp-Learning", - "address": "0x35C6d9117F66943C881E8354138434b8a0727988", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x97d1779d1e478d5f58246af8c595cbf8f00aae86706524fc21b051bb20c002a9", - "projectDescription": "Definitive Guide for Decentralized-app(Dapp) Development on Blockchain", - "projectWebsite": "https://github.com/Dapp-Learning-DAO/Dapp-Learning", - "projectLogoCid": "bafkreic5qg2p5gfvg5xms43clyxfpknwqrylh2ojzkwc3vguqmfnnhjyxu", - "projectBannerCid": null, - "projectTwitter": "Dapp_Learning", - "projectGithub": "https://github.com/Dapp-Learning-DAO", - "userGithub": "yanyanho", - "fundingTotalDollars": 1036, - "donorsTotal": 126, - "fractionsTotalSupply": 1004, - "hypercertEligibleDonors": 106, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0x1F7b953113f4dFcBF56a1688529CC812865840e1": "dapplearning.eth", - "0xFE63eDdC467E3E7bB6804ab21eAA18289355d02b": null, - "0x87451bb0053cD80E1c7d092114D710F7600b66a2": "top-defi.eth" - }, - "safeUsers": null - }, - "hypercertData": { - "workScopes": "Dapp-Learning", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x35C6d9117F66943C881E8354138434b8a0727988", - "rights": ["Public Display"] - } - }, - { - "title": "Web3MQ", - "address": "0xA126F99e0DEFc3bFa963064314c4b1D54c872DCc", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x9b5419814f45cb2091991b0d2379f7db9d8ea17cecb6bc2117b26c6acfd6ce15", - "projectDescription": "Web3MQ is currently the fastest social layer1 and trustless messaging network in Web3. Web3MQ offers the highest throughput (QPS), lowest message latency, and best scalability compared to other communication protocols. Web3MQ is also extremely simple to integrate through open-sourced component libraries. Web3 projects ranging from DAOs, Gamefi games, data providers, and decentralized social media, can build decentralized social and user engagement solutions using Web3MQ today.", - "projectWebsite": "https://www.web3mq.com", - "projectLogoCid": "bafkreigwwge6w3m4roqtkmj6qwf6nqezqklz62q563ulac6jzvdhd4mibe", - "projectBannerCid": null, - "projectTwitter": "https://twitter.com/Web3MQ", - "projectGithub": null, - "userGithub": null, - "fundingTotalDollars": 1052, - "donorsTotal": 204, - "fractionsTotalSupply": 1004, - "hypercertEligibleDonors": 163, - "ensName": "swapchatnft.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "Web3MQ", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "swapchatnft.eth", - "rights": ["Public Display"] - } - }, - { - "title": "Voting Contracts", - "address": "0x5514f4a2BC7194664B12A48E238876Aa53140350", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x9ca823959474851a1e54a315cd1e78637c114d5f4dcf7db7ba0daacc263ad785", - "projectDescription": "We propose a framework for on-chain voting that can be grown by a community into a vast landscape of voting contracts. This would be beneficial to the Ethereum ecosystem as a whole. If there was a system of voting contracts covering a wide range of possible voting types from token-weighted voting via quadratic voting to delegation, then DAOs could simply plug in rather than hard-coding yet another, say, token-weighted voting into their contracts. Plugging in would be as simple as pointing to a deployed voting contract. One can also plug out or exchange the reference from one voting contract to another.\n\nWe have deployed a registry contract to polygon and mainnet (https://etherscan.io/address/0xC535389b5a26efEbc27811915B6d78f6C95433f7) and opened a topic on the Ethereum magicians forum to discuss the EIP draft: https://ethereum-magicians.org/t/eip-draft-configurable-voting-contract/10736 \n\nI am currently developing a dapp that lets people interact with a playground, where one can plug in and out of voting contracts and get a feeling for the framework. This site is hosted on ipfs and served through ens: https://votingcontracts.eth.limo/. The development of this app and the deployment of the underlying playground and pluggable voting contracts to ethereum mainnet are the next steps. Feedback is very welcome. Please do reach out with feature requests and ideas. There is also a node package: @leomarlo/voting-registry-contracts, though I am considering migrating that at some point. There are two repositories for this project: https://github.com/leomarlo/voting-contracts-frontend and https://github.com/leomarlo/voting-registry-contracts . \n\n**Updates will appear here!**", - "projectWebsite": "https://votingcontracts.eth.limo/", - "projectLogoCid": "bafkreiacds5hssbudog4s6dvpcvhal42qo5zltwtleswiq3yi7vscxyfoy", - "projectBannerCid": "bafkreihkytdnkbkpr5sbxkyshv4d3f45j3kz5fj52iyprw5vicqjvwjc6m", - "projectTwitter": "https://twitter.com/VotingContracts", - "projectGithub": "leomarlo", - "userGithub": "leomarlo", - "fundingTotalDollars": 550, - "donorsTotal": 79, - "fractionsTotalSupply": 533, - "hypercertEligibleDonors": 69, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0x5462588962dA877Aa976992BC2126Bb54dcbacb1": null, - "0xAbb9aC1F97FB9b40a538B41f7F5e3681d4495bE5": "leomarlo.eth", - "0x07c33D5C1F3f0dBd03d6Ba4C55F2B5277D1faF59": "votingcontracts.eth" - }, - "safeUsers": { - "leomarlo.eth": 1.0 - } - }, - "hypercertData": { - "workScopes": "Voting Contracts", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x5514f4a2BC7194664B12A48E238876Aa53140350", - "rights": ["Public Display"] - } - }, - { - "title": "Seedle", - "address": "0x5c34386552091744717b1c0154b9d48d35f5f435", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x9e659b60cc9a7658c25b161d535ae6b1a66c309130962e5b95110c2f1c4f4746", - "projectDescription": "Seedle is an open-source tool that helps you to manage and track the performance of their Uniswap v3 positions.", - "projectWebsite": "https://seedle.finance", - "projectLogoCid": "bafkreidk4xvmwjvwrbposoaspy4ecy2kk6lrqkfl25wdnqbeyyfvrfudzy", - "projectBannerCid": "bafkreian5mfja4ydwlgkgxwmzgxi63blbyc4syzpdlfvcx7u7gyntqd7ei", - "projectTwitter": "SeedleFinance", - "projectGithub": "", - "userGithub": "seedlefinance", - "fundingTotalDollars": 2194, - "donorsTotal": 692, - "fractionsTotalSupply": 2018, - "hypercertEligibleDonors": 555, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0x1f9F5a2511C4Ca5B768dadD067bC19916dd59d88": "seedle.eth", - "0xf45A307e19232EFbDfD91eCE01C8A89B7B333440": null, - "0x764c676FeAcb0766D43F7F66287ca63cae7a6A64": null - }, - "safeUsers": { - "0x5c34386552091744717b1C0154b9d48D35f5f435": 0.7222222222222222, - "seedle.eth": 0.2777777777777778 - } - }, - "hypercertData": { - "workScopes": "Seedle", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x5c34386552091744717b1c0154b9d48d35f5f435", - "rights": ["Public Display"] - } - }, - { - "title": "Umbra", - "address": "0x57EA12A3A8E441f5FE7B1F3Af1121097b7d3B6A8", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x9fb5b0d0698dc64cbd3a01c5205ebc5ef609e7d20c21ce20ee2c73905a8309a0", - "projectDescription": "Umbra is a protocol that lets you get paid privately on Ethereum and Layer 2 networks. \n\n----About Umbra----\n\nAs a protocol, Umbra defines a simple set of standards, coupled with a singleton smart contract instance, to enable stealth addresses on Ethereum. With a stealth address, a payer can send Ether or ERC20 tokens to an address controlled by the receiver, but no one except the two parties know who that receiver is. \n\nOn chain, the transaction looks like a simple transfer to an otherwise unused address on the Ethereum network. Off chain, the sender has used a public key published by the receiver to generate the new address. By encrypting the data used to generate the address, and announcing it via the Umbra smart contract, the sender can let the receiver know they\u2019ve sent them a payment to a new stealth address. Only the receiver can generate the private key needed to withdraw the funds.\n\nBy leveraging meta-transactions Umbra enables withdrawers to pay relayers for gas using the tokens they\u2019ve received. This avoids the need to fund stealth addresses with Ether before withdrawing.\n\n----Project Status----\n\nThe Umbra MVP went live in June 2021. You can visit https://app.umbra.cash to send and receive stealth payments using Umbra.\n\nSince our launch, we've made many iterative improvements based on user feedback. These included better mobile responsiveness, a simpler key registry system, faster scanning when searching for received funds, and other UX enhancements. We've also launched Umbra on Polygon, Optimism, and Umbra, and made huge improvements to our relay system to make token withdrawals faster and cheaper.\n\nSince launch, Umbra has processed nearly 100,000 payments across all networks, transacting more than $50 Million in value in the process. More than 52,000 accounts have registered stealth keys to enable privacy preserving payments through Umbra. Despite this growth, Umbra remains a grant funded public good project made possible by the community.\n\n---- What's Next----\n\nWe are grateful to our many supporters who have enabled us to get this far. There's still lot's more work to do!\n\nWe believe there is so much more we can do to make Umbra an even more powerful privacy tool in the Ethereum ecosystem. In the year ahead, we're focused on continuing to improve Umbra through withdrawal integrations, new network deployments, performance improvements, and host of small UX improvements and features. We're also working with researchers to develop a Stealth Address EIP, so that Umbra can remain an open, public goods protocol.", - "projectWebsite": "https://app.umbra.cash", - "projectLogoCid": "bafkreiem7q3g3b7knibjbskir74rdptd3rg6llsf327pcrtfaec4xoq564", - "projectBannerCid": "bafybeibkqio6ktgkqfvdwz3jbtcnhotwpvbxnhni4s5kouzr4jqxzl52kq", - "projectTwitter": "umbracash", - "projectGithub": "ScopeLift", - "userGithub": "apbendi", - "fundingTotalDollars": 32858, - "donorsTotal": 5653, - "fractionsTotalSupply": 31435, - "hypercertEligibleDonors": 5417, - "ensName": "umbra.umbra.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.011654196442005204 - }, - "hypercertData": { - "workScopes": "Umbra", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "umbra.umbra.eth", - "rights": ["Public Display"] - } - }, - { - "title": "Friends of Pooly", - "address": "0xC876bEC4e02EACc92df0F7b6EEee90c2aD794E50", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xa78a0c71a020745ba9199556d142f6878fe27638346977fe060a16927d250e3e", - "projectDescription": "Friends of Pooly is on a mission to defend decentralized finance; and to secure an Open Web3 through the power of Community.", - "projectWebsite": "https://www.friendsofpooly.com", - "projectLogoCid": "bafkreibbefbbkfuugs64inbdxsb44algpq7ndrg3beebca5nd7kjxlwu3e", - "projectBannerCid": "bafybeibwqzq7s6kkhwvba2arxgj2nwnkf7zagvodjn3tjjra3r6o466rda", - "projectTwitter": "https://twitter.com/FriendsofPooly", - "projectGithub": "https://github.com/orgs/friends-of-pooly", - "userGithub": "https://github.com/kamescg", - "fundingTotalDollars": 4235, - "donorsTotal": 555, - "fractionsTotalSupply": 4081, - "hypercertEligibleDonors": 501, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0x874557A2b9f7FC2096f7F01DdCaC856CC5baafD6": null, - "0x0894717f3D79ab54Fdec1f652EabB4800ee024e5": null, - "0x5839C307d24fA17cCe5EEd153368942eCd7D8828": null - }, - "safeUsers": { - "0xC876bEC4e02EACc92df0F7b6EEee90c2aD794E50": 0.3076923076923077 - } - }, - "hypercertData": { - "workScopes": "Friends of Pooly", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0xC876bEC4e02EACc92df0F7b6EEee90c2aD794E50", - "rights": ["Public Display"] - } - }, - { - "title": "Starksheet", - "address": "0x7A0857D314f62d383341b4ED8FE380e7C98Fb978", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xa9956ceed5830e7f1c9e820c38453edc222265ff98e8592d25544464570266a1", - "projectDescription": "Starksheet is a general-purpose high-level interface to everything on-chain.\nRead, write, execute, all on-chain, using data from every single piece of information available, right from a familiar interface.\n\nLiterally everything. Each cell is indeed any contract call that you could do in, for example, a block explorer.\nBut starksheet is not a block explorer.\n\nAs you can expect from a spreadsheet, you can use the result of one cell in the definition of another.\n\nA1=BAYC.ownerOf(9999)\nB1=USDC.balanceOf(A1)\n\nYou\u2019ve just created a tracker of the wealth of the owner of a given token. But starksheet is not an analytics tool.\n\nNot only can you view on-chain but also can you use write functions\n\nA1=uniswapAddress\nA2=myAddress\nB1=USDC.approve(A1.A2)\nC1=A1.swap(\u2026)\n\nBecause starksheet is 100% on-chain, you create indeed a bundle of several transactions into a single one. But starksheet is not a transaction builder.\n\nBecause the logic you create is stored as a (non so) standard ERC721 it\u2019s directly available from any wallet, dApp, etc. just by calling tokenURI\n\nYou\u2019ve just transformed your wallet into a dynamic dashboard + full of custom plug-ins\n\nBut starksheet is not a plug-in builder\n\nIt\u2019s just whatever you can think about with the chain, on chain, directly available anywhere else in any dapp of the ecosystem. From the chain to the chain.\n\nYou can right now make Dexes, flashlaons, airdrops, etc.\n\nAnd you, what would you build?", - "projectWebsite": "https://starksheet.xyz", - "projectLogoCid": "bafkreidbh6d3o4h5dzxltkji6gfcundf3ajtydc6uzy562325cbbuusdo4", - "projectBannerCid": "bafybeihdmjhq2ccib6egpnyyizz3ehbgajpos7gg3wxul6c3nt7qomgk7m", - "projectTwitter": "starksheet", - "projectGithub": "the-candy-shop", - "userGithub": "ClementWalter", - "fundingTotalDollars": 2670, - "donorsTotal": 624, - "fractionsTotalSupply": 2533, - "hypercertEligibleDonors": 571, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0xaA31a72aa161f8F00184985cB15383A9b20BA0F3": "abbeyjaz.eth", - "0xFc7c18A7F0d53A924D6aF07814c47eEf0Fb4F7d7": "clemlaflemme.eth" - }, - "safeUsers": { - "abbeyjaz.eth": 0.9, - "clemlaflemme.eth": 0.1 - } - }, - "hypercertData": { - "workScopes": "Starksheet", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x7A0857D314f62d383341b4ED8FE380e7C98Fb978", - "rights": ["Public Display"] - } - }, - { - "title": "minipent by pentacle", - "address": "0x8EFEF51d19EF3844C00076ab9d02847B9C70f94A", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xaa48be1f472efc5f5ee4d7f4fc1f2be1fbbc3507acd813dffdd322d9a4e8e6d5", - "projectDescription": "For web3 orgs / DAOs\n\nMinipent is an opensource version of the Pentacle knowledgebase, for you to fill with your own content.\n\nWritten in nextjs with a strapi-powered cms, orgs / DAOs can self-host internal information without being tied to web2 saas platforms.\n\n\ud83e\udd0d Your projects, sites and resources all accessible from a single page\n\ud83e\udd0d Easily onboard, collaborate and share knowledge with contributors\n\ud83e\udd0d No more hunting through various platforms to find your news and articles\n\ud83e\udd0d A self-hosted environment where you own your data\n\nMinipent instances completed in Q4 2022 include: Opyn, Redacted, Euler and Canto.\n\n---\n\nFor data collectors / content curators\n\nData collectors currently use a mix of notion, google docs, github and hackmd to collect up their crypto research. Much of which is duplicated across these various platforms multiple times by multiple researchers. \n\nMinipent gives data collectors and researchers a platform to organise and showcase their research and data collections with access to Pentacle's extensive database of projects and people. ", - "projectWebsite": "https://minipent.xyz", - "projectLogoCid": "bafkreicepfbibdenjd232az2absxe6a5cyeqfen6dqblehbph3vcexrpli", - "projectBannerCid": "bafybeibulxwenvycbjpaz566illro6tuxybybafmmiaxmwpmxih6d7i5ky", - "projectTwitter": "pentaclexyz", - "projectGithub": "pentaclexyz", - "userGithub": "pentcle", - "fundingTotalDollars": 907, - "donorsTotal": 231, - "fractionsTotalSupply": 865, - "hypercertEligibleDonors": 209, - "ensName": "pentamom.eth", - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0x7547266036D5E836720c5c90e41ecF4981629EE2": "sha237.eth", - "0xDcd9C2B905E70b2D5BE722FAbB6b4923C9d7AAA1": null, - "0x7A1057E6e9093DA9C1D4C1D049609B6889fC4c67": "wentokyo.eth", - "0x40acC257C3Ee9FC1147314b03509b5B1B52930F0": "minipent.eth", - "0x26ee99122DfC7E22a4a24ae70cfCc07561DDE2B3": "gib.eth" - }, - "safeUsers": { - "minipent.eth": 0.3333333333333333, - "pentacle.eth": 0.20833333333333334, - "gib.eth": 0.20833333333333334, - "sha237.eth": 0.125, - "0xriku.eth": 0.041666666666666664 - } - }, - "hypercertData": { - "workScopes": "minipent", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "pentamom.eth", - "rights": ["Public Display"] - } - }, - { - "title": "Rouge Ticket", - "address": "0xEb439EED5642641968f9D8b52F2788e0F19B443B", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xad3348a8338210c5d7eca4187a0267507d9dd8683fe02d253c4a17a952c5ef3c", - "projectDescription": "Web3 app to create events & sell NFT tickets", - "projectWebsite": "https://rouge.network/", - "projectLogoCid": "bafkreih73q5xy446dwm5mwglhicak5ipzn2jhqseuax2xuhslv3zjuojcm", - "projectBannerCid": "bafybeif2kztn5a2pvv4aisi4aezg4vmscvmagsk2lckotywmtcyyyf6c5m", - "projectTwitter": "rougetoken", - "projectGithub": "TheRougeProject", - "userGithub": "clbrge", - "fundingTotalDollars": 3395, - "donorsTotal": 714, - "fractionsTotalSupply": 3234, - "hypercertEligibleDonors": 684, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.07911265517613031 - }, - "hypercertData": { - "workScopes": "Rouge Ticket", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0xEb439EED5642641968f9D8b52F2788e0F19B443B", - "rights": ["Public Display"] - } - }, - { - "title": "1Hive Gardens", - "address": "0x1B8C7f06F537711A7CAf6770051A43B4F3E69A7e", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xad56d803c2be49755c3e74705f1dbc6c03197fe10df1698bde59822fc89dea03", - "projectDescription": "\ud83c\udf31\ufeff Gardens is a 1Hive initiative to create a template for public communities to coordinate shared resources from the bottom-up, taking the best lessons learned from the 1Hive community and allowing any DAO to implement them in a plug-and-play fashion. \n\nWith Gardens, anyone can set up a DAO in minutes, leveraging Conviction Voting, a Community Covenant, and the Celeste arbitration protocol, while also getting the network effects of joining a community of quickly blooming Gardens DAOs.", - "projectWebsite": "https://gardensdao.eth.limo", - "projectLogoCid": "bafkreidydrdodxzfdalfgtm3nolemn2hlfiio3j2xerjbjaqjrexeeofhu", - "projectBannerCid": "bafkreidnihaigw6fgqodgehhcins73jcefs2oa6nqferwthbq5l6tl25pq", - "projectTwitter": "gardensdao", - "projectGithub": "1hive", - "userGithub": "@pglavin2", - "fundingTotalDollars": 2829, - "donorsTotal": 405, - "fractionsTotalSupply": 2748, - "hypercertEligibleDonors": 375, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0x07AD02e0C1FA0b09fC945ff197E18e9C256838c6": null, - "0xc5fb85e1DA24B29Af7fF10450f0514C5d40d8322": "moutinho.eth", - "0xAbcb6D615918c17329F2e1C1797B4F4617515cC7": null, - "0x2F9e113434aeBDd70bB99cB6505e1F726C578D6d": "felipenovaesrocha.eth", - "0x5b0F8D8f47E3fDF7eE1c337AbCA19dBba98524e6": null, - "0x5141970563C7d70a129A05f575e9e34DF4bD81d8": null, - "0x809C9f8dd8CA93A41c3adca4972Fa234C28F7714": "paul2.eth", - "0xdf8f53B9f83e611e1154402992c6F6CB7Daf246c": null, - "0x60a9372862bD752CD02D9AE482F94Cd2fe92A0Bf": null, - "0xf632Ce27Ea72deA30d30C1A9700B6b3bCeAA05cF": "sem-the-bee.eth", - "0xe5F470E376554fB613A43FDe223e40a3bb338765": "twells.eth" - }, - "safeUsers": { - "paul2.eth": 0.2631578947368421, - "0x1B8C7f06F537711A7CAf6770051A43B4F3E69A7e": 0.10526315789473684, - "moutinho.eth": 0.2631578947368421, - "felipenovaesrocha.eth": 0.10526315789473684 - } - }, - "hypercertData": { - "workScopes": "1Hive Gardens", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x1B8C7f06F537711A7CAf6770051A43B4F3E69A7e", - "rights": ["Public Display"] - } - }, - { - "title": "Punk Domains - Modular Web3 Names Protocol", - "address": "0x12e838f846ffdade34b2e006f84117a370d71687", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xae97e83e49806ee023655c5ce84bb7837c7ad4fab73129d6ac089a3d48bfe268", - "projectDescription": "Punk Domains is a web3 domain/name protocol. What sets it apart from others (like ENS or UD) is that it can issue multiple domain extensions and allows for various types of names (single-purchase domains, renewable domains, soulbound domains etc.). It has a modular architecture that can cover any use case.\n\nAny DAO or web3 community can get their own domain extension via the Punk Domains protocol. KlimaDAO (.klima), PoolTogether (.pool), Smol Brains NFT community (.smol) and many others have already gotten their own respective domain extensions via Punk Domains.\n\nThe Punk Domains protocol is completely open source (all code is on GitHub) and permissionless - once you own your domain name no one can take it away from you.\n\nWeb3 domains are the essential part of the upcoming Web3 Social where they will be used as usernames and digital identity. Our mission is to help build this future.\n", - "projectWebsite": "https://punk.domains", - "projectLogoCid": "bafkreifo3yv3sscm3vfsfvaluoz5aaewegrunbbwskqeft652cltr7syyy", - "projectBannerCid": "bafybeicqanjg63u4uv7eubt3kvweb4rabjrjiuchzungki55ioel6v3hmm", - "projectTwitter": "PunkDomains", - "projectGithub": "punk-domains", - "userGithub": "tempe-techie", - "fundingTotalDollars": 4518, - "donorsTotal": 993, - "fractionsTotalSupply": 4310, - "hypercertEligibleDonors": 882, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.12482537558949647 - }, - "hypercertData": { - "workScopes": "Punk Domains", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x12e838f846ffdade34b2e006f84117a370d71687", - "rights": ["Public Display"] - } - }, - { - "title": "ETH Leaderboard", - "address": "0xD0AeA65bb96b823cb30724ee0a6B7588c77dE486", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xaedbc3eaef477409f3c3b5113f9674940e1dd80d4a783736607fdd9ab750c966", - "projectDescription": "ETH Leaderboard is a website that tracks Twitter accounts with .eth names.", - "projectWebsite": "https://ethleaderboard.xyz", - "projectLogoCid": "bafkreigmqaicmew42d2icvig7ynlljgt3ehd3zwizoncjxfznv3qz7fm2y", - "projectBannerCid": "bafybeihmn4eijzmxaxumu2lqqhrx5aywvenwyu4paapsy2lc6mpqwkgnbm", - "projectTwitter": "ethleaderboard", - "projectGithub": null, - "userGithub": "gskril", - "fundingTotalDollars": 2678, - "donorsTotal": 973, - "fractionsTotalSupply": 2505, - "hypercertEligibleDonors": 891, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "ETH Leaderboard", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0xD0AeA65bb96b823cb30724ee0a6B7588c77dE486", - "rights": ["Public Display"] - } - }, - { - "title": "Geo Web", - "address": "0xDE798cD9C53F4806B9Cc7dD27aDf7c641540167c", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xaf455647fcbc71f77390600d31dfe88e9c347634916d9f740197ac09e6ebe820", - "projectDescription": "SUPPORT THE OPEN METAVERSE\n-\nGeo Web is a set of open protocols & fair property rights for anchoring digital media to physical locations.\n\nIt creates decentralized consensus for an augmented, shared reality layer covering Earth guided by public good values rather than corporate profits. \n\nThe Geo Web will bring digital media, gaming, data, commerce, and NFTs into the physical world as shared experiences rather than siloed applications. \n-\nWhy the Geo Web?\n -\nLarge portions of our lives are shaped by our smart devices. This will only compound with the adoption of augmented reality smart glasses and other always-on wearables/embeddables. The foundations of our lived reality shouldn\u2019t be defined by arbitrary app store rules and the subversive, never-ending drive for corporate profit growth.\n\nWe\u2019re building the Geo Web because we think the metaverse should be based on permissionless, public internet infrastructure. It should be an extension of the ethos/design of the internet, the early web, and Ethereum.\n\nThe Geo Web is divided into digital land parcel NFTs which map 1:1 to the physical world. The market for digital land is administered under a partial common ownership (aka Harberger tax) system. Digital content can be anchored to the land utilizing our p2p content layer (Ceramic, IPFS, & Filecoin).\n\nThe Geo Web is a fair, efficient, and legitimate way to bootstrap and scale the metaverse across our shared planet. \n\nBy reinvesting 100% of land market proceeds into rewarding open-source developers, creatives, advocates, users, and public goods, we can create compounding network utility and value. The Geo Web is a choice for positive-sum coordination over fixed-mindset tradition.\n\nIf the Geo Web is successful, we can help spur the adoption of partial common ownership systems beyond our network and help redefine global property rights systems to be fairer and more efficient.\n-\nUpdate Since GR15\n- \nThe Geo Web launched on Optimism with a fair launch auction on December 15th, 2022! You can claim a parcel at your home, business, or favorite public place now at https://geoweb.land/. \n\nThis project has been a labor of love for over two years. We couldn't be more excited to be live and thankful for the support of all the Gitcoin contributors that empowered us to make it here.\n-\nPlans for Alpha Round Funding\n-\nWith the Geo Web platform/economic system live, the core team is shifting focus to building and supporting use cases with partners, builders, and creators. \n\nFunds received from this QF round will primarily be distributed to core team members and open source contributors through Coordinape Circles and/or Govrn's DAO contributor platform as we maintain that use case focus. We may allocate some of the funds to bounties on Dework and incidental costs of development/tooling/hosting use cases as well.\n\nThese funds will help bridge the core team until the Geo Web digital land market produces enough revenue to fund its own QF rounds (https://docs.geoweb.network/community-and-governance/network-funds-allocation). \n-\nLinks\n-\nDiscord - https://discord.gg/sbqWRGhb\nCadastre - https://geoweb.land/\nSpatial Browser - https://geoweb.app/\nWebsite - https://geoweb.network/\nGithub - https://github.com/Geo-Web-Project\nDework Bounties - https://app.dework.xyz/geo-web\nForum - https://forum.geoweb.network/\nDocs - https://docs.geoweb.network/\nTwitter - @thegeoweb\nNewsletter Signup - https://bit.ly/geowebsignup\nBlog - https://geoweb.network/blog\n", - "projectWebsite": "https://geoweb.land/", - "projectLogoCid": "bafkreifl3ynwvpodxcxoj2duwqcxjawgmsryxsz3kpe4cme3i5xqgwv4jq", - "projectBannerCid": "bafkreib6vcpfk6ri26t6h7gbixq4kw5hx7zzwrh7ne2cc3wmkrchgcmwgq", - "projectTwitter": "thegeoweb", - "projectGithub": "Geo-Web-Project", - "userGithub": "gravenp", - "fundingTotalDollars": 1356, - "donorsTotal": 274, - "fractionsTotalSupply": 1291, - "hypercertEligibleDonors": 248, - "ensName": "geoweb.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.2380284792451696 - }, - "hypercertData": { - "workScopes": "Geo Web", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "geoweb.eth", - "rights": ["Public Display"] - } - }, - { - "title": "Tally Ho! - Open Source and Community Owned Wallet", - "address": "0x99b36fDbC582D113aF36A21EBa06BFEAb7b9bE12", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xafb022ea11846bceb90516c35155defd6404e4948697cbfca25f5d34cf5321fb", - "projectDescription": "Help fund the development of the first open source and community owned decentralized Web3 wallet! All funds raised by this grant will flow to the community multisig wallet, which you can verify on Gnosis.\n\nIf you haven't tried the wallet yet, what are you waiting for? Download the extension at tallyh.org\n\nAre you a dev or an open source enthusiast? Come over to our Github repo and help us make the magic happen!\n\nFind out more about what we're building on our blog, and make sure to join the community on Discord!", - "projectWebsite": "https://tallyho.org", - "projectLogoCid": "bafkreihw53elvfa3oyjwbyivlkcxcdbrkfj3fnl564faktiirw5pduopjy", - "projectBannerCid": "bafybeif32ux4gpeii4ryfa5y6mdwv6cfipmr23arhuqgy2btu52jfuidfi", - "projectTwitter": "TallyHoOfficial", - "projectGithub": "tallyhowallet", - "userGithub": null, - "fundingTotalDollars": 57482, - "donorsTotal": 12622, - "fractionsTotalSupply": 54098, - "hypercertEligibleDonors": 12239, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0xd0415Bda753b6C3d9fc24e3556Ea7101599678A5": "woofwoofwoof.eth", - "0x2844a0d6442034D3027A05635F4224d966C54fD7": null, - "0x8be60fe9F7C8d940D8DA9d5dDD0D8E0c15A4288B": "jvk.eth", - "0xcaE6eb19f010abdADAdCCBBEA812cc3878a7E25c": null, - "0x7BF1cC6dd268fC92a16A49dB59b6e9803f33a81a": null - }, - "safeUsers": { - "0x99b36fDbC582D113aF36A21EBa06BFEAb7b9bE12": 0.03333333333333333, - "scott1up.eth": 0.03333333333333333 - } - }, - "hypercertData": { - "workScopes": "Tally Ho!", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x99b36fDbC582D113aF36A21EBa06BFEAb7b9bE12", - "rights": ["Public Display"] - } - }, - { - "title": "IDriss - A more usable web3 for everyone \ud83d\udc9a", - "address": "0x531Eb60b2dDE9a841BA358EE033533AAF90D1feA", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xb6a332decc38c703130a537ce7fcfe5a24bd85e52e0769994bc752d04e182cca", - "projectDescription": "\n\ud83d\udcd7 ABOUT\n\nEvery human on Earth deserves frictionless access to crypto and the benefits coming from using it: cheap and instant transactions, improved security & privacy, and investment opportunities.\n\nIDriss.xyz is on a mission to help provide that by building a suite of tools making web3 more usable for everyone.\n\nWe are strong supporters and defenders of community ownership, open source software development, and access to crypto for all. Join our community of 4000 members on Discord, and let's build a more usable web3 together \ud83e\udd1d\n\n\ud83c\udf4f HARVEST TIME\n\nThe last Gitcoin round (GR15) was extremely successful for IDriss. 3453 contributors helped raise over $20k! \n\nToday, we are introducing our next tool and the fruit of your donations - IDriss Send, a mass web3 onboarding protocol.\n\nIDriss Send allows individuals and dApps to send crypto & NFTs to anyone on Earth, using emails, phone numbers, and Twitter usernames - no wallet required.\n\nTry it out: https://www.idriss.xyz/send \u2728\n\n\ud83d\uddfa\ufe0f ROADMAP\n\nDonations to this grant will help fund further development of IDriss Send and IDriss Creators - solution for online creators on Twitch, YouTube, and other platforms to seamlessly receive tips in crypto \ud83d\udcb8 ", - "projectWebsite": "https://IDriss.xyz", - "projectLogoCid": "bafkreihj356qt35o5g4aftaylzdzn26arhy7igxlnocfdyb7h6v7twce7e", - "projectBannerCid": "bafybeihm26acxbaplooj5ya7mxa3npd3nkd4tgnkssbin2zfqffvn3mbge", - "projectTwitter": "IDriss_xyz", - "projectGithub": "idriss-crypto", - "userGithub": "", - "fundingTotalDollars": 15969, - "donorsTotal": 3347, - "fractionsTotalSupply": 15165, - "hypercertEligibleDonors": 3206, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0xC360510BA70697EBDC1A99Ab1e8235c0D1BEeDf7": null, - "0xcCE9A28b570946123f392Cf1DbfA6D2D5e636a1f": "geoist.eth", - "0x4a3755eB99ae8b22AaFB8f16F0C51CF68Eb60b85": "levertz.eth" - }, - "safeUsers": { - "geoist.eth": 0.6774193548387096, - "levertz.eth": 0.3225806451612903 - } - }, - "hypercertData": { - "workScopes": "IDriss", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x531Eb60b2dDE9a841BA358EE033533AAF90D1feA", - "rights": ["Public Display"] - } - }, - { - "title": "Giveth", - "address": "0x4D9339dd97db55e3B9bCBE65dE39fF9c04d1C2cd", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xb746c0f648f9b930ea4568cf8741067a7fc7eb3928ac13cced8076212cf3cf37", - "projectDescription": "We\u2019ve been making HUGE progress! Giveth is Building the Future of Giving and we are hitting our milestones. We launched GIVpower and now are setting our eyes on NFTs, Quadratic Funding & DAOifying nonprofits.\n \nGiveth.io is a radically open source, user-friendly donation platform that allows anyone to open crypto funding portals by creating projects for positive impact, with zero added fees and no intermediaries. Donors are also rewarded for giving to a wide range of projects that cover the field of for-good ventures including feeding the homeless, funding community currency projects, and saving the environment. Want to support public goods? It's all on Giveth.io! Projects can be created in minutes; donors can make contributions in seconds. Currently Giveth.io is live on both Ethereum Mainnet and Gnosis Chain.\n\n100% of every donation goes directly to the intended project, and we reward donors to verified projects with GIV. Learn more about our GIVbacks program here: https://medium.com/giveth/what-if-giving-gave-back-using-web3-to-evolve-philanthropy-a8500b7636ce\n\nNow at the start of 2023, we are delighted to announce some significant updates and future plans.\n\n\nMAJOR UPDATES THIS QUARTER\n\n- We launched GIVpower: A tool for supporting and curating your favorite projects on Giveth.io while earning rewards. It uses web3 incentives to rally support for, and drive more donations to, public goods projects. Learn all about it in this post and start boosting: https://medium.com/giveth/givpower-boosting-public-goods-to-the-next-level-bd335f92ecd3\n\n- We upgraded the verification process for streamlined onboarding of impact projects.\n\n- We integrated the Praise system to reward individual contributions. More info: https://givepraise.xyz/\n\n- A new Giveth Analytics Dashboard is live in alpha. More info: https://analytics-dashboard-blue.vercel.app/\n\n- And a lot more! Check out our end of year recap to see the other big milestones achieved this year: https://medium.com/giveth/building-the-future-of-giving-highlights-of-2022-26727ef11391\n\n\nGOALS FOR 2023\n\nThe following is a list of new products, partnerships and features that we have already begun to build for 2023. Our ability to execute on these goals is dependent on fundraising and the success of our economy, so if you want to support the Future of Giving, please add us to your cart and donate!\n\n\nIN PROGRESS\n\n- Integrate fiat donations\n\n- Partner with Gitcoin to bring Quadratic Funding to Giveth\n\n- Partner with Chainvine to create referral links and reward fundraisers with GIVbacks\n\n- Translate our products and documentation into Spanish and other languages to better integrate our global community\n\n- Launch a Giveth PFP collection to dip our toes in the NFT market\n\n\nUNDER RESEARCH\n\n- Partner with other L1s and L2s to bring more chains to Giveth\n\n- Create \u201cGIVdowments\u201d so interest earned on DeFi can easily be donated\n\n- Find an NFT launchpad to partner with to enable our projects to fundraise with NFTs\n\n- Build a better project ranking system, integrating impact and project owners assessment\n\n- Support projects in launching their own reputation systems to govern their donations as DAOs\n\n\nThank you for helping us Build the Future of Giving. We appreciate your support. We\u2019re all in this together!\n\n\nLEARN MORE\n\nSite: https://giveth.io/\nDiscord: https://discord.giveth.io\nNewsletter: https://paragraph.xyz/@giveth\n", - "projectWebsite": "https://giveth.io/", - "projectLogoCid": "bafkreiczgblqaa53byteenslgvjskag4cd47kq5bgmepp3uepprnuwsa3i", - "projectBannerCid": "bafybeihndmwk6vxjrcxkd5a4dtsvcxauy3yhynji6jmnjh2e5owua5ruce", - "projectTwitter": "Givethio", - "projectGithub": "Giveth", - "userGithub": "laurenluz", - "fundingTotalDollars": 8396, - "donorsTotal": 575, - "fractionsTotalSupply": 8257, - "hypercertEligibleDonors": 542, - "ensName": "giv.eth", - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0x38f80f8f76B1C44B2beeFB63bb561F570fb6ddB6": "freshelle.eth", - "0x839395e20bbB182fa440d08F850E6c7A8f6F0780": "griff.eth", - "0x00d18ca9782bE1CaEF611017c2Fbc1a39779A57C": "mateodaza.eth", - "0x5D28FE1e9F895464aab52287d85Ebff32B351674": "danigiv.eth", - "0xC46c67Bb7E84490D7EbdD0b8ecDaca68Cf3823F4": "karmaticacid.eth", - "0x05A1ff0a32bc24265BCB39499d0c5D9A6cb2011c": "willywonka.eth", - "0x826976d7C600d45FB8287CA1d7c76FC8eb732030": "divinecomedian.eth", - "0xDAa172456F5815256831aeE19C8A370a83522871": null, - "0xed8DB37778804A913670d9367aAf4F043AAd938b": null, - "0x2Ea846Dc38C6b6451909F1E7ff2bF613a96DC1F3": null, - "0x701d0ECB3BA780De7b2b36789aEC4493A426010a": "geleeroyale.eth", - "0x6D97d65aDfF6771b31671443a6b9512104312d3D": "markop.eth", - "0xA4D506434445Bb7303eA34A07bc38484cdC64a95": null, - "0x10a84b835C5df26f2A380B3E00bCC84A66cD2d34": null, - "0xF23eA0b5F14afcbe532A1df273F7B233EBe41C78": "aminlatifi.eth" - }, - "safeUsers": { - "aminlatifi.eth": 0.12, - "griff.eth": 0.06, - "divinecomedian.eth": 0.05, - "geleeroyale.eth": 0.04, - "mateodaza.eth": 0.03 - } - }, - "hypercertData": { - "workScopes": "Giveth", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "giv.eth", - "rights": ["Public Display"] - } - }, - { - "title": "LunCo: accelerating Lunar Colonization with opensource", - "address": "0xA64f2228cceC96076c82abb903021C33859082F8", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xb8a2970cb5c24a12cd631f757560b2c765a32bc1d48b010d8cd1f23cc645ea68", - "projectDescription": "Our mission is to accelerate Lunar Colonisation by providing open source engineering software to benefit humanity\n\nWe believe that permanent presence on another celestial body would help humanity to understand how small and fragile our planet is!\n\nImpact\n\n - Lowering the cost of space missions\n - Faster engineering, faster knowledge sharing\n - Decentralized and distributed space missions", - "projectWebsite": "https://lunco.space", - "projectLogoCid": "bafkreigggvubpdcmpznt6dg5oyjsgw55xg5ju5cc76brhysxcvkbjgzbuy", - "projectBannerCid": "bafybeihoc7rxlnbwp32e7d2h2pavhrv4rbblg2oz6f6fo4fmrayioocbvu", - "projectTwitter": "LunCoSim", - "projectGithub": "LunCoSim", - "userGithub": "Difint", - "fundingTotalDollars": 2499, - "donorsTotal": 119, - "fractionsTotalSupply": 2469, - "hypercertEligibleDonors": 106, - "ensName": "lunco.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.004634261306089692 - }, - "hypercertData": { - "workScopes": "LunCo", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "lunco.eth", - "rights": ["Public Display"] - } - }, - { - "title": "Blaine Bublitz - ETH/ZK Infrastructure & Ecosystem developer", - "address": "0x0E4d2ec48f03a9eD9068EeA2926dE34b6AB8646b", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xbab9b95ccf5784b8ba2a96627e10a71190820d2fee3c5034157c79e5945b77ab", - "projectDescription": "Blaine Bublitz builds infrastructure for ETH/ZK application development. He also collaborates closely with the Dark Forest team and other 0xPARC-adjacent projects.\n\nBlaine is a developer who is excited about web tech, open source, the future of decentralized virtual worlds, and ZK applications. He got hooked during the first public round of Dark Forest and has been building in the ZK application ecosystem ever since. Some of his work includes:\n\n** ZK Tooling and hardhat-circom **\n\nIn collaboration with Jacob Rosenthal, Blaine helped to rewrite Dark Forest's zkSNARK build processes. This work was generalized into the hardhat-circom plugin, a configurable hardhat plugin which provides developers with a set of ZK circuit build tasks, and provides TypeScript declarations for snarkjs.\n\n** Contributions to circom & snarkjs **\n\nBlaine contributes to circom and snarkjs on a regular basis. He\u2019s provided patches to reduce the bundle build by 50% and enabled WebWorker support.\n\n** Hardhat plugins **\n\nBlaine created and maintains a series of hardhat plugins, such as hardhat-diamond-abi and hardhat-settings, which make large-scale projects easier to manage. All of these plugins were made possible through funding raised on Gitcoin and will continue to be maintained as long as they are useful to people!\n\n** Project Sophon **\n\nAs one half of Project Sophon, Blaine open sources many experiments related to Dark Forest or other ZK ecosystem projects, such as darkforest-local, Broadcast market, and DF plugin-dev-server.\n\nGitcoin contributions will support Blaine's ongoing open-source work on ZK infrastructure, crypto-native gaming, and developer tools.", - "projectWebsite": "https://github.com/phated", - "projectLogoCid": "bafybeieqe5enwqcudxekje4auxvxk5oauxfu24cc2s6td3ywudh4ewto6u", - "projectBannerCid": null, - "projectTwitter": null, - "projectGithub": "https://github.com/projectsophon", - "userGithub": "https://github.com/phated", - "fundingTotalDollars": 1129, - "donorsTotal": 150, - "fractionsTotalSupply": 1093, - "hypercertEligibleDonors": 140, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "Blaine Bublitz", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x0E4d2ec48f03a9eD9068EeA2926dE34b6AB8646b", - "rights": ["Public Display"] - } - }, - { - "title": "Vyper Smart Contract Language", - "address": "0x70CCBE10F980d80b7eBaab7D2E3A73e87D67B775", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xbccb2617f0d5ddaf2d8d010d682575f679e73545ad74048dd8e20374ee3ff37a", - "projectDescription": "Pythonic Smart Contract Language for the EVM", - "projectWebsite": "https://vyperlang.org", - "projectLogoCid": "bafkreif5ydmrjv4z3i7xg4xpye6guql5ljtw3x3oj7gkdkgmxt7wcuibo4", - "projectBannerCid": null, - "projectTwitter": "vyperlang", - "projectGithub": "vyperlang", - "userGithub": "fubuloubu", - "fundingTotalDollars": 1999, - "donorsTotal": 375, - "fractionsTotalSupply": 1935, - "hypercertEligibleDonors": 334, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0x425d16B0e08a28A3Ff9e4404AE99D78C0a076C5A": null, - "0x00000C64586fC178E566aBadfD1119c03849520e": null, - "0x1C277bD41A276F87D3E92bccD50c7364aa2FFc69": "fubuloubu.eth", - "0x042Cc77196183b8C3D08Dc2acB74C1a456B131a5": null, - "0xAbfA48BCc0F96Fc70be7a4156b0a74Ea350167fD": null - }, - "safeUsers": { - "fubuloubu.eth": 0.36, - "0x70CCBE10F980d80b7eBaab7D2E3A73e87D67B775": 0.11 - } - }, - "hypercertData": { - "workScopes": "Vyper", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x70CCBE10F980d80b7eBaab7D2E3A73e87D67B775", - "rights": ["Public Display"] - } - }, - { - "title": "Lenster", - "address": "0x3A5bd1E37b099aE3386D13947b6a90d97675e5e3", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xbe519f8c8f7ff2acb359dd757c5d2bf25b05d9fd29b8684885aa27f1fa487fcf", - "projectDescription": "Lenster is a decentralized and permissionless social media app built with Lens Protocol \ud83c\udf3f", - "projectWebsite": "https://lenster.xyz", - "projectLogoCid": "bafkreiaaabeober6ur2xf3pjxufodzq443l4i5c5lbiyeipsl2jpd2vm5y", - "projectBannerCid": "bafybeiaz5llt67iscxakrvqlvvrlqphk2qhwypagnxztk4il3ssyqbyrli", - "projectTwitter": "lensterxyz", - "projectGithub": "lensterxyz", - "userGithub": "bigint", - "fundingTotalDollars": 84027, - "donorsTotal": 16113, - "fractionsTotalSupply": 79269, - "hypercertEligibleDonors": 15569, - "ensName": "yoginth.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.09904843636964825 - }, - "hypercertData": { - "workScopes": "Lenster", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "yoginth.eth", - "rights": ["Public Display"] - } - }, - { - "title": "IDENA", - "address": "0x8917418aBe36E6E788068E96EF5A47d7484C06b1", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xc11f49e0d04bfd2eb724cf01aeab92bf2329568859d21fe3e3d72741be73d4b4", - "projectDescription": "Idena is the first blockchain that utilizes a unique consensus mechanism called Proof-Of-Person, which prioritizes people over tokens. Unlike other systems that rely on money-based governance, Idena operates on the principle of \"one person, one vote,\" ensuring that power is distributed equally among all participants. This prevents a small group from gaining too much control. \n\nIdena offers a puppet-resistant crypto-identity primitive, which is used for democratic voting, Quadratic Funding, fair airdrops and decentralized governance.\n\nIdena is accessible to anyone. It does not require any personal information and allows participants to join the network without any investments. Users play an active role in mutual verification by challenging each other with AI-resistant FLIP-tests. This process is done in a synchronous ceremony, which ensures that individuals cannot spoof multiple accounts.\n\nThe network is protected from Sybil attacks through regular validations and Quadratic Staking. Quadratic Staking is a mechanism that prevents large stake holders from dominating the network and encourages small individuals to secure their identities with stakes ensuring democratic staking rewards distribution.\n ", - "projectWebsite": "https://idena.io", - "projectLogoCid": "bafkreihb6aoxbqzup5g6nmktqyiryrkax4k4o3rhqpncnuszhei7dneamm", - "projectBannerCid": "bafkreiboedudas4c3kygrhr6dpc6peqaar5ctbyq7627mp3velzxvemkem", - "projectTwitter": "idenanetwork", - "projectGithub": "idena-network", - "userGithub": "midenaio", - "fundingTotalDollars": 6089, - "donorsTotal": 1333, - "fractionsTotalSupply": 5742, - "hypercertEligibleDonors": 1228, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.013384591712418611 - }, - "hypercertData": { - "workScopes": "IDENA", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x8917418aBe36E6E788068E96EF5A47d7484C06b1", - "rights": ["Public Display"] - } - }, - { - "title": "ZeroPool", - "address": "0x947F8A49640B4770A8c7fE3C1E69FfC974295448", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xc290dd8e51ac35480d9872ce4484aac23bb812c47c0567bfd4beb9113726ed11", - "projectDescription": "ZeroPool is blockchain agnostic privacy engine. Our solution is build on zkSNARKs. We research and create privacy technologies under fully opensource license and you can use it in your products.\n\nEVM, Substrate, NEAR implementations are available and live on testnet, and WAVES implementation is coming soon.\n\nWhat is under the hood:\n\n* Fawkes-crypto / Circom / Groth16 / Poseidon / * Solidity / Typescript / Angular / NestJs / RxJS\n\nFuture Plans:\n* Switch to Plonk Q1 2023\n* Implementation of newest polynomial constructions, providing lightweight proofs and TPS speedup Q1 2023\n* ZkZkRollup Q2 2023\n\n\nhttps://goerli.testnet.frontend.v2.zeropool.network/\n\nhttps://near.testnet.frontend.v2.zeropool.network/\n\nhttps://substrate.testnet.frontend.v2.zeropool.network/\n\n", - "projectWebsite": "https://zeropool.network", - "projectLogoCid": "bafkreiau5536yiuxdzsr5qy7h5fi2qidjnojzn6bgjlxop7al5svwjsla4", - "projectBannerCid": "bafkreictcgcrwq5ps772mcjljgidwkjqpg7ftyhggkht3mw5r4gpsedcia", - "projectTwitter": "zeropoolnetwork", - "projectGithub": "zeropoolnetwork", - "userGithub": "snjax", - "fundingTotalDollars": 7306, - "donorsTotal": 1317, - "fractionsTotalSupply": 6928, - "hypercertEligibleDonors": 1227, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "ZeroPool", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x947F8A49640B4770A8c7fE3C1E69FfC974295448", - "rights": ["Public Display"] - } - }, - { - "title": "vfat.tools", - "address": "0xeF0Ca09fbf9a5f61E657Fb208b46b8685c1d4766", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xc5b3ff259773efe69ed973d346afa656a1a6195bc7156098d2e7fc3ede11cf44", - "projectDescription": "vfat.tools is a suite of calculators for yield farming. It is a fork of yieldfarming.info, expanded to include many different types of projects, while maintaining the minimal aesthetic of the original. \n\n\n\nKey offerings:\n\nMore information than is typically shown in a project's own rich graphical interface\nConcise presentation, so you can view all of your positions in one page\nAlternative interface for interacting with a farm's smart contracts\n\n\nAll listings on the site are and always will be free, and the site will always be free of ads and tracking cookies and so forth.\n\n\n\nFuture plans include:\n\nMore lovely farm projects\nAn API with information about each farm\nAdvanced features like adding single-sided liquidity or claiming from multiple pools simultaneously\n\n\nAny grants will go towards maintaining the current modest server costs, and investing into a full node setup which will lessen the site's reliance on MetaMask.\n\n\n\nIf you have a farm or feature you would like to suggest, please get in touch!\n\n\n\nAddendum: vfat.tools v2 development is on-going at full speed, awill include features such as:\n\n-Portfolio view\n\n-Farm comparison/search\n\n-Farm-assistant contracts (compound, claim all in 1 click, and more)", - "projectWebsite": "https://vfat.tools", - "projectLogoCid": "bafkreih6qz52obxuuo3omjsxfzsneuof7ynpiewmkk4labvcdjbwd6otrm", - "projectBannerCid": null, - "projectTwitter": "vfat0", - "projectGithub": "vfat-tools", - "userGithub": "vfat0", - "fundingTotalDollars": 3146, - "donorsTotal": 676, - "fractionsTotalSupply": 3008, - "hypercertEligibleDonors": 651, - "ensName": "vfat.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.07740102834231606 - }, - "hypercertData": { - "workScopes": "vfat.tools", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "vfat.eth", - "rights": ["Public Display"] - } - }, - { - "title": "Spect", - "address": "0x55B23ed53Fe13060183b92979c737A8eF9A73b73", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xb701f16a30a2ed49d7820ad83352ee1c048b2bff81a1d9734cdd7a27708c72c6", - "projectDescription": "Spect helps crypto native organizations centralize context and decentralize decision making at the same time.\n\n**Problem Statement**\n\nAs DAOs scale to larger number of contributors, it is naturally becoming harder and harder to maintain a shared sense of context among all contributors. This has led to the formation of sub-DAOs and guilds. However, most of the current tooling to manage grants, bounties and tasks, distribute rewards and make decisions are built for monolithic DAOs instead of modular ones. Moreover, these tools are point solution which means each tool serves a specific purpose. Therefore, with every addition of a new tool for a new use case, there is a loss of context among contributors.\n\n**About Spect**\n\nAt Spect, our goal is to centralize context while at the same time decentralize decision making. To do this, we have built a tool for DAOs to form circles (or sub-DAOs) that manage grants, bounties and tasks. A tool that can also be used by contributors to fund each other and build history of contributions with soulbound tokens and verifiable credentials.\n\n**What can Spect be used for today?**\n\n1. Forming organizations that can scale N levels deep\n2. Run Ecosystem Grants Program\n3. Run Onboarding Program\n4. Run Surveys\n5. Manage Tasks and Contacts as a community\n\nHere are docs on how these can be implemented in an organization -\nhttps://docs.spect.network/\n\n**Features**\n\n1. Fully customizable tables, kanbans, lists and gantts which can be used to setup workflows\n3. Web3 enabled, sybil protected forms with ability to analyze and export responses\n3. Extensive Automations to automate chores\n4. Credentialing using soulbound tokens and verifiable credentials\n5. Payment on Ethereum, Polygon, Optimism, Arbitrum, Gnosis Chain, BNB Chain and Avalanche with any token using personal wallets or gnosis multi-sigs.\n\n**Integrations**\n\n1. Discord to map roles and automatically assign roles, send messages and create channels using automations.\n2. Guild.xyz to map roles and give granular permissions\n3. Gitcoin Passport for creating sybil protected forms\n4. Mintkudos to distribute soulbound tokens to contributors\n5. Snapshot to run voting periods on form responses and other data\n\n**What is upcoming?**\n\n1. Templated Use cases - Organizations will be able to setup advanced workflows within seconds with templates\n2. Complete Composability - Spect will be made composable on various different levels. Both developers and non-developers will be able to build their own applications with Spect. We already have an early version of our API docs that developers can use. In the near future, tables, lists, boards and forms will be made embeddable such that non-developers can build their own experiences using these.\n3. Make it possible for anyone to build custom widgets and bots on Spect.\n\n**How we will use the funding?**\n\nThe funding will be used to pay for infrastructure costs and contributor salaries.\n\n**What can you do?**\n\n1. Fill up the early adopter form and claim a soulbound token -\nhttps://circles.spect.network/r/074c06d9-120f-4b99-87a9-c0f6e415c9a3\n\n2. Create your first circle on\nhttps://circles.spect.network/\n\n3. Follow us on Twitter -\nhttps://twitter.com/JoinSpect\n\n4. Come say gm on\nhttps://discord.gg/AxWkJVfN\n\n5. Read and collect our manifesto -\nhttps://mirror.xyz/chaks.eth/us5rOm1jSsvmvqBOmef_SZSP6zzbNeo7ay-_DkacC64\n", - "projectWebsite": "https://spect.network", - "projectLogoCid": null, - "projectBannerCid": null, - "projectTwitter": "JoinSpect", - "projectGithub": "spect-ai", - "userGithub": "adityachakra16", - "fundingTotalDollars": 1319, - "donorsTotal": 106, - "fractionsTotalSupply": 1294, - "hypercertEligibleDonors": 90, - "ensName": "chaks.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.26089015269786187 - }, - "hypercertData": { - "workScopes": "Spect", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "chaks.eth", - "rights": ["Public Display"] - } - }, - { - "title": "BanklessDAO Projects", - "address": "0xf26d1Bb347a59F6C283C53156519cC1B1ABacA51", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xc87ab7d2537f30cbf929f26a9ac8d760411a56f129fb9c6e2cbd3529f136a010", - "projectDescription": "THE BANKLESSDAO MISSION...\nBanklessDAO is a decentralised community coordinating and propagating bankless media, culture, and education. BanklessDAO launched on May 4, 2021, and its goal is to drive adoption and awareness of truly bankless money systems like Ethereum, DeFi, and Bitcoin.\nTogether, the BanklessDAO community collaborates to create user-friendly onramps for people to discover decentralised financial technologies through education, media and culture.\nThe BanklessDAO community runs a variety of projects; for the scope of this grant we are focusing on the ones which truly provide goods and services for the entire world such as BANKLESS ACADEMY, BANKLESS AFRICA, and INTERNATIONAL MEDIA NODES. \nThe projects listed below have had contributors working on them for many months and although some of the project contributors earn governance tokens, the work being done far outstrips the existing remuneration. Second, and perhaps more important, is that all these projects aim to help the wider crypto ecosystem and not just the Bankless community \u2014 and hence are public goods.\nBANKLESS ACADEMY\n\ud83d\ude80 Brief\nBankless Academy is a leading web3 \"knowledge on-ramp\" - a practical & engaging education experience with infrastructure preparing to be scaled across the blockchain multiverse.\nWe're helping the world adopt the permissionless tools they need to go Bankless.\n\ud83d\udd25 Vision\nWe are building a web3 world where:\n\ud83d\udcda Information is frictionless and free.\n\ud83d\udc4a Communities are high impact creators.\n\ud83c\udf10 Education is permissionless (no central body dictates what you can/can't see).\n\ud83d\uddfa\ufe0f Trajectory\nCurrent focuses:\nEstablish a Bankless-native syllabus/user journey to move users from Centralised Exchanges to Ethereum Layer2 self-custody.\nPursue collaboration with popular dApps to educate users on trusted tools available to them.\nBuild theory lessons with expert guests from the Bankless 'Hall of Fame'.\nForm frontier partnerships so that the Academy dApp continues to support interoperability and cutting-edge use cases.\nContinue research, development, and onboarding for our whitelabel platform to scale our efforts into other web3 ecosystems.\nBuild a framework for contributor content creation to empower talented community educators.\n\ud83d\udcc0 Try the dApp:\nhttps://app.banklessacademy.com/\nMultiple wallets supported\nMobile friendly\nNo download\nhttps://giveth.mypinata.cloud/ipfs/QmPkVpSqhUr1bUALLHL2ErzytqM5wHh2RmkCF82GApe8Lv\n\ud83c\udf0f Let's scale permissionless education together!\nBANKLESS AFRICA\nOur community is focused on promoting the bDAO mission. We leverage crypto-based creations like Bitcoin, Defi, NFTs etc. to tackle problems faced by Africans.\nAchievement/Growth:\n*Our podcast highlights projects and people making impact in the African crypto/Web3 ecosystem.\n*Our Newsletter provides well curated information on Bitcoin, DeFi, crypto regulations, projects and Web3 funding in the crypto/Web3 space in Africa.\n*Our website helps Africans access educational courses. It includes a link to Bankless Academy where lots of Web3 courses are available. Eventually this website will become a native-educational platform for Africans.\nWebsite v1 here: https://banklessafrica.com/\n*We onboard and train contributors with various Web3 ethos, teaching them how to contribute in various DAOs and potentially bootstrap project ideas they have.\nSome links to get into our community: https://linktr.ee/banklessafrica.\n\ud83c\udf0f INTERNATIONAL MEDIA NODES (IMN)\nOnly 5% of the world\u2019s population are native English speakers and roughly 15% speak English on some level. The initial goal of the IMN project is to reach the remaining 80% by translating and distributing content about blockchain technology, DeFi, the Metaverse and Web3. All links: https://www.banklessimn.xyz/\nThe International Media Nodes project believes in the liberating effect of going Bankless and what it can do for improving financial wellbeing and stability throughout the world. Creating and maintaining communities of people who do not speak English and educating them/opening the door for them to onboard to Web3 is one of the most crucial pieces of infrastructure if we want Web3 to be any different from Web2.\nThe story so far\u2026\nIn Q1 2022, the total audience grew by 52% as compared to the previous quarter and our total reach is over 40,000 audience members in over 20 languages. We have more than 100 active contributors speaking 20 different languages from all parts of the world. We have worked with prominent DAOs in Web3 such as Polygon, Tribe and Yearn.\nOver the next months and years, as we continue to produce content we will also start developing local language communities which will develop Web3 talent in local languages as well as organising events in different geographical locations to onboard more people.\n\nOur Ask to the Crypto Community ...\nAt the highest level, the Web3 education provided by BanklessDAO stands to empower humanity with the informed decision-making required in our digital future. We firmly believe that we align with the vision of the Gitcoin Community, and that together we can work to slay Moloch.\nWe seriously can\u2019t wait to show you what we have to offer this space.\nLet\u2019s Impact Together!\nBanklessDAO believes in the liberating effects of going Bankless and the impact our ideal can have on improving the financial stability and wellbeing of our world, both in learning and translation. With the help of the Gitcoin Community, we will accelerate the spread of an ungated Web3 education for everyone.\nLet\u2019s help the world go Bankless!", - "projectWebsite": "https://www.bankless.community/", - "projectLogoCid": "bafkreifhgemr6res2dsvkqy26vc4eveaf2g6qmjdqg3rnjal6cy4lmorwq", - "projectBannerCid": "bafybeigxjivwgcz4njxfdky5yw7kzysfghusf6j72srucr3adn4msgryde", - "projectTwitter": "https://twitter.com/banklessDAO", - "projectGithub": null, - "userGithub": "https://github.com/BanklessDAO", - "fundingTotalDollars": 5999, - "donorsTotal": 1191, - "fractionsTotalSupply": 5677, - "hypercertEligibleDonors": 1088, - "ensName": "banklessvault.eth", - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0x23dB246031fd6F4e81B0814E9C1DC0901a18Da2D": "abvavgjoe.eth", - "0xb6ac0341Fcf3FB507A8208D34a97f13779e1393D": "icedcool.eth", - "0x47f882a155209F55D280EB36577c100A74DD32a1": null, - "0xE71eFd5865A42Cb0f23146Dc8E056dBA4E67e9b7": "frogmonkee.eth", - "0xE4067ED66738dBDC7b8917703C8c380d898033F8": "grendel.eth", - "0x4f8c2d5397262653Cd8956CB977A0bA3660210c7": "redvan.eth", - "0x35EA12472d6fb21A9dB24B397AA2775D332C14B7": null - }, - "safeUsers": { - "0xf26d1Bb347a59F6C283C53156519cC1B1ABacA51": 0.15, - "abvavgjoe.eth": 0.08, - "natew.eth": 0.07 - } - }, - "hypercertData": { - "workScopes": "BanklessDAO Projects", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "banklessvault.eth", - "rights": ["Public Display"] - } - }, - { - "title": "Pepemon: Degen Battleground", - "address": "0xB614B1464c561EB2fD0d7d3475feB52B5a34dEc0", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xc8fca067d1ecb57b625e640263d153190fe1258c34e8a4ae85396fe502fd6164", - "projectDescription": "Pepemon it's a DAO owned by the players building open gaming goods in web3.\n\nDegen Battleground is the first Pepemon game. A play and earn trading card game, it's powered by DeFi, using NFTs as in-game assets, and governed decentralized by the players. An easy to learn, difficult to master Trading Card Game where users will duel each other on blockchain in their journey to become the very best.\n\n\nPepemon started in 2020 as one of the new decentralized economies with a 99.86% airdrop of the tokens to the community members that helped spreading the word on our mission: build a blockchain game that it's owned by the players.\n\n\nSince inception we launched different dapps in our economy including:\n\n- Our staking platform with ~80% of PPBLZ token in staking or ~$3mil TVL.\n\n- A NFT Store that sold more than $1mil of digital cards.\n\n- A way for Pepetrainers to stake and evolve their existing NFTs in NFT Staking Events.\n\n- A Unity game app pending launching on Android, iOS and web.", - "projectWebsite": "https://pepemon.world/", - "projectLogoCid": "bafkreigc3btspx23qle7f2tfmixxtpuuy24kczhwl6hyan5xmtgl5x4zga", - "projectBannerCid": "bafybeib6gr5cvr57woddflh5qs77vupapsoheullv5smcoujlhhcjzneeq", - "projectTwitter": "pepemonfinance", - "projectGithub": null, - "userGithub": null, - "fundingTotalDollars": 1780, - "donorsTotal": 389, - "fractionsTotalSupply": 1674, - "hypercertEligibleDonors": 317, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0xE71FbB197BC8fD11090FA657C100d52Dbb407662": "pepemonworld.eth" - }, - "safeUsers": { - "pepemonworld.eth": 1.0 - } - }, - "hypercertData": { - "workScopes": "Degen Battleground", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0xB614B1464c561EB2fD0d7d3475feB52B5a34dEc0", - "rights": ["Public Display"] - } - }, - { - "title": "CryptoStats", - "address": "0x69aa21403244889832609963B0028e337a834953", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xc99a1b5395a53118fcd4be537cb89c6f4ed5e98d6e00211cf7c31fbb14b882e2", - "projectDescription": "CryptoStats is an open project with the following mission:\n\nOne neutral source of truth for crypto metrics. Used by everyone, managed by the community.\n\nCryptoStats provides open, trustworthy data metrics for the whole crypto ecosystem. It also operates a number of popular websites, such as CryptoFees.info.", - "projectWebsite": "https://cryptostats.community", - "projectLogoCid": "bafkreigywlryh7vgflfy4gmxtny7jsla4thfzjin4cjzai7v24homy2duy", - "projectBannerCid": "bafybeicyy7gvzypsz2atjy7d4bv33styfmiprrksfit7gtxgej54cdmo54", - "projectTwitter": "cryptostats_", - "projectGithub": "crypto-stats", - "userGithub": "dmihal", - "fundingTotalDollars": 8493, - "donorsTotal": 189, - "fractionsTotalSupply": 8447, - "hypercertEligibleDonors": 171, - "ensName": "cryptostats.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.009635873827168892 - }, - "hypercertData": { - "workScopes": "CryptoStats", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "cryptostats.eth", - "rights": ["Public Display"] - } - }, - { - "title": "POAPin", - "address": "0x5Afc7720b161788f9D833555b7EbC3274FD98Da1", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xcc6d33fe291d0fafb19cf8b833dc27d2f469fac52e3cc1f050ca4a0d83d66c74", - "projectDescription": "POAPin is a series of tools built on the POAP ecosystem. \n\n\nCurrently, POAPin has apps for Android, iOS, macOS, and a web-based POAP explorer. The basic function is to finely organize and share POAP. The web version also has the function of creating custom topics and grouping POAPs together. There is also pin.poap.in to create code to embed POAPs in web pages. ", - "projectWebsite": "https://poap.in", - "projectLogoCid": "bafkreibw5gkdmtk73dx3vmx3kcu63niqaewdlhltniqjnu66sonjvcuyxq", - "projectBannerCid": "bafybeibuojh3uquz6cr2ujcrbpfa7rzqtsiq36hnc3uuxgyglnsvctx4oq", - "projectTwitter": "glorylaboratory", - "projectGithub": "glorylab", - "userGithub": "RockerFlower", - "fundingTotalDollars": 14199, - "donorsTotal": 2689, - "fractionsTotalSupply": 13500, - "hypercertEligibleDonors": 2443, - "ensName": "glorylab.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "POAPin", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "glorylab.eth", - "rights": ["Public Display"] - } - }, - { - "title": "Relay", - "address": "0x0cb27e883E207905AD2A94F9B6eF0C7A99223C37", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xd1b13c5816a63928dfce0aa47bdc3262a1bdf2eec24800b465b1fd3ddee2f2af", - "projectDescription": "Relay has two open-source products: \n1) A directory of quality ImpactDAO, Regen, and ReFi projects\u2014along with their verified ENS or Lens \n2) An open-source wallet messenger that allows users to encrypted chat with the Impact projects or each other, decentralized on the XMTP off-chain message network. \n\nGrants would go directly to Relay's development roadmap, for features including: improving the messenger filters to detect spam and token holdings, adding many more Regen projects, adding web3 profiles with Gitcoin Passport, and training a chatGPT bot to support and onboard users onto ImpactDAO projects, via documentation embedding. \nThank you for reading and enjoy using relay.cc!\n\ud83c\udf3f\ud83c\udfc5", - "projectWebsite": "https://relay.cc", - "projectLogoCid": "bafkreihyqkmlwjlbaqtku2wef4tckfyvawwcqpqtqyaqih3c7arzx3pdfq", - "projectBannerCid": "bafybeidflp6uxivcc7cn7irfjxuexf7frwloyvafd3dqe7vimtaht2b5s4", - "projectTwitter": "relay_eth", - "projectGithub": "relaycc", - "userGithub": "seanrelay", - "fundingTotalDollars": 4318, - "donorsTotal": 799, - "fractionsTotalSupply": 4137, - "hypercertEligibleDonors": 731, - "ensName": "seanwbren.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.038444744616829285 - }, - "hypercertData": { - "workScopes": "Relay", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "seanwbren.eth", - "rights": ["Public Display"] - } - }, - { - "title": "Gitcoin China Ecosystem Development", - "address": "0x521aacB43d89E1b8FFD64d9eF76B0a1074dEdaF8", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xd3bd2111f80027d538cc252a13afacad8eb0b1565a58d0655eda3b718b88e767", - "projectDescription": "\u52a0\u5165\u4e2d\u6587TG\u7fa4\u7ec4\nWelcome to join us -> https://t.me/gitcoincn\n\n\n\nUpdate 2022.09.02\nGitcoin\u4e2d\u6587\u5468\u62a5\uff1a\u8ba2\u9605\u5165\u53e3 - http://news.gitcoinchina.com/\n\n\u5173\u6ce8\u5fae\u4fe1\u516c\u4f17\u53f7\uff1aGitcoinChina\n\n\n\nUpdate 2022.05.27\nWe are going to have more people to join the AMA sharing session, for more info, please click\n\nhttps://www.gitcoinchina.com\n\n\n\nUpdate 2022.2.25\nWe made decision to have Gitcoin Chinese AMA on Discord server\n\nJoin us by blick https://discord.gg/gitcoin\n\nmove to #\u4e2d\u6587AMA-\u6bcf\u5468\u4e9421:00\n\n\u6bcf\u5468AMA\u5305\u542b\uff1a\n\n\u6bcf\u5468Gitcoin\u66f4\u65b0\nGrant\u4ecb\u7ecd\nAMA\u73af\u8282\nUpdate 2021.11\nWe have published new website: http://gitcoinchina.com/\n\nWe have Chinese AMA each Friday, record here.\n\nWelcome to join us -> https://t.me/gitcoincn\n\n\n\nFDD User Support\nBob leads FDD User Support workstream, if you would like to contribute to GitcoinDAO, please goto \n\nhttp://gitcoindao.com/\n\nAnd then fill in the contributor form.\n\nLooking forward to work with you, grow Gitcoin together ;)\n\n\n\nWe have website: https://gitcoinchina.com/\n\nChinese AMA each Friday, please find info on our homepage.\n\n\n\nWhat has been done?\nCommunity support\n\nforum moderation (discord discussion)\ntelegram group & wechat group\nContent (sharing)\n\nGTC&Gitcoin sharing https://www.bilibili.com/video/BV1h44y167ra\nGitcoin articles I translated before (on my blog, 5 posts there)\ntranslation introducing GTC (https://gitcoin.co/blog/introducing-gtc-gitcoins-governance-token/) https://mp.weixin.qq.com/s/0HFZFdg8TWoHRa0i0H9IBg \nGitcoin and GTC sharing on Bihu\nWhat support is needed?\nRegular sync with Gitcoin team\nFunding support (for Bounties)\nTranslation materials (platform) - crowdin\nOnline meetup (speaker support)\nWhat are in future?\nGitcoin product support in China\nContinual community support like:\nForum moderation (and Discord discussion)\nTelegram group & Wechat group moderation\nProject connection\nGrant support\nGTC (and governance) support and other product support\nMeetups\nOrganize online/offline Gitcoin meetups in China\nAttend/support other conference with Gitcoin introduction (like EDCON)\nContent\nTranslation \nBlog & website (about/mission/support)\nKnowledge base and API document\nNewsletter (WeChat publication)\nCreate new China focused content\nOnline and offline meetup (slides)\nChannel\nCreate wechat official channel with dedicated Chinese contents\nEmpower community to moderate wechat group - staff it and manage the community moderation etc\nModerate Chinese language Telegram group\n", - "projectWebsite": "https://bobjiang.notion.site/bobjiang/Gitcoin-China-3f84469c07d7482e9c1f5eeae58a2dd3", - "projectLogoCid": "bafybeiffhsmsanue5phm5ljkjznnfxyrvhukd3ryqn5okw6cxrp2dgm7xu", - "projectBannerCid": "bafybeieznp2yh6qsdpwmijyuur2ct2gj3h2maqtu6gdk43qu7cxjv6bfbu", - "projectTwitter": "https://twitter.com/GitcoinCN", - "projectGithub": null, - "userGithub": null, - "fundingTotalDollars": 2982, - "donorsTotal": 656, - "fractionsTotalSupply": 2812, - "hypercertEligibleDonors": 541, - "ensName": "bobjiang.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.009129865608344912 - }, - "hypercertData": { - "workScopes": "Gitcoin China Ecosystem", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "bobjiang.eth", - "rights": ["Public Display"] - } - }, - { - "title": "Faster API for resolving ENS names and avatars for web3 projects", - "address": "0xC9C022FCFebE730710aE93CA9247c5Ec9d9236d0", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xd58acf63d9a2800eca8752855dd9da3214f67a4321a3a40a6355f5ea3ca2f2a6", - "projectDescription": "I've integrated ENS resolving into several projects now (both my own and as a contributor/collaborator), but found the standard approach of querying ENS contracts directly to be quite slow for most use cases, and can quickly eat up Alchemy/Infura node resources if you're not careful.\n\nTo help with this, I built an incredibly fast API (thanks to Cloudflare's edge caching) for resolving and reverse-resolving ENS names and addresses and avatars (30-50ms with a warm cache).\n\nAPI docs are here: https://ensideas.com/about\n\nAnd open source code here: https://github.com/holic/ens-ideas", - "projectWebsite": "https://ensideas.com/about", - "projectLogoCid": "bafkreibgiznmys6i7gtmtea7yasjmvty6fwf2ofc6twuwx76jarald3y5m", - "projectBannerCid": null, - "projectTwitter": "frolic", - "projectGithub": null, - "userGithub": "holic", - "fundingTotalDollars": 836, - "donorsTotal": 165, - "fractionsTotalSupply": 796, - "hypercertEligibleDonors": 148, - "ensName": "frolic.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.3314735117561508 - }, - "hypercertData": { - "workScopes": "API: Resolving ENS names and avatars", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "frolic.eth", - "rights": ["Public Display"] - } - }, - { - "title": "ETHRank - The open source achievement system for every Ethereum address", - "address": "0x0D538d6253Eb5CeBaEf94a873a7d3DF22D6F936c", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xd8e0de535ba58db6a7226c577a7f8f51afaa8461a026bfe7ab9ba3a32e83e344", - "projectDescription": "ETHRank is an open-source, merit-based ranking system for every Ethereum address.\n\nSeason 3 features over 80 projects from the Ethereum ecosystem, including Gitcoin.\n\nThis season focuses on these four categories:\n\n1. DeFi\n\nOwning different tokens, swapping tokens, lending/borrowing, joining DAOs, and gas spending all contribute to this category.\n\n2. Reputation\n\nPerforming bounties, web3 gaming, interacting with many wallets, earning merit badges all contribute to this category.\n\nIn Season 3, we've aggregated all the top web3 reputation protocols.\n\n3. NFTs\n\nOwning NFTs, using NFT platforms, collecting web3 domains, generative art, CC0 collections, all contribute to this category.\n\n4. Staking\n\nRunning a validator and participating in various ETH2 staking protocols contribute to this category.\n\nETHRank's community includes some of Ethereum's most active users and contributors.\n\nCheck your score today at ethrank.io.", - "projectWebsite": "https://ethrank.io", - "projectLogoCid": "bafkreih7ygujpbxdac5h5z6iamyrkboh6dde2loh75h4mxu3zvvwuve3da", - "projectBannerCid": "bafybeiflmdef57dof2eugussdzdtlvdycmb5jq6baf4rdvjq2xkvmckjq4", - "projectTwitter": "eth_rank", - "projectGithub": "", - "userGithub": null, - "fundingTotalDollars": 3163, - "donorsTotal": 703, - "fractionsTotalSupply": 2980, - "hypercertEligibleDonors": 611, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "ETHRank", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x0D538d6253Eb5CeBaEf94a873a7d3DF22D6F936c", - "rights": ["Public Display"] - } - }, - { - "title": "Inverter Network - Fund and build in web 3 with ease", - "address": "0x10666d9c6295E838d3b8B84ffcC97d62EF7e6120", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xdbcfdc1e2ba83ed0c8d392a3abcd107bdff361f345e011e052366a7be05b37a3", - "projectDescription": "About \nInverter Network is here to help you build and fund on web3 with ease. As a team, we pride ourselves on the diversity of our backgrounds and experiences, enabling us to see challenges from multiple angles and develop innovative solutions. Our team includes individuals with expertise in web3, web2, multinational companies, international organizations, and community builders from 6 different countries. Together, we offer a unique perspective on strategy and execution.\n\nProject TLDR;\nInverter is an \u2018Operations Portal\u2019 for organizations to manage their grants programs, funding operations, and treasuries. It is a one-stop-shop for contributors to apply for funds, manage funds and maintain feedback loops with funders and community stakeholders. It is a milestone-based funding mechanism that enables due diligence primitives such as KYC verifications, entity establishment, automated invoicing, and on-chain equity activation to open pathways to loan financing. \n\nProject Overview \n\nInverter dApp is inspired by the Operations Portals that are being used to fund over 1.2 trillion USD for development projects across the globe by organizations like United Nations, World Bank, and European Union. Our aim is to interconnect the novel technologies of web3 to the grounded funding infrastructures of traditional organizations to improve access to funding and inspire distributed ownership for builders and funders of the next generation of the internet regardless of their backgrounds. \nSimply said Inverter is an \u2018Operations Portal\u2019 for organizations to manage their grants programs, funding operations, and treasuries. It is a one-stop shop for contributors to apply for funds, manage funds, and maintain feedback loops with funders and community stakeholders.\nInverter Product MAIN Features TL DR \n(2022)Initial Release:\nMilestone-based Long term project/workstream funding and joint funding with reduced overhead\nTransparency around funded projects for communities\nOrganizations can manage and track their incoming proposals and funded proposals from one organizational page \nTeams can have one common proposal that can be used for applying to, streaming funding from, maintaining accountability with, and receiving continuous feedback from many organizations. \nAbility to withdraw funding from a project\n(2023) Funder Treasury accounts that can run yield earning and diversification strategies with continuous payment abilities\n(2023) On-chain milestone-based investment based on KPIs and Due Diligence\n(2023) Multi-token funding with fluid funding governance\n(2023) Tax-deductible donations\n(2023) On-chain organization(DAO, Association, etc.) establishment \n(2023) Community Conviction Signaling \n", - "projectWebsite": "https://www.inverter.network", - "projectLogoCid": "bafkreig2jbttucuxtm5u34dolj7hu2xfxxkbi62daibjceletxvxyobwvm", - "projectBannerCid": "bafybeich5abdm2hddpkapb7zm7wtr4jptbylmkswobxyufslc56in6s4di", - "projectTwitter": "inverternetwork", - "projectGithub": "InverterNetwork", - "userGithub": "", - "fundingTotalDollars": 5688, - "donorsTotal": 603, - "fractionsTotalSupply": 5564, - "hypercertEligibleDonors": 545, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0x4282A4Fc7Cf468b6128c9aCBfdE7a98F3836A107": null, - "0xe6b3b65c35f7A0BD5940eEb0B91A3f61FF7e2514": null - }, - "safeUsers": { - "0x10666d9c6295E838d3b8B84ffcC97d62EF7e6120": 0.38461538461538464 - } - }, - "hypercertData": { - "workScopes": "Inverter Network", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x10666d9c6295E838d3b8B84ffcC97d62EF7e6120", - "rights": ["Public Display"] - } - }, - { - "title": "Zero Knowledge Podcast", - "address": "0x0b0E6486648FBBb8E9ab33e3ae9D0B44B6faa701", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xdce910ac23823b6f29196e90eda26ad6fb42e7726a49a7affe24b4780eaf6c80", - "projectDescription": "Zero Knowledge is a podcast which goes deep into the tech that will power the emerging decentralized web and the community that is building it. Covering the latest in zero knowledge research and applications, the open web as well as future technologies and paradigms that promise to change the way we interact \u2014 and transact \u2014 with one another online. \n\n\n\nZero Knowledge is hosted by Anna Rose.\n\n\n\nThis funding helps us to pay the staff working on the show, transcripts on our episodes, some upcoming Zero Knowledge 101 content, the next zkSummit event (happening March 30 2023 !), a ZK merch line and more! ", - "projectWebsite": "https://zeroknowledge.fm", - "projectLogoCid": "bafkreigm3v2fjmrfq6ho3vasmaiexs7gbnwxhaui6jh27kyipbq4gnv5dm", - "projectBannerCid": "bafybeigpscgybprvbcl7m2csawgtimnczsbbmgt7rtvvvfigugxp5tlxl4", - "projectTwitter": "zeroknowledgefm", - "projectGithub": null, - "userGithub": null, - "fundingTotalDollars": 3217, - "donorsTotal": 680, - "fractionsTotalSupply": 3077, - "hypercertEligibleDonors": 628, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "Zero Knowledge Podcast", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x0b0E6486648FBBb8E9ab33e3ae9D0B44B6faa701", - "rights": ["Public Display"] - } - }, - { - "title": "datalatte", - "address": "0x690315449eFad5f8B06a356f16eecFC41F475F70", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xdeffc2d190ddec88d06ba86e1eb09abe5a9ccb49ab1dc1a6005ebd7afae0489f", - "projectDescription": "Datalatte is a two-sided dApp that enables people to anonymize, tokenize, and monetize their data, while providing researchers and organizations with survey-based insights to develop and improve their products.\n\nDatalatte aims at transforming market research towards ethical practices with a focus on the ownership and privacy of data. This leads to bridging the economic gap by enabling people to monetize their digital footprint on a secure and fair decentralized application. Currently, traditional apps often harvest user data and sell it to other companies without the user's knowledge or consent, and users receive no compensation for their data. This has led to the rise of large corporations that hold a monopoly on data and influence our daily lives. At the same time, researchers and small and medium-sized companies struggle to obtain data to build predictive models for various purposes, such as finding jobs, providing healthcare, and educating children.\n\nSince the implementation of the General Data Protection Regulation (GDPR) in 2018, internet users have the right to access their personal data on each platform. However, many people are unaware of this right and the value of their data. Datalatte aims to address this issue by leveraging decentralized technologies such as cryptocurrency, decentralized applications, and exchanges to empower people to gain control over their data and its use.\n\nTo achieve data democracy, Datalatte plans to store tokenized data in users' wallets using protocols like IPFS and Filecoin for decentralized storage and Ocean protocol's Data NFTs for compliant and self-sovereign data licensing and monetization. However, the current table-structured data model is not easily understandable and requires significant resources to extract insights. Datalatte aims to address this issue by using a graph-structured data model based on small Knowledge Graphs (KGs), which allow for easy access and utilization of data through the use of Natural Language Processing (NLP) and offer higher computational efficiency through privacy-preserving data pipelines.\n\nThe goals of Datalatte include empowering internet users to monetize their data, providing data scientists with access to affordable data, enabling full control and ownership of personal data for internet users, and creating a data-backed income through personal data monetization. To achieve these objectives, Datalatte will develop a decentralized data store that allows users to sell their data rather than having it sold by large corporations.\n\nOverall, Datalatte aims to create a more equitable and transparent system for data monetization by empowering individuals and providing researchers and small businesses with access to valuable data.", - "projectWebsite": "https://datalatte.com", - "projectLogoCid": "bafkreigbqulls7vuoxiyz2u2nrqm35jvw6mwldza5dnx7xezevrjqmyydu", - "projectBannerCid": "bafybeidwuri3nzqcow3cy36cy4o6oj4oqd7fghqsuizgzycivwwpzvxmfi", - "projectTwitter": "datalatte_", - "projectGithub": "datalatte-ai", - "userGithub": "amirmabhout", - "fundingTotalDollars": 845, - "donorsTotal": 127, - "fractionsTotalSupply": 813, - "hypercertEligibleDonors": 111, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "datalatte", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x690315449eFad5f8B06a356f16eecFC41F475F70", - "rights": ["Public Display"] - } - }, - { - "title": "Electronic Frontier Foundation", - "address": "0x640C28441f9e73537C63576A0D6f44643a577E32", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xe1ae0696ac9550ffde401be8421f3ed3fc89d8c2a672797263be1d32dfe5eb43", - "projectDescription": "For over 30 years, EFF has been the leading nonprofit advocate for the privacy and free speech rights of technology creators and ordinary users. Our team achieves success through impact litigation, policy analysis and education, grassroots activism, technology development, and support from the public. EFF's mission is to ensure that technology supports freedom, justice, and innovation for all people of the world.\n\nCOMMUNITY ADVOCACY\n\nFrom the early days of the web, EFF understood that we must protect access to technology in order to advance freedom for all. In the years that followed, EFF used its fiercely independent voice to clear the way for open source software, encryption, security research, file sharing tools, and a world of emerging technologies. EFF\u2019s work in the growing movement for web decentralization and the public interest internet is no different.\n\nIn order to combat the ever-consolidating power of corporate giants (and end the gatekeeping, surveillance, and censorship that often accompany them), many have looked toward blockchain-based technology and cryptocurrency for remedies. EFF is optimistic about the ability of digital currency to support independent community projects, route around financial censorship, and support independent journalists around the world.\n\nWhile there are still many problems to solve in the blockchain ecosystem, the world needs thoughtful, user-focused advocates like EFF to help uncover the opportunities for public good. This is why EFF fought a poorly-defined cryptocurrency provision in the Biden Administration\u2019s infrastructure bill that could create onerous requirements affecting user privacy, and EFF also introduced bright-line rules that Congress should adopt when developing cryptocurrency regulations; we\u2019ve written extensively about the ways financial intermediaries censor legal speech; we submitted comments to FinCEN opposing the agency\u2019s proposal for new privacy-invasive regulations of cryptocurrency transactions; and we\u2019ve called for blockchain intermediaries to issue transparency reports and protect the rights of their users. During the Tornado Cash controversy, EFF spoke out for the speech protections on software code and represented Johns Hopkins Professor Matthew Green, who made a fork of the code and posted the replica so it would be available for study. EFF also reached out to The U.S. Office of Foreign Assets Control (OFAC) to seek more clarity on their interpretation of the sanctions listing. \n\nOPEN SOURCE SOFTWARE PROJECTS\n\nWhile EFF is proud to be a leading voice in online rights debates, we also develop gratis and open source tools to enhance everyone\u2019s freedom online. Your donations provide critical support for EFF\u2019s wide-ranging work, which includes projects such as:\n\n- Atlas of Surveillance: This project launched in collaboration with hundreds of EFF members and university students. With over 10,000 data points and counting, the Atlas is the largest searchable database of U.S. law enforcement\u2019s surveillance technologies.\n\n- Certbot: This software tool allows you to automatically deploy Let's Encrypt certificates to enable HTTPS on your website. EFF even helped develop Let\u2019s Encrypt which has in turn enabled free and easy encryption across the web!\n\n- Cover Your Tracks: This successor to EFF\u2019s Panopticlick demonstrates how well your browser and add-ons protect you from tracking and fingerprinting.\n\n- HTTPS Everywhere: This tool automatically connects users to the encrypted version of many major sites. Just over a decade after its launch, EFF declared success and announced the planned deprecation of our HTTPS Everywhere plugin because the functionality had been incorporated into all of the major web browsers, making it unnecessary.\n\n- Privacy Badger: With millions of active installs, this browser add-on was the first to specifically focus on blocking tracking in advertisements, instead of just the ads themselves. EFF\u2019s open-source technology has also inspired other widely used privacy tools, including the Brave browser and Safari\u2019s tracker blocking.\n\nThe world relies on the internet to stay connected and informed more than ever before, and that gives you a pivotal opportunity to stand up for technology users everywhere. Your support for EFF ensures that we always have a vocal advocate wherever tech and civil liberties meet.", - "projectWebsite": "https://eff.org", - "projectLogoCid": "bafkreicnljmaur4op2irvuflb3utpt62qivsjumfy3mm6nky6wrankruna", - "projectBannerCid": "bafkreie5wkhybbs5oomyaq4aufqcoeo76lbv3jhokmy4tcb3pzdfpvxa7q", - "projectTwitter": "eff", - "projectGithub": null, - "userGithub": null, - "fundingTotalDollars": 1761, - "donorsTotal": 230, - "fractionsTotalSupply": 1703, - "hypercertEligibleDonors": 217, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "Electronic Frontier Foundation", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x640C28441f9e73537C63576A0D6f44643a577E32", - "rights": ["Public Display"] - } - }, - { - "title": "Nimi.eth", - "address": "0xdE81d67Af572EC0F22841da702C1EdC25608dBBB", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xe2f4ea6f46ef9d67818f71b8c40403b8528768af11f7fe0c2d10cd2afe21de62", - "projectDescription": "Nimi allows users to effortlessly host on their ENS domain, making web3 websites easy. Use Nimi as your link-in-bio, display your favourite POAPs, share your social links - and collect all the Nimi themes!", - "projectWebsite": "https://nimi.io", - "projectLogoCid": "bafybeiar7p2rzc5dmgxnjagqcks6dsp56gzyw66tkspyfwv7tntewlrruq", - "projectBannerCid": "bafybeia7q7gvddjyxwvxgtucwurbt47dn3bimp5cb3nty7tfb5za3yhpye", - "projectTwitter": "0xNimi", - "projectGithub": "nimi-app", - "userGithub": null, - "fundingTotalDollars": 4271, - "donorsTotal": 677, - "fractionsTotalSupply": 4123, - "hypercertEligibleDonors": 637, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "Nimi.eth", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0xdE81d67Af572EC0F22841da702C1EdC25608dBBB", - "rights": ["Public Display"] - } - }, - { - "title": "Commons Stack", - "address": "0x8110d1D04ac316fdCACe8f24fD60C86b810AB15A", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xe6424ab2ed95b21ba758a64a72e3a4583a01cad6b12419420ae7286c70ecae83", - "projectDescription": "We build tools and protocols that enable impact-driven communities to deploy their own token economy to advance their mission through regenerative funding, commons governance and community building. The Token Engineering Commons was the first successful launch using our Commons design patterns. We plan to support on-the-ground ReFi communities next and open source our protocols to allow other purpose or public good-focused communities to deploy their own Commons. \n\nPlease also consider supporting our joint venture with ReFi DAO to build a ReFi Commons Incubator: https://grantshub.gitcoin.co/#/chains/1/registry/0x03506eD3f57892C85DB20C36846e9c808aFe9ef4/projects/179\n\nDonate to Refi Commons as well here!\n\n\nWHAT IS COMMONS STACK?\n\nCommons Stack started as a think-tank primarily focused on crypto-economic primitives to underpin a design framework for a Commons, a tokenized community with a mission benefitting a public good. We aspired to scale commons as a way to realign incentives with public goods. To achieve this, we needed to elaborate cultural designs that reinforce commoning principles and create novel tools such as the Augmented Bonding Curve (ABC), Conviction Voting (CV) and the Praise reward and reputation system. \n\nOur Commons design patterns are made up of a suite of cultural frameworks and a curated library of tools for governance, funding, proposal, analytics and initialization of a Commons. Some have come straight out of our research collaborations - such as the ABC, CV and Praise. We also use Collaborative Economics, a methodology for enabling the community to collectively propose iterate and finalize the parameters of their Commons\u2019 economy.\n\nWe see the work of Elinor Ostrom as our North Star and set out to weave her principles of governing commons into the cultural fabric of a Commons. Our Cultural Build defines practices for clear boundaries, conflict resolution, monitoring, participatory decision-making, and others principles. \n\nOther things we have done are supporting BlockScience in open-sourcing cadCAD, developing the edutainment program Commons Simulator, launching the Trusted Seed, developing a collaborative economics method, deploying the Token Engineering Commons (TEC) - the first field test for our Commons design patterns, launching the Commons Prize and doing a discovery of the needs of Grassroots Economics, the winner of the prize.\n\nWhile we have already had some success, we have only just begun. Our research continues. The lessons learned from a first field test, the Token Engineering Commons (TEC), are being rolled into new deployment protocols and our curated commons library of tools and processes continues to evolve. \n\nWe did not get this far alone. We have collaborated with BlockScience, Blossom Labs, Metagov, Curve Labs, PrimeDAO, Giveth, 1Hive, Aragon, Token Engineering Academy, Token Engineering Commons, and many others.\n\nMuch of our Github activity (https://github.com/commons-stack) is collaborative. We work hand in hand with General Magic, Token Engineering Commons and Praise, specifically:\nhttps://github.com/givepraise/\nhttps://github.com/commonsbuild\nhttps://github.com/GeneralMagicio/\n\n\nPLANS FOR ALPHA ROUND FUNDING\n\nFor this round, we will focus on one deliverable - donations to this grant will contribute to the costs of open-sourcing our Commons deployment protocols. Our intention in doing so is to allow any community to deploy its own commons-inspired economy, i.e, the intentionally ground-up launch of an economy to support a purpose or public good.\n\nWe are in process of building the guidelines for initializing and deploying a Commons. Funding will enable our team to continue our work on the open-source documentation of our deployment protocols that will help Commons facilitate the communal management of public goods through a regenerative economic system. \n\nThe documentation covers the four phases of the Commons deployment: Engage, Incubate, Hatch and Launch. In every phase, we outline the processes, tools and different concepts that will bring about the creation of a sustainable and scalable Commons.\n\n \nUPDATES SINCE GR15\n \nDonations from the Gitcoin GR15 helped our team accomplish the following in the last quarter:\n \n- We worked with our pilot Commons to grant over $400,000 to various Token Engineering initiatives, via the economic system we collectively designed.\n\n- The Token Engineering Commons has proved out the value of the Augmented Bonding Curve and Trusted Seed approach, as participating in the Hatch has been one of the better investments in crypto (beating the price of ETH by over 2x)\n\n- Co-developed Praise and spun it out to be its own independent project, focused on becoming a reputation system and rewards distribution tool. We open-sourced the deployment and supported several communities in using it.\n\n - Worked on-the-ground in Kenya with Grassroots Economics to understand the needs for their complex economic model and jointly explore possible solutions.\n\n- Initiated the \u201cLaunch a Commons\u201d campaign to engage purpose-driven web3 communities in becoming tokenized communities that will create and steward public goods.\n\nThank you for your generosity! \ud83d\ude4f", - "projectWebsite": "https://commonsstack.org/", - "projectLogoCid": "bafkreiajbf7swocekdtnevjir67videhgxjtjk3vnwumubazvdejli7h5a", - "projectBannerCid": "bafkreick5f3lez5vbbnwevsk3wgdp5fg4n6z4ts5uz7iyaafriy5jwgtfe", - "projectTwitter": "commonsstack", - "projectGithub": "", - "userGithub": "", - "fundingTotalDollars": 5636, - "donorsTotal": 508, - "fractionsTotalSupply": 5522, - "hypercertEligibleDonors": 464, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.009632580466447712 - }, - "hypercertData": { - "workScopes": "Commons Stack", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x8110d1D04ac316fdCACe8f24fD60C86b810AB15A", - "rights": ["Public Display"] - } - }, - { - "title": "Optinames | ENS on Optimism", - "address": "0x1208a26FAa0F4AC65B42098419EB4dAA5e580AC6", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0x3e4b3f7089aa5cb6614b67e235624d01364febe418419bc1b165e77d8589e5a2", - "projectDescription": "What are Optinames?\n\nOptinames are tradable and transferable sub-domains wrapped as ERC721s & fully integrated with the Ethereum Name Service (ENS). They can be resolved on L1 Ethereum by utilizing an off-chain resolver.\n\nImportant Links:\n\nGithub: https://github.com/stevegachau/optimismresolver\n\nOff-chain Resolver on L1 - https://etherscan.io/address/0x9fb848300e736075ed568147259bf8a8eefe4fef#code\n\nSubdomain NFTs on Optimism - https://optimistic.etherscan.io/address/0x9fb848300e736075ed568147259bf8a8eefe4fef#code\n\nSubdomain Example on ENS App - https://app.ens.domains/name/nick.ecc.eth/details\n\nSubdomain Example on Etherscan - https://etherscan.io/enslookup-search?search=nick.ecc.eth\n\nSubdomain Example on Rainbow Wallet - https://rainbow.me/nick.ecc.eth\n\nSubdomain Example on Opensea - https://opensea.io/assets/optimism/0x9fb848300E736075eD568147259bF8a8eeFe4fEf/2\n\n\nWhat We Do:\n\nThis project is leading the charge in making it easier & cheaper to acquire and utilize ens domains. We are implementing the latest technologies released by the ENS team (CCIP Read & Off-chain resolution) to make it possible for users to register subdomains on Optimism while making them available & resolvable on L1 Ethereum.\n\nIn addition to providing free ENS subdomain on Optimism (currently ecc.eth), OptiNames is partnering with NFT projects & gaming communities building their games on any Layer 2. These communities will be utilizing our tech and smart contracts to provide free usernames & gamer-tags that double up as ENS subdomains.\n\nAdoption:\n\nThe first project utilizing Optinames to issue subdomains to their community is ECC Name Service. ECC Name Service has since grown to become the Number 1 domain collection on Optimism.\n\nRegistrations: 17,725\n\nWhat Next?: Optinames is working on and will soon be launching ENS Wildcards on L2\n\nMany NFT communities on Ethereum and L2s have expressed a desire to use ENS names and subdomains to identify and connect with their users and holders. However, requiring each NFT holder to manually register an ENS subdomain can be cumbersome. This creates unnecessary friction for NFT holders, who often stand to benefit greatly from the usability improvements offered by ENS names.\n\nWildcard subdomains offer a solution to this problem by allowing every NFT holder to receive an ENS name automatically at no cost & without any registration step. The process for the ENS domain holder is simple: just link their domain name to the NFT collection they want to support. From there, digit subdomains (linked to an NFTs token ID) will automatically point to and resolve to the current owner of the NFT in the chosen collection.\n", - "projectWebsite": "https://optinames.eth.limo", - "projectLogoCid": "bafkreig6io7p6k3q53wbu4h3qz7cbnkcrldatu54tlxioej4ovby2gd7yq", - "projectBannerCid": "bafybeidzfmpm6ua2lviqprjznrp4qcj54ihyuiaoliry5ldktygaysthhq", - "projectTwitter": "OptiNames", - "projectGithub": "stevegachau/optimismresolver", - "userGithub": "stevegachau", - "fundingTotalDollars": 37384, - "donorsTotal": 4334, - "fractionsTotalSupply": 36239, - "hypercertEligibleDonors": 4144, - "ensName": "opti.ecc.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.005292506414766423 - }, - "hypercertData": { - "workScopes": "Optinames", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "opti.ecc.eth", - "rights": ["Public Display"] - } - }, - { - "title": "BrightID \ud83d\udd06 Universal Proof of Uniqueness", - "address": "0x4B8810b079eb22ecF2D1f75E08E0AbbD6fD87dbF", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xe9dfc4da2e9fbcf33042b9c978322967e52985162659fa8a0627bc8573cbbb59", - "projectDescription": "BrightID \u2013 an open source Sybil-resistant identity lego.\n\nWe are thrilled to be working with Gitcoin to reduce the impact of Sybil accounts. With your help, we added over 63,000 verified BrightID users. Thank you for the amazing support so far! Let's keep the momentum going!\n\nGet 50% bonus matching for all your Gitcoin grants by joining BrightID and connecting it to your Gitcoin Passport . After completing your passport, come back and link it to the trust bonus screen in your Gitcoin profile page.\n\nIf you are not already verified, please come to one of our many daily online meetings.\nVisit meet.brightid.org/\n\n\ud83d\udd06 What has BrightID core team been up to?\n\nSince the last Gitcoin Grants round, BrightID core has added the following features:\n* Support for multiple devices and improved account recovery\n* Aura scoring integration\n* Wifi sharing for large data transfers\n* Improvement to and first large scale use of Blind Signatures for improved privacy\n* Powering free crypto gas distributions at unitap.app\n\nThere are more details in our monthly update posts at brightid.mirror.xyz\n\nSome amazing projects are already integrating with BrightID. \nCheck them out at apps.brightid.org\nWill your project be next?\n\n\ud83d\udd06 What is BrightID?\nBrightID is building an identity lego that allows users to prove to applications that they only exist once in any given system.\n\nWhat if you could always prove you were a real unique user?\nIt\u2019s easy in the real world to ensure you\u2019re dealing with a unique or a specific person, but imagine how many systems could be improved or made possible if every user or account could prove they only exist once as we transition to the digital era?\n\n* Digital voting and governance - including quadratic voting, liquid democracy, and signaling\n* Truly universal income or airdrop distributions payable to literally everyone\n* Public-goods funding allocation - trust minimized and collusion resistant thanks to MACI\n* Social media without millions of bots polluting the discourse\n* Credit systems for under-collateralized DeFi\n* And so much more...\n\n\ud83d\udd06 How does it work?\nBrightID is creating a giant pseudonymous social graph of people all around the world. Users can make private, cryptographically secure connections to people they know, using a smartphone app. This pseudonymous connection data is shared among a decentralized group of computer nodes that store and analyze the public social graph. The nodes of the network determine and verify the likely uniqueness of each account, based on its interconnectivity with other accounts. The user can then use their BrightID verification to prove to any integrated system that they have one and only one account. The potential integrations are endless.\n\n\ud83d\udd06 Where will my contributions go?\nBrightID Main DAO is a LAO (a DAO with a legal wrapper) that stewards centralized pieces until they can be decentralized, such as the app registry, website, and app store entries. It also has stewardship over grant and sponsorship income, and functions as a non-profit. It has been committed to BrightID\u2019s core mission and funded the core team since its inception in Feb 2020.\n100% of contributed funds will go to BMAIN DAO.\n\n\ud83d\udd06 Bright DAO!\nBright DAO pulls in many contributors from the community to grow BrightID at a faster pace. Using the gardens DAO format pioneered by 1Hive, contributors can create their own proposals and receive their own funding in $BRIGHT community governance tokens.\n\nCome help us build a brighter world.\n\n", - "projectWebsite": "https://www.brightid.org", - "projectLogoCid": "bafkreiadate4cocvimh422fmc3kcwpcbftawuexl3mnmvs3kwtbrcc4km4", - "projectBannerCid": "bafkreiggaqod3axjmtujagb4tcbxojb2gxtqsdfrcdeockxr7fn6j7b7ua", - "projectTwitter": "BrightIDProject", - "projectGithub": "BrightID", - "userGithub": null, - "fundingTotalDollars": 20021, - "donorsTotal": 4032, - "fractionsTotalSupply": 19049, - "hypercertEligibleDonors": 3768, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "BrightID", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x4B8810b079eb22ecF2D1f75E08E0AbbD6fD87dbF", - "rights": ["Public Display"] - } - }, - { - "title": "Revoke.cash - Helping you stay safe in web3", - "address": "0xe126b3E5d052f1F575828f61fEBA4f4f2603652a", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xf05829c76e3da92a8942378240ab4dc70c8c509f558eca9b0621c61054e9342c", - "projectDescription": "Hey all, we're building free and open source tools to help you stay safe in web3! \ud83d\udc4b\n\nTo use tokens in decentralised applications such as Uniswap you have to grant the application permission to spend tokens on your behalf - known as an allowance. Allowances are an important part of using these apps, but can be dangerous if left unchecked.\n\nBugs can exists and exploits can happen even in established projects, and by approving token allowances you are potentially exposing your wallet to these exploits. To keep yourself safe from allowance exploits it is a good practice to regularly inspect and revoke your allowances.\n\nRevoke.cash comes in as a preventative tool to manage your token allowances and practice proper wallet hygiene. By regularly revoking active allowances you reduce the chances of becoming the victim of allowance exploits.\n\nIn many cases, phishing websites try to make you sign an allowance while they pretend to be an NFT mint or other legitimate use cases. When these phishing scams happen, it is recommended to use Revoke.cash to mitigate the damage, but it is even better to prevent the scam in the first place.\n\nThis is where the Revoke.cash Browser Extension comes in. The extension pops up whenever you are about to sign an allowance and will inform you of the allowance details. This can help you prevent signing malicious allowances.", - "projectWebsite": "https://revoke.cash", - "projectLogoCid": "bafkreihvbycub5glpe5a27qwx2dtsbafu7c5ven4xqwgnmhaemzgqxthey", - "projectBannerCid": "bafkreigh4n4cg4xidzk3dwrtvynsoyti3aau3zmoq5xjp5jicrxwbaj5ae", - "projectTwitter": "RevokeCash", - "projectGithub": "RevokeCash", - "userGithub": "rkalis", - "fundingTotalDollars": 37390, - "donorsTotal": 7500, - "fractionsTotalSupply": 35467, - "hypercertEligibleDonors": 7203, - "ensName": "kalis.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 4.406374932541299 - }, - "hypercertData": { - "workScopes": "Revoke.cash", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "kalis.eth", - "rights": ["Public Display"] - } - }, - { - "title": "MetaMail", - "address": "0x3806a85D9b8E017d2714B5a240f3e7737279a3Ba", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xf22becdb87631f44c3cf5839e471811ed21c4200324cc9e5e16771703d03e819", - "projectDescription": "MetaMail is the web3 email provider. With MetaMail users use wallet/ENS as email address (e.g. suneal.eth@mmail.ink), and sign/encrypt to ensure the security. MetaMail is compatible with other mail like Gmail. All those features are totally free, no gas fee.\n\nMetaMail just won Gold Prize in EthShanghai22 Hackathon! We need you help to keep MetaMail free and neutral. We have open-sourced our frontend code at Github. In the future, we plan to open source the MetaMail email protocol and help users to host their own MetaMail service.", - "projectWebsite": "https://metamail.ink", - "projectLogoCid": "bafybeihl2sgajv6wyt6u3d3kiq53rdyyudwswqwn3d7boq7ofqqxjgwbva", - "projectBannerCid": "bafybeigaq7bdinqnxhu7mqs5qk7cqn2qbedelzfww3ecsnikiljeioom5e", - "projectTwitter": "MetaMailInk", - "projectGithub": "MetaMail", - "userGithub": "Gooong", - "fundingTotalDollars": 14334, - "donorsTotal": 3712, - "fractionsTotalSupply": 13491, - "hypercertEligibleDonors": 3486, - "ensName": null, - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.0 - }, - "hypercertData": { - "workScopes": "MetaMail", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x3806a85D9b8E017d2714B5a240f3e7737279a3Ba", - "rights": ["Public Display"] - } - }, - { - "title": "OpSci Society: The Open Science DAO", - "address": "0x33359285F30E7B3386dE70ca500F4fe27853765B", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xf315ffb4e59dd53cdd1d0d14e03e756a7d9f6abbec449b1d577993c1cbb2277a", - "projectDescription": "OpSci builds open source tooling for web-native identity, reputation, funding, and reproducible science. \n\nThe OpSci ecosystem is composed of three services: \n\n1) Commons - a decentralized data commons that offers free archival for large reproducible neuroimaging datasets.\n\n2) Verse - a DeSci Society registry that links verifiable impact with funding streams on-chain.\n\n3) Fellowship - a permission-less grant program that provides a stipend for researchers at all levels performing work at the intersection of Web3 and DeSci.", - "projectWebsite": "https://opsci.io", - "projectLogoCid": "bafkreic3mwzm5hkjrto7jt3hbstra3owkwi2olc7iv2g7wfgxydombjn6m", - "projectBannerCid": "bafybeiegmfnfzvzhagmyjnn3djubzbhajcd4eeka5sbkhh7dency2dbmay", - "projectTwitter": "opscientia", - "projectGithub": "opscientia", - "userGithub": "seldamat", - "fundingTotalDollars": 1147, - "donorsTotal": 177, - "fractionsTotalSupply": 1106, - "hypercertEligibleDonors": 139, - "ensName": "ltd.opscientia.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.22628434919805063 - }, - "hypercertData": { - "workScopes": "OpSci Society", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "ltd.opscientia.eth", - "rights": ["Public Display"] - } - }, - { - "title": "Upala \ud83e\udd16 Price-of-forgery digital identity", - "address": "0x0230c6dD5DB1d3F871386A3CE1A5a836b2590044", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xf84c0ab44e4012f6f20be3e08fe0a775835df0c091fdf0fa9e0a20ca6e0de53f", - "projectDescription": "Proof of person-hood system that provides human uniqueness score to DApps and beyond.\n\nUpala account score represents how much it would cost to forge the account and valued in dollars.", - "projectWebsite": "https://docs.upala.id/en/latest/", - "projectLogoCid": "bafybeie7fhpesqgyf4ycf6xg63qjwfy5glxmcgaabj33g6kdwja6amwara", - "projectBannerCid": null, - "projectTwitter": "TheUpala", - "projectGithub": "upala-digital-identity", - "userGithub": "porobov", - "fundingTotalDollars": 2212, - "donorsTotal": 395, - "fractionsTotalSupply": 2149, - "hypercertEligibleDonors": 366, - "ensName": "multipassport.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.09951882692134979 - }, - "hypercertData": { - "workScopes": "Upala", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "multipassport.eth", - "rights": ["Public Display"] - } - }, - { - "title": "DeFi & Web3 Developer Roadmap", - "address": "0xB25C5E8fA1E53eEb9bE3421C59F6A66B786ED77A", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "roundName": "Open Source Software", - "projectId": "0xb6c349a5461b888f265c039d0081fdff98cab0bd51a31458437acdacc117b237", - "projectDescription": "I present to you the most comprehensive knowledge base for developers from A to Z.\n\nAll information is checked by the repository author. New tools and researches are added regularly. I check the database daily and tweet out updates and new materials I've found.\n\nFeel free to submit a pull request, with anything from small fixes to translations, docs or tools you'd like to add! Here you can track all my activities in one place!", - "projectWebsite": "https://github.com/OffcierCia/DeFi-Developer-Road-Map", - "projectLogoCid": "bafybeie5be662iz7mxtb7qofwm7o2arqhbvae5jsbrxktlw7nbwyj2jyje", - "projectBannerCid": "bafybeid3bdh55q5ifqovvoid5d2zilpwplerfoii3k6cacrvmhgxorrvfe", - "projectTwitter": "officer_cia", - "projectGithub": null, - "userGithub": "OffcierCia", - "fundingTotalDollars": 2702, - "donorsTotal": 481, - "fractionsTotalSupply": 2605, - "hypercertEligibleDonors": 462, - "ensName": "officercia.eth", - "addressType": "EOA", - "addressScan": { - "optimismAddressFound": true, - "optimismBalanceEth": 0.002150671546741064 - }, - "hypercertData": { - "workScopes": "DeFi & Web3 Developer Roadmap", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "officercia.eth", - "rights": ["Public Display"] - } - }, - { - "title": "Bundle: Agriculture", - "address": "0x78Dc08c6f14e26B2C91edAE9a6e03eed7Ae5218B", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x0b84bfa1e358e2c7816e5244258c16e4d6d06930fb4cf20f2d714ce35d330308", - "projectDescription": "\ud83c\udf31\u00a0This grant bundles 8 initiatives devoted to transforming agriculture to provide healthy food, water, material, medicinal security to communities, regenerated working lands for improved carbon & water cycling, and biodiversity as well as general ecosystem functions. \ud83c\udf31\u00a0\n\n\ud83d\ude9c\u00a0 Agriculture is a primary driver of land, water degradation globally, and contributes significantly to global GHG emissions (>10%) food is essential for a community\u2019s security & well-being, and is considered a matter of national security by modern nation-states. \n\n\ud83d\udc90\u00a0\u00a0Regenerative agriculture initiatives recognize the fragility of \u201cmodern\u201d agriculture. They argue that resilient communities achieve food, water, material & medicinal security by restoring health to their surroundings and valuing ecosystem functions. It generally allows us to decolonize our minds that traditionally associate farming with mass monoculture to instead associate it with multiple and diverse species (wild, livestock, vegetative, & microbiome\u2026) contributing to the resilience of a whole ecosystem. \n\n\ud83c\udf0e\u00a0 A global decentralized grants platform like Gitcoin offers a means for each of us to reclaim agency over the food system that we rely on. Let us be empowered and demonstrate the potential of quadratic funding to allocate, prioritize, as well as support transformative change to agriculture across scales. \n\n\u2600\ufe0f\u00a0The initiatives represented by this bundle are collaborating with local communities and indigenous organizations while providing access to knowledge about regenerative agriculture as well as access to the tools for farmers. Creating these impacts in Kenya, Columbia, India, Croatia & the United States with disparate aims but a common mission and mandate to demonstrate and expand the role of free and open-source software in public goods funding.\n\nIf you would like to know more about the individual projects that have been gathered in this bundle, check below!\n\n\u2615\ufe0f Coffee Carbon Collective, @CoffeeCarbonCo: supports coffee farmers in their transition to regenerative agriculture by providing agronomic guidance and rewarding them for the implementation of new practices. Coffee Impact Collective creates an ecosystem that provides multiple services and opportunities for farmers, allowing them to become a part of a decentralized marketplace where \u201cregenerated\u201d coffee is traded along with eco credits (like carbon, biodiversity, water quality, social impact, and eco-tourism), not separately.\n\n\ud83c\udf38\u00a0 Kanga Gardens, @Kangra_Gardens: The Kangra Gardens are a place for people to express gratitude and give back to the earth by respecting and learning from it. The purpose of the Kangra Botanical Garden, which is a part of Kula, is to regenerate the local ecosystem, promote biodiversity conservation, support community health, build towards food sovereignty and nutrition, and engage people in connecting with the environment. The garden uses Ayurvedic medicine production and syntropic farming to achieve these goals facilitated through a Bioregional Learning Center. The grant for Kangra Gardens aims to fund new as well as current contributors and the development of open-source documentation to share with the global community.\n\n\ud83d\udca7\u00a0Watercycle, @friedmanspace: Watercycle is developing an open-source, low-cost water structuring device to improve crop yields and accelerate natural carbon sequestration. Water structuring is the process of altering the structure of water to optimize its ability to support life. The benefits of water structuring in agriculture include improved soil structure, increased plant growth and yield, and reduced water usage.\n\n\ud83c\udfdd\ufe0f\u00a0Ogallala.Life, @ogallalalife: We are a not-for-profit devoted to learning, exploring, developing & deploying web3 tools for landscape rehydration on and around the US high plains aquifer system. Our mission is to prove out market incentives for improved water recharge & retention - our communities place a tremendously high value on water security and ReFi offers novel mechanisms to invest in surrounding landscapes & watersheds. We\u2019ve launched pilot projects along the Canadian River breaks to explore leaky weirs, riparian restoration, and similar interventions, & their impact on the water budget, biodiversity, carbon & climate. Our projects help facilitate the maturation of decentralized science applied towards regenerative aims through our active collaboration with dMeter, a DAO tasked to build tools for decentralized digital measure recordation & validation in natural capital context including but not limited to PES markets.\n\n\ud83d\udc68\ud83c\udffe\u200d\ud83c\udf3e\u00a0 Regr\u00f2, @projectregro: At Regr\u00f2 farmers, gardeners and artists share their journeys about Regenerative Agriculture and Regenerative Finance. Under the increasing climate emergency pressure, the Regr\u00f2 project aims to connect land owners, farmers, and growers, interested in sharing resources to build resilient agroecological systems through Regenerative and Conservation Agriculture, Permaculture, and non-invasive practices.\n\n\ud83c\udf33 Ayowecca Uganda, @ayowecca_uganda: A community-founded organization working on nature-based solutions, Wetlands and peatland ecosystem restoration has been our focus. Together with the local community, we are restoring encroached wetlands and protecting those that already exist. Our strategy involves agroforestry and afforestation. We are promoting agroforestry, by giving farmers fruit trees to plant beside their crops to protect the degraded landscape, promote food security and raise food production. Climate change adaptation and mitigation are our primary goals in promoting agroforestry/regenerative agriculture and permaculture. The effects of climate change on agricultural communities can be lessened by planting trees in agricultural systems. Growing the number of trees on agricultural land decreases tree cutting and boosts carbon sinks.\n\n \ud83d\udce1\u00a0 dMRV Network, @dmrvnetwork: dMRV network puts the tools necessary in the hands of small-scale farmers and other marginalized communities so that they have the opportunity to collect and submit valuable ecological data for fair compensation. dMRV network is a decentralized organization of scientists, project developers, farmers, and regenerators that contributes to open source systems that allow for decentralized data collection correlation of ecological data into ecological credits and/or payments. The primary goal of dMRV Network is to create a guide for communities to identify the best practices, tools, and resources for maximizing value and ecological health via ecological service payments and/or credits.\n\n\ud83c\udf31 The WeSeed Project @weseedrefi: The WeSeed Project is a unique initiative that aims to address global food insecurity challenges through the use of blockchain and cryptocurrency technologies. The project seeks to provide education and training in these areas to underserved communities, empowering them to actively participate in regenerative microeconomics and create long-term systemic change.", - "projectWebsite": "https://tinyurl.com/RegenerativeAgricultureBundle", - "projectLogoCid": "bafkreihxweu7r6m6kkhkfo7yqqfzfs2ln3mqaooac2g5h674xc6y55awri", - "projectBannerCid": "bafybeiclpjhugmwdlc27id7nkf3rnn7fliurzb7ylnca4gkx57bic5o2pq", - "projectTwitter": null, - "projectGithub": null, - "userGithub": null, - "fundingTotalDollars": 12443, - "donorsTotal": 312, - "fractionsTotalSupply": 12361, - "hypercertEligibleDonors": 290, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0x71d987ed59CD1C6DF337826228AfDe7D2854Eb3A": null, - "0x86E35e46459aa6CAA97193A2E9a929E9fAC0cbe4": null, - "0x75cC37322D9eE1cE441a4e486217Dcc71A086Aa1": null, - "0x63757e9c621AE7963F2DB2C7F02A1CDD89d6375D": null, - "0xE559e959b891b14eB5A9DdE45C61b1aEb0b6DF4B": null, - "0x39D453d4B86c6D97f6D420cB2F0dab957dec0279": null, - "0x43D936856485c6FF09E05FFdF0A97989A433ab9D": "epistetech.eth", - "0xAb7e1B060910C2D6Fe9A21bD897e0180941880AC": null - }, - "safeUsers": { - "epistetech.eth": 0.625, - "0x78Dc08c6f14e26B2C91edAE9a6e03eed7Ae5218B": 0.125 - } - }, - "hypercertData": { - "workScopes": "Bundle: Agriculture", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x78Dc08c6f14e26B2C91edAE9a6e03eed7Ae5218B", - "rights": ["Public Display"] - } - }, - { - "title": "Act Now Climate Change Bundle", - "address": "0x221966004b2001a0dA1274024d67cd09FEbD0b94", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x42c5410440da06b29d782ee691783aad21d76b0de61c1034432f816af89aa57f", - "projectDescription": "\ud83d\udc9a ACT NOW CLIMATE CHANGE BUNDLE:\n\nActivism and advocacy can change the world. They can push the boundaries of our knowledge, tip the balance on policy and induce public action to affect environmental and social change. The projects in the activism and advocacy bundle extend from the depths of the earth to the far reaches of outer space and include:\n\n- Collaborations between Web3 regens and land trusts\n- Indigenous legal climate challenges\n- Initiatives to incentivize planetary cleanup, from oceans and rainforests to Earth's orbits\n- Strategic Climate Solutions Campaigns\n- Putting the Paris Agreement carbon markets on chain\n- Governing climate-related blockchain efforts across sectors\n\n\ud83d\udc18 ELEPHANT IN THE ROOM:\n\nTwitter- @ClimateRace\n\nStrategic Climate Solutions Campaigns. We work with Indigenous organizations, voting organizations, neighborhoods, cities and activists to promote climate action to communities around the world and to counter the vast array of fossil fuel advertising and disinformation. Over the past year Elephant Room has also been creating strategic communications that are focused on the web3 community.\n\n\ud83c\udfe1 UNEARTHING COMMON GROUND:\n\nWebsite- https://common-ground.super.site/\nTwitter- @commongroundCLT\n\nGitcoin Grant 16 page-https://gitcoin.co/grants/6318/unearthing-common-ground-a-six-week-journey-into-\n\n0x08f2E5b3b316C49F8Ab95df0D6ee541271d10f7e\n\nA six week learning journey which introduces 50 web3 regens to 50 existing community land trusts from around the world to develop on the ground project collaboration.\n\n\u267b\ufe0f LITTER TOKEN ($LTK):\n\nTwitter- @litter_token\nInstagram- @littertoken\nWebsite- www.littertoken.xyz\n\nLittle Token is a purpose-driven token that pays people to pick up litter. We use our own cryptocurrency to compensate people for cleaning up the planet. We are Pokemon Go for climate change.\n\nTo date, we have picked up 65k+ pieces of litter (across Nigeria, Philippines, USA, Brazil, Puerto Rico, etc), started a Community Farm in rural Nigeria, and started a waste management business in Puerto Rico.\n\n\ud83d\udef0\ufe0f COSMOS FOR HUMANITY:\n\nWebsite- https://cosmosforhumanity.eu/en/\nTwitter- @cosmos4humanity\nDiscord- https://discord.gg/mmCAgkHFnn\n\nGitcoin Grant 16 page-https://gitcoin.co/grants/6782/protecting-earths-orbits-through-citizen-intellige\n\nC4H is a Swiss-based NGO that promotes a more sustainable access to outer space for humanity. We are currently creating a carbon footprint inspired indicator in partnership with the French space agency. We also aim to create a citizen-run label to fund researchers and startups working on space pollution and help finance active debris removal operations in the future.\n\n\u2696\ufe0f BEYOND FOSSIL FUELS:\n\nTwitter- @BFF_campaign\n\nIndigenous Legal Fund for Climate Action.\n\n\ud83c\udf33 BLOCKCHAIN FOR CLIMATE FOUNDATION:\n\nTwitter- @blockforclimate\n\nBlockchain for Climate Foundation is working to put the Paris Agreement carbon markets on Ethereum to enable cross border collaboration on climate change. The BITMO Platform enables national government issuance and exchange of sovereign emissions reductions and removals outcomes as ERC-1155 NFTs - providing low-cost transparent architecture for a more timely launch of these markets.\n\n\ud83d\udce3 BLOCKCHAIN x CLIMATE INFRASTRUCTURE (BxCi) - formerly known as BICOWG\n\nTwitter- @BICWOG \n\nBxC is an activist-to-industry network of global stakeholders working together to define and author cooperative operating and technical principles that govern climate-related blockchain efforts across sectors. BxCi working groups focus on carbon market registries, standards and auditability, policy development, regenerative finance and emerging markets in the global south. In 2023, BxC aims to scale the reach and impact of these initiatives and identify new multi-sector alliances. Many of these projects are underway as proof of concepts or in fully implemented solutions but require a consistent taxonomy framework to scale.", - "projectWebsite": "https://www.notion.so/Bundle-Activism-Advocacy-99120e6ed97947b786af7cc2f1becc80", - "projectLogoCid": "bafybeih2yfajcjftb6gnbdcvunc4kxt72ikhfyqueatfl4mwbajqycbivq", - "projectBannerCid": "bafybeihexwxbj3mballgmvhirfscscp2ygucciq477htllckxbp3ns7wvy", - "projectTwitter": "ActNow_Bundle", - "projectGithub": null, - "userGithub": null, - "fundingTotalDollars": 6414, - "donorsTotal": 198, - "fractionsTotalSupply": 6370, - "hypercertEligibleDonors": 185, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0xd2993E8217063c72BBE8c736404c7fC02adC9761": null, - "0xdDe104D6c45906399c61aaDCA2d460b68Ce27897": null, - "0x4AFC0c9a5C4060DF2345C5b8C73e8eDBA2DE8E47": "isiahcruz.eth", - "0x65ad2BF7E09af2597C140dF6386a3003d0F5f8Ee": "cosmosforhumanity.eth", - "0x08f2E5b3b316C49F8Ab95df0D6ee541271d10f7e": null, - "0xcbF3c13e05Aa9C18Ab8ecbb3302EDad21C23c688": null - }, - "safeUsers": { - "0x221966004b2001a0dA1274024d67cd09FEbD0b94": 1.0 - } - }, - "hypercertData": { - "workScopes": "Act Now Climate Change Bundle", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x221966004b2001a0dA1274024d67cd09FEbD0b94", - "rights": ["Public Display"] - } - }, - { - "title": "Bundle \u26a1\ufe0f\u267b\ufe0fRenewable Energy", - "address": "0xFC148c92062Ae30D788d48031b89B45237f27AF7", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x52f41f0f49803ae47f13977a8a5dd1b170348e82e2d59303861efb83d1413b50", - "projectDescription": "//////////// \ud83d\udc41 LOOK HERE \ud83d\udc41 //////////////\nThe BEST place to read about this bundle with images is on \n\ud83d\udc49 https://bit.ly/RenewableEnergyGrant \ud83d\udc48\n\udb40\udc20\n\n/////////////// \ud83c\udfc3\u200d\u2642\ufe0fTL;DR ////////////////\n\n//// \u26a1\ufe0f\u267b\ufe0f WHY SUPPORT THE RENEWABLE ENERGY BUNDLE \n\n\nEnergy is the \ud83d\udc49 biggest problem of the Climate Crisis \ud83d\udc48 \nsince its consumption is responsible for 75.6% of all global CO2 emissions \ud83e\udd2f\n \nThese projects are working hard to \ud83d\udcc9 reduce emissions and create new ways to increase the adoption of renewable energy in its many forms.\n\n\nWe are focused on directly funding renewable energy development around the world while creating decentralized energy grids and data centers that heat spaces with compute power instead of wasting energy on cooling. This removes middle men, makes climate action programmable, improves access to stable electricity and accelerates the world\u2019s transition to sustainable energy and heating.\n\nIf you want to put your chips on a sector that is e-x-i-s-t-e-n-t-i-a-l and fundamental for solving climate change, it would be this.\n\n\udb40\udc20\n//////////// \ud83d\udc68\u200d\ud83d\ude80 THE PROJECTS /////////////\n\udb40\udc20\n\ud83d\udc49\ud83d\udc49\ud83d\udc49 7ENERGY\nEmpowering Renewable Energy Independence for Energy Communities \ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66\u26a1\ufe0f\n\nJoin the 7Energy revolution and take control of your energy \u26a1\ufe0fconsumption! Our platform and community empower individuals to optimize their energy usage and cost, \ud83d\udcb5 while breaking free from dependence on fossil fuels and big corporations. Be a part of shaping a sustainable and healthy \ud83d\udc9a energy future for all.\n\ud83d\udc26 @7EnergyDAO \n\ud83d\udd17 https://7energy.at\n\n\n\udb40\udc20\n\ud83d\udc49\ud83d\udc49\ud83d\udc49 ZERO LABS & BLOCKS GARDEN\nEmbedding tokenized renewable energy into any digital process or app + Blocks.garden to MakeCryptoGreen\n \nthrough tokenized Renewable Energy Certificates (REC) and our simple API, making climate action programmable and automatic \ud83e\udd16, building radically accessible and transparent tools that make it easy for anyone anywhere to buy renewable energy \u267b\ufe0f\u26a1\ufe0fand prove it on a blockchain, and tell the story of their impact with \ud83e\udd29 gorgeous human readable \u2705 Green-Proofs 2\ufe0f\u20e3. We call this vision \u201cprogrammable decarbonization\u201d.\n \nWe recently \ud83d\ude80launched Blocks.garden 3\ufe0f\u20e3 to #MakeCryptoGreen, starting from decarbonizing Ethereum\u2019s 1 historical emissions. \n\ud83d\udc26 @zerolabsx \n\ud83d\udd17 www.zerolabs.green \n\n\ud83d\udd17 2\ufe0f\u20e3 https://app.proofs.green\n\ud83d\udd17 3\ufe0f\u20e3 https://.blocks.garden\n\n\n\n\udb40\udc20\n\ud83d\udc49\ud83d\udc49\ud83d\udc49 FUROA \nFloor heating with compute power \n\nData centers consume 2% of the world\u2019s electricity but 40% of it is wasted on cooling \u2744\ufe0f. That\u2019s enough energy to heat millions of homes \ud83c\udfe1 or offices \ud83c\udfe2. And that\u2019s why we\u2019re building Furoa\u2014a floor heating system that heats spaces with compute power \u26a1\ufe0f; laying the foundation for zero-emission, truly decentralized computing \ud83d\ude4c. Since GR15, we\u2019ve established relationships with component suppliers and updated the design to reduce production cost and energy consumption.\n\ud83d\udc26 @FuroaCo \n\ud83d\udd17 https://furoa.co\n\n\n\n\udb40\udc20\n\udb40\udc20\ud83d\udc49\ud83d\udc49\ud83d\udc49 KHALON BRIDGE\nDistributed Solar for Web3 Creators in Nigeria\n\nNigeria is at the leading edge of the web3 ecosystem but suffers from a notoriously collapsing electrical grid that impedes developer talent from keeping up with the digital economy without having to buy pollutive generators. Khalon Bridge is a development studio collective of over 40+ web3 operators and continues to provide residential solar to emerging talent in the region to advance the digital economy in Africa.\n\ud83d\udc26 @Khalon Bridge\n\ud83d\udd17 https://khalonbridge.com/\n\n\n\n\udb40\udc20\n//////////// POWER A \u267b\ufe0fFUTURE /////////////\n\n\ud83d\udc9a Be a part of the solution and not the pollution. \n\u2600\ufe0f Join us in powering a brighter future!\n\ud83d\ude4f Support renewable energy by donating today! \n\ud83d\udc49 only on ETH mainnet\n*********************************************\n\n\n\udb40\udc20\n///////////// \ud83d\udc41 REMEMBER \ud83d\udc41 ///////////////\nThe BEST place to read about this bundle with images is on \n\ud83d\udc49 https://bit.ly/RenewableEnergyGrant \ud83d\udc48", - "projectWebsite": "https://bit.ly/RenewableEnergyGrant", - "projectLogoCid": "bafkreidmtsiwtu6zapbuli2eswe6zdszftmia2r4totaixgqptzmusp23u", - "projectBannerCid": "bafybeibkqqev5k2mwcbe2pdhhypm6qmshhq4crxrdklsvgvfklbfeotf7y", - "projectTwitter": null, - "projectGithub": null, - "userGithub": null, - "fundingTotalDollars": 3384, - "donorsTotal": 247, - "fractionsTotalSupply": 3332, - "hypercertEligibleDonors": 230, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0xc3afeB93ae73f160347BCaE82097c1f8f3daC75c": "furoa.eth", - "0x9fC13b4E1C4206970a1C4520d2f77336CD5D0e0a": null, - "0x5aDaC46a2C4e8471681F3feF216904EAA8961B16": null - }, - "safeUsers": null - }, - "hypercertData": { - "workScopes": "Bundle \u26a1\ufe0f\u267b\ufe0fRenewable Energy", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0xFC148c92062Ae30D788d48031b89B45237f27AF7", - "rights": ["Public Display"] - } - }, - { - "title": "Bundle: Climate Research Alpha Round", - "address": "0x29C40842a76B0aa28865EbF7c916ec820233b7bB", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x5b82b9d0cb3d0d14c8fe693502b197cfbc0f55115446632448549da20538c96c", - "projectDescription": "Mission Statement:\n\nTime is running out. Climate research today needs to focus immediately on practical solutions. We need research that leads to mass movements and exponentially growing impact. Like the US Advanced Research Projects Agency - Energy (ARPA-E), the Climate Research bundle will be a key engine of climate innovation and climate action. While fixing our sights on the high bar set by ARPA-E is wildly ambitious, we know that blockchain technology can exponentially increase effective and efficient scientific research. Integrated indicators make the research replicable and scalable and allow improved documentation and verification. The ambitious and innovative projects in the Climate Research bundle will architect many systems of the new infrastructure of climate research and scientific collaboration. \n\nThis bundle is comprised of 8 critical and interrelated projects address various challenges of climate research by generating:\n\n\u26a1 Clean, cheap, abundant, and reliable sources of energy and the need to mitigate the negative impacts of climate change on cities and urban areas.\n\n\ud83d\udca8 Increased speed and efficiency of traditional methods for conducting and translating scientific research\n\n\ud83e\udd2f Solutions to the complex set of root causes that contribute to the long time it takes for scientific research to be implemented in real life\n\n\ud83d\udd0d Increased transparency, traceability, and access to funding for scientific research\n\n\ud83e\uddbe Effective mechanisms to protect intellectual property, reduced investor risk in, and increased investor access to the scientific and technological innovation process\n\n\ud83e\udd11 Profitable ways for companies to align with community values related to climate change\n\n\ud83d\udd2c More effective research, and strategies for promoting and supporting scientific innovation that positively impacts the world and its inhabitants\n\n\ud83c\udf31 Developing regenerative data tech, storing digital data in the DNA of plants and trees, to create carbon absorbing data storage\n\nThe projects contributing to this effort are:\n\n\ud83c\udf0e FrontierDAO\n\ud83c\udf0e SCINET\n\ud83c\udf0e Option\n\ud83c\udf0e ScienceFund\n\ud83c\udf0e Internet of Animals\n\ud83c\udf0e Defi Biolabs\n\ud83c\udf0e Circonomy\n\ud83c\udf0e Grow Your Own Cloud DAO (GYOC DAO)\n\nFrontierDAO @FrontierDAO; Collectively incubating scientific and engineering innovations and innovators, using Web3 tooling (linktr.ee/frontierdao).\n\nOne of our key focus areas is \u201cfusion energy as a climate solution.\u201d Fusion energy, while still in its infancy, is the technology that will usher in a new era on this planet - one where cheap, clean, abundant, baseload energy is available for all. \n\nNuclear fusion energy is the energy of the stars and sun. It is the opposite of nuclear fission.. \n\nTo help usher in this new era of transition to clean energy, FrontierDAO has released in BETA an IP NFT on-chain scientific publishing platform called FrontierRegistry. By publishing research on the blockchain, we aim to foster greater collaboration while protecting authors\u2019 IP rights. frontierda.xyz/faqs-projects\n\nFunds raised from GR15 were used to partially underwrite a 12-week Fusion Energy As A Climate Solution weekly workshop series that ran from November to mid-January. Interviews can be found on Youtube.com/@frontierdao. \n\nSCINET, INC @scinet_inc. At SCINET, we are increasing the speed, efficiency, and effectiveness of life sciences research from \u201clab to life\u201d by developing a suite of software applications in a decentralized (\"DeSci\") life sciences ecosystem that addresses the complex set of root causes for why it takes 17 years for life sciences research, including climate solutions, to get into real life (see here for socials, media mentions, website, etc.).\n\nWe help scientists conduct and translate research faster, more accurately, and more efficiently by offering them a unique confluence of decentralized funding, blockchain-protected IP, unique trust mechanisms, and commercialization strategies that reduce investor risk, increase scientific innovation, protect intellectual property, and positively impact the world and its inhabitants.\n\nOption, @option_hq: Option is a prediction market for governance that incentivizes companies to align with community values, including those related to climate change, by making it profitable for them to do so. An example of climate governance using Option could be creating a market where players can make predictions about a company's carbon emissions reduction targets. If the company meets its targets, those who predicted accurately would be rewarded. This would incentivize the company to align with community values and reduce its carbon emissions in order to profit from the market. Furthermore, the funding provided by the market could be used to support research and journalism focused on climate change and carbon emissions reduction.\n\nScience Fund, @sciencefund_io: Fund basic science with donations recorded for posterity on the Ethereum blockchain. \n\nScience Fund is empowering scientists to freely, openly, and rapidly pursue their best scientific ideas. To achieve this, we are reimagining how discovery is funded. No grant applications. Transparent, traceable funding records. Rapid funding cycles that support more ideas early and continue funding what\u2019s working. In this Gitcoin Round, we plan to test some of the mechanisms we thought out. At least 80% of the funds collected in this round will go towards our first Climate Action funding pool, the \u201cUrban Climate Impact Mitigation Pool\u201d. \n\nSpecifically we will support \u201cUPP\u201d - the \u201cUrban Planting Project\u201d incubated at the AKASHA Hub in Barcelona. UPPs mission is to turn every available city space into green islands of chill. By easing heat stress, UPP is helping to mitigate the effects of climate change and promote new sources for local food production in cities. UPP has already formed partnerships with local universities and communities to deploy its \u201cUPP toolbox\u201d and will apply S.M.A.R.T. principles to quantify the project's impact both through technology including real-time tracking, and satellite imagery as well as by documenting the social impact of their project.\n\nDonors to our Gitcoin grant will be recorded in the funding pool through their Ethereum addresses and will receive certificates of the impact that allows them to unlock information and data about the project\u2019s success at regular intervals in the future. \n\nInternet of Animals, @WildlifeMovemnt: Our mission is to create a community of scientists that promotes the design, development, implementation, and improvement of accessibility to software, hardware, and knowledge resources related to wildlife movement ecology. To realize that vision, we formed The Wildlife Movement Institute, a nonprofit organization to be a hub for this community for local, regional, and international collaborations \u2013 whether you are an expert or someone passionate about wildlife and technology. Since the end of GR15 we have established a bank account, set up a business account on CoinBase and are now preparing to invest in web development and getting 501(c)(3) tax status. \n\nDefi Biolabs, @Defibiolabs: Bioengineering algae to reduce greenhouse gas emissions. \nGR15 Grant: https://gitcoin.co/grants/7497/defi-biolabs-is-engineering-cyanobacteria-to-prod\n\nCirconomy, @CirconomyDAO: Recycle & Reuse 2 Earn 2 put the \u201ceco\u201d in \u201ceconomy\u201d (https://www.circon.me). \n\nWe aspire to become a DAO platform to proliferate circular economic projects all over the world. We'll accomplish this by building a dapp which will have a combination of on-chain registration of hardware-based circular economic projects such as Precious Plastic. This will be crowdfunded to ensure common ownership and stakeholdership. This will be supported by on-chain tracking of all recycling activity which will have a recycle-2-eajjrn cryptoeconomics model underpinning it.\n\nWe are currently creating a crypto-back solution for the world of recycling & reusing. We\u2019ll accomplish this by tokenizing existing points-based recycling/reuse-2-earn programs administered by not-for-profit organizations such as Circulr.ca and RedeemClothingRecycling.com. This allows us to better empower end users with an interoperable incentive that would have a unified reward pool amongst all of our partners as well as grant more autonomy to our partners to scale their operations.\n\nThe high-level summary of our tokenomics is as follows - there will be a dual-token system whereby:\nThe token users will earn will be created by coalitions between brands and nonprofits so what we mean by this is - depending on the material in question and/or other factors, we\u2019ll have coalitions of for-profit and nonprofit organizations that will mint a utility token together for earning. As an example - ideally, all clothing-recycling will have one utility token governed by all nonprofits that handle clothing recycling whilst the for-profits will be sustainable fashion brands. Likewise, all plastic-recycling will have one utility token governed by all nonprofits that deal with plastic recycling whilst the for-profits will be sustainable toy/merch companies. In that latter example, there may be multiple coalitions given that the toy industry is a specific/niche market. But regardless, we\u2019re starting with the fashion industry as our MVP.\n\nThis utility token will not be tradable in the exchanges because Circonomy itself will have a token that will be liquid in the exchanges out there. This token will be token-bonded to the utility tokens within Circonomy\u2019s ecosystem and thus in order for users to either obtain other utility tokens or liquidate them, they\u2019ll have to exchange their utility token for the Circonomy token. Each utility token will be exchangeable for rewards such as discounts or exclusive access to brand events that are token-gated or NFT phygital goods. But if they don\u2019t care about those things, they may simply liquidate by way of exchanging for the Circonomy token and then selling their Circonomy token, or they may stake the Circonomy token for gains of course and helping to drive value.\n\nGrow Your Own Cloud, @_GYOC: develops regenerative data technology, storing digital data in the DNA of plants and trees, to create carbon absorbing data storage. \n\nIt works! We\u2019ve just been awarded the science breakthrough of the year from Falling Walls for our functional prototype 'Data Garden'. We\u2019ve also just finished an EU-funded research project that demonstrates how urban scale implementations of GYOC could absorb megatonnes of carbon and store terabytes of data.\n\nNow we\u2019re developing a unique Web3 offering we call \"Non-Fungible Plants\" (NFPs). NFPs are physical plants with data encoded within their DNA. Data like JPEGs and MP3s. They\u2019re the first truly plant-based NFTs ever created. They\u2019re the first step to build data systems that work in harmony with living systems for maximum positive impact.\n\nTo enable our vision, within Web3 we are forming GYOC DAO: an internet-native organization dedicated to accelerating the transition to truly green data storage. Funds raised through this bundle will help the continued growth of an organization which more closely resembles a public good than a traditional tech company. Together we can create a future where server farms could be replaced by data forests. \n\n", - "projectWebsite": "https://www.notion.so/Climate-Research-Bundle-Project-Description-4254cf8973f14b428feacc157dbc2021", - "projectLogoCid": "bafybeidgeo5rhrpc4lly4e3gpjwim4zyatofeg4wbflpmmbhr26dh23bpy", - "projectBannerCid": "bafybeibpeazvzjn4eewcj2t3p4ylifuxlurgwz3hhkml3vh5ux7ebgdqza", - "projectTwitter": null, - "projectGithub": null, - "userGithub": null, - "fundingTotalDollars": 7903, - "donorsTotal": 311, - "fractionsTotalSupply": 7821, - "hypercertEligibleDonors": 273, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0xdE6843c5cdE24472dA420c70E074C890d17B4E28": null, - "0xf75b89857cD1AED40F5B9Cf39994775de25aD1F5": "nfpgarden.eth", - "0x4f8c531df3d97c6Cd437aC8DfE756975445D1161": "connorm.eth", - "0x632Fd6D5E53A8661e751a964c9d7c9aa63Ecaa5A": null, - "0x585cD52bf0206a1ee3Bcc609A06Be74ae9C82Bf1": null, - "0x1963A6cc8DEb426AE196a95D9e91aC3dFFfC67cB": null, - "0x9Fcc55e782c2E43DFADCC428C4F2f8f32E095782": null, - "0x4A35674727c44cf4375d80C6171281Ba2f764213": "frontierdao.eth", - "0xF2f1F58E6940531fFd4e42e3778E624306c30e95": null - }, - "safeUsers": { - "0x29C40842a76B0aa28865EbF7c916ec820233b7bB": 0.14285714285714285, - "frontierdao.eth": 0.14285714285714285 - } - }, - "hypercertData": { - "workScopes": "Bundle: Climate Research Alpha Round", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x29C40842a76B0aa28865EbF7c916ec820233b7bB", - "rights": ["Public Display"] - } - }, - { - "title": "Bundle: Oceans & Forests", - "address": "0x48f2696FB6FAB7ac0956175b2E25B456E61B3FCf", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x89c4fbe0d97ba25cba17b36c837c27cb7b39c96ccc8b43a99df2dfaca9732763", - "projectDescription": " \n\ud83d\udc49 Who are we? \n \nWe are independent teams of conscious humans, climate tech entrepreneurs, computer scientists, and environmentalists, that are united by the mission to protect and restore the forests and oceans of our beloved planet Earth. We believe in a power of coordination so that collectively we can tackle the problem of biodiversity loss.\n \n\ud83c\udf33 Gainforest: A decentralized fund using artificial intelligence to measure and reward sustainable nature stewardship @GainForestNow: GainForest is a non-profit developing impact evaluators, transparency dashboards and accountability protocols for nature-based assets using DeSci, artificial intelligence and web3. \n \n\ud83c\udf33 Vlinder: Restoration of degraded mangrove areas, @vlinderclimate: Vlinder develops Verra-certified mangrove restoration projects to provide a variety of ecosystem services, climate change mitigation, economic considerations, and active participation of the local community in coastal areas.\n \n\ud83c\udf33 Salt Spring Solutions \u2013 Sequestering carbon via forest preservation & regenerative agriculture @SaltSpringSols: Our projects are systemic solutions to carbon sequestration on Salt Spring Island, BC, including managing a recently-purchased 75 acre forest as a community park to sequester carbon in perpetuity, and sequestering carbon through regenerative agriculture that also improves food security.\n \n\ud83c\udf33Bloomeria, an organization to help communities safeguard green areas. @bloomeria_dao: We help fund reforestation and conservation projects, we connect environmental organizations and companies willing to fund meaningful projects and we help companies prove their ESG commitments through a simplified view of their relevant on-chain actions, in a graphic and interactive way.\n \n\ud83c\udf33Treegens: Evolving Degens into Treegens, @thetreegens: We\u2019re making Degens bullish on trees through the world\u2019s most transparent & rewarding tree planting. PPGL tokens are pegged to the cost of each mangrove tree we plant - $0.094. Our machine learning / AI tree counter then counts each tree from video footage, & airdrops Non-Fungible Updates. To reward holders, we\u2019re also tokenizing carbon forwards & airdropping a portion of carbon forward revenue to the holders. \n \n\ud83d\udc49 What we do? \n \nOur bundle mission is to protect and restore forests and oceans with the support of science and technology. Received funding will be used to:\n\n\ud83c\udf33 support impact projects of our members, \n\ud83c\udf33 improve collaboration between our teams via joint projects,\n\ud83c\udf33 facilitate dMRV and verification of impact for greater accountability.\n \nOur bundle is organized as a DAO with a Treasury Safe managed by the simple majority of the bundle members. Projects will be nominated by the bundle members and voted on by the DAO.", - "projectWebsite": "https://vlinder.notion.site/Oceans-Forests-f3c665c5162547eea874ec031f0cd8fc", - "projectLogoCid": "bafybeibm3xi7hjhbiiw2ek3mq4havabxmuok6wf2eqnefi67mdhq7zxgtu", - "projectBannerCid": "bafybeihr2d2rq3d3rdm2cr6vwpzbqnse7w67qsbvgdynfcoxs7obg3orz4", - "projectTwitter": null, - "projectGithub": null, - "userGithub": null, - "fundingTotalDollars": 7587, - "donorsTotal": 274, - "fractionsTotalSupply": 7517, - "hypercertEligibleDonors": 259, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0x59490C362C54C1b60158F19CE499C82aa3669820": "ecolabs.eth", - "0xfC9265A28f66CF4561D74A4E25D7Bbd3F482B8e6": "jimicohen.eth", - "0x2dBC5A4A615c9fa0f93207467ad9fc277FaEF479": null, - "0xe915EE741Ac2773a655059818cf3b71dEd04F337": null, - "0xFa99AbFc81243b552FBfF526a424f3De6e4F3605": null, - "0xEf48752C933b1050187e89A9F909De2b9e0BDCE6": null - }, - "safeUsers": { - "0x48f2696FB6FAB7ac0956175b2E25B456E61B3FCf": 0.3333333333333333, - "jimicohen.eth": 0.3333333333333333 - } - }, - "hypercertData": { - "workScopes": "Bundle: Oceans & Forests", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x48f2696FB6FAB7ac0956175b2E25B456E61B3FCf", - "rights": ["Public Display"] - } - }, - { - "title": "Bundle #3: Verification Infrastructure (Impact Certs, Measurement, Reporting & Verification (MRV) and Oracles)", - "address": "0xb0b0c51D98d3c49f7a5E61735db4f084d62954A1", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0x95adaaef6d0a11b862f47a236bbca9d93dcfe35d1ae044edc0223d5485e1bfbb", - "projectDescription": "Verification Bundle - 12 innovative projects proving impact and unlocking critical funding in the climate and sustainability space.\n\nWhy: Verification as proof of impact\n\nHow: MRV, Oracles, Impact Certs, Active Inference, Digital Identity\n\nWhat: An anti-greenwashing toolkit\n\nBundle Description\n\n\ud83c\udf0d\ud83d\udca1 Introducing Bundle #3: Verification Infrastructure \ud83d\udee1\ufe0f- the ultimate toolkit for proving \ud83d\udc9aimpact and unlocking \ud83d\udcb0funding in the sustainability and climate solutions space.\n\nThis bundle brings together \ud83d\udd25 12 cutting-edge projects that are changing the game for measuring, reporting, and verifying (MRV) impact. With our bundle, you'll be able to confidently prove that your projects are delivering real, tangible results.\n\nLet's be real, in order to fund the solutions we need to save the planet, we need to show that our projects are \ud83d\udcaf and that the impact is \ud83d\udcaa. That's where MRV comes in - it's the bridge between \ud83d\udcb0 and \ud83d\udc9aimpact. These projects included in the bundle offer MRV solutions through \ud83d\udd2eoracles, \ud83d\udcbbimpact certificates, and MRV protocols which are making it simpler and more transparent for projects to prove their impact and secure funding.\n\nThink of this bundle as your one-stop-shop for proving your impact and unlocking funding \ud83d\udcb0. Whether you're working on \ud83c\udf33carbon removal, \ud83c\udf31afforestation, regenerative agriculture or you've doing grassroots community building - with this bundle, you'll have everything you need to prove your impact, access funding and receive rewards.\n\nWith this grant, we're powering up these projects to take the MRV space to the next level\ud83d\ude80. Let's work together to make sure funding is going to the most impactful solutions, and let's make a real difference in the fight against \ud83d\udd25climate change.\n\nWhat\n\nBehind every product lies a hidden infrastructure\u2014a complex ecosystem of factories, ships, robots, processes, and people working in harmony to deliver value. The web3 climate economy likewise requires an infrastructure of technologies, people, and services. That's us.\n\nThe Verification Bundle comprises a range of approaches targeting different pieces of the verification value chain. This includes project evaluation networks, oracles, impact certificates, and MRV protocols. We are also building apps and interfaces enabling climate entrepreneurs to easily plug verification into their projects. We are for climate entrepreneurs like what AWS is for developers.\n\nWhy\n\nCurrent verification methods are expensive, inaccurate, inaccessible, or untransparent. These shortcomings are a bottleneck for both funding and entrepreneurs. Funders, from small donors, to institutional and sovereign funds, will not fund climate initiatives en masse until they can verify climate impact. Meanwhile the legacy, off-chain verification organizations cannot scale to serve the fast-growing, dynamic, and global mix of climate entrepreneurs.\n\nWeb3 technologies, like blockchain, enable new verification solutions that decrease cost, democratize access, increase accuracy, and create transparency. However, these solutions are not automatic. There is tremendous work to be done designing user experiences, aligning incentives, and building applications. Furthermore, we need to tailor solutions for the wide range of climate and sustainability initiatives.\n\nBeyond accountability, verification projects are the foundation for a more immersive, and rewarding impact sector. Impact certificates (NFTs linked to verifiable impact) enable projects to symbolically represent their work with creative smart contract structures. For example, a tree planter could sell tree NFTs that produce carbon tokens for holders. These carbon tokens could then grant holders exclusive rewards from video game skins, to store discounts, backstage concert access, or project voting rights.\n\nIf we are successful, donating to climate impact will soon be as good, if not better, than buying things for oneself.\n\n--------------------------------------------------------------------------------\n\nExplore each individual project\n\n\u2b50 Athena Protocol @_AthenaProtocol \n\nChanging the way the world runs on data to include ethics and equity through cryptographic security. Athena Protocol is building the smart contract primitives required to facilitate on chain claim resolutions to claims involving payments for ecosystem services. Our work during q4 of 2022 re our GR15 grant application \u201c ImpactNFTs: An on-chain resource for validating impact\u201d has resulted in the collaboration between several organizations within the dMeter ecosystem to adopt ours as their shared claim resolution framework. We are seeking additional funding to grow our core team, to expand our educational material on the importance of data sovereignty, and to continue development of our claim resolution framework and ImpactNFT primitives.\n\n----------------------------------------\n\n\u2b50 Pozzle Planet @PozzlePlanet \n\nPozzlePlanet is social app \ud83d\udcf1and protocol \u26d3\u00a0where users earn our native token POZ by sharing, joining and documenting planet pozitive \ud83c\udf0e activities via short form video\u2019s called pozzles \ud83e\udd33\ud83c\udffd. On the outside, a social app where people generate positive impact by sharing videos and earning rewards. Underneath the hood, a DeFi protocol that passively farms users activity into NFTs backed by real world assets like CO2. \n\nOur mobile app went LIVE in public beta in November 2022 via AppStore and Goggle Play with 1500+ daily active users. So far 24k+ pozzle videos added, 8k+ activities verified by the community, and the protocol has rewarded the community with 18k+ POZ - see the latest \ud83d\udcc8\u00a0real-time stats here https://www.pozzleplanet.com/ \ud83c\udf0d\u00a0\n\nLinks \ud83d\udd17\n\nVideo Demo: https://twitter.com/PozzlePlanet/status/1591662766947201025?s=20&t=zsAvCXhjeJpGyAQpVV6R6Q\n\nWeb:\nhttps://www.pozzleplanet.com/\n\nPurple paper:\nhttps://pozzle-planet.gitbook.io/poz-purplepaper/\n\nTwitter:\nhttps://twitter.com/PozzlePlanet\n\nMedium:\nhttps://pozzleplanet.medium.com/\n\nDune Analytics for POZ:\nhttps://dune.com/swarthyhatter/POZ\n\nGITHUB: \nhttps://github.com/PozzlePlanet/\n\n----------------------------------------\n\n\u2b50 Digital Gaia @_digitalgaia www.digitalgaia.earth\nIf you want to teach people a new way of thinking, don't bother trying to teach them. Instead, give them a tool, the use of which will lead to new ways of thinking. (Buckminster Fuller)\n\nThe funding from this grant will support the launch of Digital Gaia's first product, called Gaia. It is the culmination of Digital Gaia's MVP sprint in Q3 and Q4 of 2021, which was partially funded by Gitcoin GR 14 and 15. \n\nBackground on the research and thought leadership that goes into Gaia can be found at: https://docsend.com/view/s/gexztbntbf5vxsn9\n\nGaia is an AI-augmented assistant that helps the global regenerative community achieve more impact faster and with greater confidence. It is built on a novel decentralized AI platform and backed by state-of-the-art science. Gaia provides context-specific information, knowledge, decision support, and Impact assessment for the first mile of Impact rooted in the collective intelligence of a global network of practitioners, experts, scientists, data providers, and indigenous communities.\n\nGaia is built on Digital Gaia's open technology platform and will enable multiple high-value services missing today that are essential to scaling regenerative agriculture and healthy bioregional economies, including:\n\n1. Expert Assistance for the first mile of Impact: Each instance of Gaia is a standalone AI for a specific ecosystem and community context. It supports and gathers context from land stewards and experts through local inputs and the use of multi-tiered remote sensing and other forms of MRV.\n2. Open Access to a global commons of data, information, and knowledge: Individual Gaias are interconnected in an AI-augmented global network. Digital Gaia's AI tools autonomously integrate all the local information and knowledge into continuously improving scientific models. These consensus-based models feed back into the network, enabling exponentially faster learning and continuously improving performance against targeted outcomes at the local level.\n3. Transparent and Immutable Proof of Impact on Regenerative Outcomes: Gaia produces real-time project assessments from pre-feasibility stages to end-of-life. It serves as an Oracle for both future predicted performance and realized impact across the life of projects that can scale from project, to portfolio, to bioregion.\n\nObjectives\n\nOur objectives for the first six months of the Gaia launch are:\n\n- 125 Project Onboarded with >10,000 Hectares impacted\n- A pipeline of over 1250 Projects in the onboarding pipeline with >100,000 Hectares impacted\n- 7+ project aggregators integrating Gaia into operating models\n- 55+ SMEs, Experts and Data Providers engaged in our global community\n- 7+ SME organization, academic institutions, data aggregators integrating internal resources with the Gaia Network and Gaia POI oracle services\n- Integration of Gaia POI Oracle Services into 3 Marketplace channels\n\n----------------------------------------\n\n\u2b50 Katalyst.earth @KatalystEarth www.katalyst.earth\n\nScaling Nature Positive Credits through Digital MRV\n\n----------------------------------------\n\n\u2b50 POCA: Proof of Climate/Community Action \n @Poca_earth \nis like a POAP but for climate and community action.\n\nIt\u00a0is a reward badge to add to a collection of actions you participated in, whether it is building a community or taking part in a climate action.\n\n----------------------------------------\n\n\u2b50 LunarPunk Labs @LunarPunk_Labs \nFacilitating community articulated Active Inferencing Models.\n\n----------------------------------------\n\n\u2b50 SproutUp @sproutupapp \nThe impact certificate fundraising platform for web3 charities. Turn good deeds into NFTs and earn crypto donations.\n\n----------------------------------------\n\n\u2b50 EverGreenCoin @evergreencoin_ evergreencoin.org\nEverGreenCoin (EGC) is a native blockchain PoW/PoS hybrid cryptocurrency, now full PoS, launched in 2015. The EverGreenCoin Foundation, Inc. is a 501(c)3 public charity launched in 2017. Proof of Environment (PoE) is a program of the foundation's, by which it rewards environmentally-conscious activities and observations with EGC, launched in 2019. PoE rounds run monthly and the reward pool is grown throughout. Submissions are publicly scored. The reward each submission receives after month's end is proportionate to how it did in public scoring. We believe we have an amazing platform established for people to share, and be rewarded for, any environmentally-conscious activity. We are requesting grant funding to scale EGC\u2019s PoE and ready it for a global stage.\n\n----------------------------------------\n\n\u2b50 ORGO @orgo_earth \nORGO is on a mission to regenerate the planet by creating an economy for environmental and social causes. Impact organizations that are focused on making a difference need better visibility and access to funding. ORGO\u2019s philosophy is rooted in liberating impact data. ORGO aims to close the gap in sustainable finance, reward positive behaviors, and eradicate greenwashing and fraud.\n\nWebsite\nhttps://orgo.earth/\n\nJoin our Discord\nhttp://discord.gg/qhg6wqWE5j\n\nBlog\nhttps://medium.com/@orgo_earth/our-philosophy-279431efc41a\n\n----------------------------------------\n\n\u2b50 Earthbanc Protocol @earthbanc\n\n----------------------------------------\n\n\u2b50 Project Themistoklis @p_themistoklis \n\n----------------------------------------\n\n\u2b50 Buan @buan_fund\n@buan_fund on twitter / mirror.xyz/buanfund.eth / https://t.me/buanthereum\n\nB\u00daAN is minting digital twins of RWA on Ethereum with a focus on environmentally valuable areas of land which can form the backing for impact certificates which can be sold to businesses. With the ultimate goal of rekindling societies relationship with nature. Think of us as The Federal Reserve before it moved away from the gold standard except our treasure is biodiversity. By developing the rails to on board RWA to the blockchain in a legally indemnifiable way we hope to encourage others to innovate within the same framework.", - "projectWebsite": "https://verificationinfra.notion.site", - "projectLogoCid": "bafkreib4uv3ymk3274tcyvx6hiwpvgtn7v3t7rd65fgl2jpsqvwdtnd5ri", - "projectBannerCid": "bafybeigs5mqiitcx7s5u6n3u2g36j7ais4usfdcahl3cbmr3hpylqfx5ru", - "projectTwitter": "verif_infra", - "projectGithub": null, - "userGithub": null, - "fundingTotalDollars": 8308, - "donorsTotal": 220, - "fractionsTotalSupply": 8254, - "hypercertEligibleDonors": 207, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0x687B28218aa02bE6B70846b9E2C7b93993691b8d": null, - "0x2Edaa86197A839792a9Befd71DafB328422be84E": null, - "0x05e0a46a3a96478f8c6915f57E8089b3397E7cea": "joenisbett.eth", - "0x48ea61df42A9D86FCF4763F3f6369E99853F1812": "buanfund.eth", - "0xF3ddE439a67FDAf6F1e509A575BA2A69a306132c": null, - "0x4BD87f86824a1577e705489780376DA5AD309180": null - }, - "safeUsers": null - }, - "hypercertData": { - "workScopes": "Bundle #3: Verification Infrastructure (Impact Certs", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0xb0b0c51D98d3c49f7a5E61735db4f084d62954A1", - "rights": ["Public Display"] - } - }, - { - "title": "Bundle: Carbon Markets", - "address": "0xE07b0f3c2A669b656476e4D6A054F4922D539D3D", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0xd716c3a7c353f0458ff8387fb435606934e25b631a83db017e5eb9a0022358f0", - "projectDescription": "\nA collective of 13 cutting edge projects working at the forefront of the digital carbon revolutions.\n\n------------------------------------------\nAbout the Carbon Markets Bundle\n------------------------------------------\n\nCarbon markets are an important way to reduce greenhouse gas emissions and slow down climate change. These markets work by allowing people and companies to buy and sell emissions reductions. This GR16 bundle is a collection of projects that help people understand and reduce their own emissions, and make it easier for them to buy carbon credits to offset the emissions they can't reduce. This bundle includes projects innovating to raise awareness, create demand, and facilitate the supply of carbon credits, all of which are necessary for a functioning carbon market.\n\n------------------------------------------\nHow the grants funds will be used\n------------------------------------------\nThe funds raised will be divided equally between all bundle projects. Funds will be invested into increasing demand through improved scoring, increasing supply and improving guaranteed quality of supply, promoting the marketplace to ensure demand can meet supply. Ultimately, the consumer is best served through a strong marketplace when there\u2019s competition and choice. The grants funding will contribute towards that.\n\n---------------------------------------------------------------------------------------------------------\nThe funds raised in this bundle will be shared equally amongst the following 15 projects:\n---------------------------------------------------------------------------------------------------------\n\nDottyland Impact Self \ud83c\udf33 @dottyland_xyz : On-chain Impact Self. Turning climate-positive actions into functional and serviceable identities across web3 applications, starting with on-chain carbon token retirement.\n\nCarbon Flow \ud83c\udf33 @CarbonAntiTheft : An anti-theft solution for global carbon markets, a multitoken system restricting the amount of carbon tokens converted. Multi-trillion carbon market just makes no sense without anti-theft. It is a smart contract that limits the amount of theft in carbon markets. Everybody can create a carbon token. The owner of a carbon token can allow conversion into it from other carbon tokens, and set limits (absolute or per a period of time) of conversion from that other tokens. So, for example France\u2019s DAO sets the amount of Paris\u2019s carbon tokens that can be exchanged for France's token. So if Paris is found guilty, France can pause exchanges from Paris tokens and devalue their token. If Paris during some error produces a septillion of carbon tokens, they can\u2019t be exchanged for an upper level, because of the anti-theft limits. Tokens can be retired (voluntary denial of carbon production) and retired tokens are meant to be used as a means of payment. Every carbon token owner (such as a notary) can set his \u201ctax\u201d on the retirement of tokens, so notaries and DAOs compete on the free market. DAOs can also mint retired tokens to reward somebody, e.g. for climate science progress. The smart smart (not a typo) contract is developed, it remains to create a DAO around it.\n\nCoorest \ud83c\udf33 @CoorestOfficial : A decentralised application for carbon offsets utilising a 100% on-chain CO2 sequestration via satellite validated NFTrees, CO2 tokens and Proof of Carbon Compensation (PoCC) certificates. \n\nKlimaDAO Name Service \ud83c\udf33 @knsdomains_ : A domain name NFT that permanently locks up carbon credits, continuously offsets carbon credits and can be used as a social representation of climate impact. Currently integrated into KlimaDAO pledge dashboard, making it easy to access climate commitments using .klima domain names. \n\nClime Tech (Formerly Clime DAO) \ud83c\udf33 @ClimeTechInc : Climate action and resiliency tool used by cities and business for adaptation and mitigation. Carbon reduction verified, stored on chain and issued tech based carbon credits. \n\nMangrove \ud83c\udf33 @mangrovecarbon : Mangrove is building the operating system for carbon removal companies to eliminate the risk of double selling supply, improve sales processes, easily bring inventory into the refi ecosystem and ensure compliance with government and registries. \n\nERC-Cool\u2122 \ud83c\udf33 @TresCoolLabs : The ERC-Cool\u2122 is an improved implementation of the ERC721 smart contract standard that weaves real world, perpetual, carbon removal into any NFT use case that adopts it. An open source - planet cooling - super sustainable - delight. Designed to spark a removal revolution, enabling action to become the fabric of web3 and sprinkled to every corner of the internet.\n\nKUMO \ud83c\udf33 @kumo_dao : KUMO unlocks the value of natural assets by providing interest-free loans against their market value. Loans are issued in our native stablecoin, which literally locks carbon into money. KUMO turns the act of owning a dollar into a climate action.\n\nECORISE DAO \ud83c\udf33 @ECORISEDAO : ECORISE brings liquidity to the real estate and natural capital asset market and unlocks stored value through tokenization of these assets and bringing them on-chain. Landowners are incentivized and rewarded for regenerative and restorative actions that increase their natural capital asset value and provides new sources of revenue from ecological economics. \n\nCarbonland:\nCarbonland Trust \ud83c\udf33 @CarbonLandTrust : a carbon credits registry offering natured based carbon removal credits from biodiverse forest land that is being enrolled into perpetual conservation. \nCarbonland DAO \ud83c\udf33 @CarbonlandDAO : a Nature Preserve Timeshare that leverages the Carbonland Trust protocol to issue and sell carbon credits from its own forestland. Carbonland DAO acquires property by selling CDAO tokens, the governance token of Carbonland DAO. Token holders can use CDAO to vote where Carbonland DAO buys property, and can spend CDAO to make reservations to visit and stay at Carbonland DAO\u2019s nature preserves.\n\ndisCarbon \ud83c\udf33 @discarbon_earth : creates transparent and verifiable emission estimation and carbon retirement and tools available as public goods within the Ethereum ecosystem. disCarbon\u2019s aims are to raise awareness about the impact our actions have on our planet and accelerate the adoption of on-chain carbon credits.\n\nChangeblock \ud83c\udf33 : investors can gain access to groundbreaking green credits that are streamlined and independently verified, allowing for the creation and listing of unique instruments on our platform. As the first to offer an end of life plastic credit in collaboration with Fusion One, we have demonstrated the ability to develop credits for any green initiative, providing investors with a unique opportunity to support and benefit from innovative sustainability efforts.\nChangeblockNFT: ChangeblockNFT helps demonstrate commitment to sustainability and social responsibility. We enable NFT companies to improve their reputation, reduce risk and attract top talent whilst making a positive impact on the environment. ChangeblockNFT has the following 3 key features: \nNFT Asset Wrapping: Enhance the value and marketability of your NFTs while supporting UN SDGs with our asset wrapping service; \nRetroactive Carbon Offsetting: Eliminate the negative emissions from your past NFT transactions with ChangeblockNFT. \nAutomated Offsetting: Ensure all future NFT transactions are offset with our automated offsetting service. Choose the green assets you want to support and make a real world impact. \n\nThe Eden Dao \ud83c\udf33 @TheEdenDao : In 2022, Eden Dao launched the DRM Syndicate, which removed 760 tons of CO2 permanently removed from the atmosphere to rise to top 25 in the world alongside Stripe, Microsoft, and Harvard. In 2023, Eden Dao Lab builds regenerative financial infrastructure, decentralized lego blocks, and public good utilities to accelerate time-to-market for ReFi startups.", - "projectWebsite": "https://www.notion.so/Bundle-Carbon-Markets-cc64342f73b9467f969b031811066397", - "projectLogoCid": "bafkreidzxaury4tzglu35h6zqkfkdtv77pvvwirbslwuvcuqevmx6hmplm", - "projectBannerCid": "bafybeiexckaeuirr5fxztoox2o2lpp6pkpcob5wyuuozproc5nb6ycorea", - "projectTwitter": null, - "projectGithub": null, - "userGithub": null, - "fundingTotalDollars": 6238, - "donorsTotal": 248, - "fractionsTotalSupply": 6181, - "hypercertEligibleDonors": 233, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0xB04821C9E7e6A2Bd65C6339C8c20eB1438b5c23B": null, - "0x931884dFeAac21aC4b7809F032Ae850432A0D1c0": null, - "0xe01B4C4d1Cb0d15e3f6cE0182e4d98F882058876": "ecorisedao.eth", - "0x1c0AcCc24e1549125b5b3c14D999D3a496Afbdb1": "haurog.eth", - "0x58B36156A268eC1E28aC781554c556E5152f7450": "theedendao.eth", - "0x4cae80e11fB1fd5C5b18550dA7e7A026F12c4cAF": null, - "0x36A0356d43EE4168ED24EFA1CAe3198708667ac0": null, - "0x4454Bb8A4eFae077629640572B03FADf7E2b9e48": null, - "0x92Dc6FcB703D46E90D363290181379cEE79e192A": null - }, - "safeUsers": null - }, - "hypercertData": { - "workScopes": "Bundle: Carbon Markets", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0xE07b0f3c2A669b656476e4D6A054F4922D539D3D", - "rights": ["Public Display"] - } - }, - { - "title": "Community Engagement - Bundle 6", - "address": "0x315E6c37077cC5772709Bb7fEcd6d7606b4443c4", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0xe8017af6c0a19b08c86e8ef94d9b3dadcbe8f55bc446d7359a6f294d68227b84", - "projectDescription": "\ud83d\udc9a Who are we? \ud83d\udc9a\n\nWe make change happen through community! \ud83d\udc65\ud83d\udc9a\n\nAll the projects and organisations in this bundle focus on change-making and innovation for, by and with communities. \u2728\n\nWe are all cutting edge projects \ud83d\udd1d building and curating communities with planet-positive impact, including web3 conferences, ecovillages, podcasts and learning journeys around regenerative economic systems, new ways of living and climate education. \ud83c\udf40\n\n\ud83c\udf0d The global impact of this group ranges from the United States, Guatemala, Brazil and various countries in Europe and Africa. We travel the world! \ud83d\uddfa\ufe0f\n\n\ud83d\udc65 All of the grantees in this round are working to remove barriers to save the planet, from addressing gaps in language access, lack of knowledge, access to Internet and climate resources and education, digital literacy or capacity to participate in climate action, or the simple ability to connect to nature. \n\n\ud83c\udf38 We are all builders who are using decentralized processes and other accessible technologies for social good. \n\n\ud83c\udf3c We all operate in the climate, health and social justice space. \ud83e\udec2\n\n\ud83d\udc49\ud83c\udffc By donating to this bundle you will have the chance to kick off the new year by supporting global builders in our efforts to create digital public goods alongside Gitcoin. \ud83d\ude4f\ud83c\udffd\ud83e\udd8b\n \n \n\ud83d\udc9a The projects \ud83d\udc9a\n\n\ud83e\udd38\ud83c\udffd\u200d\u2640\ufe0f The Undivide Project: rebuilding, reclaiming and connecting communities to climate solutions and web3\n\n\ud83e\udd38\ud83c\udffe All for Climate DAO is building the Greenpeace of the 21st: a decentralized community of active citizens that take initiatives to transition to a more regenerative world. @allforclimatedao\n\n\ud83e\udd38\ud83c\udffe La Matrice Multiversity Campus: La Matrice Campus is a hotspot of transformative education with a focus on the transmission of regenerative practices, in a vibrant ecovillage. @MatriceCampus\n \n\ud83e\udd38\ud83c\udffe Closer an operating system for regenerative villages. We are building systems that support the governance and operations of regenerative co-living and co-housing projects. @closerearth\n\n\ud83e\udd38\ud83c\udffc\u200d\u2642\ufe0f Translators DAO: a collective of translators and interpreters who ensure communication across the world in five languages and more, for grassroots, non-profit climate justice movements. @TranslatorsDAO \n\n\ud83e\udd38\ud83c\udffe Samara Trust is a decentralized organization of facilitators who help organizations and communities attempting to regenerate our Earth (revitalizing soil, forests, waterways, capturing carbon, etc.) and regenerate our culture \n\n\ud83e\udd38\ud83c\udfff Hazel is gamifying carbon removal using a web3 game to help bring consumer spending to the carbon removal market. @hazelclimateapp\n\n\ud83e\udd38\ud83c\udffd\u200d\u2640\ufe0f Pythagoras Ecology Works uses forest waste wood taken in wildfire mitigation in decentralized manufacture of furniture and structures without use of metal fasteners. @ecologyworks\n\n\ud83e\udd38\ud83c\udffc\u200d\u2642\ufe0f Future Diaries: a dramatised speculative fiction podcast that highlights a variety of social and environmental issues! @future_diaries\n\n\ud83e\udd38\ud83c\udfff Borderless Money: @borderless_refi is the first non-custodial decentralized endowment platform, where contributors retain control over the principal, and only the income generated is distributed to initiatives. @borderless_refi \n\n\ud83e\udd38\ud83c\udffe La Matrice Multiversity Campus: La Matrice Campus is a hotspot of transformative education with a focus on the transmission of regenerative practices, in a vibrant ecovillage. @MatriceCampus\n\n\ud83e\udd38\ud83c\udfff ReConnection Tech (devices & experiences) seek to materialize this kind of world through experimentation with Music from Plants, Smart Forest Baths and more. @emergir.co\n\n\ud83e\udd38\ud83c\udffd\u200d\u2640\ufe0f Open Source Ecology: Open Source Manufacturing: An Affordable Housing Solution\n\n\ud83e\udd38\ud83c\udffc\u200d\u2642\ufe0f ReFi Bootcamp: Learn to Earn Regenerative Finance Education\n\n\ud83e\udd38\ud83c\udfff Cambiatus Complementary currencies and collaborative businesses on Blockchain. @_cambiatus\n\n\ud83e\udd38\ud83c\udfff ReconTech: technology as a mean to reconnect the humans and more-than-human pluriverse.@recon.tec\n\n", - "projectWebsite": "https://dao.allforclimate.earth/gitcoin/bundles/communityengagement", - "projectLogoCid": "bafybeiduh7dlopm4xrqk26uhaowlizeebvgv756qsfxdz7dtx44ki3kmvu", - "projectBannerCid": "bafybeiazrujqcqcpsq3xy4au2isrvobuyyv2rkvbqa52wzark7r4hpnohq", - "projectTwitter": "projects_unite", - "projectGithub": null, - "userGithub": null, - "fundingTotalDollars": 3986, - "donorsTotal": 191, - "fractionsTotalSupply": 3939, - "hypercertEligibleDonors": 176, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0x61d68f2652Ecb7a51b42387D0090574054AcB671": null, - "0x82d2173645fd452134807CeeA12e4CC687F59009": null, - "0x435CD42591cC503a909085c3d3d2899d17032F77": null, - "0x6E73f3166B2F737E967592F3d9D5a0BdeBcA0ed8": null, - "0xF9903c5d11E8f4bFebcf02747D53319E9c4a10c6": "sunnyleen.eth", - "0x3d7CFE9D00436d49178576dC2Be9Adaaad35a775": null - }, - "safeUsers": null - }, - "hypercertData": { - "workScopes": "Community Engagement - Bundle 6", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x315E6c37077cC5772709Bb7fEcd6d7606b4443c4", - "rights": ["Public Display"] - } - }, - { - "title": "Bundle: Emerging Economies and Indigenous Communities", - "address": "0x4574e76CbB9891A90d46b0788cC4094B9275b61E", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0xedc8c2863195c102234eb522c94568c4aabd91d4eb2df52d2c4dc9f953e01295", - "projectDescription": "This bundle unites 12 exciting projects working either in Emerging Economies or with Indigenous Communities around the world. \n \nHumanity must choose to either embrace economic transformation or continue down the path of destruction, desecration and resource theft via war, infringement and oppression. We see many people, worldwide, standing up to denounce the latter. The mission of these projects is to steward and lay the foundation for emerging economies and indigenous communities that are built on the principles of abundance, knowledge sharing, trust and an intimate connection to our fellow human beings, nature and ourselves. \nThe initiatives represented by this bundle include work in First Nation and Native American Communities, LatinoAmerica, Uganda, Nigeria, Kenya, and India with disparate aims but a common mission to demonstrate and expand the role of Free Open Source Software in public goods funding. With your help we will be able to continue our work in climate action, clean energy sovereignty, indigenous justice, the global water crisis, postCapitalist education, regenerative agriculture, mangrove restoration, SolarPunk IoT, and advocacy of both people and Earth\u2019s rights.\nGitcoin offers a means for each of us to reclaim agency over the economic system that we rely on. Let us be empowered and demonstrate the potential of quadratic funding to allocate, prioritize & support transformative change.\nTogether we can empower communities through sustainable, scalable agriculture, climate action, clean energy sovereignty, equitable access, resiliency, advocacy and local environmental achievements. \nIf you would like to know more about the individual projects that have gathered in this bundle, check below!\n\n\ud83c\udf1e KhalonBridge, @KhalonBridge: Nigeria is at the leading edge of the web3 ecosystem but suffers from a notoriously collapsing electrical grid that impedes developer talent from keeping up with the digital economy without having to buy pollutive generators. Khalon Bridge is a development studio collective of over 40+ web3 operators and continues to provide residential solar to emerging talent in the region to advance the digital economy in Africa.\n\n\ud83d\udce1 ReconTech, @emergir.co: Imagine a world in which our technological devices help us to interact more intimately with the more-than-human world, expanding our consciousness by cultivating new cognitive and sensory perceptions. ReConnection Tech (devices & experiences) seek to materialize this kind of world through experimentation with Music from Plants, Smart Forest Baths and more.\n\n\ud83c\udf3b Urb\u00e1nika, @0xUrbanika / @urbanika.lens: An immersive activism school that turns passive citizens into active city shapers capable of using web 3.0 tech, peer governance, and commoning to facilitate transitioning into regenerative ways of living.\n\n\ud83e\uddd1\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c\udffb Vlinder: \"Papariko\" - Restoration of degraded mangrove areas in Kenya, @vlinderclimate: Verra-certified mangrove restoration project to provide a variety of ecosystem services, climate change mitigation, economic considerations, and active participation of the local community in coastal areas of Kenya.\n\n\u2615 Coffee Impact Collective, @Coffeeimpactco: The project supports coffee farmers in their transition to regenerative agriculture by providing agronomic guidance and rewarding them for implementation of new practices. Coffee Impact Collective creates an ecosystem that provides multiple services and opportunities for farmers, allowing them to become a part of a decentralized marketplace where \u201cregenerated\u201d coffee is traded along with eco credits (like carbon, biodiversity, water quality, social impact and eco tourism), not separately. First pilots are starting with farmers and cooperatives in Colombia.\n\n\ud83c\udff5\ufe0f Kangra Gardens, @Kangra_Gardens: The Kangra Gardens are a place for people to express gratitude and give back to the earth by respecting and learning from it. The purpose of the Kangra Botanical Garden, which is a part of Kula, is to regenerate the local ecosystem, promote biodiversity conservation, support community health, build towards food sovereignty and nutrition, and engage people in connecting with the environment. The garden uses Ayurvedic medicine production and syntropic farming to achieve these goals facilitated through a Bioregional Learning Center. The grant for Kangra Gardens aims to fund new as well as current contributors and the development of the gardens themselves to share with the global community.\n\n\ud83d\udc18 Elephant in the Room: @ClimateRace : Strategic Climate Solutions Campaigns. We work with Indigenous organizations, voting organizations, neighborhoods, cities and activists to promote climate action to communities around the world and to counter the vast array of fossil fuel advertising and disinformation. Over the past year Elephant Room has also been creating strategic communications that are focused on the web3 community.\n\n\ud83d\udee2\ufe0f Beyond Fossil Fuels: @BFF_campaign : Indigenous Legal Fund for Climate Action. Presently supporting 2 major projects - 1) Tsleil-Waututh Nation Sacred Trust\u2019s opposition to the TMX pipeline and 2) We Stand Together : a legal climate case that is aimed at ensuring systemic climate planning and remedies for legally binding, science-based climate recovery policies. First Nations have standing under the ratified UNDRIP (United Nations Declaration on the Rights of Indigenous Peoples) Act in Canada and can invoke their unceded rights in legal proceedings to effectively defend and protect the environment.\n\n\ud83d\udc68\ud83c\udffe\u200d\ud83c\udf3e Project regr\u00f2 : @projectregro Under the increasing climate emergency pressure, the regr\u00f2 project aims to connect land owners, farmers and growers, interested in sharing resources to build resilient agro-ecologic systems through Regenerative and Conservation Agriculture, Permaculture and non-invasive practices.\n\n\ud83c\udf33 Ayowecca: Wetlands and peatland ecosystem restoration has been our focus. Together with the local community, we are restoring encroached wetlands and protecting those that already exist. Our strategy involves agroforestry and afforestation. We are promoting agroforestry, by giving farmers fruit trees. Climate change adaptation and mitigation are our primary goals in promoting agroforestry. The effects of climate change on agricultural communities can be lessened by planting trees in agricultural systems. Growing the amount of trees on agricultural land decreases tree cutting and boosts carbon sinks.\n\n\ud83e\udd8b Cambiatus: @_cambiatus - social currencies to foster planetary regeneration. Working with the Paiter Surui indigenous community to create the Paiter Coin and onboard their members into the web3 space.\n\n\ud83d\udc2cProject Toninas: @yaqupachauy Project Toninas is long term project focused on the research and conservation of the Lahille\u2019s bottlenose dolphin T. truncatus gephyreus, a subspecies of bottlenose dolphin that only occurs in Brazil, Uruguay and Argentina. They are only ~ 600 individuals left across the entire distribution (Uruguay population~ 70\ud83d\udc2c). Project Toninas is carried out by Yaqu Pacha Uruguay, a civil non-profit organization dedicated to implementing and promoting projects for the conservation and study of aquatic mammals in Uruguay and the Southwestern Atlantic Ocean. ", - "projectWebsite": "https://tinyurl.com/EmergingEconomiesBundle", - "projectLogoCid": "bafkreidrap5gj445mflaaryngaudaoqjaxwjqe56epanekt7eqrjznadwa", - "projectBannerCid": "bafybeib24bxcvaozehkot63sawz62el6n7jp4fyvkrv26jaznaskrrbcqq", - "projectTwitter": null, - "projectGithub": null, - "userGithub": null, - "fundingTotalDollars": 5511, - "donorsTotal": 212, - "fractionsTotalSupply": 5466, - "hypercertEligibleDonors": 202, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0x0442A9aBbc93058a873c371F21CC366338254A88": "urbanika.eth", - "0x75cC37322D9eE1cE441a4e486217Dcc71A086Aa1": null, - "0xE559e959b891b14eB5A9DdE45C61b1aEb0b6DF4B": null, - "0xAb7e1B060910C2D6Fe9A21bD897e0180941880AC": null, - "0x0ff1bAA6c90480d8627B922A1E81393EB9C7eA08": null, - "0xcbF3c13e05Aa9C18Ab8ecbb3302EDad21C23c688": null, - "0x2604AB91d49106EE861BbC2B6718A4EC25318fae": null, - "0xC675486888761B33E7115Cc04B5e40B42A96799A": null, - "0xFa99AbFc81243b552FBfF526a424f3De6e4F3605": null, - "0x435CD42591cC503a909085c3d3d2899d17032F77": null - }, - "safeUsers": null - }, - "hypercertData": { - "workScopes": "Bundle: Emerging Economies and Indigenous Communities", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x4574e76CbB9891A90d46b0788cC4094B9275b61E", - "rights": ["Public Display"] - } - }, - { - "title": "Bundle: Creative Works", - "address": "0x2129fCc2baD30a0c7A448FE802265A14643092df", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "roundName": "Climate Solutions", - "projectId": "0xf39a20c932f2445f48214e8726d305bac89d54b3c99940d601a168e2b8745014", - "projectDescription": "\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\nAre you looking for a way to contribute to a positive impact on the world through creative works? Bundle: Creative Works is the place to look!\nWe are believers in regeneration through art and unapologetic creativity. We are the solarpunk artists, changemakers, shapeshifters and out-of-the-box creators from all around the world.\nThis group of innovative projects is using their creativity and expertise to address important environmental and social issues. From using art sales to fund social causes to immersive activism schools these projects are making tangible impacts IRL and on web 3.0.\nThat's not all. There are also grants DAOs supporting and funding diverse and creative projects with the potential to make a positive impact and collectives of artists raising awareness about the climate emergency within the group. Creating digital artworks about climate change, producing eco-conscious handmade hemp goods or high-impact filmmaking for climate awareness are also among what amazing projects of this bundle are doing.\nJoin the movement for a better world with the Creative Works Bundle!\n11 creative projects related to art, film, games, solarpunk for Climate Action\u2026\n----------------------------------------------------------------\n\ud83c\udf31 Future Quest\nA web3 ecosystem committed to fixing our future. Part game, part launch pad for public good Quests for our planet.\n@FutureQuestDAO\n----------------------------------------------------------------\n\ud83c\udf31 ColtonArt\n100% of my art sales fund social causes. $154,389 have gone directly to support the Gitcoin Matching Pool by selling over 200 individual artworks over the past year. This grant helps cover my living expenses so I can continue creating solarpunk art that funds our shared needs and hopefully inspires more artists to join the regen movement \u2600\ufe0f\ud83c\udf34\n@mettahead\n----------------------------------------------------------------\n\ud83c\udf31 Urbanika\nImmersive activism school that uses AI and XR to teach about the intersection of web 3.0 and urban governance. We aim to turn passive citizens into active city shapers. Our first course is being co-created with David Bollier and targeted to policy-makers, urban activists, and social entrepreneurs. Enter to urbanika.my.canva.site/ to immerse yourself into the micro-learning videos that come with virtual and IRL\n@0xUrbanika - @urbanika.lens - urbanika.my.canva.site/\n----------------------------------------------------------------\n\ud83c\udf31 Decentralized Desires Studio-Lab (Former: \u201cDynamic Energy Budget\u201d)\nWe are an Art-Science Studio-Lab for DeSci ecosystems - hosted at Omega/TEC. We use art as an inquiry (Practice Based Research in the Arts scientific methodologies) to engage interdisciplinary teams on climate related avenues of research. We develop prototypes and artistic creations to make alternative futures tangible for all.\n@BudgetDynamic - @JeanneBloch - decentralized-desires.com\n----------------------------------------------------------------\n\ud83c\udf31 Climate Change Countdown\nFrom 01/19/2022 and for 10 years, the project regularly creates and posts digital artworks about Climate Change, exploring a variety of forms of visual and non visual arts. The artworks are published on the artists social media channels. The core of the project are periodic expeditions on the field to document causes and effects of Climate Change and positive examples of sustainability and activism. All the artworks are available for free to any nonprofit climate project.\n@Marcobear_eth\n----------------------------------------------------------------\n\ud83c\udf31 Vanara\nVanara is an ecological arts & crafts collective working with hemp not only to produce slow-fashion goods, but also to regenerate the ecosystem as a whole with the strongest fiber in the world. We support economically disadvantaged artisan women and young digital artists by creating and producing with freedom both in the metaverse and in the physical world. Processing hemp to make yarn with authentic methods and techniques is our primary production line. We are preparing to launch an NFT collection of digital art pieces of Hemp as utilities for our workshops, IRL products and community events.\n@Vanara_Co\n----------------------------------------------------------------\n\ud83c\udf31 Ranna\nRanna is an open network of filmmakers dedicating their tools and skills to creating quality content for the environmental and climate justice movements. We create high impact films that provide activist-led, top-tier coverage to climate action initiatives. We are sharing and amplifying the voices of those working for a better collective present and future. In doing so we aim to inspire, engage and mobilize more people to join the fight for a just, livable Earth.\n@rannamedia - ranna.pt\n----------------------------------------------------------------\n\ud83c\udf31 nfDAO\nnfDAO is a grants DAO with a mission is to discover, support and fund diverse and creative projects we believe can make a positive impact. We award micro-grants to promising early stage projects and guide them on their first steps towards success.\n@dao_nf - nfdao.io\n----------------------------------------------------------------\n\ud83c\udf31 Artists for Climate\nUsing art to raise awareness on the climate emergency! Artists For Climate is a collective of humans who use art as a tool to generate an emotional impact on citizens and motivate them to take action in solving the climate emergency we have created. We work together and share knowledge, resources, techniques, inspiration, and much more. The group is managed and coordinated by artists and for artists.\n@all4climatedao - allforclimate.earth\n----------------------------------------------------------------\n\ud83c\udf31 Solarpunk Art DAO:\nWe are a collective of Solarpunks helping create and fund more Solarpunk art to reimagine a regenerative future where humans, nature, and technology live in harmony. Solarpunk comes in many flavors, and it varies based on the needs of every community. We intend to empower local artists to design their local Solarpunk reality by helping them with funding for local IRL exhibitions.\n@all4climatedao - allforclimate.earth\n----------------------------------------------------------------\n\ud83c\udf31 W3ST: Solarpunk meta-nation\nAn impact network of regenerative projects (nodes) united under the symbolic entity of a globally distributed country to transition to new models of political, social and economic innovation through the will and direct action of its citizens. We are working through 3 ACTION STREAMS: NODES (territories and positive impact initiatives) + ACTIVISM (direct actions and artistic interventions) + FUNDRAISING (help like-minded entities and collectives)\n@w3stdao\n----------------------------------------------------------------\n\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\n", - "projectWebsite": "https://tinyurl.com/gitcoincreative", - "projectLogoCid": "bafybeienbtvud7wqtlvwesdff44xmss2bdojkjgjqx7gdvmtber4cdkceq", - "projectBannerCid": "bafybeibptkvyxj3mchbk5qgchhj5i6glmjegaglnvhrseqtjl63qh72veq", - "projectTwitter": "", - "projectGithub": null, - "userGithub": null, - "fundingTotalDollars": 2381, - "donorsTotal": 191, - "fractionsTotalSupply": 2342, - "hypercertEligibleDonors": 179, - "ensName": null, - "addressType": "Safe", - "addressScan": { - "safeOwners": { - "0x0442A9aBbc93058a873c371F21CC366338254A88": "urbanika.eth", - "0x6B5918D8EF9094679F4b4e1Bf397a66eA411B118": "coltonart.eth", - "0xD3055381ce349b4cB7116A0b3FAb762c3f16FA45": "cicicici.eth", - "0x32cC507E7B0596562823c66D0f6950F14961BEf3": null, - "0x99a8CE58d2232B0aC2f5cC5C0D08c0B8c6727DCB": null, - "0x82D4f37d3a5ebF9B7D89e9D83E1Fc59DAD3E97aF": null, - "0xC9683E50D2edC15c72b7a7bB8666f7c5C466fE19": null, - "0x9A22b1D4661661E96c2c7D7ECf93F0672B3F27d4": null - }, - "safeUsers": null - }, - "hypercertData": { - "workScopes": "Bundle: Creative Works", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "0x2129fCc2baD30a0c7A448FE802265A14643092df", - "rights": ["Public Display"] - } - } -] diff --git a/utils/gitcoin/gitcoin-alpha/data/climate-bundle-data.json b/utils/gitcoin/gitcoin-alpha/data/climate-bundle-data.json deleted file mode 100644 index 0ece918..0000000 --- a/utils/gitcoin/gitcoin-alpha/data/climate-bundle-data.json +++ /dev/null @@ -1,553 +0,0 @@ -[ - { - "bundleId": "0x0b84bfa1e358e2c7816e5244258c16e4d6d06930fb4cf20f2d714ce35d330308", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "bundleName": "Bundle: Agriculture", - "workScope": "Agriculture", - "bundleDescription": "\ud83c\udf31\u00a0This grant bundles 8 initiatives devoted to transforming agriculture to provide healthy food, water, material, medicinal security to communities, regenerated working lands for improved carbon & water cycling, and biodiversity as well as general ecosystem functions. \ud83c\udf31\u00a0\n\n\ud83d\ude9c\u00a0 Agriculture is a primary driver of land, water degradation globally, and contributes significantly to global GHG emissions (>10%) food is essential for a community\u2019s security & well-being, and is considered a matter of national security by modern nation-states. \n\n\ud83d\udc90\u00a0\u00a0Regenerative agriculture initiatives recognize the fragility of \u201cmodern\u201d agriculture. They argue that resilient communities achieve food, water, material & medicinal security by restoring health to their surroundings and valuing ecosystem functions. It generally allows us to decolonize our minds that traditionally associate farming with mass monoculture to instead associate it with multiple and diverse species (wild, livestock, vegetative, & microbiome\u2026) contributing to the resilience of a whole ecosystem. \n\n\ud83c\udf0e\u00a0 A global decentralized grants platform like Gitcoin offers a means for each of us to reclaim agency over the food system that we rely on. Let us be empowered and demonstrate the potential of quadratic funding to allocate, prioritize, as well as support transformative change to agriculture across scales. \n\n\u2600\ufe0f\u00a0The initiatives represented by this bundle are collaborating with local communities and indigenous organizations while providing access to knowledge about regenerative agriculture as well as access to the tools for farmers. Creating these impacts in Kenya, Columbia, India, Croatia & the United States with disparate aims but a common mission and mandate to demonstrate and expand the role of free and open-source software in public goods funding.\n\nIf you would like to know more about the individual projects that have been gathered in this bundle, check below!\n\n\u2615\ufe0f Coffee Carbon Collective, @CoffeeCarbonCo: supports coffee farmers in their transition to regenerative agriculture by providing agronomic guidance and rewarding them for the implementation of new practices. Coffee Impact Collective creates an ecosystem that provides multiple services and opportunities for farmers, allowing them to become a part of a decentralized marketplace where \u201cregenerated\u201d coffee is traded along with eco credits (like carbon, biodiversity, water quality, social impact, and eco-tourism), not separately.\n\n\ud83c\udf38\u00a0 Kanga Gardens, @Kangra_Gardens: The Kangra Gardens are a place for people to express gratitude and give back to the earth by respecting and learning from it. The purpose of the Kangra Botanical Garden, which is a part of Kula, is to regenerate the local ecosystem, promote biodiversity conservation, support community health, build towards food sovereignty and nutrition, and engage people in connecting with the environment. The garden uses Ayurvedic medicine production and syntropic farming to achieve these goals facilitated through a Bioregional Learning Center. The grant for Kangra Gardens aims to fund new as well as current contributors and the development of open-source documentation to share with the global community.\n\n\ud83d\udca7\u00a0Watercycle, @friedmanspace: Watercycle is developing an open-source, low-cost water structuring device to improve crop yields and accelerate natural carbon sequestration. Water structuring is the process of altering the structure of water to optimize its ability to support life. The benefits of water structuring in agriculture include improved soil structure, increased plant growth and yield, and reduced water usage.\n\n\ud83c\udfdd\ufe0f\u00a0Ogallala.Life, @ogallalalife: We are a not-for-profit devoted to learning, exploring, developing & deploying web3 tools for landscape rehydration on and around the US high plains aquifer system. Our mission is to prove out market incentives for improved water recharge & retention - our communities place a tremendously high value on water security and ReFi offers novel mechanisms to invest in surrounding landscapes & watersheds. We\u2019ve launched pilot projects along the Canadian River breaks to explore leaky weirs, riparian restoration, and similar interventions, & their impact on the water budget, biodiversity, carbon & climate. Our projects help facilitate the maturation of decentralized science applied towards regenerative aims through our active collaboration with dMeter, a DAO tasked to build tools for decentralized digital measure recordation & validation in natural capital context including but not limited to PES markets.\n\n\ud83d\udc68\ud83c\udffe\u200d\ud83c\udf3e\u00a0 Regr\u00f2, @projectregro: At Regr\u00f2 farmers, gardeners and artists share their journeys about Regenerative Agriculture and Regenerative Finance. Under the increasing climate emergency pressure, the Regr\u00f2 project aims to connect land owners, farmers, and growers, interested in sharing resources to build resilient agroecological systems through Regenerative and Conservation Agriculture, Permaculture, and non-invasive practices.\n\n\ud83c\udf33 Ayowecca Uganda, @ayowecca_uganda: A community-founded organization working on nature-based solutions, Wetlands and peatland ecosystem restoration has been our focus. Together with the local community, we are restoring encroached wetlands and protecting those that already exist. Our strategy involves agroforestry and afforestation. We are promoting agroforestry, by giving farmers fruit trees to plant beside their crops to protect the degraded landscape, promote food security and raise food production. Climate change adaptation and mitigation are our primary goals in promoting agroforestry/regenerative agriculture and permaculture. The effects of climate change on agricultural communities can be lessened by planting trees in agricultural systems. Growing the number of trees on agricultural land decreases tree cutting and boosts carbon sinks.\n\n \ud83d\udce1\u00a0 dMRV Network, @dmrvnetwork: dMRV network puts the tools necessary in the hands of small-scale farmers and other marginalized communities so that they have the opportunity to collect and submit valuable ecological data for fair compensation. dMRV network is a decentralized organization of scientists, project developers, farmers, and regenerators that contributes to open source systems that allow for decentralized data collection correlation of ecological data into ecological credits and/or payments. The primary goal of dMRV Network is to create a guide for communities to identify the best practices, tools, and resources for maximizing value and ecological health via ecological service payments and/or credits.\n\n\ud83c\udf31 The WeSeed Project @weseedrefi: The WeSeed Project is a unique initiative that aims to address global food insecurity challenges through the use of blockchain and cryptocurrency technologies. The project seeks to provide education and training in these areas to underserved communities, empowering them to actively participate in regenerative microeconomics and create long-term systemic change.", - "projects": [ - { - "project_name": "Coffee Carbon Collective", - "twitter_handle": "@CoffeeCarbonCo", - "description": "Supports coffee farmers in their transition to regenerative agriculture by providing agronomic guidance and rewarding them for the implementation of new practices. Creates an ecosystem that provides multiple services and opportunities for farmers." - }, - { - "project_name": "Kangra Gardens", - "twitter_handle": "@Kangra_Gardens", - "description": "A place for people to express gratitude and give back to the earth by respecting and learning from it. Uses Ayurvedic medicine production and syntropic farming to achieve goals." - }, - { - "project_name": "Watercycle", - "twitter_handle": "@friedmanspace", - "description": "Developing an open-source, low-cost water structuring device to improve crop yields and accelerate natural carbon sequestration. Benefits of water structuring in agriculture include improved soil structure, increased plant growth and yield, and reduced water usage." - }, - { - "project_name": "Ogallala.Life", - "twitter_handle": "@ogallalalife", - "description": "Devoted to learning, exploring, developing & deploying web3 tools for landscape rehydration on and around the US high plains aquifer system. Proves out market incentives for improved water recharge & retention." - }, - { - "project_name": "Regr\u00f2", - "twitter_handle": "@projectregro", - "description": "Connects land owners, farmers, and growers, interested in sharing resources to build resilient agroecological systems through Regenerative and Conservation Agriculture, Permaculture, and non-invasive practices." - }, - { - "project_name": "Ayowecca", - "twitter_handle": "@ayowecca_uganda", - "description": "A community-founded organization working on nature-based solutions, Wetlands and peatland ecosystem restoration. Promotes agroforestry, by giving farmers fruit trees to plant beside their crops to protect the degraded landscape, promote food security and raise food production." - }, - { - "project_name": "dMRV Network", - "twitter_handle": "@dmrvnetwork", - "description": "Puts the tools necessary in the hands of small-scale farmers and other marginalized communities so that they have the opportunity to collect and submit valuable ecological data for fair compensation." - }, - { - "project_name": "WeSeed Project", - "twitter_handle": "@weseedrefi", - "description": "Addresses global food insecurity challenges through the use of blockchain and cryptocurrency technologies. Provides education and training in these areas to underserved communities, empowering them to actively participate in regenerative microeconomics." - } - ] - }, - { - "bundleId": "0x42c5410440da06b29d782ee691783aad21d76b0de61c1034432f816af89aa57f", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "bundleName": "Act Now Climate Change Bundle", - "bundleDescription": "\ud83d\udc9a ACT NOW CLIMATE CHANGE BUNDLE:\n\nActivism and advocacy can change the world. They can push the boundaries of our knowledge, tip the balance on policy and induce public action to affect environmental and social change. The projects in the activism and advocacy bundle extend from the depths of the earth to the far reaches of outer space and include:\n\n- Collaborations between Web3 regens and land trusts\n- Indigenous legal climate challenges\n- Initiatives to incentivize planetary cleanup, from oceans and rainforests to Earth's orbits\n- Strategic Climate Solutions Campaigns\n- Putting the Paris Agreement carbon markets on chain\n- Governing climate-related blockchain efforts across sectors\n\n\ud83d\udc18 ELEPHANT IN THE ROOM:\n\nTwitter- @ClimateRace\n\nStrategic Climate Solutions Campaigns. We work with Indigenous organizations, voting organizations, neighborhoods, cities and activists to promote climate action to communities around the world and to counter the vast array of fossil fuel advertising and disinformation. Over the past year Elephant Room has also been creating strategic communications that are focused on the web3 community.\n\n\ud83c\udfe1 UNEARTHING COMMON GROUND:\n\nWebsite- https://common-ground.super.site/\nTwitter- @commongroundCLT\n\nGitcoin Grant 16 page-https://gitcoin.co/grants/6318/unearthing-common-ground-a-six-week-journey-into-\n\n0x08f2E5b3b316C49F8Ab95df0D6ee541271d10f7e\n\nA six week learning journey which introduces 50 web3 regens to 50 existing community land trusts from around the world to develop on the ground project collaboration.\n\n\u267b\ufe0f LITTER TOKEN ($LTK):\n\nTwitter- @litter_token\nInstagram- @littertoken\nWebsite- www.littertoken.xyz\n\nLittle Token is a purpose-driven token that pays people to pick up litter. We use our own cryptocurrency to compensate people for cleaning up the planet. We are Pokemon Go for climate change.\n\nTo date, we have picked up 65k+ pieces of litter (across Nigeria, Philippines, USA, Brazil, Puerto Rico, etc), started a Community Farm in rural Nigeria, and started a waste management business in Puerto Rico.\n\n\ud83d\udef0\ufe0f COSMOS FOR HUMANITY:\n\nWebsite- https://cosmosforhumanity.eu/en/\nTwitter- @cosmos4humanity\nDiscord- https://discord.gg/mmCAgkHFnn\n\nGitcoin Grant 16 page-https://gitcoin.co/grants/6782/protecting-earths-orbits-through-citizen-intellige\n\nC4H is a Swiss-based NGO that promotes a more sustainable access to outer space for humanity. We are currently creating a carbon footprint inspired indicator in partnership with the French space agency. We also aim to create a citizen-run label to fund researchers and startups working on space pollution and help finance active debris removal operations in the future.\n\n\u2696\ufe0f BEYOND FOSSIL FUELS:\n\nTwitter- @BFF_campaign\n\nIndigenous Legal Fund for Climate Action.\n\n\ud83c\udf33 BLOCKCHAIN FOR CLIMATE FOUNDATION:\n\nTwitter- @blockforclimate\n\nBlockchain for Climate Foundation is working to put the Paris Agreement carbon markets on Ethereum to enable cross border collaboration on climate change. The BITMO Platform enables national government issuance and exchange of sovereign emissions reductions and removals outcomes as ERC-1155 NFTs - providing low-cost transparent architecture for a more timely launch of these markets.\n\n\ud83d\udce3 BLOCKCHAIN x CLIMATE INFRASTRUCTURE (BxCi) - formerly known as BICOWG\n\nTwitter- @BICWOG \n\nBxC is an activist-to-industry network of global stakeholders working together to define and author cooperative operating and technical principles that govern climate-related blockchain efforts across sectors. BxCi working groups focus on carbon market registries, standards and auditability, policy development, regenerative finance and emerging markets in the global south. In 2023, BxC aims to scale the reach and impact of these initiatives and identify new multi-sector alliances. Many of these projects are underway as proof of concepts or in fully implemented solutions but require a consistent taxonomy framework to scale.", - "projects": [ - { - "project_name": "Elephant in the Room", - "twitter_handle": "ClimateRace", - "description": "Elephant in the Room works with Indigenous organizations, voting organizations, neighborhoods, cities, and activists to promote climate action to communities around the world and to counter fossil fuel advertising and disinformation." - }, - { - "project_name": "Unearthing Common Ground", - "twitter_handle": "commongroundCLT", - "description": "Unearthing Common Ground is a six week learning journey which introduces 50 Web3 regens to 50 existing community land trusts from around the world to develop on the ground project collaboration." - }, - { - "project_name": "Litter Token ($LTK)", - "twitter_handle": "litter_token", - "description": "Litter Token is a purpose-driven token that pays people to pick up litter. They use their own cryptocurrency to compensate people for cleaning up the planet." - }, - { - "project_name": "Cosmos for Humanity", - "twitter_handle": "cosmos4humanity", - "description": "Cosmos for Humanity is a Swiss-based NGO that promotes a more sustainable access to outer space for humanity. They are creating a carbon footprint inspired indicator and a citizen-run label to fund researchers and startups working on space pollution." - }, - { - "project_name": "Beyond Fossil Fuels", - "twitter_handle": "BFF_campaign", - "description": "Beyond Fossil Fuels is an Indigenous Legal Fund for Climate Action." - }, - { - "project_name": "Blockchain for Climate Foundation", - "twitter_handle": "blockforclimate", - "description": "Blockchain for Climate Foundation is working to put the Paris Agreement carbon markets on Ethereum to enable cross border collaboration on climate change." - }, - { - "project_name": "Blockchain x Climate Infrastructure", - "twitter_handle": "BICWOG", - "description": "Blockchain x Climate Infrastructure is an activist-to-industry network of global stakeholders working together to define and author cooperative operating and technical principles for climate-related blockchain efforts." - } - ] - }, - { - "bundleId": "0x52f41f0f49803ae47f13977a8a5dd1b170348e82e2d59303861efb83d1413b50", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "bundleName": "Bundle \u26a1\ufe0f\u267b\ufe0fRenewable Energy", - "bundleDescription": "//////////// \ud83d\udc41 LOOK HERE \ud83d\udc41 //////////////\nThe BEST place to read about this bundle with images is on \n\ud83d\udc49 https://bit.ly/RenewableEnergyGrant \ud83d\udc48\n\udb40\udc20\n\n/////////////// \ud83c\udfc3\u200d\u2642\ufe0fTL;DR ////////////////\n\n//// \u26a1\ufe0f\u267b\ufe0f WHY SUPPORT THE RENEWABLE ENERGY BUNDLE \n\n\nEnergy is the \ud83d\udc49 biggest problem of the Climate Crisis \ud83d\udc48 \nsince its consumption is responsible for 75.6% of all global CO2 emissions \ud83e\udd2f\n \nThese projects are working hard to \ud83d\udcc9 reduce emissions and create new ways to increase the adoption of renewable energy in its many forms.\n\n\nWe are focused on directly funding renewable energy development around the world while creating decentralized energy grids and data centers that heat spaces with compute power instead of wasting energy on cooling. This removes middle men, makes climate action programmable, improves access to stable electricity and accelerates the world\u2019s transition to sustainable energy and heating.\n\nIf you want to put your chips on a sector that is e-x-i-s-t-e-n-t-i-a-l and fundamental for solving climate change, it would be this.\n\n\udb40\udc20\n//////////// \ud83d\udc68\u200d\ud83d\ude80 THE PROJECTS /////////////\n\udb40\udc20\n\ud83d\udc49\ud83d\udc49\ud83d\udc49 7ENERGY\nEmpowering Renewable Energy Independence for Energy Communities \ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66\u26a1\ufe0f\n\nJoin the 7Energy revolution and take control of your energy \u26a1\ufe0fconsumption! Our platform and community empower individuals to optimize their energy usage and cost, \ud83d\udcb5 while breaking free from dependence on fossil fuels and big corporations. Be a part of shaping a sustainable and healthy \ud83d\udc9a energy future for all.\n\ud83d\udc26 @7EnergyDAO \n\ud83d\udd17 https://7energy.at\n\n\n\udb40\udc20\n\ud83d\udc49\ud83d\udc49\ud83d\udc49 ZERO LABS & BLOCKS GARDEN\nEmbedding tokenized renewable energy into any digital process or app + Blocks.garden to MakeCryptoGreen\n \nthrough tokenized Renewable Energy Certificates (REC) and our simple API, making climate action programmable and automatic \ud83e\udd16, building radically accessible and transparent tools that make it easy for anyone anywhere to buy renewable energy \u267b\ufe0f\u26a1\ufe0fand prove it on a blockchain, and tell the story of their impact with \ud83e\udd29 gorgeous human readable \u2705 Green-Proofs 2\ufe0f\u20e3. We call this vision \u201cprogrammable decarbonization\u201d.\n \nWe recently \ud83d\ude80launched Blocks.garden 3\ufe0f\u20e3 to #MakeCryptoGreen, starting from decarbonizing Ethereum\u2019s 1 historical emissions. \n\ud83d\udc26 @zerolabsx \n\ud83d\udd17 www.zerolabs.green \n\n\ud83d\udd17 2\ufe0f\u20e3 https://app.proofs.green\n\ud83d\udd17 3\ufe0f\u20e3 https://.blocks.garden\n\n\n\n\udb40\udc20\n\ud83d\udc49\ud83d\udc49\ud83d\udc49 FUROA \nFloor heating with compute power \n\nData centers consume 2% of the world\u2019s electricity but 40% of it is wasted on cooling \u2744\ufe0f. That\u2019s enough energy to heat millions of homes \ud83c\udfe1 or offices \ud83c\udfe2. And that\u2019s why we\u2019re building Furoa\u2014a floor heating system that heats spaces with compute power \u26a1\ufe0f; laying the foundation for zero-emission, truly decentralized computing \ud83d\ude4c. Since GR15, we\u2019ve established relationships with component suppliers and updated the design to reduce production cost and energy consumption.\n\ud83d\udc26 @FuroaCo \n\ud83d\udd17 https://furoa.co\n\n\n\n\udb40\udc20\n\udb40\udc20\ud83d\udc49\ud83d\udc49\ud83d\udc49 KHALON BRIDGE\nDistributed Solar for Web3 Creators in Nigeria\n\nNigeria is at the leading edge of the web3 ecosystem but suffers from a notoriously collapsing electrical grid that impedes developer talent from keeping up with the digital economy without having to buy pollutive generators. Khalon Bridge is a development studio collective of over 40+ web3 operators and continues to provide residential solar to emerging talent in the region to advance the digital economy in Africa.\n\ud83d\udc26 @Khalon Bridge\n\ud83d\udd17 https://khalonbridge.com/\n\n\n\n\udb40\udc20\n//////////// POWER A \u267b\ufe0fFUTURE /////////////\n\n\ud83d\udc9a Be a part of the solution and not the pollution. \n\u2600\ufe0f Join us in powering a brighter future!\n\ud83d\ude4f Support renewable energy by donating today! \n\ud83d\udc49 only on ETH mainnet\n*********************************************\n\n\n\udb40\udc20\n///////////// \ud83d\udc41 REMEMBER \ud83d\udc41 ///////////////\nThe BEST place to read about this bundle with images is on \n\ud83d\udc49 https://bit.ly/RenewableEnergyGrant \ud83d\udc48", - "projects": [ - { - "project_name": "7Energy", - "twitter_handle": "@7EnergyDAO", - "description": "Empowering Renewable Energy Independence for Energy Communities. Join the 7Energy revolution and take control of your energy consumption!" - }, - { - "project_name": "Zero Labs & Block Garden", - "twitter_handle": "@zerolabsx", - "description": "Embedding tokenized renewable energy into any digital process or app. Making climate action programmable and automatic, building radically accessible and transparent tools." - }, - { - "project_name": "Furua", - "twitter_handle": "@FuroaCo", - "description": "Floor heating system that heats spaces with compute power; laying the foundation for zero-emission, truly decentralized computing." - }, - { - "project_name": "Khalon Bridge", - "twitter_handle": "@KhalonBridge", - "description": "Distributed Solar for Web3 Creators in Nigeria. Providing residential solar to emerging talent in the region to advance the digital economy in Africa." - } - ] - }, - { - "bundleId": "0x5b82b9d0cb3d0d14c8fe693502b197cfbc0f55115446632448549da20538c96c", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "bundleName": "Bundle: Climate Research Alpha Round", - "bundleDescription": "Mission Statement:\n\nTime is running out. Climate research today needs to focus immediately on practical solutions. We need research that leads to mass movements and exponentially growing impact. Like the US Advanced Research Projects Agency - Energy (ARPA-E), the Climate Research bundle will be a key engine of climate innovation and climate action. While fixing our sights on the high bar set by ARPA-E is wildly ambitious, we know that blockchain technology can exponentially increase effective and efficient scientific research. Integrated indicators make the research replicable and scalable and allow improved documentation and verification. The ambitious and innovative projects in the Climate Research bundle will architect many systems of the new infrastructure of climate research and scientific collaboration. \n\nThis bundle is comprised of 8 critical and interrelated projects address various challenges of climate research by generating:\n\n\u26a1 Clean, cheap, abundant, and reliable sources of energy and the need to mitigate the negative impacts of climate change on cities and urban areas.\n\n\ud83d\udca8 Increased speed and efficiency of traditional methods for conducting and translating scientific research\n\n\ud83e\udd2f Solutions to the complex set of root causes that contribute to the long time it takes for scientific research to be implemented in real life\n\n\ud83d\udd0d Increased transparency, traceability, and access to funding for scientific research\n\n\ud83e\uddbe Effective mechanisms to protect intellectual property, reduced investor risk in, and increased investor access to the scientific and technological innovation process\n\n\ud83e\udd11 Profitable ways for companies to align with community values related to climate change\n\n\ud83d\udd2c More effective research, and strategies for promoting and supporting scientific innovation that positively impacts the world and its inhabitants\n\n\ud83c\udf31 Developing regenerative data tech, storing digital data in the DNA of plants and trees, to create carbon absorbing data storage\n\nThe projects contributing to this effort are:\n\n\ud83c\udf0e FrontierDAO\n\ud83c\udf0e SCINET\n\ud83c\udf0e Option\n\ud83c\udf0e ScienceFund\n\ud83c\udf0e Internet of Animals\n\ud83c\udf0e Defi Biolabs\n\ud83c\udf0e Circonomy\n\ud83c\udf0e Grow Your Own Cloud DAO (GYOC DAO)\n\nFrontierDAO @FrontierDAO; Collectively incubating scientific and engineering innovations and innovators, using Web3 tooling (linktr.ee/frontierdao).\n\nOne of our key focus areas is \u201cfusion energy as a climate solution.\u201d Fusion energy, while still in its infancy, is the technology that will usher in a new era on this planet - one where cheap, clean, abundant, baseload energy is available for all. \n\nNuclear fusion energy is the energy of the stars and sun. It is the opposite of nuclear fission.. \n\nTo help usher in this new era of transition to clean energy, FrontierDAO has released in BETA an IP NFT on-chain scientific publishing platform called FrontierRegistry. By publishing research on the blockchain, we aim to foster greater collaboration while protecting authors\u2019 IP rights. frontierda.xyz/faqs-projects\n\nFunds raised from GR15 were used to partially underwrite a 12-week Fusion Energy As A Climate Solution weekly workshop series that ran from November to mid-January. Interviews can be found on Youtube.com/@frontierdao. \n\nSCINET, INC @scinet_inc. At SCINET, we are increasing the speed, efficiency, and effectiveness of life sciences research from \u201clab to life\u201d by developing a suite of software applications in a decentralized (\"DeSci\") life sciences ecosystem that addresses the complex set of root causes for why it takes 17 years for life sciences research, including climate solutions, to get into real life (see here for socials, media mentions, website, etc.).\n\nWe help scientists conduct and translate research faster, more accurately, and more efficiently by offering them a unique confluence of decentralized funding, blockchain-protected IP, unique trust mechanisms, and commercialization strategies that reduce investor risk, increase scientific innovation, protect intellectual property, and positively impact the world and its inhabitants.\n\nOption, @option_hq: Option is a prediction market for governance that incentivizes companies to align with community values, including those related to climate change, by making it profitable for them to do so. An example of climate governance using Option could be creating a market where players can make predictions about a company's carbon emissions reduction targets. If the company meets its targets, those who predicted accurately would be rewarded. This would incentivize the company to align with community values and reduce its carbon emissions in order to profit from the market. Furthermore, the funding provided by the market could be used to support research and journalism focused on climate change and carbon emissions reduction.\n\nScience Fund, @sciencefund_io: Fund basic science with donations recorded for posterity on the Ethereum blockchain. \n\nScience Fund is empowering scientists to freely, openly, and rapidly pursue their best scientific ideas. To achieve this, we are reimagining how discovery is funded. No grant applications. Transparent, traceable funding records. Rapid funding cycles that support more ideas early and continue funding what\u2019s working. In this Gitcoin Round, we plan to test some of the mechanisms we thought out. At least 80% of the funds collected in this round will go towards our first Climate Action funding pool, the \u201cUrban Climate Impact Mitigation Pool\u201d. \n\nSpecifically we will support \u201cUPP\u201d - the \u201cUrban Planting Project\u201d incubated at the AKASHA Hub in Barcelona. UPPs mission is to turn every available city space into green islands of chill. By easing heat stress, UPP is helping to mitigate the effects of climate change and promote new sources for local food production in cities. UPP has already formed partnerships with local universities and communities to deploy its \u201cUPP toolbox\u201d and will apply S.M.A.R.T. principles to quantify the project's impact both through technology including real-time tracking, and satellite imagery as well as by documenting the social impact of their project.\n\nDonors to our Gitcoin grant will be recorded in the funding pool through their Ethereum addresses and will receive certificates of the impact that allows them to unlock information and data about the project\u2019s success at regular intervals in the future. \n\nInternet of Animals, @WildlifeMovemnt: Our mission is to create a community of scientists that promotes the design, development, implementation, and improvement of accessibility to software, hardware, and knowledge resources related to wildlife movement ecology. To realize that vision, we formed The Wildlife Movement Institute, a nonprofit organization to be a hub for this community for local, regional, and international collaborations \u2013 whether you are an expert or someone passionate about wildlife and technology. Since the end of GR15 we have established a bank account, set up a business account on CoinBase and are now preparing to invest in web development and getting 501(c)(3) tax status. \n\nDefi Biolabs, @Defibiolabs: Bioengineering algae to reduce greenhouse gas emissions. \nGR15 Grant: https://gitcoin.co/grants/7497/defi-biolabs-is-engineering-cyanobacteria-to-prod\n\nCirconomy, @CirconomyDAO: Recycle & Reuse 2 Earn 2 put the \u201ceco\u201d in \u201ceconomy\u201d (https://www.circon.me). \n\nWe aspire to become a DAO platform to proliferate circular economic projects all over the world. We'll accomplish this by building a dapp which will have a combination of on-chain registration of hardware-based circular economic projects such as Precious Plastic. This will be crowdfunded to ensure common ownership and stakeholdership. This will be supported by on-chain tracking of all recycling activity which will have a recycle-2-eajjrn cryptoeconomics model underpinning it.\n\nWe are currently creating a crypto-back solution for the world of recycling & reusing. We\u2019ll accomplish this by tokenizing existing points-based recycling/reuse-2-earn programs administered by not-for-profit organizations such as Circulr.ca and RedeemClothingRecycling.com. This allows us to better empower end users with an interoperable incentive that would have a unified reward pool amongst all of our partners as well as grant more autonomy to our partners to scale their operations.\n\nThe high-level summary of our tokenomics is as follows - there will be a dual-token system whereby:\nThe token users will earn will be created by coalitions between brands and nonprofits so what we mean by this is - depending on the material in question and/or other factors, we\u2019ll have coalitions of for-profit and nonprofit organizations that will mint a utility token together for earning. As an example - ideally, all clothing-recycling will have one utility token governed by all nonprofits that handle clothing recycling whilst the for-profits will be sustainable fashion brands. Likewise, all plastic-recycling will have one utility token governed by all nonprofits that deal with plastic recycling whilst the for-profits will be sustainable toy/merch companies. In that latter example, there may be multiple coalitions given that the toy industry is a specific/niche market. But regardless, we\u2019re starting with the fashion industry as our MVP.\n\nThis utility token will not be tradable in the exchanges because Circonomy itself will have a token that will be liquid in the exchanges out there. This token will be token-bonded to the utility tokens within Circonomy\u2019s ecosystem and thus in order for users to either obtain other utility tokens or liquidate them, they\u2019ll have to exchange their utility token for the Circonomy token. Each utility token will be exchangeable for rewards such as discounts or exclusive access to brand events that are token-gated or NFT phygital goods. But if they don\u2019t care about those things, they may simply liquidate by way of exchanging for the Circonomy token and then selling their Circonomy token, or they may stake the Circonomy token for gains of course and helping to drive value.\n\nGrow Your Own Cloud, @_GYOC: develops regenerative data technology, storing digital data in the DNA of plants and trees, to create carbon absorbing data storage. \n\nIt works! We\u2019ve just been awarded the science breakthrough of the year from Falling Walls for our functional prototype 'Data Garden'. We\u2019ve also just finished an EU-funded research project that demonstrates how urban scale implementations of GYOC could absorb megatonnes of carbon and store terabytes of data.\n\nNow we\u2019re developing a unique Web3 offering we call \"Non-Fungible Plants\" (NFPs). NFPs are physical plants with data encoded within their DNA. Data like JPEGs and MP3s. They\u2019re the first truly plant-based NFTs ever created. They\u2019re the first step to build data systems that work in harmony with living systems for maximum positive impact.\n\nTo enable our vision, within Web3 we are forming GYOC DAO: an internet-native organization dedicated to accelerating the transition to truly green data storage. Funds raised through this bundle will help the continued growth of an organization which more closely resembles a public good than a traditional tech company. Together we can create a future where server farms could be replaced by data forests. \n\n", - "projects": [ - { - "project_name": "FrontierDAO", - "twitter_handle": "@FrontierDAO", - "description": "Collectively incubating scientific and engineering innovations and innovators, using Web3 tooling. Focus area is \u201cfusion energy as a climate solution.\u201d Released IP NFT on-chain scientific publishing platform called FrontierRegistry." - }, - { - "project_name": "SCINET, INC", - "twitter_handle": "@scinet_inc", - "description": "Increasing speed, efficiency, and effectiveness of life sciences research from \u201clab to life\u201d through decentralized life sciences ecosystem. Offering unique confluence of decentralized funding, blockchain-protected IP, and commercialization strategies." - }, - { - "project_name": "Option", - "twitter_handle": "@option_hq", - "description": "Prediction market for governance that incentivizes companies to align with community values, including those related to climate change, by making it profitable for them to do so." - }, - { - "project_name": "ScienceFund", - "twitter_handle": "@sciencefund_io", - "description": "Funding basic science with donations recorded for posterity on the Ethereum blockchain. Supporting \u201cUrban Climate Impact Mitigation Pool\u201d, specifically \u201cUPP\u201d - the \u201cUrban Planting Project\u201d incubated at the AKASHA Hub in Barcelona." - }, - { - "project_name": "Internet of Animals", - "twitter_handle": "@WildlifeMovemnt", - "description": "Creating a community of scientists to promote design, development, implementation, and improvement of software, hardware, and knowledge resources related to wildlife movement ecology. Established a bank account and business account on CoinBase, preparing to invest in web development and 501(c)(3) tax status." - }, - { - "project_name": "Defi Biolabs", - "twitter_handle": "@Defibiolabs", - "description": "Bioengineering algae to reduce greenhouse gas emissions." - }, - { - "project_name": "Circonomy", - "twitter_handle": "@CirconomyDAO", - "description": "Recycle & Reuse 2 Earn 2 put the \u201ceco\u201d in \u201ceconomy\u201d. Building a dapp with combination of on-chain registration of hardware-based circular economic projects and on-chain tracking of all recycling activity." - }, - { - "project_name": "Grow Your Own Cloud DAO (GYOC DAO)", - "twitter_handle": "@_GYOC", - "description": "Developing regenerative data tech, storing digital data in the DNA of plants and trees, to create carbon absorbing data storage. Awarded science breakthrough of the year from Falling Walls. Building unique Web3 offering \u201cNon-Fungible Plants\u201d (NFPs)." - } - ] - }, - { - "bundleId": "0x89c4fbe0d97ba25cba17b36c837c27cb7b39c96ccc8b43a99df2dfaca9732763", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "bundleName": "Bundle: Oceans & Forests", - "bundleDescription": " \n\ud83d\udc49 Who are we? \n \nWe are independent teams of conscious humans, climate tech entrepreneurs, computer scientists, and environmentalists, that are united by the mission to protect and restore the forests and oceans of our beloved planet Earth. We believe in a power of coordination so that collectively we can tackle the problem of biodiversity loss.\n \n\ud83c\udf33 Gainforest: A decentralized fund using artificial intelligence to measure and reward sustainable nature stewardship @GainForestNow: GainForest is a non-profit developing impact evaluators, transparency dashboards and accountability protocols for nature-based assets using DeSci, artificial intelligence and web3. \n \n\ud83c\udf33 Vlinder: Restoration of degraded mangrove areas, @vlinderclimate: Vlinder develops Verra-certified mangrove restoration projects to provide a variety of ecosystem services, climate change mitigation, economic considerations, and active participation of the local community in coastal areas.\n \n\ud83c\udf33 Salt Spring Solutions \u2013 Sequestering carbon via forest preservation & regenerative agriculture @SaltSpringSols: Our projects are systemic solutions to carbon sequestration on Salt Spring Island, BC, including managing a recently-purchased 75 acre forest as a community park to sequester carbon in perpetuity, and sequestering carbon through regenerative agriculture that also improves food security.\n \n\ud83c\udf33Bloomeria, an organization to help communities safeguard green areas. @bloomeria_dao: We help fund reforestation and conservation projects, we connect environmental organizations and companies willing to fund meaningful projects and we help companies prove their ESG commitments through a simplified view of their relevant on-chain actions, in a graphic and interactive way.\n \n\ud83c\udf33Treegens: Evolving Degens into Treegens, @thetreegens: We\u2019re making Degens bullish on trees through the world\u2019s most transparent & rewarding tree planting. PPGL tokens are pegged to the cost of each mangrove tree we plant - $0.094. Our machine learning / AI tree counter then counts each tree from video footage, & airdrops Non-Fungible Updates. To reward holders, we\u2019re also tokenizing carbon forwards & airdropping a portion of carbon forward revenue to the holders. \n \n\ud83d\udc49 What we do? \n \nOur bundle mission is to protect and restore forests and oceans with the support of science and technology. Received funding will be used to:\n\n\ud83c\udf33 support impact projects of our members, \n\ud83c\udf33 improve collaboration between our teams via joint projects,\n\ud83c\udf33 facilitate dMRV and verification of impact for greater accountability.\n \nOur bundle is organized as a DAO with a Treasury Safe managed by the simple majority of the bundle members. Projects will be nominated by the bundle members and voted on by the DAO.", - "projects": [ - { - "project_name": "Gainforest", - "twitter_handle": "@GainForestNow", - "description": "Gainforest is a non-profit developing impact evaluators, transparency dashboards and accountability protocols for nature-based assets using DeSci, artificial intelligence and web3." - }, - { - "project_name": "Vlinder", - "twitter_handle": "@vlinderclimate", - "description": "Vlinder develops Verra-certified mangrove restoration projects to provide a variety of ecosystem services, climate change mitigation, economic considerations, and active participation of the local community in coastal areas." - }, - { - "project_name": "Salt Spring Solutions", - "twitter_handle": "@SaltSpringSols", - "description": "Our projects are systemic solutions to carbon sequestration on Salt Spring Island, BC, including managing a recently-purchased 75 acre forest as a community park to sequester carbon in perpetuity, and sequestering carbon through regenerative agriculture that also improves food security." - }, - { - "project_name": "Bloomeria", - "twitter_handle": "@bloomeria_dao", - "description": "We help fund reforestation and conservation projects, we connect environmental organizations and companies willing to fund meaningful projects and we help companies prove their ESG commitments through a simplified view of their relevant on-chain actions, in a graphic and interactive way." - }, - { - "project_name": "Treegens", - "twitter_handle": "@thetreegens", - "description": "We\u2019re making Degens bullish on trees through the world\u2019s most transparent & rewarding tree planting. PPGL tokens are pegged to the cost of each mangrove tree we plant. Our machine learning / AI tree counter then counts each tree from video footage, & airdrops Non-Fungible Updates." - } - ] - }, - { - "bundleId": "0x95adaaef6d0a11b862f47a236bbca9d93dcfe35d1ae044edc0223d5485e1bfbb", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "bundleName": "Bundle #3: Verification Infrastructure (Impact Certs, Measurement, Reporting & Verification (MRV) and Oracles)", - "bundleDescription": "Verification Bundle - 12 innovative projects proving impact and unlocking critical funding in the climate and sustainability space.\n\nWhy: Verification as proof of impact\n\nHow: MRV, Oracles, Impact Certs, Active Inference, Digital Identity\n\nWhat: An anti-greenwashing toolkit\n\nBundle Description\n\n\ud83c\udf0d\ud83d\udca1 Introducing Bundle #3: Verification Infrastructure \ud83d\udee1\ufe0f- the ultimate toolkit for proving \ud83d\udc9aimpact and unlocking \ud83d\udcb0funding in the sustainability and climate solutions space.\n\nThis bundle brings together \ud83d\udd25 12 cutting-edge projects that are changing the game for measuring, reporting, and verifying (MRV) impact. With our bundle, you'll be able to confidently prove that your projects are delivering real, tangible results.\n\nLet's be real, in order to fund the solutions we need to save the planet, we need to show that our projects are \ud83d\udcaf and that the impact is \ud83d\udcaa. That's where MRV comes in - it's the bridge between \ud83d\udcb0 and \ud83d\udc9aimpact. These projects included in the bundle offer MRV solutions through \ud83d\udd2eoracles, \ud83d\udcbbimpact certificates, and MRV protocols which are making it simpler and more transparent for projects to prove their impact and secure funding.\n\nThink of this bundle as your one-stop-shop for proving your impact and unlocking funding \ud83d\udcb0. Whether you're working on \ud83c\udf33carbon removal, \ud83c\udf31afforestation, regenerative agriculture or you've doing grassroots community building - with this bundle, you'll have everything you need to prove your impact, access funding and receive rewards.\n\nWith this grant, we're powering up these projects to take the MRV space to the next level\ud83d\ude80. Let's work together to make sure funding is going to the most impactful solutions, and let's make a real difference in the fight against \ud83d\udd25climate change.\n\nWhat\n\nBehind every product lies a hidden infrastructure\u2014a complex ecosystem of factories, ships, robots, processes, and people working in harmony to deliver value. The web3 climate economy likewise requires an infrastructure of technologies, people, and services. That's us.\n\nThe Verification Bundle comprises a range of approaches targeting different pieces of the verification value chain. This includes project evaluation networks, oracles, impact certificates, and MRV protocols. We are also building apps and interfaces enabling climate entrepreneurs to easily plug verification into their projects. We are for climate entrepreneurs like what AWS is for developers.\n\nWhy\n\nCurrent verification methods are expensive, inaccurate, inaccessible, or untransparent. These shortcomings are a bottleneck for both funding and entrepreneurs. Funders, from small donors, to institutional and sovereign funds, will not fund climate initiatives en masse until they can verify climate impact. Meanwhile the legacy, off-chain verification organizations cannot scale to serve the fast-growing, dynamic, and global mix of climate entrepreneurs.\n\nWeb3 technologies, like blockchain, enable new verification solutions that decrease cost, democratize access, increase accuracy, and create transparency. However, these solutions are not automatic. There is tremendous work to be done designing user experiences, aligning incentives, and building applications. Furthermore, we need to tailor solutions for the wide range of climate and sustainability initiatives.\n\nBeyond accountability, verification projects are the foundation for a more immersive, and rewarding impact sector. Impact certificates (NFTs linked to verifiable impact) enable projects to symbolically represent their work with creative smart contract structures. For example, a tree planter could sell tree NFTs that produce carbon tokens for holders. These carbon tokens could then grant holders exclusive rewards from video game skins, to store discounts, backstage concert access, or project voting rights.\n\nIf we are successful, donating to climate impact will soon be as good, if not better, than buying things for oneself.\n\n--------------------------------------------------------------------------------\n\nExplore each individual project\n\n\u2b50 Athena Protocol @_AthenaProtocol \n\nChanging the way the world runs on data to include ethics and equity through cryptographic security. Athena Protocol is building the smart contract primitives required to facilitate on chain claim resolutions to claims involving payments for ecosystem services. Our work during q4 of 2022 re our GR15 grant application \u201c ImpactNFTs: An on-chain resource for validating impact\u201d has resulted in the collaboration between several organizations within the dMeter ecosystem to adopt ours as their shared claim resolution framework. We are seeking additional funding to grow our core team, to expand our educational material on the importance of data sovereignty, and to continue development of our claim resolution framework and ImpactNFT primitives.\n\n----------------------------------------\n\n\u2b50 Pozzle Planet @PozzlePlanet \n\nPozzlePlanet is social app \ud83d\udcf1and protocol \u26d3\u00a0where users earn our native token POZ by sharing, joining and documenting planet pozitive \ud83c\udf0e activities via short form video\u2019s called pozzles \ud83e\udd33\ud83c\udffd. On the outside, a social app where people generate positive impact by sharing videos and earning rewards. Underneath the hood, a DeFi protocol that passively farms users activity into NFTs backed by real world assets like CO2. \n\nOur mobile app went LIVE in public beta in November 2022 via AppStore and Goggle Play with 1500+ daily active users. So far 24k+ pozzle videos added, 8k+ activities verified by the community, and the protocol has rewarded the community with 18k+ POZ - see the latest \ud83d\udcc8\u00a0real-time stats here https://www.pozzleplanet.com/ \ud83c\udf0d\u00a0\n\nLinks \ud83d\udd17\n\nVideo Demo: https://twitter.com/PozzlePlanet/status/1591662766947201025?s=20&t=zsAvCXhjeJpGyAQpVV6R6Q\n\nWeb:\nhttps://www.pozzleplanet.com/\n\nPurple paper:\nhttps://pozzle-planet.gitbook.io/poz-purplepaper/\n\nTwitter:\nhttps://twitter.com/PozzlePlanet\n\nMedium:\nhttps://pozzleplanet.medium.com/\n\nDune Analytics for POZ:\nhttps://dune.com/swarthyhatter/POZ\n\nGITHUB: \nhttps://github.com/PozzlePlanet/\n\n----------------------------------------\n\n\u2b50 Digital Gaia @_digitalgaia www.digitalgaia.earth\nIf you want to teach people a new way of thinking, don't bother trying to teach them. Instead, give them a tool, the use of which will lead to new ways of thinking. (Buckminster Fuller)\n\nThe funding from this grant will support the launch of Digital Gaia's first product, called Gaia. It is the culmination of Digital Gaia's MVP sprint in Q3 and Q4 of 2021, which was partially funded by Gitcoin GR 14 and 15. \n\nBackground on the research and thought leadership that goes into Gaia can be found at: https://docsend.com/view/s/gexztbntbf5vxsn9\n\nGaia is an AI-augmented assistant that helps the global regenerative community achieve more impact faster and with greater confidence. It is built on a novel decentralized AI platform and backed by state-of-the-art science. Gaia provides context-specific information, knowledge, decision support, and Impact assessment for the first mile of Impact rooted in the collective intelligence of a global network of practitioners, experts, scientists, data providers, and indigenous communities.\n\nGaia is built on Digital Gaia's open technology platform and will enable multiple high-value services missing today that are essential to scaling regenerative agriculture and healthy bioregional economies, including:\n\n1. Expert Assistance for the first mile of Impact: Each instance of Gaia is a standalone AI for a specific ecosystem and community context. It supports and gathers context from land stewards and experts through local inputs and the use of multi-tiered remote sensing and other forms of MRV.\n2. Open Access to a global commons of data, information, and knowledge: Individual Gaias are interconnected in an AI-augmented global network. Digital Gaia's AI tools autonomously integrate all the local information and knowledge into continuously improving scientific models. These consensus-based models feed back into the network, enabling exponentially faster learning and continuously improving performance against targeted outcomes at the local level.\n3. Transparent and Immutable Proof of Impact on Regenerative Outcomes: Gaia produces real-time project assessments from pre-feasibility stages to end-of-life. It serves as an Oracle for both future predicted performance and realized impact across the life of projects that can scale from project, to portfolio, to bioregion.\n\nObjectives\n\nOur objectives for the first six months of the Gaia launch are:\n\n- 125 Project Onboarded with >10,000 Hectares impacted\n- A pipeline of over 1250 Projects in the onboarding pipeline with >100,000 Hectares impacted\n- 7+ project aggregators integrating Gaia into operating models\n- 55+ SMEs, Experts and Data Providers engaged in our global community\n- 7+ SME organization, academic institutions, data aggregators integrating internal resources with the Gaia Network and Gaia POI oracle services\n- Integration of Gaia POI Oracle Services into 3 Marketplace channels\n\n----------------------------------------\n\n\u2b50 Katalyst.earth @KatalystEarth www.katalyst.earth\n\nScaling Nature Positive Credits through Digital MRV\n\n----------------------------------------\n\n\u2b50 POCA: Proof of Climate/Community Action \n @Poca_earth \nis like a POAP but for climate and community action.\n\nIt\u00a0is a reward badge to add to a collection of actions you participated in, whether it is building a community or taking part in a climate action.\n\n----------------------------------------\n\n\u2b50 LunarPunk Labs @LunarPunk_Labs \nFacilitating community articulated Active Inferencing Models.\n\n----------------------------------------\n\n\u2b50 SproutUp @sproutupapp \nThe impact certificate fundraising platform for web3 charities. Turn good deeds into NFTs and earn crypto donations.\n\n----------------------------------------\n\n\u2b50 EverGreenCoin @evergreencoin_ evergreencoin.org\nEverGreenCoin (EGC) is a native blockchain PoW/PoS hybrid cryptocurrency, now full PoS, launched in 2015. The EverGreenCoin Foundation, Inc. is a 501(c)3 public charity launched in 2017. Proof of Environment (PoE) is a program of the foundation's, by which it rewards environmentally-conscious activities and observations with EGC, launched in 2019. PoE rounds run monthly and the reward pool is grown throughout. Submissions are publicly scored. The reward each submission receives after month's end is proportionate to how it did in public scoring. We believe we have an amazing platform established for people to share, and be rewarded for, any environmentally-conscious activity. We are requesting grant funding to scale EGC\u2019s PoE and ready it for a global stage.\n\n----------------------------------------\n\n\u2b50 ORGO @orgo_earth \nORGO is on a mission to regenerate the planet by creating an economy for environmental and social causes. Impact organizations that are focused on making a difference need better visibility and access to funding. ORGO\u2019s philosophy is rooted in liberating impact data. ORGO aims to close the gap in sustainable finance, reward positive behaviors, and eradicate greenwashing and fraud.\n\nWebsite\nhttps://orgo.earth/\n\nJoin our Discord\nhttp://discord.gg/qhg6wqWE5j\n\nBlog\nhttps://medium.com/@orgo_earth/our-philosophy-279431efc41a\n\n----------------------------------------\n\n\u2b50 Earthbanc Protocol @earthbanc\n\n----------------------------------------\n\n\u2b50 Project Themistoklis @p_themistoklis \n\n----------------------------------------\n\n\u2b50 Buan @buan_fund\n@buan_fund on twitter / mirror.xyz/buanfund.eth / https://t.me/buanthereum\n\nB\u00daAN is minting digital twins of RWA on Ethereum with a focus on environmentally valuable areas of land which can form the backing for impact certificates which can be sold to businesses. With the ultimate goal of rekindling societies relationship with nature. Think of us as The Federal Reserve before it moved away from the gold standard except our treasure is biodiversity. By developing the rails to on board RWA to the blockchain in a legally indemnifiable way we hope to encourage others to innovate within the same framework.", - "projects": [ - { - "project_name": "Athena Protocol", - "twitter_handle": "@_AthenaProtocol", - "description": "Athena Protocol is building the smart contract primitives required to facilitate on chain claim resolutions to claims involving payments for ecosystem services." - }, - { - "project_name": "Pozzle Planet", - "twitter_handle": "@PozzlePlanet", - "description": "PozzlePlanet is a social app and protocol where users earn a native token by sharing, joining and documenting planet positive activities." - }, - { - "project_name": "Digital Gaia", - "twitter_handle": "@_digitalgaia", - "description": "Digital Gaia is building an AI-augmented assistant to help the global regenerative community achieve more impact faster and with greater confidence." - }, - { - "project_name": "Katalyst.earth", - "twitter_handle": "@KatalystEarth", - "description": "Katalyst.earth is scaling Nature Positive Credits through Digital MRV." - }, - { - "project_name": "POCA: Proof of Climate/Community Action", - "twitter_handle": "@Poca_earth", - "description": "POCA is a reward badge to add to a collection of actions taken, such as building a community or taking part in a climate action." - }, - { - "project_name": "LunarPunk Labs", - "twitter_handle": "@LunarPunk_Labs", - "description": "LunarPunk Labs is facilitating community articulated Active Inferencing Models." - }, - { - "project_name": "SproutUp", - "twitter_handle": "@sproutupapp", - "description": "SproutUp is an impact certificate fundraising platform for web3 charities." - }, - { - "project_name": "EverGreenCoin", - "twitter_handle": "@evergreencoin_", - "description": "EverGreenCoin is a native blockchain PoW/PoS hybrid cryptocurrency, rewarding environmentally-conscious activities and observations with EGC." - }, - { - "project_name": "ORGO", - "twitter_handle": "@orgo_earth", - "description": "ORGO is creating an economy for environmental and social causes, rewarding positive behaviors and eradicating greenwashing and fraud." - }, - { - "project_name": "Earthbanc Protocol", - "twitter_handle": "@earthbanc", - "description": "Earthbanc Protocol is a blockchain-based platform for environmental and social impact projects." - }, - { - "project_name": "Project Themistoklis", - "twitter_handle": "@p_themistoklis", - "description": "Project Themistoklis is an open source platform for decentralized climate action and finance." - }, - { - "project_name": "Buan", - "twitter_handle": "@buan_fund", - "description": "B\u00daAN is minting digital twins of RWA on Ethereum with a focus on environmentally valuable areas of land." - } - ] - }, - { - "bundleId": "0xd716c3a7c353f0458ff8387fb435606934e25b631a83db017e5eb9a0022358f0", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "bundleName": "Bundle: Carbon Markets", - "bundleDescription": "\nA collective of 13 cutting edge projects working at the forefront of the digital carbon revolutions.\n\n------------------------------------------\nAbout the Carbon Markets Bundle\n------------------------------------------\n\nCarbon markets are an important way to reduce greenhouse gas emissions and slow down climate change. These markets work by allowing people and companies to buy and sell emissions reductions. This GR16 bundle is a collection of projects that help people understand and reduce their own emissions, and make it easier for them to buy carbon credits to offset the emissions they can't reduce. This bundle includes projects innovating to raise awareness, create demand, and facilitate the supply of carbon credits, all of which are necessary for a functioning carbon market.\n\n------------------------------------------\nHow the grants funds will be used\n------------------------------------------\nThe funds raised will be divided equally between all bundle projects. Funds will be invested into increasing demand through improved scoring, increasing supply and improving guaranteed quality of supply, promoting the marketplace to ensure demand can meet supply. Ultimately, the consumer is best served through a strong marketplace when there\u2019s competition and choice. The grants funding will contribute towards that.\n\n---------------------------------------------------------------------------------------------------------\nThe funds raised in this bundle will be shared equally amongst the following 15 projects:\n---------------------------------------------------------------------------------------------------------\n\nDottyland Impact Self \ud83c\udf33 @dottyland_xyz : On-chain Impact Self. Turning climate-positive actions into functional and serviceable identities across web3 applications, starting with on-chain carbon token retirement.\n\nCarbon Flow \ud83c\udf33 @CarbonAntiTheft : An anti-theft solution for global carbon markets, a multitoken system restricting the amount of carbon tokens converted. Multi-trillion carbon market just makes no sense without anti-theft. It is a smart contract that limits the amount of theft in carbon markets. Everybody can create a carbon token. The owner of a carbon token can allow conversion into it from other carbon tokens, and set limits (absolute or per a period of time) of conversion from that other tokens. So, for example France\u2019s DAO sets the amount of Paris\u2019s carbon tokens that can be exchanged for France's token. So if Paris is found guilty, France can pause exchanges from Paris tokens and devalue their token. If Paris during some error produces a septillion of carbon tokens, they can\u2019t be exchanged for an upper level, because of the anti-theft limits. Tokens can be retired (voluntary denial of carbon production) and retired tokens are meant to be used as a means of payment. Every carbon token owner (such as a notary) can set his \u201ctax\u201d on the retirement of tokens, so notaries and DAOs compete on the free market. DAOs can also mint retired tokens to reward somebody, e.g. for climate science progress. The smart smart (not a typo) contract is developed, it remains to create a DAO around it.\n\nCoorest \ud83c\udf33 @CoorestOfficial : A decentralised application for carbon offsets utilising a 100% on-chain CO2 sequestration via satellite validated NFTrees, CO2 tokens and Proof of Carbon Compensation (PoCC) certificates. \n\nKlimaDAO Name Service \ud83c\udf33 @knsdomains_ : A domain name NFT that permanently locks up carbon credits, continuously offsets carbon credits and can be used as a social representation of climate impact. Currently integrated into KlimaDAO pledge dashboard, making it easy to access climate commitments using .klima domain names. \n\nClime Tech (Formerly Clime DAO) \ud83c\udf33 @ClimeTechInc : Climate action and resiliency tool used by cities and business for adaptation and mitigation. Carbon reduction verified, stored on chain and issued tech based carbon credits. \n\nMangrove \ud83c\udf33 @mangrovecarbon : Mangrove is building the operating system for carbon removal companies to eliminate the risk of double selling supply, improve sales processes, easily bring inventory into the refi ecosystem and ensure compliance with government and registries. \n\nERC-Cool\u2122 \ud83c\udf33 @TresCoolLabs : The ERC-Cool\u2122 is an improved implementation of the ERC721 smart contract standard that weaves real world, perpetual, carbon removal into any NFT use case that adopts it. An open source - planet cooling - super sustainable - delight. Designed to spark a removal revolution, enabling action to become the fabric of web3 and sprinkled to every corner of the internet.\n\nKUMO \ud83c\udf33 @kumo_dao : KUMO unlocks the value of natural assets by providing interest-free loans against their market value. Loans are issued in our native stablecoin, which literally locks carbon into money. KUMO turns the act of owning a dollar into a climate action.\n\nECORISE DAO \ud83c\udf33 @ECORISEDAO : ECORISE brings liquidity to the real estate and natural capital asset market and unlocks stored value through tokenization of these assets and bringing them on-chain. Landowners are incentivized and rewarded for regenerative and restorative actions that increase their natural capital asset value and provides new sources of revenue from ecological economics. \n\nCarbonland:\nCarbonland Trust \ud83c\udf33 @CarbonLandTrust : a carbon credits registry offering natured based carbon removal credits from biodiverse forest land that is being enrolled into perpetual conservation. \nCarbonland DAO \ud83c\udf33 @CarbonlandDAO : a Nature Preserve Timeshare that leverages the Carbonland Trust protocol to issue and sell carbon credits from its own forestland. Carbonland DAO acquires property by selling CDAO tokens, the governance token of Carbonland DAO. Token holders can use CDAO to vote where Carbonland DAO buys property, and can spend CDAO to make reservations to visit and stay at Carbonland DAO\u2019s nature preserves.\n\ndisCarbon \ud83c\udf33 @discarbon_earth : creates transparent and verifiable emission estimation and carbon retirement and tools available as public goods within the Ethereum ecosystem. disCarbon\u2019s aims are to raise awareness about the impact our actions have on our planet and accelerate the adoption of on-chain carbon credits.\n\nChangeblock \ud83c\udf33 : investors can gain access to groundbreaking green credits that are streamlined and independently verified, allowing for the creation and listing of unique instruments on our platform. As the first to offer an end of life plastic credit in collaboration with Fusion One, we have demonstrated the ability to develop credits for any green initiative, providing investors with a unique opportunity to support and benefit from innovative sustainability efforts.\nChangeblockNFT: ChangeblockNFT helps demonstrate commitment to sustainability and social responsibility. We enable NFT companies to improve their reputation, reduce risk and attract top talent whilst making a positive impact on the environment. ChangeblockNFT has the following 3 key features: \nNFT Asset Wrapping: Enhance the value and marketability of your NFTs while supporting UN SDGs with our asset wrapping service; \nRetroactive Carbon Offsetting: Eliminate the negative emissions from your past NFT transactions with ChangeblockNFT. \nAutomated Offsetting: Ensure all future NFT transactions are offset with our automated offsetting service. Choose the green assets you want to support and make a real world impact. \n\nThe Eden Dao \ud83c\udf33 @TheEdenDao : In 2022, Eden Dao launched the DRM Syndicate, which removed 760 tons of CO2 permanently removed from the atmosphere to rise to top 25 in the world alongside Stripe, Microsoft, and Harvard. In 2023, Eden Dao Lab builds regenerative financial infrastructure, decentralized lego blocks, and public good utilities to accelerate time-to-market for ReFi startups.", - "projects": [ - { - "project_name": "Dottyland Impact Self", - "twitter_handle": "@dottyland_xyz", - "description": "On-chain Impact Self. Turning climate-positive actions into functional and serviceable identities across web3 applications, starting with on-chain carbon token retirement." - }, - { - "project_name": "Carbon Flow", - "twitter_handle": "@CarbonAntiTheft", - "description": "An anti-theft solution for global carbon markets, a multitoken system restricting the amount of carbon tokens converted." - }, - { - "project_name": "Coorest", - "twitter_handle": "@CoorestOfficial", - "description": "A decentralised application for carbon offsets utilising a 100% on-chain CO2 sequestration via satellite validated NFTrees, CO2 tokens and Proof of Carbon Compensation (PoCC) certificates." - }, - { - "project_name": "KlimaDAO Name Service", - "twitter_handle": "@knsdomains_", - "description": "A domain name NFT that permanently locks up carbon credits, continuously offsets carbon credits and can be used as a social representation of climate impact." - }, - { - "project_name": "Clime Tech (Formerly Clime DAO)", - "twitter_handle": "@ClimeTechInc", - "description": "Climate action and resiliency tool used by cities and business for adaptation and mitigation. Carbon reduction verified, stored on chain and issued tech based carbon credits." - }, - { - "project_name": "Mangrove", - "twitter_handle": "@mangrovecarbon", - "description": "Mangrove is building the operating system for carbon removal companies to eliminate the risk of double selling supply, improve sales processes, easily bring inventory into the refi ecosystem and ensure compliance with government and registries." - }, - { - "project_name": "ERC-Cool\u2122", - "twitter_handle": "@TresCoolLabs", - "description": "An improved implementation of the ERC721 smart contract standard that weaves real world, perpetual, carbon removal into any NFT use case." - }, - { - "project_name": "KUMO", - "twitter_handle": "@kumo_dao", - "description": "KUMO unlocks the value of natural assets by providing interest-free loans against their market value. Loans are issued in their native stablecoin, which literally locks carbon into money." - }, - { - "project_name": "ECORISE DAO", - "twitter_handle": "@ECORISEDAO", - "description": "ECORISE brings liquidity to the real estate and natural capital asset market and unlocks stored value through tokenization of these assets and bringing them on-chain." - }, - { - "project_name": "Carbonland Trust", - "twitter_handle": "@CarbonLandTrust", - "description": "A carbon credits registry offering natured based carbon removal credits from biodiverse forest land that is being enrolled into perpetual conservation." - }, - { - "project_name": "disCarbon", - "twitter_handle": "@discarbon_earth", - "description": "Creates transparent and verifiable emission estimation and carbon retirement and tools available as public goods within the Ethereum ecosystem." - }, - { - "project_name": "Changeblock", - "twitter_handle": "Changeblock_io", - "description": "Provides investors access to groundbreaking green credits that are streamlined and independently verified, allowing for the creation and listing of unique instruments on their platform." - }, - { - "project_name": "The Eden Dao", - "twitter_handle": "@TheEdenDao", - "description": "Launched the DRM Syndicate in 2022, which removed 760 tons of CO2 permanently removed from the atmosphere. Building regenerative financial infrastructure, decentralized lego blocks, and public good utilities in 2023." - } - ] - }, - { - "bundleId": "0xe8017af6c0a19b08c86e8ef94d9b3dadcbe8f55bc446d7359a6f294d68227b84", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "bundleName": "Community Engagement - Bundle 6", - "bundleDescription": "\ud83d\udc9a Who are we? \ud83d\udc9a\n\nWe make change happen through community! \ud83d\udc65\ud83d\udc9a\n\nAll the projects and organisations in this bundle focus on change-making and innovation for, by and with communities. \u2728\n\nWe are all cutting edge projects \ud83d\udd1d building and curating communities with planet-positive impact, including web3 conferences, ecovillages, podcasts and learning journeys around regenerative economic systems, new ways of living and climate education. \ud83c\udf40\n\n\ud83c\udf0d The global impact of this group ranges from the United States, Guatemala, Brazil and various countries in Europe and Africa. We travel the world! \ud83d\uddfa\ufe0f\n\n\ud83d\udc65 All of the grantees in this round are working to remove barriers to save the planet, from addressing gaps in language access, lack of knowledge, access to Internet and climate resources and education, digital literacy or capacity to participate in climate action, or the simple ability to connect to nature. \n\n\ud83c\udf38 We are all builders who are using decentralized processes and other accessible technologies for social good. \n\n\ud83c\udf3c We all operate in the climate, health and social justice space. \ud83e\udec2\n\n\ud83d\udc49\ud83c\udffc By donating to this bundle you will have the chance to kick off the new year by supporting global builders in our efforts to create digital public goods alongside Gitcoin. \ud83d\ude4f\ud83c\udffd\ud83e\udd8b\n \n \n\ud83d\udc9a The projects \ud83d\udc9a\n\n\ud83e\udd38\ud83c\udffd\u200d\u2640\ufe0f The Undivide Project: rebuilding, reclaiming and connecting communities to climate solutions and web3\n\n\ud83e\udd38\ud83c\udffe All for Climate DAO is building the Greenpeace of the 21st: a decentralized community of active citizens that take initiatives to transition to a more regenerative world. @allforclimatedao\n\n\ud83e\udd38\ud83c\udffe La Matrice Multiversity Campus: La Matrice Campus is a hotspot of transformative education with a focus on the transmission of regenerative practices, in a vibrant ecovillage. @MatriceCampus\n \n\ud83e\udd38\ud83c\udffe Closer an operating system for regenerative villages. We are building systems that support the governance and operations of regenerative co-living and co-housing projects. @closerearth\n\n\ud83e\udd38\ud83c\udffc\u200d\u2642\ufe0f Translators DAO: a collective of translators and interpreters who ensure communication across the world in five languages and more, for grassroots, non-profit climate justice movements. @TranslatorsDAO \n\n\ud83e\udd38\ud83c\udffe Samara Trust is a decentralized organization of facilitators who help organizations and communities attempting to regenerate our Earth (revitalizing soil, forests, waterways, capturing carbon, etc.) and regenerate our culture \n\n\ud83e\udd38\ud83c\udfff Hazel is gamifying carbon removal using a web3 game to help bring consumer spending to the carbon removal market. @hazelclimateapp\n\n\ud83e\udd38\ud83c\udffd\u200d\u2640\ufe0f Pythagoras Ecology Works uses forest waste wood taken in wildfire mitigation in decentralized manufacture of furniture and structures without use of metal fasteners. @ecologyworks\n\n\ud83e\udd38\ud83c\udffc\u200d\u2642\ufe0f Future Diaries: a dramatised speculative fiction podcast that highlights a variety of social and environmental issues! @future_diaries\n\n\ud83e\udd38\ud83c\udfff Borderless Money: @borderless_refi is the first non-custodial decentralized endowment platform, where contributors retain control over the principal, and only the income generated is distributed to initiatives. @borderless_refi \n\n\ud83e\udd38\ud83c\udffe La Matrice Multiversity Campus: La Matrice Campus is a hotspot of transformative education with a focus on the transmission of regenerative practices, in a vibrant ecovillage. @MatriceCampus\n\n\ud83e\udd38\ud83c\udfff ReConnection Tech (devices & experiences) seek to materialize this kind of world through experimentation with Music from Plants, Smart Forest Baths and more. @emergir.co\n\n\ud83e\udd38\ud83c\udffd\u200d\u2640\ufe0f Open Source Ecology: Open Source Manufacturing: An Affordable Housing Solution\n\n\ud83e\udd38\ud83c\udffc\u200d\u2642\ufe0f ReFi Bootcamp: Learn to Earn Regenerative Finance Education\n\n\ud83e\udd38\ud83c\udfff Cambiatus Complementary currencies and collaborative businesses on Blockchain. @_cambiatus\n\n\ud83e\udd38\ud83c\udfff ReconTech: technology as a mean to reconnect the humans and more-than-human pluriverse.@recon.tec\n\n", - "projects": [ - { - "project_name": "The Undivide Project", - "twitter_handle": null, - "description": "The Undivide Project focuses on rebuilding, reclaiming and connecting communities to climate solutions and web3." - }, - { - "project_name": "All for Climate DAO", - "twitter_handle": "@allforclimatedao", - "description": "All for Climate DAO is building the Greenpeace of the 21st: a decentralized community of active citizens that take initiatives to transition to a more regenerative world." - }, - { - "project_name": "La Matrice Multiversity Campus", - "twitter_handle": "@MatriceCampus", - "description": "La Matrice Campus is a hotspot of transformative education with a focus on the transmission of regenerative practices, in a vibrant ecovillage." - }, - { - "project_name": "Closer", - "twitter_handle": "@closerearth", - "description": "Closer is an operating system for regenerative villages, building systems that support the governance and operations of regenerative co-living and co-housing projects." - }, - { - "project_name": "Translators DAO", - "twitter_handle": "@TranslatorsDAO", - "description": "Translators DAO is a collective of translators and interpreters who ensure communication across the world for grassroots, non-profit climate justice movements." - }, - { - "project_name": "Samara Trust", - "twitter_handle": null, - "description": "Samara Trust is a decentralized organization of facilitators who help organizations and communities attempting to regenerate our Earth and culture." - }, - { - "project_name": "Hazel", - "twitter_handle": "@hazelclimateapp", - "description": "Hazel is gamifying carbon removal using a web3 game to help bring consumer spending to the carbon removal market." - }, - { - "project_name": "Pythagoras Ecology Works", - "twitter_handle": "@ecologyworks", - "description": "Pythagoras Ecology Works uses forest waste wood taken in wildfire mitigation in decentralized manufacture of furniture and structures without use of metal fasteners." - }, - { - "project_name": "Future Diaries", - "twitter_handle": "@future_diaries", - "description": "Future Diaries is a dramatised speculative fiction podcast that highlights a variety of social and environmental issues." - }, - { - "project_name": "Borderless Money", - "twitter_handle": "@borderless_refi", - "description": "Borderless Money is the first non-custodial decentralized endowment platform, where contributors retain control over the principal, and only the income generated is distributed to initiatives." - }, - { - "project_name": "Open Source Ecology", - "twitter_handle": null, - "description": "Open Source Ecology is building systems for open source manufacturing as an affordable housing solution." - }, - { - "project_name": "ReFi Bootcamp", - "twitter_handle": null, - "description": "ReFi Bootcamp is a learning platform to earn regenerative finance education." - }, - { - "project_name": "Cambiatus", - "twitter_handle": "@_cambiatus", - "description": "Cambiatus is building complementary currencies and collaborative businesses on Blockchain." - }, - { - "project_name": "ReConnection Tech", - "twitter_handle": null, - "description": "Reconnection Tech is using technology as a mean to reconnect the humans and more-than-human pluriverse." - } - ] - }, - { - "bundleId": "0xedc8c2863195c102234eb522c94568c4aabd91d4eb2df52d2c4dc9f953e01295", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "bundleName": "Bundle: Emerging Economies and Indigenous Communities", - "bundleDescription": "This bundle unites 12 exciting projects working either in Emerging Economies or with Indigenous Communities around the world. \n \nHumanity must choose to either embrace economic transformation or continue down the path of destruction, desecration and resource theft via war, infringement and oppression. We see many people, worldwide, standing up to denounce the latter. The mission of these projects is to steward and lay the foundation for emerging economies and indigenous communities that are built on the principles of abundance, knowledge sharing, trust and an intimate connection to our fellow human beings, nature and ourselves. \nThe initiatives represented by this bundle include work in First Nation and Native American Communities, LatinoAmerica, Uganda, Nigeria, Kenya, and India with disparate aims but a common mission to demonstrate and expand the role of Free Open Source Software in public goods funding. With your help we will be able to continue our work in climate action, clean energy sovereignty, indigenous justice, the global water crisis, postCapitalist education, regenerative agriculture, mangrove restoration, SolarPunk IoT, and advocacy of both people and Earth\u2019s rights.\nGitcoin offers a means for each of us to reclaim agency over the economic system that we rely on. Let us be empowered and demonstrate the potential of quadratic funding to allocate, prioritize & support transformative change.\nTogether we can empower communities through sustainable, scalable agriculture, climate action, clean energy sovereignty, equitable access, resiliency, advocacy and local environmental achievements. \nIf you would like to know more about the individual projects that have gathered in this bundle, check below!\n\n\ud83c\udf1e KhalonBridge, @KhalonBridge: Nigeria is at the leading edge of the web3 ecosystem but suffers from a notoriously collapsing electrical grid that impedes developer talent from keeping up with the digital economy without having to buy pollutive generators. Khalon Bridge is a development studio collective of over 40+ web3 operators and continues to provide residential solar to emerging talent in the region to advance the digital economy in Africa.\n\n\ud83d\udce1 ReconTech, @emergir.co: Imagine a world in which our technological devices help us to interact more intimately with the more-than-human world, expanding our consciousness by cultivating new cognitive and sensory perceptions. ReConnection Tech (devices & experiences) seek to materialize this kind of world through experimentation with Music from Plants, Smart Forest Baths and more.\n\n\ud83c\udf3b Urb\u00e1nika, @0xUrbanika / @urbanika.lens: An immersive activism school that turns passive citizens into active city shapers capable of using web 3.0 tech, peer governance, and commoning to facilitate transitioning into regenerative ways of living.\n\n\ud83e\uddd1\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c\udffb Vlinder: \"Papariko\" - Restoration of degraded mangrove areas in Kenya, @vlinderclimate: Verra-certified mangrove restoration project to provide a variety of ecosystem services, climate change mitigation, economic considerations, and active participation of the local community in coastal areas of Kenya.\n\n\u2615 Coffee Impact Collective, @Coffeeimpactco: The project supports coffee farmers in their transition to regenerative agriculture by providing agronomic guidance and rewarding them for implementation of new practices. Coffee Impact Collective creates an ecosystem that provides multiple services and opportunities for farmers, allowing them to become a part of a decentralized marketplace where \u201cregenerated\u201d coffee is traded along with eco credits (like carbon, biodiversity, water quality, social impact and eco tourism), not separately. First pilots are starting with farmers and cooperatives in Colombia.\n\n\ud83c\udff5\ufe0f Kangra Gardens, @Kangra_Gardens: The Kangra Gardens are a place for people to express gratitude and give back to the earth by respecting and learning from it. The purpose of the Kangra Botanical Garden, which is a part of Kula, is to regenerate the local ecosystem, promote biodiversity conservation, support community health, build towards food sovereignty and nutrition, and engage people in connecting with the environment. The garden uses Ayurvedic medicine production and syntropic farming to achieve these goals facilitated through a Bioregional Learning Center. The grant for Kangra Gardens aims to fund new as well as current contributors and the development of the gardens themselves to share with the global community.\n\n\ud83d\udc18 Elephant in the Room: @ClimateRace : Strategic Climate Solutions Campaigns. We work with Indigenous organizations, voting organizations, neighborhoods, cities and activists to promote climate action to communities around the world and to counter the vast array of fossil fuel advertising and disinformation. Over the past year Elephant Room has also been creating strategic communications that are focused on the web3 community.\n\n\ud83d\udee2\ufe0f Beyond Fossil Fuels: @BFF_campaign : Indigenous Legal Fund for Climate Action. Presently supporting 2 major projects - 1) Tsleil-Waututh Nation Sacred Trust\u2019s opposition to the TMX pipeline and 2) We Stand Together : a legal climate case that is aimed at ensuring systemic climate planning and remedies for legally binding, science-based climate recovery policies. First Nations have standing under the ratified UNDRIP (United Nations Declaration on the Rights of Indigenous Peoples) Act in Canada and can invoke their unceded rights in legal proceedings to effectively defend and protect the environment.\n\n\ud83d\udc68\ud83c\udffe\u200d\ud83c\udf3e Project regr\u00f2 : @projectregro Under the increasing climate emergency pressure, the regr\u00f2 project aims to connect land owners, farmers and growers, interested in sharing resources to build resilient agro-ecologic systems through Regenerative and Conservation Agriculture, Permaculture and non-invasive practices.\n\n\ud83c\udf33 Ayowecca: Wetlands and peatland ecosystem restoration has been our focus. Together with the local community, we are restoring encroached wetlands and protecting those that already exist. Our strategy involves agroforestry and afforestation. We are promoting agroforestry, by giving farmers fruit trees. Climate change adaptation and mitigation are our primary goals in promoting agroforestry. The effects of climate change on agricultural communities can be lessened by planting trees in agricultural systems. Growing the amount of trees on agricultural land decreases tree cutting and boosts carbon sinks.\n\n\ud83e\udd8b Cambiatus: @_cambiatus - social currencies to foster planetary regeneration. Working with the Paiter Surui indigenous community to create the Paiter Coin and onboard their members into the web3 space.\n\n\ud83d\udc2cProject Toninas: @yaqupachauy Project Toninas is long term project focused on the research and conservation of the Lahille\u2019s bottlenose dolphin T. truncatus gephyreus, a subspecies of bottlenose dolphin that only occurs in Brazil, Uruguay and Argentina. They are only ~ 600 individuals left across the entire distribution (Uruguay population~ 70\ud83d\udc2c). Project Toninas is carried out by Yaqu Pacha Uruguay, a civil non-profit organization dedicated to implementing and promoting projects for the conservation and study of aquatic mammals in Uruguay and the Southwestern Atlantic Ocean. ", - "projects": [ - { - "project_name": "Khalon Bridge", - "twitter_handle": "@KhalonBridge", - "description": "A development studio collective of over 40+ web3 operators providing residential solar to emerging talent in Nigeria to advance the digital economy in Africa." - }, - { - "project_name": "ReConnection Tech", - "twitter_handle": null, - "description": "Reconnection Tech is using technology as a mean to reconnect the humans and more-than-human pluriverse." - }, - { - "project_name": "Urb\u00e1nika", - "twitter_handle": "@0xUrbanika", - "description": "An immersive activism school that turns passive citizens into active city shapers capable of using web 3.0 tech, peer governance, and commoning." - }, - { - "project_name": "Vlinder", - "twitter_handle": "@vlinderclimate", - "description": "Verra-certified mangrove restoration project to provide a variety of ecosystem services, climate change mitigation, and active participation of the local community in coastal areas of Kenya." - }, - { - "project_name": "Coffee Impact Collective", - "twitter_handle": "@Coffeeimpactco", - "description": "Supports coffee farmers in their transition to regenerative agriculture by providing agronomic guidance and rewarding them for implementation of new practices." - }, - { - "project_name": "Kangra Gardens", - "twitter_handle": "@Kangra_Gardens", - "description": "A place for people to express gratitude and give back to the earth by respecting and learning from it and using Ayurvedic medicine production and syntropic farming." - }, - { - "project_name": "Elephant in the Room", - "twitter_handle": "@ClimateRace", - "description": "Works with Indigenous organizations, voting organizations, neighborhoods, cities and activists to promote climate action and counter fossil fuel advertising and disinformation." - }, - { - "project_name": "Beyond Fossil Fuels", - "twitter_handle": "@BFF_campaign", - "description": "Indigenous Legal Fund for Climate Action supporting projects to oppose the TMX pipeline and ensure systemic climate planning and remedies for legally binding, science-based climate recovery policies." - }, - { - "project_name": "Project regr\u00f2", - "twitter_handle": "@projectregro", - "description": "Connects land owners, farmers and growers to build resilient agro-ecologic systems through Regenerative and Conservation Agriculture, Permaculture and non-invasive practices." - }, - { - "project_name": "Ayowecca", - "twitter_handle": "@ayowecca", - "description": "Restoring encroached wetlands and protecting those that already exist through agroforestry and afforestation, promoting climate change adaptation and mitigation." - }, - { - "project_name": "Cambiatus", - "twitter_handle": "@_cambiatus", - "description": "Creating social currencies to foster planetary regeneration, working with the Paiter Surui indigenous community to create the Paiter Coin." - }, - { - "project_name": "Project Toninas", - "twitter_handle": "@yaqupachauy", - "description": "Focused on the research and conservation of the Lahille\u2019s bottlenose dolphin, providing multiple services and opportunities for farmers in Brazil, Uruguay and Argentina." - } - ] - }, - { - "bundleId": "0xf39a20c932f2445f48214e8726d305bac89d54b3c99940d601a168e2b8745014", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "bundleName": "Bundle: Creative Works", - "bundleDescription": "\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\nAre you looking for a way to contribute to a positive impact on the world through creative works? Bundle: Creative Works is the place to look!\nWe are believers in regeneration through art and unapologetic creativity. We are the solarpunk artists, changemakers, shapeshifters and out-of-the-box creators from all around the world.\nThis group of innovative projects is using their creativity and expertise to address important environmental and social issues. From using art sales to fund social causes to immersive activism schools these projects are making tangible impacts IRL and on web 3.0.\nThat's not all. There are also grants DAOs supporting and funding diverse and creative projects with the potential to make a positive impact and collectives of artists raising awareness about the climate emergency within the group. Creating digital artworks about climate change, producing eco-conscious handmade hemp goods or high-impact filmmaking for climate awareness are also among what amazing projects of this bundle are doing.\nJoin the movement for a better world with the Creative Works Bundle!\n11 creative projects related to art, film, games, solarpunk for Climate Action\u2026\n----------------------------------------------------------------\n\ud83c\udf31 Future Quest\nA web3 ecosystem committed to fixing our future. Part game, part launch pad for public good Quests for our planet.\n@FutureQuestDAO\n----------------------------------------------------------------\n\ud83c\udf31 ColtonArt\n100% of my art sales fund social causes. $154,389 have gone directly to support the Gitcoin Matching Pool by selling over 200 individual artworks over the past year. This grant helps cover my living expenses so I can continue creating solarpunk art that funds our shared needs and hopefully inspires more artists to join the regen movement \u2600\ufe0f\ud83c\udf34\n@mettahead\n----------------------------------------------------------------\n\ud83c\udf31 Urbanika\nImmersive activism school that uses AI and XR to teach about the intersection of web 3.0 and urban governance. We aim to turn passive citizens into active city shapers. Our first course is being co-created with David Bollier and targeted to policy-makers, urban activists, and social entrepreneurs. Enter to urbanika.my.canva.site/ to immerse yourself into the micro-learning videos that come with virtual and IRL\n@0xUrbanika - @urbanika.lens - urbanika.my.canva.site/\n----------------------------------------------------------------\n\ud83c\udf31 Decentralized Desires Studio-Lab (Former: \u201cDynamic Energy Budget\u201d)\nWe are an Art-Science Studio-Lab for DeSci ecosystems - hosted at Omega/TEC. We use art as an inquiry (Practice Based Research in the Arts scientific methodologies) to engage interdisciplinary teams on climate related avenues of research. We develop prototypes and artistic creations to make alternative futures tangible for all.\n@BudgetDynamic - @JeanneBloch - decentralized-desires.com\n----------------------------------------------------------------\n\ud83c\udf31 Climate Change Countdown\nFrom 01/19/2022 and for 10 years, the project regularly creates and posts digital artworks about Climate Change, exploring a variety of forms of visual and non visual arts. The artworks are published on the artists social media channels. The core of the project are periodic expeditions on the field to document causes and effects of Climate Change and positive examples of sustainability and activism. All the artworks are available for free to any nonprofit climate project.\n@Marcobear_eth\n----------------------------------------------------------------\n\ud83c\udf31 Vanara\nVanara is an ecological arts & crafts collective working with hemp not only to produce slow-fashion goods, but also to regenerate the ecosystem as a whole with the strongest fiber in the world. We support economically disadvantaged artisan women and young digital artists by creating and producing with freedom both in the metaverse and in the physical world. Processing hemp to make yarn with authentic methods and techniques is our primary production line. We are preparing to launch an NFT collection of digital art pieces of Hemp as utilities for our workshops, IRL products and community events.\n@Vanara_Co\n----------------------------------------------------------------\n\ud83c\udf31 Ranna\nRanna is an open network of filmmakers dedicating their tools and skills to creating quality content for the environmental and climate justice movements. We create high impact films that provide activist-led, top-tier coverage to climate action initiatives. We are sharing and amplifying the voices of those working for a better collective present and future. In doing so we aim to inspire, engage and mobilize more people to join the fight for a just, livable Earth.\n@rannamedia - ranna.pt\n----------------------------------------------------------------\n\ud83c\udf31 nfDAO\nnfDAO is a grants DAO with a mission is to discover, support and fund diverse and creative projects we believe can make a positive impact. We award micro-grants to promising early stage projects and guide them on their first steps towards success.\n@dao_nf - nfdao.io\n----------------------------------------------------------------\n\ud83c\udf31 Artists for Climate\nUsing art to raise awareness on the climate emergency! Artists For Climate is a collective of humans who use art as a tool to generate an emotional impact on citizens and motivate them to take action in solving the climate emergency we have created. We work together and share knowledge, resources, techniques, inspiration, and much more. The group is managed and coordinated by artists and for artists.\n@all4climatedao - allforclimate.earth\n----------------------------------------------------------------\n\ud83c\udf31 Solarpunk Art DAO:\nWe are a collective of Solarpunks helping create and fund more Solarpunk art to reimagine a regenerative future where humans, nature, and technology live in harmony. Solarpunk comes in many flavors, and it varies based on the needs of every community. We intend to empower local artists to design their local Solarpunk reality by helping them with funding for local IRL exhibitions.\n@all4climatedao - allforclimate.earth\n----------------------------------------------------------------\n\ud83c\udf31 W3ST: Solarpunk meta-nation\nAn impact network of regenerative projects (nodes) united under the symbolic entity of a globally distributed country to transition to new models of political, social and economic innovation through the will and direct action of its citizens. We are working through 3 ACTION STREAMS: NODES (territories and positive impact initiatives) + ACTIVISM (direct actions and artistic interventions) + FUNDRAISING (help like-minded entities and collectives)\n@w3stdao\n----------------------------------------------------------------\n\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\n", - "projects": [ - { - "project_name": "Future Quest", - "twitter_handle": "@FutureQuestDAO", - "description": "A web3 ecosystem committed to fixing our future. Part game, part launch pad for public good Quests for our planet." - }, - { - "project_name": "ColtonArt", - "twitter_handle": "@mettahead", - "description": "Funds social causes through art sales. $154,389 have been donated to the Gitcoin Matching Pool in the past year." - }, - { - "project_name": "Urb\u00e1nika", - "twitter_handle": "@0xUrbanika", - "description": "Immersive activism school that uses AI and XR to teach about the intersection of web 3.0 and urban governance." - }, - { - "project_name": "Decentralized Desires Studio-Lab", - "twitter_handle": "@BudgetDynamic, @JeanneBloch", - "description": "Uses art as an inquiry to engage interdisciplinary teams on climate related avenues of research." - }, - { - "project_name": "Climate Change Countdown", - "twitter_handle": "@Marcobear_eth", - "description": "Regularly creates and posts digital artworks about Climate Change, exploring a variety of forms of visual and non visual arts." - }, - { - "project_name": "Vanara", - "twitter_handle": "@Vanara_Co", - "description": "Ecological arts & crafts collective working with hemp to produce slow-fashion goods and regenerate the ecosystem." - }, - { - "project_name": "Ranna", - "twitter_handle": "@rannamedia", - "description": "Open network of filmmakers creating high impact films to provide activist-led coverage to climate action initiatives." - }, - { - "project_name": "nfDAO", - "twitter_handle": "@dao_nf", - "description": "Grants DAO to discover, support and fund diverse and creative projects with potential to make a positive impact." - }, - { - "project_name": "Artists for Climate", - "twitter_handle": "@all4climatedao", - "description": "Collective of humans using art to generate an emotional impact on citizens and motivate them to take action in solving the climate emergency." - }, - { - "project_name": "Solarpunk Art DAO", - "twitter_handle": "@all4climatedao", - "description": "Collective of Solarpunks helping create and fund more Solarpunk art to reimagine a regenerative future." - }, - { - "project_name": "W3ST: Solarpunk meta-nation", - "twitter_handle": "@w3stdao", - "description": "Impact network of regenerative projects united under the symbolic entity of a globally distributed country to transition to new models of innovation." - } - ] - } -] diff --git a/utils/gitcoin/gitcoin-alpha/data/climate-bundle-project-data.json b/utils/gitcoin/gitcoin-alpha/data/climate-bundle-project-data.json deleted file mode 100644 index 4d5674b..0000000 --- a/utils/gitcoin/gitcoin-alpha/data/climate-bundle-project-data.json +++ /dev/null @@ -1,1617 +0,0 @@ -[ - { - "title": "Coffee Carbon Collective", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Supports coffee farmers in their transition to regenerative agriculture by providing agronomic guidance and rewarding them for the implementation of new practices. Creates an ecosystem that provides multiple services and opportunities for farmers.", - "projectWebsite": "https://twitter.com/CoffeeCarbonCo", - "fractionsTotalSupply": 12359, - "hypercertEligibleDonors": 291, - "hypercertData": { - "workScopes": "Agriculture", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Kangra Gardens", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "A place for people to express gratitude and give back to the earth by respecting and learning from it. Uses Ayurvedic medicine production and syntropic farming to achieve goals.", - "projectWebsite": "https://twitter.com/Kangra_Gardens", - "fractionsTotalSupply": 17824, - "hypercertEligibleDonors": 410, - "hypercertData": { - "workScopes": "Agriculture,Emerging Economies", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Watercycle", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Developing an open-source, low-cost water structuring device to improve crop yields and accelerate natural carbon sequestration. Benefits of water structuring in agriculture include improved soil structure, increased plant growth and yield, and reduced water usage.", - "projectWebsite": "https://twitter.com/friedmanspace", - "fractionsTotalSupply": 12359, - "hypercertEligibleDonors": 291, - "hypercertData": { - "workScopes": "Agriculture", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Ogallala.Life", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Devoted to learning, exploring, developing & deploying web3 tools for landscape rehydration on and around the US high plains aquifer system. Proves out market incentives for improved water recharge & retention.", - "projectWebsite": "https://twitter.com/ogallalalife", - "fractionsTotalSupply": 12359, - "hypercertEligibleDonors": 291, - "hypercertData": { - "workScopes": "Agriculture", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Regr\u00f2", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Connects land owners, farmers, and growers, interested in sharing resources to build resilient agroecological systems through Regenerative and Conservation Agriculture, Permaculture, and non-invasive practices.", - "projectWebsite": "https://twitter.com/projectregro", - "fractionsTotalSupply": 12359, - "hypercertEligibleDonors": 291, - "hypercertData": { - "workScopes": "Agriculture", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Ayowecca", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "A community-founded organization working on nature-based solutions, Wetlands and peatland ecosystem restoration. Promotes agroforestry, by giving farmers fruit trees to plant beside their crops to protect the degraded landscape, promote food security and raise food production.", - "projectWebsite": "https://twitter.com/ayowecca_uganda", - "fractionsTotalSupply": 17824, - "hypercertEligibleDonors": 410, - "hypercertData": { - "workScopes": "Agriculture,Emerging Economies", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "dMRV Network", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Puts the tools necessary in the hands of small-scale farmers and other marginalized communities so that they have the opportunity to collect and submit valuable ecological data for fair compensation.", - "projectWebsite": "https://twitter.com/dmrvnetwork", - "fractionsTotalSupply": 12359, - "hypercertEligibleDonors": 291, - "hypercertData": { - "workScopes": "Agriculture", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "WeSeed Project", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Addresses global food insecurity challenges through the use of blockchain and cryptocurrency technologies. Provides education and training in these areas to underserved communities, empowering them to actively participate in regenerative microeconomics.", - "projectWebsite": "https://twitter.com/weseedrefi", - "fractionsTotalSupply": 12359, - "hypercertEligibleDonors": 291, - "hypercertData": { - "workScopes": "Agriculture", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Elephant in the Room", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Elephant in the Room works with Indigenous organizations, voting organizations, neighborhoods, cities, and activists to promote climate action to communities around the world and to counter fossil fuel advertising and disinformation.", - "projectWebsite": "https://twitter.com/ClimateRace", - "fractionsTotalSupply": 11834, - "hypercertEligibleDonors": 314, - "hypercertData": { - "workScopes": "Act Now Climate Change,Emerging Economies", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Unearthing Common Ground", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Unearthing Common Ground is a six week learning journey which introduces 50 Web3 regens to 50 existing community land trusts from around the world to develop on the ground project collaboration.", - "projectWebsite": "https://twitter.com/commongroundCLT", - "fractionsTotalSupply": 6369, - "hypercertEligibleDonors": 186, - "hypercertData": { - "workScopes": "Act Now Climate Change", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Litter Token ($LTK)", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Litter Token is a purpose-driven token that pays people to pick up litter. They use their own cryptocurrency to compensate people for cleaning up the planet.", - "projectWebsite": "https://twitter.com/litter_token", - "fractionsTotalSupply": 6369, - "hypercertEligibleDonors": 186, - "hypercertData": { - "workScopes": "Act Now Climate Change", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Cosmos for Humanity", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Cosmos for Humanity is a Swiss-based NGO that promotes a more sustainable access to outer space for humanity. They are creating a carbon footprint inspired indicator and a citizen-run label to fund researchers and startups working on space pollution.", - "projectWebsite": "https://twitter.com/cosmos4humanity", - "fractionsTotalSupply": 6369, - "hypercertEligibleDonors": 186, - "hypercertData": { - "workScopes": "Act Now Climate Change", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Beyond Fossil Fuels", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Beyond Fossil Fuels is an Indigenous Legal Fund for Climate Action.", - "projectWebsite": "https://twitter.com/BFF_campaign", - "fractionsTotalSupply": 11834, - "hypercertEligibleDonors": 314, - "hypercertData": { - "workScopes": "Act Now Climate Change,Emerging Economies", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Blockchain for Climate Foundation", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Blockchain for Climate Foundation is working to put the Paris Agreement carbon markets on Ethereum to enable cross border collaboration on climate change.", - "projectWebsite": "https://twitter.com/blockforclimate", - "fractionsTotalSupply": 6369, - "hypercertEligibleDonors": 186, - "hypercertData": { - "workScopes": "Act Now Climate Change", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Blockchain x Climate Infrastructure", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Blockchain x Climate Infrastructure is an activist-to-industry network of global stakeholders working together to define and author cooperative operating and technical principles for climate-related blockchain efforts.", - "projectWebsite": "https://twitter.com/BICWOG", - "fractionsTotalSupply": 6369, - "hypercertEligibleDonors": 186, - "hypercertData": { - "workScopes": "Act Now Climate Change", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "7Energy", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Empowering Renewable Energy Independence for Energy Communities. Join the 7Energy revolution and take control of your energy consumption!", - "projectWebsite": "https://twitter.com/7EnergyDAO", - "fractionsTotalSupply": 3332, - "hypercertEligibleDonors": 231, - "hypercertData": { - "workScopes": "Renewable Energy", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Zero Labs & Block Garden", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Embedding tokenized renewable energy into any digital process or app. Making climate action programmable and automatic, building radically accessible and transparent tools.", - "projectWebsite": "https://twitter.com/zerolabsx", - "fractionsTotalSupply": 3332, - "hypercertEligibleDonors": 231, - "hypercertData": { - "workScopes": "Renewable Energy", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Furua", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Floor heating system that heats spaces with compute power; laying the foundation for zero-emission, truly decentralized computing.", - "projectWebsite": "https://twitter.com/FuroaCo", - "fractionsTotalSupply": 3332, - "hypercertEligibleDonors": 231, - "hypercertData": { - "workScopes": "Renewable Energy", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Khalon Bridge", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Distributed Solar for Web3 Creators in Nigeria. Providing residential solar to emerging talent in the region to advance the digital economy in Africa.", - "projectWebsite": "https://twitter.com/KhalonBridge", - "fractionsTotalSupply": 8797, - "hypercertEligibleDonors": 353, - "hypercertData": { - "workScopes": "Renewable Energy,Emerging Economies", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "FrontierDAO", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Collectively incubating scientific and engineering innovations and innovators, using Web3 tooling. Focus area is \u201cfusion energy as a climate solution.\u201d Released IP NFT on-chain scientific publishing platform called FrontierRegistry.", - "projectWebsite": "https://twitter.com/FrontierDAO", - "fractionsTotalSupply": 7820, - "hypercertEligibleDonors": 274, - "hypercertData": { - "workScopes": "Climate Research", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "SCINET, INC", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Increasing speed, efficiency, and effectiveness of life sciences research from \u201clab to life\u201d through decentralized life sciences ecosystem. Offering unique confluence of decentralized funding, blockchain-protected IP, and commercialization strategies.", - "projectWebsite": "https://twitter.com/scinet_inc", - "fractionsTotalSupply": 7820, - "hypercertEligibleDonors": 274, - "hypercertData": { - "workScopes": "Climate Research", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Option", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Prediction market for governance that incentivizes companies to align with community values, including those related to climate change, by making it profitable for them to do so.", - "projectWebsite": "https://twitter.com/option_hq", - "fractionsTotalSupply": 7820, - "hypercertEligibleDonors": 274, - "hypercertData": { - "workScopes": "Climate Research", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "ScienceFund", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Funding basic science with donations recorded for posterity on the Ethereum blockchain. Supporting \u201cUrban Climate Impact Mitigation Pool\u201d, specifically \u201cUPP\u201d - the \u201cUrban Planting Project\u201d incubated at the AKASHA Hub in Barcelona.", - "projectWebsite": "https://twitter.com/sciencefund_io", - "fractionsTotalSupply": 7820, - "hypercertEligibleDonors": 274, - "hypercertData": { - "workScopes": "Climate Research", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Internet of Animals", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Creating a community of scientists to promote design, development, implementation, and improvement of software, hardware, and knowledge resources related to wildlife movement ecology. Established a bank account and business account on CoinBase, preparing to invest in web development and 501(c)(3) tax status.", - "projectWebsite": "https://twitter.com/WildlifeMovemnt", - "fractionsTotalSupply": 7820, - "hypercertEligibleDonors": 274, - "hypercertData": { - "workScopes": "Climate Research", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Defi Biolabs", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Bioengineering algae to reduce greenhouse gas emissions.", - "projectWebsite": "https://twitter.com/Defibiolabs", - "fractionsTotalSupply": 7820, - "hypercertEligibleDonors": 274, - "hypercertData": { - "workScopes": "Climate Research", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Circonomy", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Recycle & Reuse 2 Earn 2 put the \u201ceco\u201d in \u201ceconomy\u201d. Building a dapp with combination of on-chain registration of hardware-based circular economic projects and on-chain tracking of all recycling activity.", - "projectWebsite": "https://twitter.com/CirconomyDAO", - "fractionsTotalSupply": 7820, - "hypercertEligibleDonors": 274, - "hypercertData": { - "workScopes": "Climate Research", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Grow Your Own Cloud DAO (GYOC DAO)", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Developing regenerative data tech, storing digital data in the DNA of plants and trees, to create carbon absorbing data storage. Awarded science breakthrough of the year from Falling Walls. Building unique Web3 offering \u201cNon-Fungible Plants\u201d (NFPs).", - "projectWebsite": "https://twitter.com/_GYOC", - "fractionsTotalSupply": 7820, - "hypercertEligibleDonors": 274, - "hypercertData": { - "workScopes": "Climate Research", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Gainforest", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Gainforest is a non-profit developing impact evaluators, transparency dashboards and accountability protocols for nature-based assets using DeSci, artificial intelligence and web3.", - "projectWebsite": "https://twitter.com/GainForestNow", - "fractionsTotalSupply": 7516, - "hypercertEligibleDonors": 260, - "hypercertData": { - "workScopes": "Oceans & Forests", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Vlinder", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Vlinder develops Verra-certified mangrove restoration projects to provide a variety of ecosystem services, climate change mitigation, economic considerations, and active participation of the local community in coastal areas.", - "projectWebsite": "https://twitter.com/vlinderclimate", - "fractionsTotalSupply": 12981, - "hypercertEligibleDonors": 364, - "hypercertData": { - "workScopes": "Oceans & Forests,Emerging Economies", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Salt Spring Solutions", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Our projects are systemic solutions to carbon sequestration on Salt Spring Island, BC, including managing a recently-purchased 75 acre forest as a community park to sequester carbon in perpetuity, and sequestering carbon through regenerative agriculture that also improves food security.", - "projectWebsite": "https://twitter.com/SaltSpringSols", - "fractionsTotalSupply": 7516, - "hypercertEligibleDonors": 260, - "hypercertData": { - "workScopes": "Oceans & Forests", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Bloomeria", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "We help fund reforestation and conservation projects, we connect environmental organizations and companies willing to fund meaningful projects and we help companies prove their ESG commitments through a simplified view of their relevant on-chain actions, in a graphic and interactive way.", - "projectWebsite": "https://twitter.com/bloomeria_dao", - "fractionsTotalSupply": 7516, - "hypercertEligibleDonors": 260, - "hypercertData": { - "workScopes": "Oceans & Forests", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Treegens", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "We\u2019re making Degens bullish on trees through the world\u2019s most transparent & rewarding tree planting. PPGL tokens are pegged to the cost of each mangrove tree we plant. Our machine learning / AI tree counter then counts each tree from video footage, & airdrops Non-Fungible Updates.", - "projectWebsite": "https://twitter.com/thetreegens", - "fractionsTotalSupply": 7516, - "hypercertEligibleDonors": 260, - "hypercertData": { - "workScopes": "Oceans & Forests", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Athena Protocol", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Athena Protocol is building the smart contract primitives required to facilitate on chain claim resolutions to claims involving payments for ecosystem services.", - "projectWebsite": "https://twitter.com/_AthenaProtocol", - "fractionsTotalSupply": 8252, - "hypercertEligibleDonors": 208, - "hypercertData": { - "workScopes": "Verification Infrastructure", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Pozzle Planet", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "PozzlePlanet is a social app and protocol where users earn a native token by sharing, joining and documenting planet positive activities.", - "projectWebsite": "https://twitter.com/PozzlePlanet", - "fractionsTotalSupply": 8252, - "hypercertEligibleDonors": 208, - "hypercertData": { - "workScopes": "Verification Infrastructure", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Digital Gaia", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Digital Gaia is building an AI-augmented assistant to help the global regenerative community achieve more impact faster and with greater confidence.", - "projectWebsite": "https://twitter.com/_digitalgaia", - "fractionsTotalSupply": 8252, - "hypercertEligibleDonors": 208, - "hypercertData": { - "workScopes": "Verification Infrastructure", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Katalyst.earth", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Katalyst.earth is scaling Nature Positive Credits through Digital MRV.", - "projectWebsite": "https://twitter.com/KatalystEarth", - "fractionsTotalSupply": 8252, - "hypercertEligibleDonors": 208, - "hypercertData": { - "workScopes": "Verification Infrastructure", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "POCA: Proof of Climate/Community Action", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "POCA is a reward badge to add to a collection of actions taken, such as building a community or taking part in a climate action.", - "projectWebsite": "https://twitter.com/Poca_earth", - "fractionsTotalSupply": 8252, - "hypercertEligibleDonors": 208, - "hypercertData": { - "workScopes": "Verification Infrastructure", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "LunarPunk Labs", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "LunarPunk Labs is facilitating community articulated Active Inferencing Models.", - "projectWebsite": "https://twitter.com/LunarPunk_Labs", - "fractionsTotalSupply": 8252, - "hypercertEligibleDonors": 208, - "hypercertData": { - "workScopes": "Verification Infrastructure", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "SproutUp", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "SproutUp is an impact certificate fundraising platform for web3 charities.", - "projectWebsite": "https://twitter.com/sproutupapp", - "fractionsTotalSupply": 8252, - "hypercertEligibleDonors": 208, - "hypercertData": { - "workScopes": "Verification Infrastructure", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "EverGreenCoin", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "EverGreenCoin is a native blockchain PoW/PoS hybrid cryptocurrency, rewarding environmentally-conscious activities and observations with EGC.", - "projectWebsite": "https://twitter.com/evergreencoin_", - "fractionsTotalSupply": 8252, - "hypercertEligibleDonors": 208, - "hypercertData": { - "workScopes": "Verification Infrastructure", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "ORGO", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "ORGO is creating an economy for environmental and social causes, rewarding positive behaviors and eradicating greenwashing and fraud.", - "projectWebsite": "https://twitter.com/orgo_earth", - "fractionsTotalSupply": 8252, - "hypercertEligibleDonors": 208, - "hypercertData": { - "workScopes": "Verification Infrastructure", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Earthbanc Protocol", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Earthbanc Protocol is a blockchain-based platform for environmental and social impact projects.", - "projectWebsite": "https://twitter.com/earthbanc", - "fractionsTotalSupply": 8252, - "hypercertEligibleDonors": 208, - "hypercertData": { - "workScopes": "Verification Infrastructure", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Project Themistoklis", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Project Themistoklis is an open source platform for decentralized climate action and finance.", - "projectWebsite": "https://twitter.com/p_themistoklis", - "fractionsTotalSupply": 8252, - "hypercertEligibleDonors": 208, - "hypercertData": { - "workScopes": "Verification Infrastructure", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Buan", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "B\u00daAN is minting digital twins of RWA on Ethereum with a focus on environmentally valuable areas of land.", - "projectWebsite": "https://twitter.com/buan_fund", - "fractionsTotalSupply": 8252, - "hypercertEligibleDonors": 208, - "hypercertData": { - "workScopes": "Verification Infrastructure", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Dottyland Impact Self", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "On-chain Impact Self. Turning climate-positive actions into functional and serviceable identities across web3 applications, starting with on-chain carbon token retirement.", - "projectWebsite": "https://twitter.com/dottyland_xyz", - "fractionsTotalSupply": 6180, - "hypercertEligibleDonors": 234, - "hypercertData": { - "workScopes": "Carbon Markets", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Carbon Flow", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "An anti-theft solution for global carbon markets, a multitoken system restricting the amount of carbon tokens converted.", - "projectWebsite": "https://twitter.com/CarbonAntiTheft", - "fractionsTotalSupply": 6180, - "hypercertEligibleDonors": 234, - "hypercertData": { - "workScopes": "Carbon Markets", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Coorest", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "A decentralised application for carbon offsets utilising a 100% on-chain CO2 sequestration via satellite validated NFTrees, CO2 tokens and Proof of Carbon Compensation (PoCC) certificates.", - "projectWebsite": "https://twitter.com/CoorestOfficial", - "fractionsTotalSupply": 6180, - "hypercertEligibleDonors": 234, - "hypercertData": { - "workScopes": "Carbon Markets", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "KlimaDAO Name Service", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "A domain name NFT that permanently locks up carbon credits, continuously offsets carbon credits and can be used as a social representation of climate impact.", - "projectWebsite": "https://twitter.com/knsdomains_", - "fractionsTotalSupply": 6180, - "hypercertEligibleDonors": 234, - "hypercertData": { - "workScopes": "Carbon Markets", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Clime Tech (Formerly Clime DAO)", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Climate action and resiliency tool used by cities and business for adaptation and mitigation. Carbon reduction verified, stored on chain and issued tech based carbon credits.", - "projectWebsite": "https://twitter.com/ClimeTechInc", - "fractionsTotalSupply": 6180, - "hypercertEligibleDonors": 234, - "hypercertData": { - "workScopes": "Carbon Markets", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Mangrove", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Mangrove is building the operating system for carbon removal companies to eliminate the risk of double selling supply, improve sales processes, easily bring inventory into the refi ecosystem and ensure compliance with government and registries.", - "projectWebsite": "https://twitter.com/mangrovecarbon", - "fractionsTotalSupply": 6180, - "hypercertEligibleDonors": 234, - "hypercertData": { - "workScopes": "Carbon Markets", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "ERC-Cool\u2122", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "An improved implementation of the ERC721 smart contract standard that weaves real world, perpetual, carbon removal into any NFT use case.", - "projectWebsite": "https://twitter.com/TresCoolLabs", - "fractionsTotalSupply": 6180, - "hypercertEligibleDonors": 234, - "hypercertData": { - "workScopes": "Carbon Markets", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "KUMO", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "KUMO unlocks the value of natural assets by providing interest-free loans against their market value. Loans are issued in their native stablecoin, which literally locks carbon into money.", - "projectWebsite": "https://twitter.com/kumo_dao", - "fractionsTotalSupply": 6180, - "hypercertEligibleDonors": 234, - "hypercertData": { - "workScopes": "Carbon Markets", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "ECORISE DAO", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "ECORISE brings liquidity to the real estate and natural capital asset market and unlocks stored value through tokenization of these assets and bringing them on-chain.", - "projectWebsite": "https://twitter.com/ECORISEDAO", - "fractionsTotalSupply": 6180, - "hypercertEligibleDonors": 234, - "hypercertData": { - "workScopes": "Carbon Markets", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Carbonland Trust", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "A carbon credits registry offering natured based carbon removal credits from biodiverse forest land that is being enrolled into perpetual conservation.", - "projectWebsite": "https://twitter.com/CarbonLandTrust", - "fractionsTotalSupply": 6180, - "hypercertEligibleDonors": 234, - "hypercertData": { - "workScopes": "Carbon Markets", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "disCarbon", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Creates transparent and verifiable emission estimation and carbon retirement and tools available as public goods within the Ethereum ecosystem.", - "projectWebsite": "https://twitter.com/discarbon_earth", - "fractionsTotalSupply": 6180, - "hypercertEligibleDonors": 234, - "hypercertData": { - "workScopes": "Carbon Markets", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Changeblock", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Provides investors access to groundbreaking green credits that are streamlined and independently verified, allowing for the creation and listing of unique instruments on their platform.", - "projectWebsite": "https://twitter.com/Changeblock_io", - "fractionsTotalSupply": 6180, - "hypercertEligibleDonors": 234, - "hypercertData": { - "workScopes": "Carbon Markets", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "The Eden Dao", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Launched the DRM Syndicate in 2022, which removed 760 tons of CO2 permanently removed from the atmosphere. Building regenerative financial infrastructure, decentralized lego blocks, and public good utilities in 2023.", - "projectWebsite": "https://twitter.com/TheEdenDao", - "fractionsTotalSupply": 6180, - "hypercertEligibleDonors": 234, - "hypercertData": { - "workScopes": "Carbon Markets", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "The Undivide Project", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "The Undivide Project focuses on rebuilding, reclaiming and connecting communities to climate solutions and web3.", - "projectWebsite": "https://grant-explorer.gitcoin.co/#/round/1/0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "fractionsTotalSupply": 3939, - "hypercertEligibleDonors": 177, - "hypercertData": { - "workScopes": "Community Engagement", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "All for Climate DAO", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "All for Climate DAO is building the Greenpeace of the 21st: a decentralized community of active citizens that take initiatives to transition to a more regenerative world.", - "projectWebsite": "https://twitter.com/allforclimatedao", - "fractionsTotalSupply": 3939, - "hypercertEligibleDonors": 177, - "hypercertData": { - "workScopes": "Community Engagement", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "La Matrice Multiversity Campus", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "La Matrice Campus is a hotspot of transformative education with a focus on the transmission of regenerative practices, in a vibrant ecovillage.", - "projectWebsite": "https://twitter.com/MatriceCampus", - "fractionsTotalSupply": 3939, - "hypercertEligibleDonors": 177, - "hypercertData": { - "workScopes": "Community Engagement", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Closer", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Closer is an operating system for regenerative villages, building systems that support the governance and operations of regenerative co-living and co-housing projects.", - "projectWebsite": "https://twitter.com/closerearth", - "fractionsTotalSupply": 3939, - "hypercertEligibleDonors": 177, - "hypercertData": { - "workScopes": "Community Engagement", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Translators DAO", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Translators DAO is a collective of translators and interpreters who ensure communication across the world for grassroots, non-profit climate justice movements.", - "projectWebsite": "https://twitter.com/TranslatorsDAO", - "fractionsTotalSupply": 3939, - "hypercertEligibleDonors": 177, - "hypercertData": { - "workScopes": "Community Engagement", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Samara Trust", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Samara Trust is a decentralized organization of facilitators who help organizations and communities attempting to regenerate our Earth and culture.", - "projectWebsite": "https://grant-explorer.gitcoin.co/#/round/1/0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "fractionsTotalSupply": 3939, - "hypercertEligibleDonors": 177, - "hypercertData": { - "workScopes": "Community Engagement", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Hazel", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Hazel is gamifying carbon removal using a web3 game to help bring consumer spending to the carbon removal market.", - "projectWebsite": "https://twitter.com/hazelclimateapp", - "fractionsTotalSupply": 3939, - "hypercertEligibleDonors": 177, - "hypercertData": { - "workScopes": "Community Engagement", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Pythagoras Ecology Works", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Pythagoras Ecology Works uses forest waste wood taken in wildfire mitigation in decentralized manufacture of furniture and structures without use of metal fasteners.", - "projectWebsite": "https://twitter.com/ecologyworks", - "fractionsTotalSupply": 3939, - "hypercertEligibleDonors": 177, - "hypercertData": { - "workScopes": "Community Engagement", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Future Diaries", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Future Diaries is a dramatised speculative fiction podcast that highlights a variety of social and environmental issues.", - "projectWebsite": "https://twitter.com/future_diaries", - "fractionsTotalSupply": 3939, - "hypercertEligibleDonors": 177, - "hypercertData": { - "workScopes": "Community Engagement", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Borderless Money", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Borderless Money is the first non-custodial decentralized endowment platform, where contributors retain control over the principal, and only the income generated is distributed to initiatives.", - "projectWebsite": "https://twitter.com/borderless_refi", - "fractionsTotalSupply": 3939, - "hypercertEligibleDonors": 177, - "hypercertData": { - "workScopes": "Community Engagement", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Open Source Ecology", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Open Source Ecology is building systems for open source manufacturing as an affordable housing solution.", - "projectWebsite": "https://grant-explorer.gitcoin.co/#/round/1/0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "fractionsTotalSupply": 3939, - "hypercertEligibleDonors": 177, - "hypercertData": { - "workScopes": "Community Engagement", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "ReFi Bootcamp", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "ReFi Bootcamp is a learning platform to earn regenerative finance education.", - "projectWebsite": "https://grant-explorer.gitcoin.co/#/round/1/0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "fractionsTotalSupply": 3939, - "hypercertEligibleDonors": 177, - "hypercertData": { - "workScopes": "Community Engagement", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Cambiatus", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Cambiatus is building complementary currencies and collaborative businesses on Blockchain.", - "projectWebsite": "https://twitter.com/_cambiatus", - "fractionsTotalSupply": 9404, - "hypercertEligibleDonors": 304, - "hypercertData": { - "workScopes": "Community Engagement,Emerging Economies", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "ReConnection Tech", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Reconnection Tech is using technology as a mean to reconnect the humans and more-than-human pluriverse.", - "projectWebsite": "https://grant-explorer.gitcoin.co/#/round/1/0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "fractionsTotalSupply": 9404, - "hypercertEligibleDonors": 304, - "hypercertData": { - "workScopes": "Community Engagement,Emerging Economies", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Urb\u00e1nika", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "An immersive activism school that turns passive citizens into active city shapers capable of using web 3.0 tech, peer governance, and commoning.", - "projectWebsite": "https://twitter.com/0xUrbanika", - "fractionsTotalSupply": 7807, - "hypercertEligibleDonors": 291, - "hypercertData": { - "workScopes": "Emerging Economies,Creative Works", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Coffee Impact Collective", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Supports coffee farmers in their transition to regenerative agriculture by providing agronomic guidance and rewarding them for implementation of new practices.", - "projectWebsite": "https://twitter.com/Coffeeimpactco", - "fractionsTotalSupply": 5465, - "hypercertEligibleDonors": 203, - "hypercertData": { - "workScopes": "Emerging Economies", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Project regr\u00f2", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Connects land owners, farmers and growers to build resilient agro-ecologic systems through Regenerative and Conservation Agriculture, Permaculture and non-invasive practices.", - "projectWebsite": "https://twitter.com/projectregro", - "fractionsTotalSupply": 5465, - "hypercertEligibleDonors": 203, - "hypercertData": { - "workScopes": "Emerging Economies", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Project Toninas", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Focused on the research and conservation of the Lahille\u2019s bottlenose dolphin, providing multiple services and opportunities for farmers in Brazil, Uruguay and Argentina.", - "projectWebsite": "https://twitter.com/yaqupachauy", - "fractionsTotalSupply": 5465, - "hypercertEligibleDonors": 203, - "hypercertData": { - "workScopes": "Emerging Economies", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Future Quest", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "A web3 ecosystem committed to fixing our future. Part game, part launch pad for public good Quests for our planet.", - "projectWebsite": "https://twitter.com/FutureQuestDAO", - "fractionsTotalSupply": 2342, - "hypercertEligibleDonors": 180, - "hypercertData": { - "workScopes": "Creative Works", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "ColtonArt", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Funds social causes through art sales. $154,389 have been donated to the Gitcoin Matching Pool in the past year.", - "projectWebsite": "https://twitter.com/mettahead", - "fractionsTotalSupply": 2342, - "hypercertEligibleDonors": 180, - "hypercertData": { - "workScopes": "Creative Works", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Decentralized Desires Studio-Lab", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Uses art as an inquiry to engage interdisciplinary teams on climate related avenues of research.", - "projectWebsite": "https://grant-explorer.gitcoin.co/#/round/1/0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "fractionsTotalSupply": 2342, - "hypercertEligibleDonors": 180, - "hypercertData": { - "workScopes": "Creative Works", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Climate Change Countdown", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Regularly creates and posts digital artworks about Climate Change, exploring a variety of forms of visual and non visual arts.", - "projectWebsite": "https://twitter.com/Marcobear_eth", - "fractionsTotalSupply": 2342, - "hypercertEligibleDonors": 180, - "hypercertData": { - "workScopes": "Creative Works", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Vanara", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Ecological arts & crafts collective working with hemp to produce slow-fashion goods and regenerate the ecosystem.", - "projectWebsite": "https://twitter.com/Vanara_Co", - "fractionsTotalSupply": 2342, - "hypercertEligibleDonors": 180, - "hypercertData": { - "workScopes": "Creative Works", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Ranna", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Open network of filmmakers creating high impact films to provide activist-led coverage to climate action initiatives.", - "projectWebsite": "https://twitter.com/rannamedia", - "fractionsTotalSupply": 2342, - "hypercertEligibleDonors": 180, - "hypercertData": { - "workScopes": "Creative Works", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "nfDAO", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Grants DAO to discover, support and fund diverse and creative projects with potential to make a positive impact.", - "projectWebsite": "https://twitter.com/dao_nf", - "fractionsTotalSupply": 2342, - "hypercertEligibleDonors": 180, - "hypercertData": { - "workScopes": "Creative Works", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Artists for Climate", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Collective of humans using art to generate an emotional impact on citizens and motivate them to take action in solving the climate emergency.", - "projectWebsite": "https://twitter.com/all4climatedao", - "fractionsTotalSupply": 2342, - "hypercertEligibleDonors": 180, - "hypercertData": { - "workScopes": "Creative Works", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "Solarpunk Art DAO", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Collective of Solarpunks helping create and fund more Solarpunk art to reimagine a regenerative future.", - "projectWebsite": "https://twitter.com/all4climatedao", - "fractionsTotalSupply": 2342, - "hypercertEligibleDonors": 180, - "hypercertData": { - "workScopes": "Creative Works", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - }, - { - "title": "W3ST: Solarpunk meta-nation", - "address": "", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "projectDescription": "Impact network of regenerative projects united under the symbolic entity of a globally distributed country to transition to new models of innovation.", - "projectWebsite": "https://twitter.com/w3stdao", - "fractionsTotalSupply": 2342, - "hypercertEligibleDonors": 180, - "hypercertData": { - "workScopes": "Creative Works", - "workTimeStart": "2022-09-22", - "workTimeEnd": "2023-01-15", - "impactScopes": ["all"], - "impactTimeStart": "2022-09-22", - "impactTimeEnd": "indefinite", - "contributors": "", - "rights": ["Public Display"] - } - } -] diff --git a/utils/gitcoin/gitcoin-alpha/data/csv/README.md b/utils/gitcoin/gitcoin-alpha/data/csv/README.md deleted file mode 100644 index 8ea9e8a..0000000 --- a/utils/gitcoin/gitcoin-alpha/data/csv/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# Custom CSV Data - -This directory should include all externally generated CSV files, including the ones required by `config.json`: - -``` -"duneSnapshots": [ - "data/csv/Donors_Climate.csv", - "data/csv/Donors_EthInfra.csv", - "data/csv/Donors_OSS.csv" - ], -"workScopeOverrides": "data/csv/Notion_WorkscopeOverrides.csv" -``` diff --git a/utils/gitcoin/gitcoin-alpha/data/donorlists/README.md b/utils/gitcoin/gitcoin-alpha/data/donorlists/README.md deleted file mode 100644 index 6e27367..0000000 --- a/utils/gitcoin/gitcoin-alpha/data/donorlists/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Donorlist Data - -Directory for unfiltered donorlist CSV files generated by `allowlist.py`. - -This directory should contain one CSV file per project. diff --git a/utils/gitcoin/gitcoin-alpha/data/graph-data.json b/utils/gitcoin/gitcoin-alpha/data/graph-data.json deleted file mode 100644 index fac5de5..0000000 --- a/utils/gitcoin/gitcoin-alpha/data/graph-data.json +++ /dev/null @@ -1,14928 +0,0 @@ -[ - { - "projectId": "0x0299d145933e3abc9bee2251589d080e0b12765e7e211e72e5209d0ac1889d33", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0xb1aece3ecd7b437f7f6f29fa9fe1bd3d340fa41f1c7e4c9d14b3b66201e5673e295a81658edce420e7eaa61c3c713525128e2ce8c9f7434707a30fedae15f6be1c", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0x474716e617FEa8898D4fa9D891AA67B5BEDd6C4b", - "project": { - "lastUpdated": 0, - "createdAt": 1673426996476, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:116", - "title": "Solarpunk Nomads: building the first two Public Goods adventure vehicles", - "description": "Since April 2022, we have been facilitating the collective rise of Solarpunk nomadism and gathering a tribe of nomadic changemakers. After focusing on concept development and community building, it is time to build the first Solarpunk Nomads vehicles. These vehicles will be community-owned and used for accelerating the transition to a more sustainable society \u2600\ufe0f \ud83d\udd0b \u26a1\ufe0f \ud83d\ude90\n\n\n---------------------------------------------------------\nWHO ARE THE SOLARPUNK NOMADS\nChangemakers, dreamers, and builders who live nomadic or semi-nomadic lifestyles using zero-carbon emission vehicles (EV vans, EV bikes, sailboats, etc.) powered by renewable energies.\n\ud83d\udc49 These nomads are always connected to the internet with satellite connections and are proactive in building a Solarpunk society. \n\ud83d\udc49 These nomads will be the storytellers and main instigators of a society where advanced technology and eco-wisdom will create a brighter future for everyone.\n\n---------------------------------------------------------\nWHAT WE WANT TO BUILD [NOW] \n\ud83d\udd1c Set up the first two Solarpunk Nomads vehicles to be used in education and promotion programs, including being present at ReFi and crypto events in Europe and India.\nThe 1st vehicle is a solar-powered E-bike with a trailer, stationed in locations in central Europe. The 2nd is an eco-vehicle, partially powered by solar panels, stationed in Southern India and used for educational activities and expeditions to document Climate Change (developed in collaboration with AtlantisDAO).\n\ud83d\udd1c Replenish the social treasury for nomads in need.\n\ud83d\udd1c Fund new artists to further develop the collective image of Solarpunk Nomadism.\n\ud83d\udd1c Complete the Solarpunk Nomadism digital guidebook.\n\n---------------------------------------------------------\nWHAT WE HAVE BUILT SO FAR [2022]\n\u2714\ufe0f Kickstarted this new concept.\n\u2714\ufe0f Created over 50 original visual artifacts in collaboration with artists.\n\u2714\ufe0f Promoted Solarpunk Nomadism with over 500k views on Twitter and over 50 Twitter Spaces.\n\u2714\ufe0f Defined a social treasury with guidelines for Solarpunk Nomads in need.\n\u2714\ufe0f Created a digital hub for nomads on Discord.\n\u2714\ufe0f Built an ongoing virtual art exhibition about Solarpunk Nomadism (https://spatial.io/s/Solarpunk-Nomads-exhibition-6315b520c490500001340a6b?share=4245792330981123574)\n\u2714\ufe0f Kickstarted the new concept of Solarpunk Safe Place and Regen Lab.\n\u2714\ufe0f Launched the Solar Punk Cafes.\n\u2714\ufe0f Introduced the concept of Proxy Solarpunk.\n\u2714\ufe0f Founded the Solarpunk Guild, a collective that supports SP-inspired projects.\n\n---------------------------------------------------------\nTEAM\n\ud83c\udf0d Earthbasedsoul, a wildlife biologist and visionary, has spent the last years spreading awareness on social media about the Climate Emergency and Biodiversity crisis.\n\ud83d\udc3b Marco Bear runs Climate Change Countdown (a daily digital art project and expedition to document causes, effects, and solutions of Climate Change). You can find him in the Alps doing wild camping and around web3 climate spaces.\n\n---------------------------------------------------------\nWHY IS SOLARPUNK NOMADISM A CLIMATE SOLUTION? \n\ud83c\udf33 Promotes zero-carbon mobility, solar energy, and electric mobility.\n\ud83c\udf33 Leverages nomadism to promote the Solarpunk vision.\n\ud83c\udf33 Helps changemakers to adapt to the Climate Emergency and to maintain functionality in challenging times.\n\ud83c\udf33 Helps to reduce the carbon footprint of the community.\n\ud83c\udf33 Promotes minimalism and a rethinking of lifestyle toward sustainability.\n\ud83c\udf33 Has very high potential scalability inside and outside the Web3 Space.\n\ud83c\udf33 Could become the backbone of positive climate action communication.\n\ud83c\udf33 Facilitates low carbon IRL connections between changemakers, projects, events.\n", - "website": "https://tinyurl.com/SolarpunkNomads", - "bannerImg": "bafybeidnatloov4map4lecdaxczl7tbl4njsrizzf5jd2jrtm4lnbkvaru", - "logoImg": "bafybeihlw25dpneicps46rwblvw3xpqn2qszx275gbfd3ec7v2zm3ky7xi", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreihknfll4gozox77q57f5s3e5wahi47gzo74kfdfn4n4c4on46i2om" - }, - "userGithub": "BearMarco", - "projectTwitter": "SolarpunkNomads", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x474716e617FEa8898D4fa9D891AA67B5BEDd6C4b", - "provider": "ClearTextTwitter#SolarpunkNomads", - "hash": "v0.0.0:+Z8l7d8A38F0qNKKF6cF/gBkeIzfFPam4jtdGFR2j7Q=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-11T09:00:00.208Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-11T09:00:00.209Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..I38uBJtwbpxLhf8eDjcmyUSpuJS2Wnqvat8zPrpbmpPojfJHW-jeA3v277vx3TYfVQBiTV7rLnKfAVh55RtfBQ" - }, - "expirationDate": "2023-04-11T09:00:00.208Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "go82BYxtS+v+zoXD7NVFxa9X1D+b62UsQCuecyNu4dRkMt3lbJwZurmO9cbeQMBI", - "encryptedSymmetricKey": "de46d3788095fe58066257cb9c59c228d334107806adc62a326f5fca0d781eb9a30845931e45a412d74c39b53379320fc6a2f5340921807d1ab18b691c47c172a591c628010e922b08fa1f256f60656f93d4d02a8800af3f16f439b5153a8baec512a6a727f7ca03248debe8f29b9c513b28169694047332c5b53032e3a0fc7f00000000000000200d9fa58a6e72f47af7eaaa23ec9d0226f8fb7bc1fe9a47c53a5c61084bd8e39993df74c9d3c7901ced9242f8c38a6596" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "2" - } - ] - } - } - }, - { - "projectId": "0x0b84bfa1e358e2c7816e5244258c16e4d6d06930fb4cf20f2d714ce35d330308", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0x280de309f28612efefe5ce906b72b1c64142623fd214d546a8eae4732776751e54533d6a8fac013383b21639d55c148e3f258eeb03d7291d4ff8b7c524c916431b", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0x78Dc08c6f14e26B2C91edAE9a6e03eed7Ae5218B", - "project": { - "lastUpdated": 0, - "createdAt": 1673479399631, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:134", - "title": "Bundle: Agriculture", - "description": "\ud83c\udf31\u00a0This grant bundles 8 initiatives devoted to transforming agriculture to provide healthy food, water, material, medicinal security to communities, regenerated working lands for improved carbon & water cycling, and biodiversity as well as general ecosystem functions. \ud83c\udf31\u00a0\n\n\ud83d\ude9c\u00a0 Agriculture is a primary driver of land, water degradation globally, and contributes significantly to global GHG emissions (>10%) food is essential for a community\u2019s security & well-being, and is considered a matter of national security by modern nation-states. \n\n\ud83d\udc90\u00a0\u00a0Regenerative agriculture initiatives recognize the fragility of \u201cmodern\u201d agriculture. They argue that resilient communities achieve food, water, material & medicinal security by restoring health to their surroundings and valuing ecosystem functions. It generally allows us to decolonize our minds that traditionally associate farming with mass monoculture to instead associate it with multiple and diverse species (wild, livestock, vegetative, & microbiome\u2026) contributing to the resilience of a whole ecosystem. \n\n\ud83c\udf0e\u00a0 A global decentralized grants platform like Gitcoin offers a means for each of us to reclaim agency over the food system that we rely on. Let us be empowered and demonstrate the potential of quadratic funding to allocate, prioritize, as well as support transformative change to agriculture across scales. \n\n\u2600\ufe0f\u00a0The initiatives represented by this bundle are collaborating with local communities and indigenous organizations while providing access to knowledge about regenerative agriculture as well as access to the tools for farmers. Creating these impacts in Kenya, Columbia, India, Croatia & the United States with disparate aims but a common mission and mandate to demonstrate and expand the role of free and open-source software in public goods funding.\n\nIf you would like to know more about the individual projects that have been gathered in this bundle, check below!\n\n\u2615\ufe0f Coffee Carbon Collective, @CoffeeCarbonCo: supports coffee farmers in their transition to regenerative agriculture by providing agronomic guidance and rewarding them for the implementation of new practices. Coffee Impact Collective creates an ecosystem that provides multiple services and opportunities for farmers, allowing them to become a part of a decentralized marketplace where \u201cregenerated\u201d coffee is traded along with eco credits (like carbon, biodiversity, water quality, social impact, and eco-tourism), not separately.\n\n\ud83c\udf38\u00a0 Kanga Gardens, @Kangra_Gardens: The Kangra Gardens are a place for people to express gratitude and give back to the earth by respecting and learning from it. The purpose of the Kangra Botanical Garden, which is a part of Kula, is to regenerate the local ecosystem, promote biodiversity conservation, support community health, build towards food sovereignty and nutrition, and engage people in connecting with the environment. The garden uses Ayurvedic medicine production and syntropic farming to achieve these goals facilitated through a Bioregional Learning Center. The grant for Kangra Gardens aims to fund new as well as current contributors and the development of open-source documentation to share with the global community.\n\n\ud83d\udca7\u00a0Watercycle, @friedmanspace: Watercycle is developing an open-source, low-cost water structuring device to improve crop yields and accelerate natural carbon sequestration. Water structuring is the process of altering the structure of water to optimize its ability to support life. The benefits of water structuring in agriculture include improved soil structure, increased plant growth and yield, and reduced water usage.\n\n\ud83c\udfdd\ufe0f\u00a0Ogallala.Life, @ogallalalife: We are a not-for-profit devoted to learning, exploring, developing & deploying web3 tools for landscape rehydration on and around the US high plains aquifer system. Our mission is to prove out market incentives for improved water recharge & retention - our communities place a tremendously high value on water security and ReFi offers novel mechanisms to invest in surrounding landscapes & watersheds. We\u2019ve launched pilot projects along the Canadian River breaks to explore leaky weirs, riparian restoration, and similar interventions, & their impact on the water budget, biodiversity, carbon & climate. Our projects help facilitate the maturation of decentralized science applied towards regenerative aims through our active collaboration with dMeter, a DAO tasked to build tools for decentralized digital measure recordation & validation in natural capital context including but not limited to PES markets.\n\n\ud83d\udc68\ud83c\udffe\u200d\ud83c\udf3e\u00a0 Regr\u00f2, @projectregro: At Regr\u00f2 farmers, gardeners and artists share their journeys about Regenerative Agriculture and Regenerative Finance. Under the increasing climate emergency pressure, the Regr\u00f2 project aims to connect land owners, farmers, and growers, interested in sharing resources to build resilient agroecological systems through Regenerative and Conservation Agriculture, Permaculture, and non-invasive practices.\n\n\ud83c\udf33 Ayowecca Uganda, @ayowecca_uganda: A community-founded organization working on nature-based solutions, Wetlands and peatland ecosystem restoration has been our focus. Together with the local community, we are restoring encroached wetlands and protecting those that already exist. Our strategy involves agroforestry and afforestation. We are promoting agroforestry, by giving farmers fruit trees to plant beside their crops to protect the degraded landscape, promote food security and raise food production. Climate change adaptation and mitigation are our primary goals in promoting agroforestry/regenerative agriculture and permaculture. The effects of climate change on agricultural communities can be lessened by planting trees in agricultural systems. Growing the number of trees on agricultural land decreases tree cutting and boosts carbon sinks.\n\n \ud83d\udce1\u00a0 dMRV Network, @dmrvnetwork: dMRV network puts the tools necessary in the hands of small-scale farmers and other marginalized communities so that they have the opportunity to collect and submit valuable ecological data for fair compensation. dMRV network is a decentralized organization of scientists, project developers, farmers, and regenerators that contributes to open source systems that allow for decentralized data collection correlation of ecological data into ecological credits and/or payments. The primary goal of dMRV Network is to create a guide for communities to identify the best practices, tools, and resources for maximizing value and ecological health via ecological service payments and/or credits.\n\n\ud83c\udf31 The WeSeed Project @weseedrefi: The WeSeed Project is a unique initiative that aims to address global food insecurity challenges through the use of blockchain and cryptocurrency technologies. The project seeks to provide education and training in these areas to underserved communities, empowering them to actively participate in regenerative microeconomics and create long-term systemic change.", - "website": "https://tinyurl.com/RegenerativeAgricultureBundle", - "bannerImg": "bafybeiclpjhugmwdlc27id7nkf3rnn7fliurzb7ylnca4gkx57bic5o2pq", - "logoImg": "bafkreihxweu7r6m6kkhkfo7yqqfzfs2ln3mqaooac2g5h674xc6y55awri", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiabsclyzuumlkcjrr74v2uvuxplmfhrwhpwm4f3efbyvuzmtjdmuu" - }, - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "bICQ8eKFpKmI/3i/zA6DPYEpUs2ucCuti48NTnQjr1U/ZMI+oJf/1cDjr8Hrmchg", - "encryptedSymmetricKey": "338988a7c982994caec59c65f0f07a0186b97c7c90f80473d754a8e917fff0ee152bf0a83c82d2d10cbcbd6afd172702618d7873b644df3776df2c0f0d922bf33c95eb4b5dff83c7944d39a831c438875dc69075c0c8c3fb535061c51cac97b64b4a3eaf56e62772ff86bf1bb86c4a96443e7e9cb34028625beb6fec7763707a00000000000000204872e8a4187e7588b9e0bb98aa75f4a4abfa40916b00eaad226f57f1df1f90a8f797af692bd4a32e2f0be8db33713cb1" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "10" - } - ] - } - } - }, - { - "projectId": "0x0d85d55a968bc9929c4f7ddfef2e6008b4ad8b77be65f7c08e89eab7cb760cc6", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0x9d170a41676cbf8b530659291df03200bc36f185a822c38dd9394b76c61903d0601971473919a7a349d1db2f105c8334103ac72eb6e0209d87233ef3e9e146c101", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0x8D860D4f254eD45946F5FB0e3243C1db63a4ea2f", - "project": { - "lastUpdated": 0, - "createdAt": 1673611252801, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:179", - "title": "ReFiDAO X Commons Stack: ReFi Commons Prize", - "description": "We are raising $100k to accelerate the growth of the ReFi movement by hatching three local startup commons. \n\nThis is a new joint venture between ReFiDAO and Commons Stack that will pilot a new concept called a \u201cReFi Commons\u201d across three local startup communities in 2023.\n\nBACKGROUND\n\nReFiDAO is a founder-led startup community that accelerates impact for people and the planet.\n\nOver the last 12 months we\u2019ve laid the foundation for the cultural home of regeneration in web3 by supporting over 300 founders at various stages of their journey. \n\nWe are now raising money to launch a ReFi Commons Incubator with Commons Stack. The idea of a ReFi Commons is new, and we are super excited to share it with you! \n\nBut first, an update.\n\nGR15 UPDATE\n\nAs a result of the $69,040 we received from the Gitcoin community in GR15, over the last three months we were able to achieve many key milestones:\n\n- Support 152 founders in FC02\n- Onboard over 70 community managers into the CM Guild\n- Onboard over 20 regen investors \n- Reach 1700 newsletter subscribers\n- Co-launch the $1M grant pool with Future Quest, Celo, Polygon, and others\n\nREFI PASSPORT & KNOWLEDGE GRAPH\n\nAfter consulting with the Gitcoin Passport team, we decided to delay ReFi Passport due to the rate of change for the Gitcoin Passport codebase in Q4 2022. \n\nWe\u2019ve been iterating a prototype of the knowledge graph around MRV (\u2018Measurement, Reporting & Verification\u2019) with an alpha version in the works. \n\nWe\u2019ve expanded our directory to include people, content, deals and events\u2014all of this aimed at helping onboard more talent and capital into the work of regeneration.\n\nTHEORY OF CHANGE\n\nWe believe that in order to realize a global regenerative economy, we need to fulfill three objectives:\n\n1. A global startup movement rooted in diverse local communities\n2. Hundreds of radical startup experiments drive exponential impact\n3. Global coordination between private, public and civil society organizations\n\nREFI COMMONS INCUBATOR\n\nTo test this evolved theory of change, we are raising money to launch a 6-month ReFi Commons Incubator with Commons Stack to accelerate the growth of local startup communities that fulfill three objectives:\n\n1. Onboard new talent and capital into ReFi\n2. Create radical startup experiments for exponential impact\n3. Build public, private and civil society partnerships\n\nThe goal is to pilot the incubator with an initial cohort of three communities and to build a regular program that incubates ReFi Commons all over the world.\n\nWHAT IS A REFI COMMONS?\n\nA ReFi Commons is a founder-led impact DAO that exists to regenerate the earth through radical startup experimentation and innovation. \n\nA ReFi Commons could be created as a startup community in a specific city (Lisbon, Bangalore) or a startup ecosystem focused on a shared problem space (such as plastic pollution or biodiversity). \n\nThe models and methods of regeneration are unique to each community, but there are a few key criteria:\n\n1. Mission, vision, and values statements establish the commons\n2. All funds must be held in a public treasury \n3. Community curates governance parameters and procedures\n4. Impact activities must be publicly verifiable\n5. Funded startup ventures must be open source\n6. Impact and finances are reported quarterly\n7. Three or more founding members make a 7-year commitment to realize their mission and vision of regeneration while upholding the commons\u2019 values\n\nThe idea for a ReFi Commons takes inspiration from Eleanor Ostrom\u2019s 8 Principles, Charles Eisenstein\u2019s Sacred Economics and Brad Feld\u2019s Startup Community Way. \n\nIt is rooted in the belief that governments and corporations cannot solve climate change alone. \n\nWe need a social movement that creates new economic models and provides an alternative to our extractive system.\n\nWHAT DOES A REFI COMMONS DO?\n\nWhile we recognize that regeneration looks differently according to the context, we believe there are a number of key behaviors that contribute to the three core objectives of a ReFi Commons. \n\nThe key behaviors are:\n\n1. Hold regular meetings and events\n2. Create shared work spaces\n3. Collaborate with other startup communities\n4. Build in public\n5. Support entrepreneurs and innovators\n\nTHE REFI COMMONS PRIZE \n\nThe ReFi Commons Prize will be the genesis cohort of the ReFi Commons Incubator focused entirely on starting ReFi Commons in strategic local communities. \n\nIt\u2019s an opportunity for regens all around the world to submit proposals to become a ReFi Commons with the full support of ReFiDAO and Commons Stack with a strong core contributor team:\n\n- Griff Green\n- Tamara \n- Liviade\n- Usama\n- Daryl Edwards\n- John Ellison\n\nThe genesis cohort will award prizes to three local ReFi Commons to implement an adapted Commons Stack framework in a strategic physical community over six months culminating in the launch of a governance token via an augmented bonding curve or other market mechanism. \n\nThe first three Commons will be selected by a community-led governance process with details to follow.\n\nThe expectation is for each ReFi Commons to participate in the global ReFiDAO community and to provide a critical onramp of talent and capital to accelerate impact for people and the planet.\n\nFINANCIALS\n\nWe are looking to raise $100k to cover operating expenditure for the ReFi Commons Prize for three months. This is half of the program, but there are some fixed up-front costs that reduces the overal expenditure. We need at least $75k to launch the program.\n\nAll funds raised will go towards the ReFi Commons Prize.\n\nBEAR MARKET GRATITUDE\n \nWe have been so grateful to everyone in the Gitcoin community for their incredible support over the last 12 months. \n\nWe will continue to steward the funds received with maximum capital efficiency, respecting the conditions of the market and the long-term horizon of the challenges at hand.\n\nWe are not building this startup movement for this cycle, or for next, but to see a global regenerative economy\u2014and beyond.\n\nREGENERATION FOR ALL \n\nGiven that the vast majority of climate projects are rooted in the global south, we commit to a balanced representation of founders and communities supported through the ReFi Commons Incubator.\n\nThe vision of regeneration requires radical inclusion\u2014especially for traditionally marginalized groups. We appreciate the Gitcoin community supporting us in this effort and are super excited to bring it to life!", - "website": "https://refidao.com/", - "bannerImg": "bafybeih2jb2nvp5ycpaaqzgts73f5xhv2egrfnl7ctb2jcxi4eyzznqldq", - "logoImg": "bafybeiagpsv26wwewu6ucsy6kvgj3p3owb2chifzhzhzixx6gzf2te2m7e", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreifp6i3rzmvm4ywmhrtuyefapsaln6lkzbs36iexhn7iyhri3aiixu" - }, - "userGithub": "climateXcrypto", - "projectTwitter": "ReFiDAOist", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xD2b4E046B3AE52078275f44Ef81BC19b4ED2872F", - "hash": "v0.0.0:/oOAUIJ08paMSKrrt+v93F4VKj6OTKhH2YK+iK95l9Q=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#ReFiDAOist" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-13T12:00:13.495Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-13T12:00:13.495Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..303BWdxTMl-_zIOv-BTr9ktGznKVMk3LZ5-wBgzodfO_pbjIJUQVMg6L85EYlE6uvtiPU-G3IwU72kQNUel4AA" - }, - "expirationDate": "2023-04-13T12:00:13.495Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "b4vSCNV6lAyVGA2irbMzt6HSubLywCzLpgnznKk5KQY=", - "encryptedSymmetricKey": "b82dffec3405320874e16a0c6a59c71a761e0490051d40ebb9dc493cead964b07e26ae6b4c69a406f6361cea0766d409d9745f562107fb99f21f6c7287f278fe889153ae8dc7efde70231abf4b653f90fff50dd7a9f2f953be9e9101c9ee59a46f78d73376a9609f493dfbaea24474416514b68b8f60e3a5635fb0c0ed96beec000000000000002010a870e01d9fb611f7983dd3aaa66a48bc6f287037632507df72a64d81ba245c682c5dd38cc58cd3487935afac3a7f8a" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Gitcoin grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "6" - } - ] - } - } - }, - { - "projectId": "0x13fdb2715bc255356cf8f34ec8d40f3ffd0e2d38299b5533ee2c7772e2948e5b", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0x8cb68d63f80ce1e68e9e26d3aa9ff01e2f0020d9a173fdbfe28e0de2495e422822fd80b883582f5f77be0c930ad9328a2866c1863b316c3388ba7c3a65366cba1b", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0xfbCA78474A09E2BF3543f4Fc1037152ea2c6C32d", - "project": { - "lastUpdated": 0, - "createdAt": 1673600047808, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:175", - "title": "Atlantis", - "description": "\ud83d\udd31 THE PROBLEM\n\nSeeded in 2022, Atlantis is a social network dedicated to powering credible climate action.\n\nA problem like climate change requires billions of people coming together. Today\u2019s social networks are not designed to facilitate this moment at speed & scale because it lacks the efficiency & incentives to mobilize people for improved climate resilience & financing.\n\n---------------------------------------------------------\n\n\ud83d\udd31 OUR SOLUTION\n\nWith state-of-the-art technology grounded in natural science developed from the frontiers of climate change, Atlantis is a social network specially designed to incentivize a wide range of credible climate actions. It is designed to be borderless & inclusive, to mobilize large amounts of people while continuing to be personal & rewarding.\n\nAtlantis is solving this by designing a decentralised community-owned social network that will power the next generation of social impact, regenerative economies & carbon/impact credits.\n \n---------------------------------------------------------\n\ud83d\udd31 WHO ARE WE \nWe are builders & changemakers from the frontlines of climate change. Fueled by social and climate injustice, we are driven to reimagine the way humans come together to solve one of humanity\u2019s biggest challenges, global warming.\nOur team consists of passionate engineers, climate experts, designers & social entrepreneurs who are building viable business models that impartially reward all stakeholders for their impact. \n---------------------------------------------------------\n\ud83d\udd31 WHY IS ATLANTIS A CLIMATE SOLUTION?\nA social network which will allow users to collaborate better & take credible climate action while getting incentivized for it (Atlantis Citizen App)\nInteresting features and their benefits to users:\n\ud83c\udf31Social Profile - A user\u2019s social profile within Atlantis, is a compostable social identity layer which acts as a next-generation social capital opening up access and recognition across the internet & IRL. \n\ud83c\udf31Earn - Complete digital/physical climate bounties, earn in your favourite token/currency & pick up a whole lot of good karma along the way.\n\ud83c\udf31Marketplace - Choose from a wide range of products/services from vetted green brands, curated specially for Atlantis users. The best part: you can burn your earned Karma to unlock huge discounts. \n\ud83c\udf31Maps - A location-based registry recording impact and vital eco data that broadens users\u2019 understanding of climate change and help them visualize climate action like never seen before.\n\ud83c\udf31Impact Certificates - Verified and Immutable proof of Impact for a user\u2019s actions.\n \n---------------------------------------------------------\n\ud83d\udd31 WHAT WE HAVE BUILT SO FAR [2022]\nJanuary - March 2022\n\ud83d\udc9a Completed design phase of Atlantis Citizen App (dApp leveraging blockchain technology)\n\ud83d\udc9a Setup Media Team and Launch Atlantis Twitter Handle\nApril - June 2022\n\ud83d\udc9a Raised grants from Arcana and Mercy Corp ventures (total: $125,000)\n\n\nJuly - September 2022\n\ud83d\udc9a Launched an on-ground pilot project in rural India, Chikmagalur focusing on climate action around water\n\ud83d\udc9a Partnership with Shamba Network, leveraging their GIS expertise for developing on-ground projects in Rural India\nOctober - December 2022\n\ud83d\udc9a Launched an on-ground pilot project in rural India, Gokarna focusing on climate action around food forests (thanks to GR15)\n\ud83d\udc9a Organized India's first-ever ReFi summit, ReFi India, which hosted 100+ guests,15+ speakers\n\ud83d\udc9a Completed frontend & smart contracts on Solana blockchain for the Atlantis Citizen App \n\ud83d\udc9a Grew our community on Twitter to 1500+ followers with over 10k average daily impressions and hosted over 50+ Twitter spaces\n\ud83d\udc9a Co-founded the Solarpunk Guild, a collective that supports SP-inspired projects\n---------------------------------------------------------\n\ud83d\udd31 TEAM\nAtlantis is founded by two mechanical engineers, Irthu and Nakul, decade-long friends who spent the last 5 years building climate solutions. \n\nTheir first venture, Hydrop, was a decentralised water network that served over 11,000 users in Bangalore. Bootstrapped & profitable, this helped them build out their bigger vision in the form of Atlantis.\nIrthu S is a Mechanical Engineer & Product Designer with 10Y in Startup Saas & Ecommerce before getting into Climate tech.\n\nNakul R is a Mechanical Engineer, specialised in leading Operations & Finance. \nBefore joining Irthu, Nakul spent over 5 years in the Aviation and Medical Sector. \n\nOver the last 5 years, both founders have accumulated vast amounts of experience building climate solutions on-ground across different terrains and geographies within India. \n---------------------------------------------------------\n\ud83d\udd31 WHO DOES THIS BENEFIT?\nFor Individuals\n\ud83c\udf33 Helps you to coordinate & collaborate better for climate action\n\ud83c\udf33 Helps you to easily transition to green consumerism through products/services from verified Green brands\n\ud83c\udf33 You can build/join local smart grids that are climate-resilient with your friends/community\nFor Founders/Experts\n\ud83c\udf33 10X easier & affordable for you to set up on-ground carbon credit/impact projects\n\ud83c\udf33 Provides you with a wide range of financing options for deploying on-ground carbon/impact projects\n\ud83c\udf33 Educators, experts & researchers can cross-share their knowledge with ease\n\ud83c\udf33 Facilitate interoperability between DAOs working towards regenerating the planet\n \nFor Investors\n\ud83c\udf33 Access to a wide range of on-ground projects of all sizes and impact\n\ud83c\udf33 Ultra transparent funding mechanism with real-time tracking & impact certificates\nFor All\n\ud83c\udf33 Whether it is time, energy, or money spent on the network, EVERY action gets you rewarded \n---------------------------------------------------------\n\n\ud83d\udd31 WHAT\u2019S NEXT FOR ATLANTIS\n\nImmediate Goals:\n\n\ud83d\udfe2Launch Citizen App V1 on Solana blockchain in February, onboarded 200+ users for beta testing\n\ud83d\udfe2Co-host the Green Pill festival; a 5-day event in Atlantis Sanctuary, Gokarna, with ReFi India\n\nBusiness Goals:\n\n\ud83d\udfe9Onboard 50+ DAOs & 10,000 network users (Chikmagalur 3K, Gokarna 2K, Global 5K)\n\ud83d\udfe9Explore strategic partnerships with carbon marketplaces, standards & ReFi projects\n\ud83d\udfe9Build an eco-vehicle, partially powered by solar panels, in partnership with the Solarpunk Nomads (https://twitter.com/SolarpunkNomads). Stationed in Southern India, it will be used for educational activities & expeditions to document Climate Change\n\ud83d\udfe9Facilitate/Host more IRL/virtual ReFi & ReAg workshops for spreading climate awareness & increasing adoption\n\nEngineering Goals:\n\n\ud83d\udc9aFurther develop the Atlantis interoperable protocol layer with key features & partnerships\n\n", - "website": "https://www.notion.so/atlantian/Atlantis-d22850ad241b469eb9c06d8d0c800ca4", - "bannerImg": "bafybeiegcx32don2paaogta7nunxatkuzl2ubfkpuqhilmq33ce3bq4aty", - "logoImg": "bafkreicxh6rkvpmtfdwifdqd2bbcz6zf6lisctz7dldk3f5vw5cex3foum", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreifzgc4wbuwok3gyni4j5wucw5lpe25o7m7tnmlpg6gci7azwlgice" - }, - "userGithub": "Atlantian001", - "projectTwitter": "AtlantisDAO1", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xfbCA78474A09E2BF3543f4Fc1037152ea2c6C32d", - "provider": "ClearTextTwitter#AtlantisDAO1", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "hash": "v0.0.0:Zx51yx8QcEyDZNtMoicVGVmQC0UuWBMS/udPONuiW88=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-13T07:20:45.872Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-13T07:20:45.873Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..QkiwlNEXp-6TDNV6pnD75bEmzajqWgCp1szNXeti6xvxV-H-Vd_TyI0GSY257xzKhsHpz9i8b7qDvm_ZQ6iUDw" - }, - "expirationDate": "2023-04-13T07:20:45.872Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "QQo/asbe3Ao5e0T10UJG+xkEAvV3Jl3OxVd5p1/4RpLlG7loNXBhBqggwgq7NkpI", - "encryptedSymmetricKey": "ec2398d4f0a4d6923160b5317a491aaf9656c3f8bf6cd86e12279c28a15d84612db07a87f5323c327ab68adf942afe16c5988369dcdd23c7e70e399a462055b9bfe75931c602ceacae5ddb10188138d4ea394b77c5138862a91fe11bfa836d92378824db137b8db98377a4d0b43a21f19defea150b70f5260a5072f22728156000000000000000208749bf662a3ccb354e9b63ed22b564bb179ebdb6e0d1e5c5bce0da1a31b1c008eee224b6f0fb57c7666630f01a58e4ac" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "6" - } - ] - } - } - }, - { - "projectId": "0x21cf1e3113b6bc01f3bc0517be60f2bcf495ba9e6ba9be416ec0fb863c8c1ec7", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0xe137ffb77a61875a3033ac626cad211fbbbf4deffa9b0a668d652463f3c57ed27d95e4a7b159ccacdac7f93e7f2dc18fc5447b51838cce7b52058474a1e57f2401", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0x0F7272F8873B68b2a2F52685311822D831afC8b4", - "project": { - "lastUpdated": 0, - "createdAt": 1673396992985, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:113", - "title": "BETTER", - "description": "\nTL;DR: \nBETTER is building a web3 movement for planet positive impact \ud83d\udc4b \ud83c\udf0e Because Earth is non-fungible. So let\u2019s not burn it.\n\udb40\udc20\nWEB3 IS GREAT. NOW LET\u2019S TRY AND MAKE IT TO WEB4. \n\nLaunched by a team of creatives and crypto enthusiasts \u2013 whose track record includes working with the likes of Nike, Google, Facebook, The North Face, and more \u2013 and supported by advisors spanning the worlds of product development, climate science and technology, BETTER aims to subvert the doom and gloom narrative on climate change, empower action in new ways, and foster a community of people looking to make a difference. \n \nA huge thank you to everyone who supported us in the GR15 Fundraising round, making BETTER one of the top projects in Gitcoin Climate Solutions \ud83d\ude4c \n \n \udb40\udc20\n\u27a1\ufe0f WHAT WE\u2019RE BUILDING IN Q1 2023. \n\nWhile there is a lot we\u2019re working on for the larger vision of BETTER, here are a few things we are excited about in the near term:\n\n\ud83d\udd1c \ud83c\udf0e BETTER GOODS \nIn our aim to turn attention into action on climate change, we\u2019re building a storefront at the intersection of web3 and web2. Filled with BETTER-branded products that straddle the line of provocative social commentary and real-world goods, the store will raise awareness around climate change and ReFi, while also driving value directly to the BETTER CLIMATE FUND. \n\n\ud83d\udd1c \ud83c\udfa5 BETTER FILMS \nFollowing on the success and reception of the BETTER DAO PSA released in November, members of the DAO from the entertainment and advertising industry will continue to raise awareness about the urgency of climate change with the call to join the BETTER DAO to take action. Supported by industry professionals, new BETTER Films will bring attention to the DAO\u2019s planet-positive initiatives, new products, and storefront. \n\n\ud83d\udd1c \u270c\ufe0f CLIMATE FUND ENHANCEMENTS \nOur team is currently working on integrations with existing protocols to streamline the BETTER CLIMATE FUND, making it easier to deploy holdings for impact initiatives, as well as creating easier ways to contribute to the fund and govern it. New B2B and B2C solutions will provide novel ways to engage with projects, community members, and onboard new users to create direct planet-positive impact. We\u2019re also in the early stages of developing a front-end UI to showcase the real-world impacts and initiatives currently funded in real time. \n\n\ud83d\udd1c \ud83c\udf3f BETTER BUDDIES REWARDS \nNFT staking, upgrades, and exclusive product access are in the works for holders of our genesis collection. \n\n\ud83d\udd1c \ud83e\udd1d BETTER COLLABS \nOngoing collaborations with brands, projects, and companies (we can\u2019t announce publicly yet) from web3 to web2 will bring new users, products, and utility to the BETTER ecosystem. \n \n\udb40\udc20\n\u2705 Q3-Q4 2022 (GR15 Update)\n\n\u2192 \ud83c\udf0e BETTER BUDDIES: Our first collection of 2,050 planet-positive NFTs, launched 12.12.22 on the Ethereum blockchain. \n\n\u2192 \ud83c\udfac BETTER DAO PSA: Members of the DAO from the entertainment industry created a public service announcement (PSA) to raise awareness about the urgency of climate change with the call to join the BETTER DAO to take action. Currently 120k+ YouTube views, 12k+ Twitter Impressions. Supported by director Daniel Stessen (Dream Corp LLC on Adult Swim and in development at Bento Box Ent. with John Krasinski and The Office co-creator, Stephen Merchant) production from Miniac (clients include Adidas, Lululemon, Mirror and more), and editorial/VFX executed by Revel. \n \n\udb40\udc20\n\ud83c\udf31 CLIMATE IMPACT\n\nBETTER gives its community members a tangible mechanism for creating planet positive impact IRL through the BETTER CLIMATE FUND, which is controlled by the community through a DAO. Our growing list of Climate Advisors helping to steward the best possible use cases for the Fund include policy and strategists from Climate Resolve, Toucan and MIT. \ud83e\udd1d \n \nThe future of the BETTER CLIMATE FUND is in the hands of the community, meaning it could expand into any number of different areas including conservation, new forms of tokenized climate impact credits, individual donations to compelling causes, and more. \ud83c\udf3f\n \nFor more info on how the DAO powers the Climate Fund, our team, and our advisors, please visit our website.\n\n\udb40\udc20\udb40\udc20\udb40\udc20\n\udb40\udc20WHY GITCOIN GRANTS?\n\nGrant funding will assist in Development, Business, and Marketing. \u200b\u200bCurrent Alpha Round funding will help:\n \n\u2705 BETTER CLIMATE FUND development costs and back-end support\n\u2705 Film production and marketing for BETTER GOODS and merch\n\u2705 BETTER STORE web2+web3 integrations, front-end and back-end development \n\u2705 BETTER BUDDIES NFT staking rewards, smart contract development, back-end support, deployment fees\n\u2705 Audit of existing smart contracts\n\u2705 Fixed business costs\n \n\udb40\udc20\nThank You \u270c\ufe0f\n\n", - "website": "https://betterdao.io", - "bannerImg": "bafybeifuz277vheu354fr5aoyakpji4hypv2yxrzu2ohh4axhq5b2xwbju", - "logoImg": "bafkreiaiidaszfzfo5vsccxdtr4rgtw5u46lukf6ucqh2jrtgrqls5oy5y", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiduxe6h23danzl4qlyxhtei3obri2pghfa2wiuvtg54bpixyiykiy" - }, - "userGithub": "betterdao", - "projectTwitter": "hodl_better", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x74E0792148dbA52932e4E333194c27958864Ad72", - "hash": "v0.0.0:LMSkZ+ZzZqRiq8aRMMsiEOkkw6//Hnql1V6UngCtrNE=", - "provider": "ClearTextTwitter#hodl_better", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-11T00:28:48.570Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-11T00:28:48.570Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..O_cx2mKqsr5LEwHFk9oP64mbMIn5pGM1znffl0RQikWcD1SyUzQLhPzcEt0x284utnXhvpQLqAwyzHxtIoztCw" - }, - "expirationDate": "2023-04-11T00:28:48.570Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "lgDsePjDRYkT5COEbbwiumgyTIVe52YN+59bj8fWELk7sRiY+M2fg2LSS1YwDkMi", - "encryptedSymmetricKey": "848c8434d9757b666473a26b30da6ec543e990c69ffd05cd308ff4f2bf41dd77fa137c4ba8644554750071c20031af059938c1d26e7cf8529547f7cdae95b95334fac4a621a7264ae6869f255529ca861834a6c3f77fd219ea0d6a2aba1e6597e4778d6aace320704af33423c154c792eabe8b63141fb62c033098abc770789500000000000000208c27dd21ae4ff1a611fecc708d603587de139657557382969b533558e938b73ebc3c6a0d2b0a7d71ab27c2f2c605a481" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "3" - } - ] - } - } - }, - { - "projectId": "0x2971da13feca9a170191e5ee5850beb57acbab9f5850e96b50f5d2ab15a351f2", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0x6c141744555f29fd82f30a219b852b9ed4d2c006f59594195411331676ffaa065eb3942f629b6c42627b5e85a515f3019ae9925b1906bed459a53711b79a90ed1b", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0x14CB60F6Aca2b2A68d975743baCb33F01f587da5", - "project": { - "lastUpdated": 0, - "createdAt": 1673479920583, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:135", - "title": "ReFi Spring", - "description": "TLDR - Let\u2019s make ReFi accessible for all! Gitcoin support will enable support for IRL events establishing places of belonging for the ReFi Movement.\n \n Our Why?\n \nImagine a regenerative economy, a financial system that serves humanity and our collective home - Earth.\nWithin web3, the ReFi movement aims to cultivate this vision within a new economic system. ReFi Spring exists to support its emergence across a rich diversity of global networks by facilitating strong bonds between individuals through human IRL interaction. \n \nWhat does ReFi Spring do?\n \nReFi Spring is a nonprofit working to enable global IRL ReFi events to create new communities in the ReFi ecosystem. We do this by providing free, accessible, full-range event support services and educational content, including: \n \nHow we do it\n \nEvent Toolkit: This toolkit contains all the information event organisers need to run a successful ReFi event, including event frameworks, marketing materials, tips for press engagement, workshop plans, and more.\n \nEvent Funding: Every ReFi event can apply for event funding; however, our funding criteria is weighted towards supporting events by and for marginalised communities. We recognise the importance of justice, equity, diversity, and inclusion as fundamental values supporting the healthy growth of the ReFi ecosystem. \n \nEvent Organizer Cohort: Providing upskilling sessions and the networking environment to grow the community of ReFi on-the-ground leaders.\n \nIntro to ReFi Course: ReFi Spring is currently curating an \u201cIntro to ReFi\u201d online learning course for new and native audiences to understand and engage in the ReFi ecosystem. \n\nReFi Rabbithole: Supporting the creation set of interconnected materials that explain what ReFi is to new audiences\n \nWe offer all of the above and so much more as a public good to the ReFi Community.\n \nGR15 Update\n \nThanks to GR15 support, we enabled a further five events for a total of 27 events for Season 1 of ReFi Spring \n \nReFi COP16 was series of talks, workshops, and panels addressing the use blockchain to increase the efficiency of the global fight against the climate emergency led by Regen Network at COP16.\n\nReFi Mercadito Verde - A ReFi Spring event focused on social currencies which promote a circular economy and a network of exchanges in Monteverde, Costa Rica.\n\nReFi India - A hugely successful first ReFi event in Bangalore, with over 100 participants and 15+ speakers.\n\nReFi Primavera Regenerativa - In Minas Gerais, Brazil, this event kicked off a season of meet-ups between web3 natives and agroforestry practitioners.\n\nDescentraliza BH - The first Bankless Brazil IRL event introducing newbies to Web3 and Web3 natives to the ReFi movement, this was the first event to address ReFi in the city of Belo Horizonte in Minas Gerais, Brazil.\n\n\n \nAlpha Round Goals\n\nGoals for Alpha Round\n \n$5000 can fund 2 events + support our ongoing operational costs and the development of further open-source event materials\n$10000 can support 4 more events in 2022 + \u201c \u201d\n$20000 can support 8 more events in 2022 + \u201c \u201c\n$50000 can support 20 more events in 2023 + \u201c \u201c\n\n\nIn recognition of the exclusive nature of the Alpha round and our strong desire to continue to see the growth of the ReFi movement, ReFi Spring will drip 25% of the total of donations to gitcoin projects that support underserved communities and that are actively supporting Regenerative projects and education. \n \n \n\n \nThank you for your support and for being part of this movement! There\u2019s never been a more vital need to regenerate the Earth.\n", - "website": "https://refispring.com", - "bannerImg": "bafybeico3hrjr4a56cqddgvul7dbea4dwio5lqr2qwlhjhmam6mjrd3rou", - "logoImg": "bafkreiaziofnnzmxumf5qtdxwjy6mlaiowmde6ajsayunno4s7sbmfdj5e", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreid7lily2c6fk5yldwc53pdva5h4do3dl6iovtyxfwvuoo5222dz4y" - }, - "userGithub": "", - "projectTwitter": "@RefiSpring", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "wyXlj8YHBdqC++0H+wxVU5vb7HBRPhj602lr4jRrWFWa4d8J/zWphMt6rwhTt5BH", - "encryptedSymmetricKey": "911200b309c55490368c678e67ca36a873f981d4ec3c161368ef3b989b41f9b18ec1c38f739afba51028bc2a0ca8e10ea1aa1ef8ab18d22ae62fa3d2d3070a9ba9cd28b7389accacc41d5fdb92df340f46feb8b5b48737f4a1fed6b2fb34a7934ebcf93d771c3569f88b4bccf276285004da65ad15716d9f32b059e9e95729030000000000000020f8797b95773505f8dd6c9b2dde29e3d4275eecb8064eb61235148dddd8381c49626c5d5088cc18b8310852bda536e8a9" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Climate Collective, previous Gitcoin Funding Rounds" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "3" - } - ] - } - } - }, - { - "projectId": "0x29ebfa45b1d708eda13c20e04a999053361a809a89c48041ffe67890329aefd1", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0x8aff2e1727969822b30d0bac2c1da7035459792c496d4393c2b9a84c4ebad42708f2ef3cafdff6db0ebb880455c749fc32fd015a1b4286ac9f6cfd09ecca8cd81c", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0xF64bBc221f89cc882fBa507908bbE4Ae3Ad2F470", - "project": { - "lastUpdated": 0, - "createdAt": 1673484173127, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:138", - "title": "Bloom Network", - "description": " \n\ud83c\udf0d Bloom is a cyber-physical social network that helps people find and participate in grassroots climate actions where they live. https://bloomnetwork.earth\n\nToday, we are 30,000 people on the ground in 22 local Bloom hubs across 9 countries doing rapid climate repair and adaptation.\n\n\ud83d\udc40 Problem\n\n67% of people feel there is a climate emergency, but they don't know what they can do about it. Meanwhile, there are plenty of solutions happening on the ground, but they lack media visibility and funding, so they remain underground.\n\n\ud83c\udf3b Solution\n\nLocal Bloom hubs connect existing projects in their region. They plant community gardens, teach people to form agroforestry co-ops, and build regional token economies focused on land and water stewardship. Online, we share knowledge P2P as a global community to implement climate repair more quickly and cost-effectively.\n\nHere is a video produced by Diamante Bridge Collective, a local Bloom hub in Costa Rica. It tells the story of what's happening on the ground and how we use web3 to bridge the finance gap to local-led regeneration.\n\n\ud83c\udf3f https://youtu.be/ENPt3lednAM\n\nBloom's social network is a vibrant hub for people to see the beautiful work happening around the planet, to flip mainstream narratives from fear to constructive, empowered action of caring for one another.\n\n\ud83c\udf38\ud83c\udf38\ud83c\udf38 Our goal for 2023: Welcome 100 new local Bloom hubs. \ud83c\udf38\ud83c\udf38\ud83c\udf38\n\nWhat will we buidl with funds from this round?\n\nComplete the social interactivity on Bloom Platform : Connect Unlock member NFT to our sign-in system : Pilot our local/international member fee splits to jumpstart local Blooms : Complete our cooperative/DAO formation with the help of an all-women legal team. This will reduce risk for our longstanding communities as we teach them to use cryptocurrency.\n\nSince GR15:\n\nWe released the MVP of our multi-user blogging platform: regenerative action templates, action reporting (MRV), blogs, profiles, and automated local Bloom media feed pages. Lastly, our platform crew became an all-female team! \ud83d\ude4b\ud83c\udffd\n\n\ud83c\udfac Why Now\n\nLocal grassroots climate projects and Indigenous leaders have deep local ecosystem knowledge for how to repair soil, prevent deforestation, and reduce flooding risk. They are the key to accelerating climate action globally.\n\nWhy us \ud83d\ude4c\ud83c\udffd\n\nLocal Bloom organizers are master community builders, local food system stewards, and healers. Our tech team works with major television networks and dOrg.tech building DAO tooling. Lastly, our media team, based in Mumbai India, are creating the most wonderful graphics and communications from their experience as journalists and creatives! We sincerely welcome you to participate and support.\n\nTeam: Magenta Ceiba, Meg Rivers, Hannah Mitchell, Aishwarya Iyer, Manasa Suresh, Anita Caldera, Grace Moore, and 50+ local community organizers\n\nPartners: MetaGame, Giveth, ReFi DAO, All for Climate DAO, Cohere, Kolektivo, dOrg\n\n\ud83c\udf0a Twitter @ourbloomnetwork | https://bloomnetwork.earth", - "website": "https://bloomnetwork.earth", - "bannerImg": "bafybeiavpd5lwzfk2req2jpvz3c7fuewzgs7diaqgz2f4247fwghystbci", - "logoImg": "bafkreihe7f6mggku54yewycm4fmvypaodk32q6fkxwtb7zpkcrk6satshi", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreifngxsobrvcz7idoei2eavxbmcldep5qm5lvepw5tnk75smtqgjmm" - }, - "userGithub": "magentaceiba", - "projectTwitter": "ourbloomnetwork", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x5219ffb88175588510e9752A1ecaA3cd217ca783", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#OurBloomNetwork", - "hash": "v0.0.0:a3bWS40cdiFeFLP5m+dxMR8QjFETXt5aa16VXfBXsp4=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-13T03:35:28.195Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-13T03:35:28.195Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..8cRTxVKEcjQj-Kjj9YC0kQxP7xICCzaZ4ww9gbXRn-NHPnQkP0ECoxTEWeBZb5O5StGiLJi-CBkpDFsIvwRsBw" - }, - "expirationDate": "2023-04-13T03:35:28.195Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "Fdl8oCLFdxlkWZJ8ahKO2zVUXsORIaEIx0R3DwjZuFitXRdBacJlHvEHGdO9fj4A", - "encryptedSymmetricKey": "59f0acb04a1e2f5dc6d90d01f327f360c50dad988d4d28cff6f1bf7a20e693d7c526311482368e30dacb38e08e4fdb0c7ea4ebef8f5de3437480fd098642a5fde415c8840f91ffad22d5c8ac092e66032898dda438c2061e9932700d79b32eaea224966c40c231cdb73833df2e7ad0cabacc38268d71cb4d6953bd618650f56f00000000000000208407ed2df7bc7d3332a5ab13ce9a9a1f66df0c1ee5038d301514a895fd9e19e93eb34d1f7266d083eccdedef95099d98" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "11" - } - ] - } - } - }, - { - "projectId": "0x2e4e97b9d9c36923cf2c1062f16c6cb83259c1e0b9a10ac466bf20cec9589ae1", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0xf83c996d8715a29c5499a55202e3e4f4ed70960ca2f1a96c67a5ea1fdcd6f78b35c5042195906ad3f66231c6d46c601f3308cb9d90fb4ff29111def04fadd8e31c", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0xD2584c1CF7E3fF11957195732d380DC886F5f05b", - "project": { - "lastUpdated": 0, - "createdAt": 1673549902352, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:166", - "title": ".basin - perpetual place-based climate & nature finance", - "description": "\"What you seek is seeking you.\" - Rumi\n\n --------- \n\nThe systems and institutions that got us into this mess will not get us out. The climate and biodiversity crises will be solved from the bottom up: by People like you, Place by Place by Place, on Purpose.\n\nTLDR\n\n.basin is perpetual place-based climate and nature finance.\n\n.basin scales land, ecosystem, and carbon sink restoration and conservation to solve the climate, nature, and carbon crises.\n\n\"RISK\"\n\nThe crises we face are interconnected and not isolated from one another. \n\nLand-use change caused by development pressure has resulted in a decline of 69% in species populations since 1970. One million species, or 1 in 7, are now threatened with extinction, with another 40% in decline. Simultaneously, if we fail to limit temperature increases, climate change will exacerbate biodiversity loss.\n\nThe climate and biodiversity crises have two main things in common: risk and land use. Whether it be wildfires, flooding, heat, drought, habitat loss, income inequality, carbon sequestration, pollination, desertification, deforestation, etc, etc all pose serious risks to individuals, businesses, investors, and governments AND all interact with land in one way or another.\n\nHistorically, risk is not directly investable. But land, and real estate, are.\n\nINVESTABLE\n\n.basin makes climate risk and nature loss risk investable through the use of tried and true real estate investment fundamentals to attract agnostic and indifferent capital into climate solutions, climate resilience, and climate adaptation. \n\nThe .basin model combines law, technology, and finance to make climate and nature investable not only for institutional and private capital but also philanthropy.\n\nCLIMATE & NATURE PROJECT DEVELOPMENT\n\nClimate will be solved not only place by place by place but project by project by project. The .basin protocol scales individual climate, carbon, and nature projects through shared upside and reduced risk. \n\nThe .basin model of course works for forest projects but we take it several steps further to make projects that have enormous ecosystem service benefits (in addition to carbon) like wetlands, floodplains, peatlands, urban heat islands, estuaries, algae, biocrust, etc investable. The .basin model also works for embodied carbon in buildings, the plugging of methane/gas leaks, and keeping oil and gas permanently in the ground.\n\nRESTORATION & CONSERVATION\n\nWhile the .basin model works for any property, regardless of size or location, the focus is on carbon sink and ecosystem restoration and conservation for maximum climate impact.\n\nINDIVIDUAL & COLLECTIVE\n\nThe .basin model is designed to allow individuals to prosper while the collective flourishes. The flow of $STREAMS through $BASINS is a circular value exchange whereby collective success is only possible if individuals are successful and vice versa. All .basin's can be solely, jointly, or collectively managed.\n\nSPEED & SCALE\n\nThe organizational and operational model of .basin is deployable, repeatable, and scalable for any place on earth and any type of ecosystem. As a series of interrelated but independent entities .basin is built for both the challenges of today and the promise of tomorrow. Our main entities are trust.basin, foundation.basin, dao.basin and a series of llc.basin's.\n\nPLACE, PURPOSE & PEOPLE\n\nClimate and nature can be (over)simplified to Place, Purpose, and People. Each .basin represents a place, purpose, or person/people but each is deeply connected to the others.\n\nPLACE: as indicated by the name, .basin is primarily organized by watershed or basin. This is similar to how humans have organized for thousands of years before we labeled nations and states. But .basin's can also be an ecosystem, your town, a place you visited, a place you care about. We have even minted .basin's for individual trees. Any point on the globe can be a .basin. Examples: hudson.basin, indus.basin, flintriver.basin, congo.basin.\n\nPURPOSE: Just as we share common-place, we share common interests and common purpose. This could be a cause you care about, a movement, a hobby or even a sport. Most purpose .basin's are climate, nature and biodiversity focused. Examples: baldeagle.basin, beaver.basin, greensalamander.basin, wetlands.basin, carbon.basin, nature.basin.\n\nPEOPLE: people are the connection points to place and purpose. People are individuals, groups, organizations, companies, and even governments. Examples: tmo.basin, joebrewer.basin, will.basin, finley.basin, mckenna.basin\n\nUNDER THE HOOD\n\nAll .basins are ERC-721 NFT\u2019s energized with Charged Particles (@defiNFT). All .basin's can store and hold any number and combination of ERC-20\u2019s or NFT\u2019s inside. Many ERC-20's are yield bearing via Aave inside each .basin and can have time locks.\n\n.basin's are a store of and fund what is truly valuable. As perpetual purpose trusts and permanent endowments for natural capital and ecological assets .basin's hold financial value but also clean air, clean water, biodiversity, pollination, human health, and safety or any tokenized impact certificate. The more value a .basin holds the more $STREAMS it receives.\n\nCONTRACTS\n\nhttps://opensea.io/collection/basin\n\n$BASIN: https://polygonscan.com/token/0x4bf5a99ea2f8de061f7d77ba9edd749503d945da\n\nCharged Particles: https://polygonscan.com/address/0x0288280df6221e7e9f23c1bb398c820ae0aa6c10\n\n$CRK (CREEKS): https://polygonscan.com/token/0xf122a63f9fd807fa28a3495ad822ad84c934793d\n\n$STREAMS\n\n$STREAMS are the flows of value through the .basin ecosystem. Technically they will be either a fungible ERC-20 or a semi-fungible ERC-1155. $STREAMS are designed to incentivize positive outcomes and eliminate negative externalities. $STREAMS are governance, access, and utility but also a flow of absolute value from trust.basin distributions. \n\nPREVIOUS GRANT ROUNDS\n\nGitcoin has moved our work forward over the last 14 months. We have used the funds for:\n\n- Beta dApp: https://beta.basin.global\n\n- Gitbook: https://docs.basin.global/v1\n\n- Main website: https://www.basin.global\n\n- Formed our non-profit arm: https://www.basin.foundation\n\n- Formed https://basin.realestate which trust.basin owns 10% of. \n\n- Launched the .basin contract and minted 500+ $BASIN tokens (with more in the works).\n\n- Allowlisted the .basin contract with Charged Particles (@DeFiNFT).\n\n- Set up 25 Safes for regional .basins and prototyped financial flows between them ($STREAMS) (more Safe\u2019s coming)\n\n- Legal work for the DAO, Foundation, Trust, and LLC.\n\n- Pilot project with Aspen Valley Land Trust on the 141 acre Coffman Ranch which has a combination of riparian forests, shrublands, grasslands, and wetlands that provide a richness of wildlife habitat and activity.\n\n- Collaboration with TaterDAO, CougarDAO, and RWA Consortium for on-chain real estate purchases and open RWA standards.\n\n- Continued work on the basinStack a holistic assessment tool and methodology for real estate based natural capital credits, carbon credits, and impact certificates.\n\n- Minted $CRK (CREEKS) our internal test ERC-20 token.\n\n- Set up and tested 0xSplits for climate and nature project as .basin entity payments.\n\n- Evaluated SuperFluid for $STREAMS flows between Safes and .basins to mimic the water cycle.\n\nON DECK / UP NEXT\n\n- Working on running our own Gitcoin Protocol Quadratic Funding round with corporate and philanthropic partners with select .basins as grantees.\n\n- Formal build out of the .basin dApp with GIS and climate project development tools.\n\n- Minting .basin's for as many threatened and endangered species and places as possible.\n\n- Pilot projects to run the basinStack on and structure the climate.lease deals.\n\n- Corporate and civic partner pilot projects for surplus real estate and ESG goals.\n\n- Launching a ERC-1155 contract for individual .basin shares, $STREAMS ($STREAMS fill $BASIN's) and custom NFT projects.\n\n- Continue legal engineering work and tooling with KaliDAO, LexDAO, TaterDAO, and CougarDAO. \n\nUSE OF FUNDS & 0xSPLITTING\n\nThe funds will be used a) generally for our mandate of stewarding ecosystem services and the benefits nature provides to and for all living creatures present and b) specifically for the initiatives mentioned throughout this proposal.\n\nWe have set up 0xSplits to share the funds with dao.basin, trust.basin, foundation.basin, llc.basin as well as select Gitcoin bundles and projects (TBD):\n\nhttps://app.0xsplits.xyz/accounts/0xD2584c1CF7E3fF11957195732d380DC886F5f05b/\n\nMUCH THANKS\n\nA special thank you to all of our supporters, the Ethereum community, and the Gitcoin team! We could not do it without you!", - "website": "https://beta.basin.global", - "bannerImg": "bafybeic5q22qe6moyydeqqhtidgkn3hxc6glq5zg7k4ncfeksy5pzvkarq", - "logoImg": "bafybeib7enyumre4jrfh4gxbefm2lposmkqyx5li2qlcpujw4kypp2dp5a", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreifml3442exdlcjbffc3jroa6fdvevx6lt4mlzjtrmg5qffwhlgzh4" - }, - "userGithub": "tmoindustries", - "projectGithub": "basin-global", - "projectTwitter": "basinDAO", - "credentials": { - "github": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x79c2D72552Df1C5d551B812Eca906a90Ce9D840A", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextGithubOrg#basin-global#89156835", - "hash": "v0.0.0:J+Ps3ws35dUUhbahhVMMox1FxVcUXl/txKqKYOt9uzE=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-12T18:57:43.983Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-12T18:57:43.984Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..AmWEDSWfbcgfV7C9hwP1cyci3eMmLp8rBDfzSMjC6TR59PdlYSS3JpDnT0lcqRNTXOKnjVuHY2-77ebkxJDyDA" - }, - "expirationDate": "2023-04-12T18:57:43.983Z" - }, - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x79c2D72552Df1C5d551B812Eca906a90Ce9D840A", - "provider": "ClearTextTwitter#basinDAO", - "hash": "v0.0.0:gPesiGvX80jAcirlD3jOuVfOw4+bHag/kWpi4GitjF8=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-12T18:57:15.911Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-12T18:57:15.911Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..NGwD5vD26fHazVk76vZPi6uuPDLN2Bi8bX8s-a6BeYLsRunm0wJb4kwr30Id0zG7yMi-3CAMc6aMD-064GL0Cg" - }, - "expirationDate": "2023-04-12T18:57:15.911Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "7gjJzpLwxsGGq91MLfunN/kAjnFo6SrWPYXKY/+TVTVojlhtZVTrTIyusbbl5aH6", - "encryptedSymmetricKey": "b5aae5cff48769d35d096369dd66fc33038dee8f6ce3822e3f73ddd47d94e34f5b16cea04bf64056c0a7e30786b94f10a1d4a4a908b8906ad9977eeb877a650f81b8fab6ade38ebb7c1ff891fac545c1806dfcdc63e79f51ffb91738c6dc1b8401a08a0fc7fab23a89c551f93c3297415239fb276f944ff4a1d66cc67ce8b43c000000000000002050ad9567a1d8776fbb33d4030803465f824fdaa5fb164ee48c3abdab9e848383dcaf71bdd028eeda685d26e7a066f984" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "personal funds, grants and friends & family" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "8" - } - ] - } - } - }, - { - "projectId": "0x329170e769ace967de0a1467dbeb2c3eaee2580099ccb9dc650452ab10216821", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0xbf22cddc4a76284c26b9c1ed6d5b1daa977f2fdd52b46f942c4898dab51d783f7fc60a9a84a8a9178318fd117a260998610fca1a7015c7f0df4417ed3f9b91ae1b", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0xFd9F8A0f4bdEaC72F08AF1c708023cC31dD2E3BE", - "project": { - "lastUpdated": 0, - "createdAt": 1673378762611, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:104", - "title": "Barichara Regeneration Fund \u2013 Prototyping a Bioregional Regenerative Economy", - "description": "About\nThe Barichara Regeneration Fund (BRF) supports the wholesale restoration of a 500,000-hectare territory in the Northern Andes of Colombia by developing and weaving together a network of individuals and organizations pursuing regenerative work on the individual, social, and ecological scale. Money received will be utilized to continue the ongoing work of the BRF to catalyze on-the-ground regenerative work in Barichara in service to the creation of a prototype of a bioregional regenerative economy that can be utilized worldwide.\n\nIntroduction\nThe town of Barichara, Colombia is uniquely positioned to cultivate large-scale regenerative work. Situated on a plateau, Barichara is at the center of a 500,000 hectare territory defined by its own regional climate system. The region possesses an incredibly unique ecosystem, the High-Andes tropical dry forest, that exists nowhere else on Earth with eighty percent of the species here being endemic, only existing in this territory. Unfortunately, the region has also seen intense monocrop agriculture, leaving only ten percent of the native forests intact. This, in turn, has led to soil degradation and erosion, the drying up of rivers, and the loss of the unique biodiversity of the territory.\n\nWhat Has Been Accomplished \nWe successfully raised $21,000 in the previous gitcoin round (GR15) and have made considerable progress in setting up a territorial foundation capable to oversee this territorial-scale regenerative work. This included hosting the #ReFiBarichara event in the first week of October that gathered like-minded people from the web3, crypto, and regenerative spaces.\n\nProjects we are supporting include:\n1.\t The Center for Syntropic Agroforestry to establish demonstration sites, train local farmers, and share technical knowledge about this powerful approach to reforestation and economic development.\n2.\tA community kitchen and store called Casa Comun that promotes the organic emergence of solidarity food exchanges while supporting local artists and craftspeople.\n3.\tA community reforestation project called Bioparque M\u00f3ncora that is a highly visible symbol of peace, reforestation, and ecological education that works with area schools and national universities.\n4.\tThe construction of a community theater called Canay Colibri where children learn the art of storytelling, filmmaking, and the performing arts \u2013 all in service to regeneration of the territory.\n5.\tThe Barichara Ecoversity that is weaving educational activities throughout the region with a special focus on watershed restoration, preservation of native ecology, and how to create regenerative economies at the bioregional scale.\n\nWith funds that we raise during this gitcoin round, we will continue weaving a tapestry of local projects and sharing what we learn with the rest of the world through Barichara Updates and learning journeys.\n\nLand and the Ecoversity\nThe BRF works to restore ecological health through a multifaceted strategy of weaving together current regenerative projects in Barichara, purchasing land for regenerative work, and creating groups and organizations to facilitate this work. Already, the BRF has raised $50,000 to purchase a heavily degraded plot of land, Origen del Agua, and has begun regenerative work on it.\n\nRecently, the BRF has secured a second piece of land, Las Albercas, that will be the future home of the central campus of the Barichara Ecoversity. Here an off-grid campus will be created to provide on-the-ground training in various regenerative techniques such as permaculture, rainwater harvesting, renewable energy solutions, and syntropic agroforestry. The Barichara Ecoversity will serve as an integrating hub for both research and education in the territory with the Las Albercas campus serving as a place for experts and students to gather to teach and learn the skills needed for restoring planetary health, all while cultivating a deep connection to the land.\n\nSyntropic Agroforestry\nOne of the central projects of the BRF has been spreading syntropic agroforestry throughout the territory. Syntropic agroforestry aims to foster climax ecosystems independent from outside inputs with an emphasis on plants geared towards maintaining food for human consumption. This works through the planting of food crops next to support species that aid with water retention, the fixing of nitrogen in the soils, the creation of shade, and the production of biomass to continually provide organic matter to cover the soil and enrich it over time. These methods encourage a process of ecological succession to occur as would happen in a natural process of forest expansion, just much faster and focused on supporting edible species. The process is one of syntropy with increased growth, diversity, density, and complexity throughout the entire system compared to conventional or organic agriculture.\n\nThe BRF has supported the creation of syntropic agroforestry projects throughout the territory. A syntropic agroforestry expert was brought to Barichara and has been teaching local farmers within the region. Specifically, two three-day design classes on syntropic agroforestry have been offered, giving participants a technical explanation of the principles of the technique and then hands-on instruction through the creation of two field sites. The demand for syntropic agroforestry has been great in the territory, and our aim is to continue supporting those wanting to learn on their journey towards transitioning to regenerative food production.\n\nOther Work\nThe work of the BRF is constantly evolving in relation to what is emerging on the ground in Barichara.\n\nA community council was set up to coordinate regenerative action in the territory with funds from the BRF being used to support fifteen local projects in the community, greatly facilitating the development of relationships among these projects in the territory.\nAs its successor, we are in the process of creating a Territorial Foundation to formally facilitate the reception of funds and mediate their use in a process ensuring consent and support from the local community.\n\nAll these efforts combine to form a cohesive and self-reinforcing Bioregional Investment Platform where the individuals and organizations dedicated to regeneration cyclically flow value amongst each other, creating a consistent spinning out of social and ecological value for the entire territory. With your help, the BRF aims to support this ever-evolving process of territorial regeneration.\n\nNext steps for the BRF\nThe work of the BRF has been ongoing for nearly three years, and much has been accomplished in that time. The relationships developed through this work and the land that has been acquired has given the BRF the foundation on which to pivot to long-term strategic planning to ensure the holistic restoration of the entire territory. One of our partners and collaborators, Commonland Foundation, has created a landscape investment framework currently utilized by fifteen territories around the world.\n\nTheir model is a five-step, twenty-year process to produce a self-sustaining regenerative economy, geared towards social and ecological improvement. Key to the success of this model is the formation of a core team with enough funds to dedicate themselves completely to this work all throughout the twenty-year period. This initial investment in a core team provides the supports necessary to ensure that the work reaches maturity, and a regenerative economy can form and begin to sustain the entire territory. This core team is currently in development and will continue the work of the ongoing regenerative projects in the area.\n\nThe development and funding of this core team forms one of three major funding efforts for the BRF. The second is the funding and construction of the Ecoversity, described above, and the third, the support of the current regenerative projects in the area. These three overarching projects will allow us to move towards holistic landscape regeneration at a bioregional scale. In total, this amounts to raising $500,000 in the next year to accelerate this work. The funds gathered through the Gitcoin grant round will be directed towards this purpose.\n\nBioregional Activators\nWe created a new community platform called Bioregional Activators to create a planetary network of regenerative economies \u2013 sharing what we learn from projects in Barichara to help other landscapes around the world. \n\nThis includes activating four bioregions in the Central Rockies that are all located in Colorado; an upcoming trip to Toronto and the Finger Lakes of New York to help form alliances among bioregions in the Great Lakes Region, and growing interest to have us work with landscapes in British Colombia, Mexico, Nicaragua, and Costa Rica.\n\nVision\nAll the activities of the BRF are in service to the creation of a real-world prototype of a regenerative bioregional economy. By weaving those that are on the ground, purchasing strategic pieces of land, integrating Web3 tools to monitor change in ecological health, and being continually open to new collaborative relationships as they arrive, the BRF intends to lay the groundwork for others to follow in their own territories. We hope that with the success of this model in Barichara, it can be used as a prototype worldwide and help regenerate the planet through regenerating local communities.\n\nLearn More\nBRF community council member Joe Brewer has made the effort to document its progress to English speaking audiences. He has formulated his thoughts on the process in his book, The Design Pathway for Regenerating Earth, and founded the Earth Regenerators network, a diverse platform with over 4,000 participants dedicated to restoring planetary health, to spread the model developed here, while learning from others\u2019 experiences. He and others from Barichara regularly provide updates on their progress in videos and articles on the network. \n\nTo learn more about regenerative work in Barichara visit: https://www.regeneratebarichara.org\n\nTo learn more about Earth Regenerators visit: \nhttps://earth-regenerators.mn.co/\n\nTo learn more about the planetary network of Bioregional Activators visit: \nhttps://bioregional-activators.mn.co/", - "website": "https://www.regeneratebarichara.org", - "bannerImg": "bafybeifxcep64xyzluvcmmvnlkd6c4mhv6fuflm5gn33gwl7yt4lhbjxgy", - "logoImg": "bafybeigeqhk7tfc7f52pg2jkcai54gkqwpj3r6bhcko3uc356nj25tn67a", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreihxqckwnjreqobnyumrqgm4towsnfpe7hjlvjvkcs5vay2wi6jtwi" - }, - "userGithub": "circlejoe", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "sBzo9fZM8G2fEUQieeX1ivchAoESts4A6y3euToNwo49yFCDUt67YU+eXEFV34cC", - "encryptedSymmetricKey": "c14ee3521b0b16f4b07c51457a2cb69a47ae2743307735c8b3395742fc362bf74c99749c9a4dabc1b656975b6f682216ecdf51e50fb93670f000a60d8812bbe0f7f9c353b1bc8143639711b5f6b7b91892de601fbf84098dfde234b96e9099b74d5e551bd7cd23e6e36624f20226f6e61d41e9341366965316377995486c67d2000000000000002067276e5df47f24997442caf61980b2f51461a62210d3829d9909868e994a7a3bd6687587ac2b0bdd9fdb407c2b91be81" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Crowdfunding, Grants, and Other Donations" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "25" - } - ] - } - } - }, - { - "projectId": "0x34da3ca2039af745fdf37add512a3cb5fdd7b7b0a5c95fd74877742b534222b3", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0xf5be115691ec5780e82ad8b9bad03547324d094c18cb07173dcfabe55288293b1867fe0efbeb1821ee1b60b227cf981fbe5766f17ad138edf1fdfe40373aa9561b", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0xd704C5F9826191F3Bd06caE867d0f20CAfA8AeBA", - "project": { - "lastUpdated": 0, - "createdAt": 1673481938990, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:137", - "title": "ReCommon", - "description": "\u2600\ufe0f TLDR \u2600\ufe0f\n\n- ReCommon is facilitating the emergence of a planetary network of sovereign, interconnected regenerative bioregional communities.\n\n- The Commons Credit is a whole-systems accounting and valuation methodology and investment vehicle for community-held land.\n\n- ReCommon is the global DAO that weaves together the various place-based Bioregional Nodes with RegenCLT governance.\n\n- All funds raised via Gitcoin go towards increasing our operational capacity and implementing ReCommon systems into real-world, regenerative community development projects.\n\n\u27a1\ufe0f read our full litepaper and learn more at www.recommon.land\n\n\ud83c\udf31 SINCE GR15 WE HAVE WE HAVE... \ud83c\udf31\n\n- Continued the development of the Commons Credit whole-systems accounting methodology, bringing together a diverse group of stakeholders and experts for our Commons Credit Working Group\n\n- Participated in ReFi Barichara with the Regenerate Barichara Fund and an international group of Regens. Out of this have grown ongoing conversations with the Earth Regenerators and other partners about utilizing the Commons Credit as a funding and accounting mechanism for their bio-regional regeneration efforts\n\n- Initiated conversations with communities in Colorado around the formation of a Bioregional Node that will act as the flagship and real-world laboratory for ReCommon\u2019s innovative community land tenure systems.\n\n- Integrated our learnings from 2022 to prepare for a big 2023, including initiating a land-based project in the American West. \ud83c\udfd4\n\n\n\u2728 OVERVIEW \u2728\n\nAt ReCommon, our mission is to facilitate the reclamation and stewardship of common land by supporting the emergence of resilient place-based communities and regenerative economies. To achieve this, we leverage regenerative financial infrastructure and innovative governance frameworks to secure communally stewarded lands for both current and future generations to thrive on.\n\nReCommon draws inspiration from three foundational pillars: the Community Land Trust model of land tenure, ecological design, and distributed technologies. When woven together, these three pillars of thought pose a viable alternative to the current extractive paradigm of land use and ownership that is destroying the ecological systems we need to survive and thrive here on planet Earth.\n\nThis particular model of land tenure is both new and old, a mix of time-honored principles and modern wisdom. Our organization is a catalyst for both global and local communities to rise to the unique challenges of our times and emerge into a new era of abundance and connectedness.\n\n\"The story of land is older than the story of man. Land came first; no man created it. Every society, large or small, must devise ways in which its members will share this gift. This is allocation. Members of the society must also determine under what conditions the land will be passed on to the next generation. This is continuity. And they must decide if, when, and how it may be traded with others. This is exchange.\" - Robert Swann\n\nReCommon is creating an equitable land tenure framework for democratically managing the intricately connected processes of allocation, continuity, and exchange. It's a scalable, adaptable model that enables people to balance land wealth in private control with the needs of the community and the Earth for regenerative, perpetual stewardship of land.\n\n\u26f0 THE COMMONS CREDIT \u26f0\n\nThe Commons Credit is a whole-systems accounting and valuation methodology for community-held land.\n\nIt serves two primary functions. The first is to properly value any given piece of land, including the ecosystem health, economic capacity, housing, food production, etc. The second is to create a way for ethical investors to finance the purchase of land and get a return on their investment while keeping the ownership within a perpetual trust and stewardship within the community.\n\nThose who invest in \u2018Commons Credits\u2019 are considered Patrons, representing 20 percent of voting power on both the global ReCommon level and on the Bioregional Node level, depending on the origination of the commons credit.\n\nThe Commons Credit serves as the digital record of a piece of land that is in the ReCommon network. When a piece of land enters a Bioregional Node\u2019s stewardship, a Commons Credit is created as the digital representation of the value of that land at that moment and is forever tethered to that piece of land.\n\nAs regenerative practices and community infrastructure are put into place, they increase the wholistic value of the land, which is concurrently recorded and updated in the commons credit, using a smart-contract NFT such as Charged Particles. This ongoing assessment is the whole-systems valuation methodology, and as MRV (measurement, recording, and verification) tools improve over time, the rate at which this assessment happens will trend towards nearly live updates.\n\nThe Commons Credit becomes a way to finance community-centered land regeneration by serving as the fertile middle ground between philanthropic donation and conventional real estate investment.\n\nThe Patron who purchases a commons credit for a particular piece of land doesn\u2019t own that land, which is owned by the bioregional node\u2019s trust, but they are included in both governance and upside in the appreciation of the value of that land.\n\nThe value of the commons credit tracks with the holistic evaluation of that piece of land, which will increase through regenerative use and sustainable development. When the land value goes up, it is reflected in the Commons Credit, and the Patron (the holder of the Commons Credit) can choose to sell it on the open market for profit.\n\n\ud83c\udfdb GOVERNANCE MODEL \ud83c\udfdb\n\nAt the core of our work, we create tools to reclaim, protect, and regenerate land through the use of the Regenerative Community Land Trust (RegenCLT) model of land tenure and governance.\n\nThe RegenCLT model is designed to lower barriers to entry for communities seeking to acquire land through purchase or gift and to develop a permaculture master plan for the site. This place-based plan takes into account the current state of the land, its future uses, its connection to the local and regional economy and community, and the global community at large.\n\nThe RegenCLT model is uniquely capable of acquiring all types of land, returning it to the commons, and stewarding it sustainably for future generations.\n\nGovernance power is shifted from an elected board of directors to the community of members directly, similar to the distributed governance of digital communities like DAOs.\n\nWe combine a \u2018one-person, one-vote' system with the \u2018balanced bucket' structure used by classic CLT boards. The result is that each person has a vote, and each vote goes through a weighted bucket system that directly corresponds to how that voter is connected with the land or project in question.\n\nThese are the 5 voting buckets, each with equal categorical weight:\n- General Members (20%) - people that are members but don\u2019t belong to any delineated subgroup\n- Stewards (20%) - leaseholders of land in trust in the ReCommon network\n- Elders (20%) - rights of nature representatives and holders of indigenous wisdom\n- Patrons (20%) - financial investors and holders of Commons Credits\n- Partners (20%) - partner organizations that provide resources and support in various forms\n\nReCommon follows this governance structure on a global level, and as such anyone can participate. However, each Bioregional Node also follows this structure on a local level.\n\nTo be a member of a Bioregional Node and participate in governance, one must live in that particular bioregion. This leverages the network effects that come from global connectivity while honoring the specificity of place and putting local decision-making first.\n\nAdditionally, Bioregional Nodes may choose to adapt and modify this 5 bucket model to the unique needs and characteristics of their bioregional community.\n\n\ud83c\udf32 WHAT\u2019S A COMMUNITY LAND TRUST? \ud83c\udfd8\n\nAll community land trusts strike the balance between project organizer, developer, and steward. Fortunately enough, the community land trust is a community development tool of uncommon flexibility that can accommodate a wide variety of land uses and development projects. Over the decades since the idea first came to fruition, community land trusts have been pushing the limits of what is possible with this governance framework.\n\nAt ReCommon we are continuing the evolution of the community land trust, integrating decentralized governance and regenerative cryptoeconomics to improve upon existing models.\n\nThe community land trust movement started with radical roots and was part of the \u2018back to the land and village\u2019 revival movements of the 1960s that pursued justice, equality, freedom, and resilient local communities.\n\nHowever, in recent years the movement has taken a turn toward affordable low-income housing. This work is undoubtedly a critical component, but alone it\u2019s not enough to address the complexity of the systemic problems of our time. In many ways, ReCommon embodies a return to the spirit found in the roots of the community land trust movement.\n\n\u27a1\ufe0f join us and learn more at www.recommon.land\n\n\ud83c\udf31 \ud83d\ude4c ~ THANKS FOR YOUR SUPPORT ~ \ud83d\ude4c \ud83c\udf31\n", - "website": "https://recommon.land", - "bannerImg": "bafybeihvoozwtk7udvxfvuk7ymbagovp6y3niawovj5z4kmngt2s4x5epa", - "logoImg": "bafkreifodjbnlw7bypyxutfxzcpjvyj3t7ezm6apyt7uyrthn4iwycbame", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreigjlqpvatf257g3bnz6ntwsgjgib65u2l3y7ne2ao6gzlzth5j3pe" - }, - "projectTwitter": "regenclt", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "d15jSzY7udJcZoSfn2BS01JXUFSCPx+qXv63FNTBwJKfZcUlwiMK/yQBwPBRviuy", - "encryptedSymmetricKey": "c825ee0fa77518665205614621eb23ba73dbe4bf950a802e1bd79191cbeec45beccf1108086ad8965da0a6e7d824130c6b4df2b97739e70f3498812cba2c0b75ca429a05757bb8d8b58d990638d7d77c7b43c1113dfe1549f8a0c29329c19297d8acf05c592df8288ed45d93a06db79ac963e3f1a107289baa7c137a066ff2080000000000000020b2efc777a19796a548afa6e20589bbfde4b942d4b10a5266f15ea1bc8d3d504908aa4f7b3638955364e3a4a1d3f98aab" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grant Funding" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "4" - } - ] - } - } - }, - { - "projectId": "0x3f9ed1884e631b7684ab9421a7ad3b4b532308268bac91bdd772d483f0363131", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0xccd46a16339f433dd0337ff2589036a954a3af5307067acaf8599726efacd3c4172b6a068514860f5028477ad861b23d5181354f67e460d56de4b4d58d63c3bd1c", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0x788bd114C3f625600b547d5a08EC38E0ee90A06e", - "project": { - "lastUpdated": 0, - "createdAt": 1673648121312, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:197", - "title": "dMeter", - "description": "MRV \u2192 Regenerative Finance \u2192 Regenerative Design and Development\n\ndMeter is creating a decentralized monitoring, reporting and verification (dMRV) system. We are in the beginning of this dMRV process and countless building blocks are still missing. There will be problems and limitations that we encounter, but as these gradually get addressed it will become possible to use this new set of lego building blocks to build things that we can hardly imagine today.\n\nA. MRV (monitoring, reporting, and verification) overview\n\nMRV consists of three distinct features, all of which are vital to conveying legitimacy of regenerative projects (such as tree planting) to stakeholders. Monitoring is the process of measuring the total ecosystem and social services provided by the project. Measurements may be collected through satellite, IOT, georeferenced imagery from boots on the ground, as well as surveys that empower experts & citizen scientists. Reporting involves describing i) measured data, ii) the methodologies that were used to collect and analyze the data, and iii) potential biases as well as assumptions that went into the data collection/analysis. Verification refers to the review process involving a third party that is utilized to ensure the confidence in the validity of the uploaded data and methodologies.\n\nDecentralized measurement, reporting and verification (dMRV) means that no single entity will own, manage or regulate how MRV is done. Instead a collective of people from many different organizations can build upon and improve this dMRV system. For current accreditation standards a combination of on the ground data collection, satellite sensing and IOT devices are used to back the credits. Utilizing web3 mentality, trust minimized data collection methods can be created. An example of this is to write open codes for actions that used to be performed by humans, like detecting a tree and the species of tree it is. Other data collection technologies can become integrated into this system as they become standard in the future.\n\nOnce the data is collected, open source reporting and verification methodologies can be utilized to analyze the data. Entities that collect the data and create the analysis methodologies are paid each time data is used and an analysis done. This inspires entrepreneurs to build specialized dMRV services which can benefit further regenerative projects. The entire dMRV allows for standardization, trustlessness, immutability, transparency, and open accessibility. This paves the way for decentralized data backed credits. These credits are tied to a specific regenerative action and entity who carried out the action continuously updated over time as more data is gathered. This data and the methodologies used to analyze it is stored permanently and immutably. The collectors of this data are the owners of it, allowing for sensitive data to be fully controlled by its owner. The dMRV would assist regenerative projects across blockchains and be interoperable with any new blockchain that came into existence. Every entity that is involved with this dMRV helps to iteratively improve upon it. With this, local communities can become more deeply involved with how the regenerative projects they carry out go through the dMRV process as well as tap into funding that was not previously available to carry out these projects. Along with that the diversity and veracity of Natural Capital assets being valued can exponentially increase.\n\nMonitoring \n \nIn this dMRV everything is open to where there is only one final layer of trust- the data itself. Trust minimized data collection can be done through a combination of remote sensing, IoT, and human sensing (such as with smart-phones). The data collected is stored permanently and immutably through current technology such as Filecoin Green. By multiple data sources backing up that a regenerative action has occurred, more accurate calculations can be created. When one of those inputs is inaccurate, the other data sources can openly show a dispute. When a dispute arises, the stakeholders of the dMRV system can confirm or deny the accuracy of the data. Scoring this data for quality, resolution, and temporal frequency can enable any entity utilizing the dMRV to compare the data sources they pay for. Allowing them to quickly choose the best dataset for their needs. Through this, data becomes highly available as many organizations strive to provide the best data for people\u2019s needs. This puts publishers on a level playing field and allows the companies with the best data to naturally succeed. Along with that publishers can not only benefit from the dMRV utilizing the data but other organizations that might want their data (such as parametric insurance). When individuals can decide who gets access to their data, they can ensure it is used ethically. They can also willingly give access to their data to those attempting to create good causes.\n\n Reporting and Verification\n\n Reporting and verification utilize algorithms. Algorithms are a set of instructions followed to solve a problem or accomplish a task (types of algorithms include standard, machine learning and AI). They are used to process data or information. For example georeferenced imagery can be analyzed using an algorithm that detects if a tree is present in that imagery. Another example is an algorithm can choose which data sources are the most appropriate for evaluating a regenerative action based upon how these data sources did previously. This is more efficient than a human could do, reducing the dMRV costs.\n\n Previous MRV organizations have developed their own algorithms. Some of these algorithms are open source and will become part of the dMRV system if there is no conflict with the creators in doing so. Oftentimes it is only the MRV organization that developed the algorithm that uses it. Allowing more entities to utilize the MRV algorithm, \u201calgorithms-as-a-service\u201d (AaaS) have arisen as a business model. AaaS allows entities of very small to large financial backing to benefit from them. For example, a small business might not have the resources to hire a data scientist to build and train a machine learning model or maintain the infrastructure needed to store the data that the model would be trained on. However, with AaaS, they can simply subscribe to a service and use the algorithms that have been created by someone else. Now through decentralization, algorithm providers can offer their services in a trust minimized and automated way. Along with that they can help financially support the providers of the data that was used to train that algorithm, which in turn gives data providers an incentive to provide high-quality and unique data that otherwise wouldn\u2019t be available for training. Algorithmic transparency allows regenerative actions to demonstrate the ecosystem services they provide in a trustless, decentralized and immutable manner. Which in turn will attract more ReFi investors to support these actions. The more funding that gets channeled towards regenerative actions, the more the dMRV system is used and with each iteration it improves.\n\n Infrastructure\n\n In order to host the data and distribute money to creators of algorithms, among other components of the dMRV system, decentralized infrastructure needs to be created. To permanently store the data collected, decentralized storage systems need to be utilized. For distributing that data to entities that would like to purchase it, data markets need to adequately display it. A new distributed system needs to be created for analyzing that data and paying for each time an analysis methodology is utilized. Some of these systems exist, however they can be improved upon to further support the dMRV system.\n\n Domain Experts\n\n For each regenerative action type there are domain specialists. For example an ocean scientist is unlikely to know how to appropriately value tree planting, vice versa. In order to develop analysis algorithms appropriate to each regenerative action type, this specialized knowledge needs to be brought into the dMRV system.\n\n As these domain experts are the ones likely to start creating tokens from the dMRV system (onboarding non web3 regenerative actions into this space) it is encouraged that a percent of their revenue goes towards supporting the dMRV system and if able provide grants for supporting the initial start of this. These organizations will not have control of the dMRV treasury.\n\nRevenue Sources\nThis dMRV system will be created bottom up from individuals and software, these individuals are who we aim to get rewarded through this software system. The flow of this system is planned to be as follows. An entity pays for collection of data, entities affiliated with this dMRV system collect the data using techniques that are part of this system. The data goes to decentralized storage which is paid for, then the entity that pays for the data is able to access it. The data is interpreted via methodologies either that the entity has proprietary control over or that is open source and part of the dMRV system. If the method is open source, a donation is channeled to the creators of the method for its use. The collected data is also marketed in a data marketplace, when people use the data they pay for the use of it. This payment goes towards both the marketplace and the data creator.\n\nSome of the business cases for dMRV are \ndMRV setup as a service\nRestoration project strategy for insurers\nEcosystem risk area assessment, regeneration plan, and MRV for insurers, municipalities, and eco-tourism enterprises\nEnvironmental Asset Creation- Carbon Credits\n\nHere are some empathy maps showcasing what each business case may be thinking- https://miro.com/app/board/uXjVP9wfNe8=/ \n\nCross Organizational Support\nBehind all of this are people. These people have formed their own decentralized organizations specializing in different aspects of the dMRV system. There are organizations specializing in data collection, analysis and domain experts. The organizations participating in the dMRV will continue to expand as the system builds continued support.\n\nHere\u2019s a complete map of the organizations that are part of dMeter: https://mm.tt/map/2252789449?t=NhUfVodAtw \n\nB. dMeter organizational structure\n\nThe Principles that dMeter Operates By Is:\n\nLegitimacy\nWe build with integrity, with high standards for quality of data and mindfulness with how it\u2019s collected. We build legitimacy with the communities, stakeholders, and internal contributors involved by striving for alignment of our highest intentions with the day-to-day working processes that move our work forward.\n\nTransparency of Process\nWhen facilitating data collection, making decisions, or building tools, we provide clear documentation of how it was done, enabling people to understand what went into a specific action, decision, or strategy. In this process we aim to be as holistic as possible. \n\nCollaborative interoperability\nData infrastructure needs to be highly interoperable so individuals can take their data with them and use it in different ecosystems, technologies, and use-cases. We create space for collaboration between organizations and focus on the standards that enable interoperability for ecodata.\n\nDistributed & decentralized\nWe distribute and decentralize power. There is no top-down hierarchy in dMeter where you answer to a boss. We self-organize around our strategy and allow leadership to organically arise from the recognition of valuable contributions by the community. We hold ourselves accountable to dMeter as a community and dMRV as a movement, not any individual. Along with that we empower systems that enable anyone anywhere to collect and provide data to the system in a trust minimized way. \n\nClear Responsibility & Accountability\nWe take initiative to define our responsibilities given our role and desires in dMeter, and hold ourselves accountable to these responsibilities on a day-to-day basis. We support each other to take responsibility and accountability by doing it in our own workflow and communications.\n\n\nSome additional info for a deeper dive into dMeter\u2019s strategy and operations can be found here: https://miro.com/app/board/uXjVPLq3DtI=/?moveToWidget=3458764537112892386&cot=14 \n\n \nWorking Groups \nWe\u2019ve adopted working circles. These circles focus on unique aspects of dMeter and work closely together to move forward in sync. Moving forward, we are open to having sub-circles and other circles created as there is a need for more unique work streams that fold into the purpose of dMeter.\n\nDemand Sensing: Understand and develop relationships with users / customers of dMRV \n\nWhat we do:\nAnalyze the potential markets for holistic ecosystem data collection and engage the relevant customers to identify customer needs and opportunities to add value.\nUnderstand unique needs and forge relationships with key users and customers for the holistic data collection and analysis process.\nDefine the use cases that will shape the Engineering circle\u2019s work on designing the data collection and analysis process.\n\nEngineering: Design and implement the ecosystem data collection and analysis process.\n \nWhat We Do:\nCo-create the process for setting up and engaging communities in ecosystem data collection with Demand Sensing\nDefine the process to decide on and implement the tech stack that\u2019s needed for each unique data collection scenario\nCo-create and implement standards for storing ecological data with others working in the MRV space\nWork on the ground with pilot projects to install the technology and engage \u2014\u2014 local stakeholders and independent operators\n\nGovernance and Operations: Steward the dMeter System; Develop dMeter\u2019s internal working structures and external appearance.\n\nWhat We Do:\nDefine the governance structure and roles that are necessary to empower the work of the other working circles.\nGrow the dMeter community and appeal to potential customers through creating and running external items like the website, social media, and community events.\nWork with the dMeter community and core group to define high level strategic direction and partnerships.\nWe Will Use the Funding We Raise to Help Complete Our Goals\nOur 1 Year Goals:\nBy November 2023, we aim to have\nHave a well functioning governance system that\u2019s aligned with our purpose, enabling greater capacity to execute collectively.\nResults:\nWe\u2019ve created clear roles, responsibilities, and decision making processes aligned with our purpose that are functioning smoothly\nOur governance token has been launched, distributed to initial team, and is clearly understood by all holders\nDesign a valuable, holistic, and usable data collection process\nResults:\nWe\u2019ve deployed full stack of data collection tools on at least 2 pilot sites\nTexas, Paraguay\nIOT, Human Sensing, Satellite Data, etc\nWe\u2019ve created a data storage framework and analysis algorithms to cross-reference and make data usable for primary market applications (insurance underwriting, eco or carbon credit creation)\nWe have an operationalized + documented process to design and coordinate flexible data collection setup in different geographical, cultural, and economic contexts\nPilot project selection algorithm based on Desci working group work.\nProve demand for our process in the market and initial financial sustainability/viability\nResults:\nAn organization has sold an asset based on dMeter data.\ndMeter has set up data collection for a project and turned a profit on the infrastructure and labor costs.\ndMeter has a clear idea of its customers and has at least 5 orgs or individuals that have agreed to paying for data collection setup.\nOur 3 Month Goals\nBy February 2023, we aim to:\nClarify our initial business model and forge relationships with potential customers\nResults:\n10 interviews / conversations with potential customers\nAt least 1 partnership that pays for data collection setup and access to the accompanying data\nBusiness model canvases and outline of financial feasibility\nResearch and prioritize business use cases for data and how they might evolve overtime.\nCreate the first concept for full stack data collection design process + conceptualizing the data storage structure\nResults:\nBegin receiving input from full stack of data collection tools on a pilot site\nResearch to find patterns in data structures used in established/emerging eco-credit methodologies, insurance underwriting and begin co-creating standards for data collection that fit the majority of current and future requirements\nV1 of standards\nConcept flow chart of how data collection is designed in different contexts + test process in a pilot.\nBuild a claims resolution layer for dMRV as outlined in Filecoin Grant: https://www.notion.so/040d8f92b2414720a90d242c1f15efb2 \nStart with environmental data\nMap out an aligned governance and tokenomics structure for dMeter DAO\nResults:\nImplement an engaging member onboarding and contribution process\nDefine essential roles for governance\nUnderstand major decisions that need to be made and conceptualize decision making processes for major decisions\nDefine token value prop and map scenarios of token value flows given the business model\nOutline technical blueprint or tools for implementing governance\nBegin to explore legal formats for dMeter\n\n \nOther Organizational Commitments!\nAvano, Ogallala Life & unnamed others have committed to donating 20% of what it raises from this Gitcoin Grant Round to dMeter", - "website": "https://dmeter.super.site/", - "bannerImg": "bafybeigdy3665doe3jqfrym7n6dyfi6qnx4jyjjpzyep27pucgrmc6awz4", - "logoImg": "bafybeib62g2lhj43uv6vgxsogxvnv4wwpgrfo7k67swhsnmftugyjxv6z4", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreid5xxvv7wnudmynoxzkgcipcollbqwpmkovdrfbod2ond6c6q3gqi" - }, - "projectTwitter": "dmeter4dMRV", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "QhPXj54CoPwRTKOIjVLSGFc1naEePZW2cmV+ABM06/yanq3w6UBcu/LmAQxZLJ6N", - "encryptedSymmetricKey": "394b67c69895a5a0c5201af21d30721364f534188c3b703adf37ac16a5504dd2300fb6b2dfe684e41a71e8967094b718fc29df282804c59f559c7d50814bf80780491f5f2fa5e05496f71f1af74c837331ddc1edda28d70d0364d7a4351fd886be5a38b914c26dcfe955d3a6b723c13bc9f83bc34640be75e212905f3701f14b0000000000000020ad80166b0f0e0f608ae4f1b807f0e38f423f3ae5fdc93343fdec9adb6455d4e2b2575d7e7db691c2b3b481ff65642c8d" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "grant" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "8" - } - ] - } - } - }, - { - "projectId": "0x42799cfce3b14376285e960875ef687cd7d1b32439a2ac3316304536f2c16509", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0x3cc60da1d3c3ed5dd919a760f3cc32810a3ecc89069332a8faf023d958a7815c7625a1d005b5c645baa9bfecec12ec1a1097fbc967af5af9011da700e53871a11b", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0x5B625088Ee2E0E9E3D0BD8AB6Ba3839d68886d2D", - "project": { - "lastUpdated": 0, - "createdAt": 1673281963044, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:87", - "title": "The Solar Foundation", - "description": "About \u2600\ufe0f\n\nThe Solar Foundation\u2019s mission is to fund solar to under-served communities in emerging markets and developing economies. We want to reinvent the non-profit and NGO model using the tools of web3 to create a new funding model. The new model will help underserved communities access clean energy and have an ownership stake in the solar deployed in their community. The Solar Foundation will fund these projects through donations, micro-loans, and other funding models. Public goods should empower communities; we believe access to electricity is a public good! Our long-term goal is to transfer 100% of the ownership to the communities we serve. \n\nUpdate\n\nSince GR15, our focus at the Solar Foundation has been on helping Ayowecca Uganda, a fellow Gitcoin Grantee in need of solar, to help improve the safety, security, and efficiency of its community-based agroforestry NGO. Ayowecca has made two project requests: 1. Solar lights for the Ayowecca tree nursery; 2. Solar + Storage for critical power needs at their office. We\u2019ve consulted with Ayowecca to determine their needs and how we can best help and have sent crypto to fund the solar lights for the tree nursery. The lights will be purchased from and installed by a local solar installer. \n\nFor the Ayowecca office, we learned that the organization is hoping to move to a new office next year, so ideally, the solar solution should be mobile. We have been researching mobile solar solutions and exploring a potential partnership with the Footprint Project (footprintproject.org). We hope to pursue a mobile solution that would meet Ayowecca\u2019s needs and provide workforce training and a new source of revenue for the community. We are also working with Footprint Project in Puerto Rico where we will be helping to find some of their work as a part of our GR15 funding commitments.\n\nProblem\n\nClimate change is an existential threat to humanity. The people most affected are in low-income and developing communities. They have directly suffered the most from dirty energy and industry. Electricity is an essential public good that drives economic growth, improves living standards, and alleviates poverty. We aspire to give this good back to the people. Many organizations have been working to solve this complex problem. If a centralized utility company tried to solve the problem, they would construct large fossil fuel-burning power plants and then build a grid of power lines to connect to customers. They would also keep all of the production and infrastructure ownership. This infrastructure does not exist in the parts of the world where energy poverty is an issue. Building traditional power plants and power grids is slow and costly, and the environmental impacts of creating this infrastructure are high. They would significantly contribute to furthering the devastation of climate change. \n\nSolution\n\nWe believe a decentralized approach will be required to solve this problem. Instead of large centralized entities burning coal and other fossil fuels, the Solar Foundation will build localized small solar microgrids and individual systems. These microgrids can supply power to small communities as close to the end-user as possible. Web3 has evolved and can provide the tools necessary to build new funding mechanisms (using the power of DeFi) so that we can focus on funding solar projects. Our vision is to create a foundation that can provide tax efficiency to donors and fund vital solar projects worldwide. Ownership, payments, and system monitoring can all be on the blockchain. This level of transparency, accountability, and ownership will empower the communities we serve. A collaborative approach is essential to solving this problem. We seek to form a strong coalition of web3 and ReFi projects and bring the voices of the communities we serve into the conversation. We will work with local installers to help us install solar to support local economies and continue to support the projects long term so that they have an impact for years to come. \n\nWho we are\n\nJon Ruth has over 15 years of experience developing, managing, and constructing over 400MW of C&I and utility-scale solar projects. He has also been on the nonprofit United Solar Initiative board for six years. Since 2016, Jon has been involved in cryptocurrency, including mining various cryptocurrencies. For 20+ years, Jon has studied climate change and has a passion for building sustainable solutions to one of the most significant challenges humanity faces. Jon is building his legacy by making the maximum impact possible in the fight against climate change. \n\nColeen Chase works on the Gitcoin Public Goods Operations team. She cares deeply about building solutions to address climate change. After adding solar to her family\u2019s home and realizing how difficult it is to implement a microgrid in her community, she is committed to helping implement an equitable transition to renewable energy so that people everywhere can experience a healthier, safer, more secure, and brighter future. \n\nJames loves the problem-solving required to bring new ideas to life. He has collaborated to launch 25+ products into the industrial biotech / renewable energy sector as a scientist, PM, and department manager. He is driven by his love for his kids and the fear for their future if we don't collectively fight to mitigate climate change. \n\nWhy Us\n\nThe Solar Foundation team members have the background to execute this vision because of our combined experience in solar, crypto, web3, and research and our determination to have an environmental and social impact with the projects we build. With a lengthy background in solar and sustainability, Jon is perfectly positioned to develop strong partnerships with solar providers around the globe. He has negotiated millions of dollars of construction contracts over his career and developed solar projects valued at millions of dollars. He has also been on the board of a non-profit developing and funding microgrid projects internationally. Coleen has a marketing background at both Microsoft and Apple along with 10 years experience writing and editing healthcare-related articles and books. She firmly believes in the capability of web3 to help address our urgent climate crisis and in the need for a just transition to clean energy worldwide. James has a passion for solving big problems in the world. Before entering the ReFi space, he was designing new models for tracking carbon and impact in his work in industrial biotech. James was excited earlier this year to find that a whole community was working on some of the problems he had been thinking about for years. He brings value to every project he contributes to and excels at project and people management, community building, and bringing great vibes.\n", - "website": "https://solarfoundation.xyz", - "bannerImg": "bafybeifamt5h6q75m535qohpagpspujvot2xaayeercitahneiepggrw5y", - "logoImg": "bafkreicdrjubb2d3izz5u25ccj53fmn5ynkbnecnpsncjxsmvu45p4vxgi", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreihgkfercswcr2iub6yi7gxfxfffuijfjfgu7iqudumj3x452pypuq" - }, - "projectTwitter": "solar_FND", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "kPHym85ELy1Emq4ZFHhPFq3HJ8F7SAvGIcdHIl0G8Tg=", - "encryptedSymmetricKey": "13b6874ef91f17fd1a942c27fb85d34660c7feb08c57dd52f3eef5c9ba4687d432052f82c9420b2994c5a91521fec90f4af902d73e20baa0375eab9e49081a90e68624c49d995b6694daf1f4ffc0b32f20ac0bcf3e765c09315ef2f3baec198ecd3649deb131bf0e017befb7581cfba38aa1b2e2c1b1116ad03e6ca5f1188cd0000000000000002022a92c7c5bec87b0abcfabd0c7e6f90bd4cb111ca2a16f4b84b9ea9c9cb212418a17303faee5073e1f8aa8719dc75a97" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "3" - } - ] - } - } - }, - { - "projectId": "0x42c5410440da06b29d782ee691783aad21d76b0de61c1034432f816af89aa57f", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0x5937a4261be533409b2f1b562c3163b4446073b4597a3e2172d3c3545109f8ea2bc8b7b4e0232ff2004827fca2597b456b9555ada9bf441275128ab997df5c841c", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0x221966004b2001a0dA1274024d67cd09FEbD0b94", - "project": { - "lastUpdated": 0, - "createdAt": 1673544418926, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:162", - "title": "Act Now Climate Change Bundle", - "description": "\ud83d\udc9a ACT NOW CLIMATE CHANGE BUNDLE:\n\nActivism and advocacy can change the world. They can push the boundaries of our knowledge, tip the balance on policy and induce public action to affect environmental and social change. The projects in the activism and advocacy bundle extend from the depths of the earth to the far reaches of outer space and include:\n\n- Collaborations between Web3 regens and land trusts\n- Indigenous legal climate challenges\n- Initiatives to incentivize planetary cleanup, from oceans and rainforests to Earth's orbits\n- Strategic Climate Solutions Campaigns\n- Putting the Paris Agreement carbon markets on chain\n- Governing climate-related blockchain efforts across sectors\n\n\ud83d\udc18 ELEPHANT IN THE ROOM:\n\nTwitter- @ClimateRace\n\nStrategic Climate Solutions Campaigns. We work with Indigenous organizations, voting organizations, neighborhoods, cities and activists to promote climate action to communities around the world and to counter the vast array of fossil fuel advertising and disinformation. Over the past year Elephant Room has also been creating strategic communications that are focused on the web3 community.\n\n\ud83c\udfe1 UNEARTHING COMMON GROUND:\n\nWebsite- https://common-ground.super.site/\nTwitter- @commongroundCLT\n\nGitcoin Grant 16 page-https://gitcoin.co/grants/6318/unearthing-common-ground-a-six-week-journey-into-\n\n0x08f2E5b3b316C49F8Ab95df0D6ee541271d10f7e\n\nA six week learning journey which introduces 50 web3 regens to 50 existing community land trusts from around the world to develop on the ground project collaboration.\n\n\u267b\ufe0f LITTER TOKEN ($LTK):\n\nTwitter- @litter_token\nInstagram- @littertoken\nWebsite- www.littertoken.xyz\n\nLittle Token is a purpose-driven token that pays people to pick up litter. We use our own cryptocurrency to compensate people for cleaning up the planet. We are Pokemon Go for climate change.\n\nTo date, we have picked up 65k+ pieces of litter (across Nigeria, Philippines, USA, Brazil, Puerto Rico, etc), started a Community Farm in rural Nigeria, and started a waste management business in Puerto Rico.\n\n\ud83d\udef0\ufe0f COSMOS FOR HUMANITY:\n\nWebsite- https://cosmosforhumanity.eu/en/\nTwitter- @cosmos4humanity\nDiscord- https://discord.gg/mmCAgkHFnn\n\nGitcoin Grant 16 page-https://gitcoin.co/grants/6782/protecting-earths-orbits-through-citizen-intellige\n\nC4H is a Swiss-based NGO that promotes a more sustainable access to outer space for humanity. We are currently creating a carbon footprint inspired indicator in partnership with the French space agency. We also aim to create a citizen-run label to fund researchers and startups working on space pollution and help finance active debris removal operations in the future.\n\n\u2696\ufe0f BEYOND FOSSIL FUELS:\n\nTwitter- @BFF_campaign\n\nIndigenous Legal Fund for Climate Action.\n\n\ud83c\udf33 BLOCKCHAIN FOR CLIMATE FOUNDATION:\n\nTwitter- @blockforclimate\n\nBlockchain for Climate Foundation is working to put the Paris Agreement carbon markets on Ethereum to enable cross border collaboration on climate change. The BITMO Platform enables national government issuance and exchange of sovereign emissions reductions and removals outcomes as ERC-1155 NFTs - providing low-cost transparent architecture for a more timely launch of these markets.\n\n\ud83d\udce3 BLOCKCHAIN x CLIMATE INFRASTRUCTURE (BxCi) - formerly known as BICOWG\n\nTwitter- @BICWOG \n\nBxC is an activist-to-industry network of global stakeholders working together to define and author cooperative operating and technical principles that govern climate-related blockchain efforts across sectors. BxCi working groups focus on carbon market registries, standards and auditability, policy development, regenerative finance and emerging markets in the global south. In 2023, BxC aims to scale the reach and impact of these initiatives and identify new multi-sector alliances. Many of these projects are underway as proof of concepts or in fully implemented solutions but require a consistent taxonomy framework to scale.", - "website": "https://www.notion.so/Bundle-Activism-Advocacy-99120e6ed97947b786af7cc2f1becc80", - "bannerImg": "bafybeihexwxbj3mballgmvhirfscscp2ygucciq477htllckxbp3ns7wvy", - "logoImg": "bafybeih2yfajcjftb6gnbdcvunc4kxt72ikhfyqueatfl4mwbajqycbivq", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreie5cuorx536xodm2wy4ki6oytz2he4s2js7d27nf6npseikkoumhu" - }, - "projectTwitter": "ActNow_Bundle", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x4AFC0c9a5C4060DF2345C5b8C73e8eDBA2DE8E47", - "provider": "ClearTextTwitter#ActNow_Bundle", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "hash": "v0.0.0:6JMu18zCjXNROCrZR8C1OT0lQz2xSyZrhYwl0W1LZzk=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-12T17:26:30.427Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-12T17:26:30.428Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..ZzmhghPBfbxzT1W4pmTwg0NPZbKJmaz0S4DSI8T2zq3EJa7gue4Oia8rTVeFpC9Q6az-1Cg-_0iyKlIA5sSuCQ" - }, - "expirationDate": "2023-04-12T17:26:30.427Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "kDeugptis1vyZggr4mV/IVdxTI3WqL5+MzuuR1VNtUUkhCCtjK3DcXa2NG4OGO/N", - "encryptedSymmetricKey": "06a150cfea0916e0edab73b476bbd24ea8b8360cc9540b199b956348c34387dd3503f1a277984510666e194e7289140675667fb7aeb6edc9925e3ac371928208467ce707d161779526f582f9f7875e471b8cca0a4852d0c68e53634988def48f6f034f0b30ed4428fd932ae4eba350dd149a1b3d60abf0985500e08030993e730000000000000020e76e09763190c8be3b54a2a3419cd6e38b3f01f5cf1151d58670cc783ed90a1dea62df6b07ec5a5135613a93552661b6" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "6" - } - ] - } - } - }, - { - "projectId": "0x43655e0e22d8654df1d008ab61aa8170f3459124f87253b6a60e728138fb2f44", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0x98b83a9b50e6f0cdad0bef2fcd02d55cfae0746a5bbbb68cbb729b6b240b919d5affddb945380f412fc8714941e3438b817129ef1b0c3fd9e5d55233a4096ba61c", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0x3C8281c8786ab29Bcab5B33566968f8011ea6A59", - "project": { - "lastUpdated": 0, - "createdAt": 1673427521970, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:117", - "title": "Avano", - "description": "About\nAvano is a proud member of Panvala League. Donations in PAN are much appreciated and can help us access additional matched funding. You can get PAN here: https://app.1inch.io/#/1/unified/swap/DAI/PAN. Avano is also a verified organization on Giveth. Donations on Giveth are much appreciated https://giveth.io/project/return-to-green \n\nThe original idea of Avano (our old name was Akorn) is presented here in an intro video: https://www.youtube.com/watch?v=lqbmqB3unuI. Since then our work has been separated into two primary sections. Firstly, furthering the creation of a decentralized monitoring, reporting and verification system (dMRV). Secondly, empowering synergistic emergence for public good, through art and web3. After the name of each of our sub orgs you can find the percent of funds that will be channeled from funds raised in this round. \n\nThe Avano DAO wiki can be found here: https://avano.gitbook.io/avano/avano and we readily share what we are up to through our Twitter. To check out other projects in the ReFi ecosystem, check out this map we created and feel free to add your organization: https://www.mindmeister.com/map/2145029803?t=AiP70N5AmZ \n\nWe Believe That You Should Hold What You Value. \nTreasury Management:\nWe Have Over 50 NFTs, Many of Which Are From Public Good Organizations including the first NFT created of an Endangered Tree Species from the Endangered Tokens Foundation\nWe have invested in both Eden DAO https://twitter.com/TheEdenDao and Basin DAO https://twitter.com/basinDAO \nWe Hold the Majority of Funding Received in Klima and Regen \n\nDecentralized Monitoring, Reporting and Verification (dMRV) Systems: dMeter 20% of Funds https://dmeter.super.site/ \n\n75% of funds raised from GR14 by Avano were channeled into a shared treasury initiating dMeter. dMeter is one of the first organizations of its kind. It is an organization of organizations that incentivizes cross organizational (decentralized) collaboration for monitoring, reporting and verification. This dMRV system is particularly geared towards data collection of regenerative actions (such as tree planting) and the benefits from them (such as benefits to water, soil, air, etc.). To further support dMeter\u2019s growth 25% of funds raised by Avano from GR15 were channeled to dMeter. Now 50% of the funds raised from this grant round (GR16), will go towards furthering the newly established Desci branch of dMeter. \n\nImportant Metrics\n\nEstablished dMeter's socials (138+ members in Discord currently)\n\nWG lead's elected (7 different working group leads, each from a unique dMRV organization)\n\nPilot project identified (Ogalla Life in Texas) with future pilots listed (Next likely to be in Paraguay and Colombia. Reddit: https://www.reddit.com/r/dMeter/comments/vgyf4f/irl_pilot_projects/ )\n\nMechanisms for incentivizing decentralized contributions established USD $1,000 per month for working group leads and Dework for further contributors: https://app.dework.xyz/dmeter \n\nHeld over 95 synchronous dMeter meetings and had input from dozens of individuals from different organizations on development trajectory since last Gitcoin grant round \n\nMapped out dMeter Discord members: https://sobol.io/d/refidao/team/hARhOQGmrr/overview \n\nIdentified and prioritized 12 different writings from past research that are now undergoing a Desci process for formalizing them into publishable papers: https://osf.io/pwr5j/?view_only=399530f253454609a320da3f7ba1c4ec \n\nAvano's founder is currently in New Zealand doing a PhD in regenerative cryptoeconomics and how web3 technology can be applied to hazards and areas impacted by natural disasters. In particular they\u2019re creating a machine learning algorithm for prioritizing conservation of existing ecosystems based on their ability to increase wellbeing and resilience of populations to natural disasters. \nhttps://osf.io/ujhkq/?view_only=3b818fd552fa489fb40e3a6f85dc88ae \n\nAvano\u2019s founder has also started an open source collaborative book that explores various web3 topics, found here: https://avano.gitbook.io/regenerative-cryptoeconomics-book/ \n\nStarted Staking Half of dMeter treasury with https://app.spirals.so/ to further support planetary regeneration \n\nFuture Fund Use\n\nFunds will be used to further incentivize contributions in dMeter. In particular to: \n\nFurther Desci community build and strategic design. As well as each working group that is part of dMeter\n\nWork on Publications. \n\nWork on Shared Infrastructure.\n\nResearch Design. \n\nStrategic Partnerships for Research Being Carried Out. \n\n\nArt and Public Good: Return to Green 20% of Funds Raised https://linktr.ee/returntogreen \n\nThe first ReFi Metaverse event raised 5.3 eth for environmental organizations on Giveth. Organizations responded that this funding allowed them immensely; they established a recycling center in El Salvador and doubled their treasury budget in Brazil for example. There was a full day of ReFi talks (recorded on our Youtube: https://youtu.be/8C3ya7dNulc) from leaders all over the world. Music was streamed into the metaverse from two different stages (12 hours each stage) and 52 NFTs from 40+ artists were auctioned for the environment! \n\nFrom the success of this event a following event was coordinated for September 9th in New Zealand around Mental Health as a public good. There was a custom metaverse space created for a Gender neutral, identity fluid, artist that is a DAO to portray their current work as well as stream the opening exhibition event into the metaverse. This event sent .18ETH to PeepTers, Sage to Saddle, Gravity DAO, and Happy DAO from NFTs sold during the event. Check out the space here: https://www.voxels.com/play?coords=N@4665W,2194S \n\nTo further support linguistic diversity in the crypto space, Return to Green hosted EthSantiago in their custom built boiler room space. This conference was entirely in Spanish. https://www.voxels.com/play?coords=W@2957W,3936N,0.5U \n\nCollaborated with AgroforestDAO to teach school children in Brazil how to build metaverse space and how planning in the metaverse can be useful for agroforestry principles. Can see the result of the collaboration here: https://www.voxels.com/play?coords=N@5196W,1814N \n\nBy working closely with Charged Particles, Return to Green became affiliated with Grandmother Grove https://grandmothergrove.org/ and is now the official voice of Grandmother Gove on Twitter. \n\nImportant Metrics\n\nFor more details on the success of our first event can go here: https://medium.com/@Avano/refi-metaverse-event-how-to-ad91ae69afd8 \n\n161 followers on our Twitter: https://twitter.com/ReFiNFT \n\nWe now own 2 metaverse spaces in Cryptovoxels and over 70 spaces in Over the Reality \n\nOver 700 visits to Agroforest DAO metaverse collaboration space\n\nOver 700 visits to EthSantiago space\n\nOver 6500 visits to our primary exhibition space: https://www.voxels.com/parcels/4147\n\nOver 400 visits to the Mental Health Event space \n\nFrom Our Impact Became a Verified Organization on Giveth https://giveth.io/project/return-to-green \n\nContinued collaboration with IRL artist venue XCHC https://xchc.co.nz/ \n\nFuture Fund Use\n\nFurther support web3 technology adoption (especially metaverse) in South America Through Strategic Partnerships: EthSantiago, Endangered Foundation, and Agroforest DAO \n\nPurchase of Streaming Hardware for New Zealand Based Events \n\nContinued Work WIth New Zealand Artist Community in Adopting and Utilizing Web3 Technology \n\nIncrease the Ability to Perpetually Plant Trees Through Grandmother Grove \n\nPublic Good NFT Marketplace: FeNXT NFT Marketplace 60% of Funds Raised\n\nFrom the efforts of Return to Green, the need for an NFT marketplace that supports public good projects on Giveth was identified. Raid Guild was contracted for a design sprint of this marketplace After the design sprint was completed the results were shared on various forums of organizations that support public good. With the word getting out that we were wanting to start fundraising to create an MVP of this marketplace we were approached by Inverter Network a branch of PrimeDAO, asking if we were interested in being one of the first web3 organizations to utilize their newly created fundraising system. We were very intrigued and are now going to be part of their trial run in February. Can learn more about this marketplace here: https://gov.charged.fi/t/fenxt-nft-marketplace \n\nImportant Metrics\n\nUSDC $8,000 was spent to contract Raid Guild on a Design Sprint\n\nCreated many forum posts sharing the idea, example post here: https://gov.charged.fi/t/fenxt-nft-marketplace \n\nReceived Brand Guide from Raid Guild: https://www.figma.com/proto/IW6RiBBq6JiUFpQNsIUGfw/PGNFTMKT-Brand-Design?node-id=4%3A10&scaling=scale-down&page-id=0%3A1&starting-point-node-id=4%3A10\n\nReceived Scope of Work for What Needs to Be Built From Raid Guild: \nhttps://hackmd.io/IgJL2pxfSXWo35UKhROuYg?edit\n\nAccumulated a Contact List of Organizations to Reach Out To When Launching Fundraising Campaign with Inverter in February \n\nFuture Fund Use\n\nMarket Fundraising Campaign \n\nHire DAO(s) (Raid Guild, General Magic, Buidl Guild etc.) to Build MVP of Marketplace ", - "website": "https://linktr.ee/Avano_io", - "bannerImg": "bafybeicv7vydo4hnv5loneacbsg4h4lky2bgat2ivdy4dqcbemyexlhwny", - "logoImg": "bafkreian4i4hq457iodb22hhgatthmmbeebhlqrauiw4uuv77s6sop5npi", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiftmf3vyrdye4o63csmw2tdj5qbhakeetocj2sr3g2p4riknrbkoy" - }, - "userGithub": "TerexitariusStomp", - "projectGithub": "Avanoio", - "projectTwitter": "Avano_io", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x5A6C1AFa7d14FD608af17d7e58e8DB52DF5d66Ea", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#Avano_io", - "hash": "v0.0.0:4hE2nmkAEc6FbwHoX3+yFAX71U38bIH9OAbwvV4LO7E=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-11T08:57:45.317Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-11T08:57:45.317Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..HwBgt2y9QeI_C7TQwUHiSHgK5jqrHs9YtfUBUBHG72KsfwS6e8H2zSNHG3mQH3IkiFuXuKGzsGm3vRANjYgZDw" - }, - "expirationDate": "2023-04-11T08:57:45.317Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "pbfvAHFVVJ4EnR7BWn2IsP2jgh6mIQxENeo47EBQykFOIS767RWi/jiB8wgiwo7E", - "encryptedSymmetricKey": "ef2dceb11b09d5e459cf2941b9b83daf4cb1814370cc5a781f258d655300c456937bc178c29d1be480cfe5011c64ce08c46ffffff1424ee2acfb3f1a48702e0f7d23292c80dd1a6df6d6bdacdc868503a752950060e3b3527b46a88afc40b9b5d27cf2cee637655391975ef030397aedd1de8fd127df6e74a15536363638956b0000000000000020429a96e69d346c1513a21c6a686c53a1094932ecb4f5338d742ed247b686cfca90169925a13ff259489a1322f98cb596" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "5" - } - ] - } - } - }, - { - "projectId": "0x49b116df324396ec3f9ff3fd3f6d9d1d50e1412f887316ca6152d1372af8ad36", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0xfa1d06686972bcf331d256a5d64a3c77796056da2db8b206c7a08872e1d2614a169245663a9005e52d5236b64401ab4ab41b657d5aa1c00cd3b47f7f99dd24881c", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0xCe849efC35A0a0a046E67c76B477c5432E4BA58b", - "project": { - "lastUpdated": 0, - "createdAt": 1673478719792, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:132", - "title": "Endangered Tokens: Endangered Trees as ReFi Biodiversity Assets ", - "description": "\n\n\n\n\u2014---------------\n\ud83e\udea7 Summary \n\u2014--------------\nEndangered Tokens is a ReFi NFT community looking to revalue biodiversity by tokenizing endangered trees with web3 incentives and digital value added.\n\n( To see a rich text and full version of the grant description go to: https://hackmd.io/@vrXnknFqSEq7faTi-zgdxw/r1DIJgDys )\n\n\u2014-----------\nMission & Vision\n\u2014---------\nForm a decentralized investment community for Endangered Species and life preservation, giving value and governance to stakeholders through Crypto Assets. \n\nWe believe in a decentralized future where economies are driven by independent, sustainable and healthy ecosystems in which the community collabore adding value to accomplish complex tasks. We need to revalue biodiversity and living ecosystems through preservation of Endangered Species which are invaluable assets to the world. \n\u2014------------------------\n\ud83e\udd14 Why support us? \n\u2014------------------------\n\n\ud83d\ude35\u200d\ud83d\udcabProblem to Solve\n\n\ud83c\udf33Endangered trees are responsible for maintaining the health of most of the world's endangered forest ecosystems, but rarely produce relevant revenue for landowners (without being damaged) and even become financial liabilities, thus encouraging their illegal felling. \n\n\n\n\ud83d\udc4cEndangered Tokens\u2019 Solution\n\nLeverage web3 and digital art to incentivize the protection of these scarce beings by changing their status from merely the cost of maintaining a tree to a revenue producing Bio-Asset. \ud83c\udf0f\n\n\u2014------------------------------------\n\ud83e\udd37\u200d\u2642\ufe0f How will we accomplish this?\n\u2014------------------------------------\n\n\n\nEndangered Tokens is a ReFi & DeSci NFT community looking to revalue biodiversity by tokenizing georeferenced endangered trees. Each specimen is characterized and video recorded alongside a small verse description, and when owning one, you become the godfather of a scarce endangered tree! \ud83d\ude0a\n\nWith the funds raised we will help landowners finance the protection of endangered Forest with reforestation, verification of carbon credits from the forests and the creation of quality digital content & data to add value to the tokens, content like:\n\n-3D tourism experience of the protected forests thus reducing the footprint of real life tourism while also generating a continuous flow of revenue to keep supporting the protection of the forests. \n-Using the 3D replicas of each tree as a virtual asset for video games and/or augmented reality experiences\n-Recording data from the forest for research and enhanced digital experiences like music from the frequencies of the trees, bioacoustics, video recording of the ecosystems, climate data, water flow, among other relevant information.\n\n\nNFT holders will receive a portion of the revenue that will come from the NFT Sales, tourism experiences, data management and carbon credits, thus converting endangered trees from liabilities to biodiversity assets for the future. \n\n\n\n\u2014---------------------------------------------------\n\ud83c\udf33Which kind of trees are we talking about?\n\u2014--------------------------------------------------\n\nWe are currently working in Chile in South America, with the rare species Gomortega Keule (https://en.wikipedia.org/wiki/Gomortega), or locally known as Queule. These magnificent beings are the last one of the Gomortegacae Family, dating its evolution to Pangea times. It is estimated that there are no more than 4000 specimens alive in the world! (Scarcer than Bitcoin!)\n\n\n\n\n\u2014----------------------------------------------\n\ud83d\udcb8How will grant funding be spent?\n\u2014----------------------------------------------\n\n\u2014\n1\ufe0f\u20e3.-Production and development of the first web3 touristic Endangered Forest experience.\n\n*First mock-up video of one of the 3d model replicas of the tokenized trees.*\n[Youtube video link](https://https://www.youtube.com/watch?v=A2Je4vC5g50)\n\n\n\u2014\n2\ufe0f\u20e3.- Vital activities core team funding\n- [x] General administration\n- [x] Coding and development\n- [x] Marketing and community growth\n- [x] NGO's and landowners coordination\n- [x] Content creation and production\n\n\n\u2014\n3\ufe0f\u20e3.- Endangered Tokens Conservation program\n\n*\ufe0f\u20e3Tokenization, extensive cadastre & landowner agreements\n*\ufe0f\u20e3in-situ conservation actions to reduce threats. \n*\ufe0f\u20e3Ex-situ conservation actions and landscape restoration actions\n*\ufe0f\u20e3Sustainable local development & community engagement\n*\ufe0f\u20e3Research on species and their habitats\n*\ufe0f\u20e3Carbon Bonds verification, trading and retirement\n\n4\ufe0f\u20e3.-Marketing and community building\n\nWe have realized that a crypto community needs to be active, engaged and in constant growth in order to stay healthy. This is an important pillar of investment on top of a marketing lead within the team.\n\n5\ufe0f\u20e3.- Biodiversity Assets Research & Development\n\nIn order to fully convert our protected trees to biodiversity Assets we think a proper indicator with a Minimum Reliable Verification (MRV) of the health status of the trees and species must be accomplished. In order to achieve this we will foster a DeSci project that aims to gather Bio-Acoustic data from different forests with different conditions and generate a machine learning algorithm that can automatically diagnose the living conditions within an ecosystem. \n\n\u2014-------------------------------------------------\n\ud83d\uddbc\ufe0fState of the art & ongoing projects\n\u2014------------------------------------------------\n\n\u2638\ufe0fThe Tokents: Digital assets with ReFi purpose\n\nWe are creating NFT collections that help us fundraise and add value to our community. So far we have launched 2 collections: \n\n#\ufe0f\u20e3Elder ENTS NFT: Georreferenced tokenized Specimens of Endangered Trees. \n * 1st Collection Gomortega Keule - Elder ENT Queule# : **Founders Collection** \n\nBecome one of the **founder members circle** of the project by minting one.\n\n#\ufe0f\u20e3Entrees NFT: \n * 1st Collection CryptoKeules - Entrees CK# : Artist Diegong \n\n\n\nThe final visualization of our Preserve to Earn ecosystem includes 2 ERC Tokens to Interact with the NFTS:\n\n* #### $ENTS DAO Governance Token - Fungible ERC20 to vote in DAO discussions and other ReFi/DeFi applications \n\n* #### $ROOTS utility Token - Fungible ERC20 to use within dapp functions and utilities.\n\n\n\n\u2638\ufe0f\ud83c\udf33\ud83c\udf33\ud83c\udf33The Queule 3D virtual Experience\ud83c\udf33\ud83c\udf33\ud83c\udf33\n\nUsing Unreal Engine 5 we have modeled so far 10 of the 25 tokenized Queules. The first product that is ready-to-launch from this is the Queule 3D showroom to explore the modeled trees as a virtual experience. \nWe are developing a Virtual Reality Experience of the Endangered Queule Forest as a product to offer to our holders and also to Scale our ReFi Model. \n\n\n\u2638\ufe0f\ud83c\udfb5\ud83c\udfb6\ud83c\udfb5Music of the ENTS\ud83c\udfb5\ud83c\udfb6\ud83c\udfb5\n\nAlongside the virtual experience we are recording the frequencies of the endangered trees through a PlantsPlay device (www.plantsplay.com) as the first approach. Our vision is to be able to stream the music of the endangered trees live, so they can produce their own content to help them stay alive.\n\n\n\u2638\ufe0f DeSci projects to be developed \ud83e\uddea\n\n\n# Bio-Acoustic MRV\nIn order to understand the forest better, we need to learn how its sounds speaks regarding the health of the forest.This way we will be able to use a cheap and effective MRV for our forests and contribute to the ReFi community with more tools and infrastructure for better MRVs\n\n\n# Dendrochronology of long lived trees to understand climate change.\n\nWith the proper tools and scientific professionals measuring the age of long lived trees and its roots can help us understand more about their endangered situation. \n\n# Queule Frog studies \ud83d\udc38\nFrogs are very important bioindicators of the forest. There is a rare frog that only lives nearby Queule forests and we are already researching regarding their behavior and ways to protect them. \n\n\n\n\n\nLinks of Interest\n[Linktree](https://linktr.ee/endangeredtokens)\n\n( To see a rich text and full version of the grant description go to: https://hackmd.io/@vrXnknFqSEq7faTi-zgdxw/r1DIJgDys )\n\n\n\n", - "website": "https://endangeredtokens.org", - "bannerImg": "bafybeihz7rhrucypphmrtgwbiq4vb3blmksi7oj2voh5gevgbjpzeeybbm", - "logoImg": "bafkreievqv6lzqnkgmgu664ai4sipxyz4wsdom2hms2y2ag56z47ccvjky", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreihhww4camyu7ecnehmfxe65thvwrmbgxcinwyx6e5hyig2pfirimu" - }, - "userGithub": "idpuga", - "projectGithub": "EndangeredTokens", - "projectTwitter": "ents_foundation", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xCe849efC35A0a0a046E67c76B477c5432E4BA58b", - "provider": "ClearTextTwitter#ents_foundation", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "hash": "v0.0.0:fCewSZvTQiE1Dwodcfk4y1zlDy29hBJuNmv1s3vDZK4=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-12T15:05:00.756Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-12T15:05:00.756Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..mAvpposLxJkEaLjXf1n2MDjLjxt8U0PWgZ30FVVAVzsxR2jvQJTNYsAfbcKWY1kHCOBKkxiZ9YGVsOPMowgmDw" - }, - "expirationDate": "2023-04-12T15:05:00.756Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "JtuKzE0fCgpKCsFeoesA+ZydGhawrvA+aoCl6vrrgu6Ty4jzL2wZBqAuTd0ElMv5", - "encryptedSymmetricKey": "3b417fcd8994e116868f5498d0fa6ea60ccc4255fd00c6ec20eaf4281464ce631d761c807292fc26384a03ee8a67f3168ce0ec9494a57dd6da68ec8c470ea0b84cb0bea3c61ca52c194bc3795f3b7cf471d0e50fadf6e2e1e4c58d87d2dff690bce13afcb26366b51251c17f49bd98bca7d608367c31978079b28bb420218ba800000000000000207373de6c4ebbb36807fb4974891a5221ecb5ba04af20f101936d6216e097e1eaab94200e7eeaa4d3f3ad936488cb82a0" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Gitcoin, NFT Sales, Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "8" - } - ] - } - } - }, - { - "projectId": "0x505b62acc15bf844c19bb19e8c6e24401f8c97c9efce376982e015003ea3354d", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0x24abe127f0902f931116743256263e1516cdf1d03449e35b4844d48f67d5042715f9fe446677abc8d3ccc0190a954d7971009456009daac85dc1ec14c6db1f6e1b", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0x371ca2c8f1d02864c7306e5e5ed5dc6edf2dd19c", - "project": { - "lastUpdated": 0, - "createdAt": 1673370543831, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:102", - "title": "Regens Unite: building public goods and a community to support all regens from web3 and beyond", - "description": "\ud83c\udf40 Who are we?\nRegens Unite DAO is a coalition of people on a mission to build public goods and create a network with and for regens. We consider everyone building regenerative solutions for themselves, for our communities and for the planet at large, a regen.\ud83c\udf31\n\n\ud83d\udc49\ud83c\udffc We organised several of \u201cRegens Unite\u201d IRL events and full week retreats in Brussels, Berlin (video), Amsterdam, Bogota to bring together people working on regenerative solutions for themselves, communities and the planet. And we wrote a handbook as a source for decentralised Regens Unite events.\n\n\ud83d\udc49\ud83c\udffc New events are planned in Amsterdam, Brussels (April, May and August) and Berlin (September) in the coming year, and we are working on regenerative offers to other DAOs. And we wrote a handbook as a source for decentralised regen events.\n\n\ud83d\udc49\ud83c\udffc Our next step in building the infrastructure\nNext step in accommodating the fast growing community is the development of a proper common website for the Regens Unite community, with a shared calendar and newsletter to facilitate the discovery of regen events, practices and knowledge. \n\n\ud83d\ude4f\ud83c\udffdFor this we need your support.\ud83d\ude4f\ud83c\udffd\n\n\n\ud83c\udf40 What do Regens need to Unite?\n\nRegens realise that there is no single silver bullet, no one-size-fits-all solution. It will take many different initiatives, many different projects, many different communities. That\u2019s why, instead of convincing each other, learning how to relate will be a key factor in joining forces to build viable solutions. We need to come out of our bubbles.\n\nThat is why \ud83c\udf31we need to unite\ud83c\udf31, we need to get to know each other, build trust and help each other be as successful as possible in building solutions.\n\nRegens Unite is a fresh way of bringing Regens together in real life, to build a strong web between all the different types of regenerative sectors, both in and outside of web3, so that we can learn from each other and foster new avenues of collaboration & unification. \n\nOur in-person events bring together regenerative thinkers and doers in DAOs, ReFi, DeSci, Platform Coops, Purpose Organizations, Climate Activism, NGOs, and Art to co-create & share projects, knowledge, food, kindness and hope.\n\n\ud83c\udf40 What are Regen Unite events like? \n\nPeople have expressed awe and surprise by whom they\u2019ve met and by the different approach Regens Unite events have taken. Regens Unite events are not typical conferences. No powerpoints, no convincing each other of solutions, but uniting in our common goal: regenerate ourselves, regenerate how we communicate & collaborate, and regenerate the planet.\n\nThese unconference-style events include:\n\u2b55\ufe0f Facilitated workshops\n\u2b55\ufe0f Round circle discussions\n\u2b55\ufe0f Co-creation spaces\n\u2b55\ufe0f Relaxation areas\n\nSome of the reactions we received in the feedback form on the question \u2018what surprised you?\u2019\n\n\u2728 Solid female presence, and people who didn\u2019t know what web 3 was (YES)\n\u2728 I was positively surprised, that not only people from crypto world attended\n\u2728 The leaning into regeneration as a personal, interpersonal human need as well as environmental regeneration\n\n\n\ud83c\udf40 How can we help your community?\n\nWe have developed an expertise in organising conferences where people can make new meaningful connections and feel rejuvenated. We learned how to create safe and brave spaces where people can meet other people outside of their bubble.\n\nWe can put that expertise of service to your community, to help you organise a Regens Unite Hub at your conference, a Regen Retreat, or find ways to bring more diversity to your community.\n\n\n\ud83c\udf40 What\u2019s next for Regens Unite?\n\nThere is a reason that greenpilling is such a strong movement: the understanding that we do not want to recreate current global system imbalances by building in a silo. We need to build bridges, we need to connect to our neighbours and to offline communities.\n\nThere is a lot more potential in the ideas behind Regens Unite. We are now organising to become a DAO to help each other create those spaces where Regens can unite in every city and every region.\n\nOur goal is to facilitate more events in 2023, produce great content around the movement, and help Regens unite around the world. Every donation helps us to move this mission forward!\n\n\n\ud83c\udf40 Our recent events\n\nBogot\u00e1 (Regen Hub @ Devcon) - October 11-14 2022\nhttps://regensunite.earth/bogota\n\n\u200dBerlin - September 16-17 2022\nhttps://regensunite.earth/berlin\n\nAmsterdam - September 22-24 2022\n\nBrussels - May 19-20 2022\nhttps://regensunite.earth/brussels\n\n\n\n", - "website": "https://regensunite.earth", - "bannerImg": "bafybeifboruptxeva64enhwzhvfjvlfwxyfwkdwmwp7ugx7eq6kqbdzusm", - "logoImg": "bafkreigtkmwjy4xp6yhrhsydko4in3cswla75z7ybfbmpr6iibbfe6fhai", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreic5dw43a6ykr2cejhibmoce3t5pqjkbq2pcts5a32l7yjwvoofkyq" - }, - "projectTwitter": "regensunite", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "yscWSVig7joDROqY9uWtxwamJg2y9vDECLRURUHo39COfY3QwnAsK0RMUf1/jfam", - "encryptedSymmetricKey": "3a4c8a96d79c2ca9a2c337c233f9995bc005998bd298b1edd50074fb3514c58118bd464fe35fe54c9771e510c0a329020b6a6bae7d3abf67d68b896bf63dcd6988b8d221e4eab86664a11cada62e197c7cd0ab0adc4a21c0dbc266754b10cab16133f430b053fd6766488a2d93f49d8db494bb6dc630ed6e38ba3da6127f6e3e00000000000000209345f54488e99c1aa3bcad6dd69520a70bceaf0ba5f98ac64762c9dfce9ca05b12e08a8ff3d91c9012f1a3b1ecf184b5" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Gitcoin and hopefully other grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "8-10" - } - ] - } - } - }, - { - "projectId": "0x52f41f0f49803ae47f13977a8a5dd1b170348e82e2d59303861efb83d1413b50", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0x674e6be652e8a465b757bc4c38f2b4f6053fbb558de08b184345e47b3602e14e7c5f4546d8f1d074d27a44dfc437a304554fb6dacdb138a026aac889f68f0d811b", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0xFC148c92062Ae30D788d48031b89B45237f27AF7", - "project": { - "lastUpdated": 0, - "createdAt": 1673521155301, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:157", - "title": "Bundle \u26a1\ufe0f\u267b\ufe0fRenewable Energy", - "description": "//////////// \ud83d\udc41 LOOK HERE \ud83d\udc41 //////////////\nThe BEST place to read about this bundle with images is on \n\ud83d\udc49 https://bit.ly/RenewableEnergyGrant \ud83d\udc48\n\udb40\udc20\n\n/////////////// \ud83c\udfc3\u200d\u2642\ufe0fTL;DR ////////////////\n\n//// \u26a1\ufe0f\u267b\ufe0f WHY SUPPORT THE RENEWABLE ENERGY BUNDLE \n\n\nEnergy is the \ud83d\udc49 biggest problem of the Climate Crisis \ud83d\udc48 \nsince its consumption is responsible for 75.6% of all global CO2 emissions \ud83e\udd2f\n \nThese projects are working hard to \ud83d\udcc9 reduce emissions and create new ways to increase the adoption of renewable energy in its many forms.\n\n\nWe are focused on directly funding renewable energy development around the world while creating decentralized energy grids and data centers that heat spaces with compute power instead of wasting energy on cooling. This removes middle men, makes climate action programmable, improves access to stable electricity and accelerates the world\u2019s transition to sustainable energy and heating.\n\nIf you want to put your chips on a sector that is e-x-i-s-t-e-n-t-i-a-l and fundamental for solving climate change, it would be this.\n\n\udb40\udc20\n//////////// \ud83d\udc68\u200d\ud83d\ude80 THE PROJECTS /////////////\n\udb40\udc20\n\ud83d\udc49\ud83d\udc49\ud83d\udc49 7ENERGY\nEmpowering Renewable Energy Independence for Energy Communities \ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66\u26a1\ufe0f\n\nJoin the 7Energy revolution and take control of your energy \u26a1\ufe0fconsumption! Our platform and community empower individuals to optimize their energy usage and cost, \ud83d\udcb5 while breaking free from dependence on fossil fuels and big corporations. Be a part of shaping a sustainable and healthy \ud83d\udc9a energy future for all.\n\ud83d\udc26 @7EnergyDAO \n\ud83d\udd17 https://7energy.at\n\n\n\udb40\udc20\n\ud83d\udc49\ud83d\udc49\ud83d\udc49 ZERO LABS & BLOCKS GARDEN\nEmbedding tokenized renewable energy into any digital process or app + Blocks.garden to MakeCryptoGreen\n \nthrough tokenized Renewable Energy Certificates (REC) and our simple API, making climate action programmable and automatic \ud83e\udd16, building radically accessible and transparent tools that make it easy for anyone anywhere to buy renewable energy \u267b\ufe0f\u26a1\ufe0fand prove it on a blockchain, and tell the story of their impact with \ud83e\udd29 gorgeous human readable \u2705 Green-Proofs 2\ufe0f\u20e3. We call this vision \u201cprogrammable decarbonization\u201d.\n \nWe recently \ud83d\ude80launched Blocks.garden 3\ufe0f\u20e3 to #MakeCryptoGreen, starting from decarbonizing Ethereum\u2019s 1 historical emissions. \n\ud83d\udc26 @zerolabsx \n\ud83d\udd17 www.zerolabs.green \n\n\ud83d\udd17 2\ufe0f\u20e3 https://app.proofs.green\n\ud83d\udd17 3\ufe0f\u20e3 https://.blocks.garden\n\n\n\n\udb40\udc20\n\ud83d\udc49\ud83d\udc49\ud83d\udc49 FUROA \nFloor heating with compute power \n\nData centers consume 2% of the world\u2019s electricity but 40% of it is wasted on cooling \u2744\ufe0f. That\u2019s enough energy to heat millions of homes \ud83c\udfe1 or offices \ud83c\udfe2. And that\u2019s why we\u2019re building Furoa\u2014a floor heating system that heats spaces with compute power \u26a1\ufe0f; laying the foundation for zero-emission, truly decentralized computing \ud83d\ude4c. Since GR15, we\u2019ve established relationships with component suppliers and updated the design to reduce production cost and energy consumption.\n\ud83d\udc26 @FuroaCo \n\ud83d\udd17 https://furoa.co\n\n\n\n\udb40\udc20\n\udb40\udc20\ud83d\udc49\ud83d\udc49\ud83d\udc49 KHALON BRIDGE\nDistributed Solar for Web3 Creators in Nigeria\n\nNigeria is at the leading edge of the web3 ecosystem but suffers from a notoriously collapsing electrical grid that impedes developer talent from keeping up with the digital economy without having to buy pollutive generators. Khalon Bridge is a development studio collective of over 40+ web3 operators and continues to provide residential solar to emerging talent in the region to advance the digital economy in Africa.\n\ud83d\udc26 @Khalon Bridge\n\ud83d\udd17 https://khalonbridge.com/\n\n\n\n\udb40\udc20\n//////////// POWER A \u267b\ufe0fFUTURE /////////////\n\n\ud83d\udc9a Be a part of the solution and not the pollution. \n\u2600\ufe0f Join us in powering a brighter future!\n\ud83d\ude4f Support renewable energy by donating today! \n\ud83d\udc49 only on ETH mainnet\n*********************************************\n\n\n\udb40\udc20\n///////////// \ud83d\udc41 REMEMBER \ud83d\udc41 ///////////////\nThe BEST place to read about this bundle with images is on \n\ud83d\udc49 https://bit.ly/RenewableEnergyGrant \ud83d\udc48", - "website": "https://bit.ly/RenewableEnergyGrant", - "bannerImg": "bafybeibkqqev5k2mwcbe2pdhhypm6qmshhq4crxrdklsvgvfklbfeotf7y", - "logoImg": "bafkreidmtsiwtu6zapbuli2eswe6zdszftmia2r4totaixgqptzmusp23u", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreigwxtoxyxkepx3ko3l64gnrod4mxp4osfr5ff4f4yn5k7a3omhcre" - }, - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "EEXlePxVYstu1zm6LQb+/ZrXd1xvuw9kSespddF4B9v0IOJsHpggxMijcj1a+R4m", - "encryptedSymmetricKey": "a9218efd500e4ee81aa2251fcea4e1a6341ad3f4982d869ebdfcc2cb69ad5bafcf0bca72b047b59f2dfc429918ea480f5d560356a7512de9d6d42811a56996938db319a5dee267ab230f18eb5cae5b7b1853e283b2247396230638dd80fc988be3b574fcdc11857b4a58fa15ce4eee31816d90425265419825c31fb032b861730000000000000020e323f59f555662185de859eb114500958dfece11c6e15b6f71142482acfeb0e43860d526a7b93ae25310486e697096a3" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "4" - } - ] - } - } - }, - { - "projectId": "0x5b82b9d0cb3d0d14c8fe693502b197cfbc0f55115446632448549da20538c96c", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0x4bd5d954c650cdcd022510b171a1762f26bfab95b0576e519ee8d9738ce2429600e420ac2cc3775e8eec06bcd589f5b49864127bf4d6ce468743a8ecd807abe01c", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0x29C40842a76B0aa28865EbF7c916ec820233b7bB", - "project": { - "lastUpdated": 0, - "createdAt": 1673501426873, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:145", - "title": "Bundle: Climate Research Alpha Round", - "description": "Mission Statement:\n\nTime is running out. Climate research today needs to focus immediately on practical solutions. We need research that leads to mass movements and exponentially growing impact. Like the US Advanced Research Projects Agency - Energy (ARPA-E), the Climate Research bundle will be a key engine of climate innovation and climate action. While fixing our sights on the high bar set by ARPA-E is wildly ambitious, we know that blockchain technology can exponentially increase effective and efficient scientific research. Integrated indicators make the research replicable and scalable and allow improved documentation and verification. The ambitious and innovative projects in the Climate Research bundle will architect many systems of the new infrastructure of climate research and scientific collaboration. \n\nThis bundle is comprised of 8 critical and interrelated projects address various challenges of climate research by generating:\n\n\u26a1 Clean, cheap, abundant, and reliable sources of energy and the need to mitigate the negative impacts of climate change on cities and urban areas.\n\n\ud83d\udca8 Increased speed and efficiency of traditional methods for conducting and translating scientific research\n\n\ud83e\udd2f Solutions to the complex set of root causes that contribute to the long time it takes for scientific research to be implemented in real life\n\n\ud83d\udd0d Increased transparency, traceability, and access to funding for scientific research\n\n\ud83e\uddbe Effective mechanisms to protect intellectual property, reduced investor risk in, and increased investor access to the scientific and technological innovation process\n\n\ud83e\udd11 Profitable ways for companies to align with community values related to climate change\n\n\ud83d\udd2c More effective research, and strategies for promoting and supporting scientific innovation that positively impacts the world and its inhabitants\n\n\ud83c\udf31 Developing regenerative data tech, storing digital data in the DNA of plants and trees, to create carbon absorbing data storage\n\nThe projects contributing to this effort are:\n\n\ud83c\udf0e FrontierDAO\n\ud83c\udf0e SCINET\n\ud83c\udf0e Option\n\ud83c\udf0e ScienceFund\n\ud83c\udf0e Internet of Animals\n\ud83c\udf0e Defi Biolabs\n\ud83c\udf0e Circonomy\n\ud83c\udf0e Grow Your Own Cloud DAO (GYOC DAO)\n\nFrontierDAO @FrontierDAO; Collectively incubating scientific and engineering innovations and innovators, using Web3 tooling (linktr.ee/frontierdao).\n\nOne of our key focus areas is \u201cfusion energy as a climate solution.\u201d Fusion energy, while still in its infancy, is the technology that will usher in a new era on this planet - one where cheap, clean, abundant, baseload energy is available for all. \n\nNuclear fusion energy is the energy of the stars and sun. It is the opposite of nuclear fission.. \n\nTo help usher in this new era of transition to clean energy, FrontierDAO has released in BETA an IP NFT on-chain scientific publishing platform called FrontierRegistry. By publishing research on the blockchain, we aim to foster greater collaboration while protecting authors\u2019 IP rights. frontierda.xyz/faqs-projects\n\nFunds raised from GR15 were used to partially underwrite a 12-week Fusion Energy As A Climate Solution weekly workshop series that ran from November to mid-January. Interviews can be found on Youtube.com/@frontierdao. \n\nSCINET, INC @scinet_inc. At SCINET, we are increasing the speed, efficiency, and effectiveness of life sciences research from \u201clab to life\u201d by developing a suite of software applications in a decentralized (\"DeSci\") life sciences ecosystem that addresses the complex set of root causes for why it takes 17 years for life sciences research, including climate solutions, to get into real life (see here for socials, media mentions, website, etc.).\n\nWe help scientists conduct and translate research faster, more accurately, and more efficiently by offering them a unique confluence of decentralized funding, blockchain-protected IP, unique trust mechanisms, and commercialization strategies that reduce investor risk, increase scientific innovation, protect intellectual property, and positively impact the world and its inhabitants.\n\nOption, @option_hq: Option is a prediction market for governance that incentivizes companies to align with community values, including those related to climate change, by making it profitable for them to do so. An example of climate governance using Option could be creating a market where players can make predictions about a company's carbon emissions reduction targets. If the company meets its targets, those who predicted accurately would be rewarded. This would incentivize the company to align with community values and reduce its carbon emissions in order to profit from the market. Furthermore, the funding provided by the market could be used to support research and journalism focused on climate change and carbon emissions reduction.\n\nScience Fund, @sciencefund_io: Fund basic science with donations recorded for posterity on the Ethereum blockchain. \n\nScience Fund is empowering scientists to freely, openly, and rapidly pursue their best scientific ideas. To achieve this, we are reimagining how discovery is funded. No grant applications. Transparent, traceable funding records. Rapid funding cycles that support more ideas early and continue funding what\u2019s working. In this Gitcoin Round, we plan to test some of the mechanisms we thought out. At least 80% of the funds collected in this round will go towards our first Climate Action funding pool, the \u201cUrban Climate Impact Mitigation Pool\u201d. \n\nSpecifically we will support \u201cUPP\u201d - the \u201cUrban Planting Project\u201d incubated at the AKASHA Hub in Barcelona. UPPs mission is to turn every available city space into green islands of chill. By easing heat stress, UPP is helping to mitigate the effects of climate change and promote new sources for local food production in cities. UPP has already formed partnerships with local universities and communities to deploy its \u201cUPP toolbox\u201d and will apply S.M.A.R.T. principles to quantify the project's impact both through technology including real-time tracking, and satellite imagery as well as by documenting the social impact of their project.\n\nDonors to our Gitcoin grant will be recorded in the funding pool through their Ethereum addresses and will receive certificates of the impact that allows them to unlock information and data about the project\u2019s success at regular intervals in the future. \n\nInternet of Animals, @WildlifeMovemnt: Our mission is to create a community of scientists that promotes the design, development, implementation, and improvement of accessibility to software, hardware, and knowledge resources related to wildlife movement ecology. To realize that vision, we formed The Wildlife Movement Institute, a nonprofit organization to be a hub for this community for local, regional, and international collaborations \u2013 whether you are an expert or someone passionate about wildlife and technology. Since the end of GR15 we have established a bank account, set up a business account on CoinBase and are now preparing to invest in web development and getting 501(c)(3) tax status. \n\nDefi Biolabs, @Defibiolabs: Bioengineering algae to reduce greenhouse gas emissions. \nGR15 Grant: https://gitcoin.co/grants/7497/defi-biolabs-is-engineering-cyanobacteria-to-prod\n\nCirconomy, @CirconomyDAO: Recycle & Reuse 2 Earn 2 put the \u201ceco\u201d in \u201ceconomy\u201d (https://www.circon.me). \n\nWe aspire to become a DAO platform to proliferate circular economic projects all over the world. We'll accomplish this by building a dapp which will have a combination of on-chain registration of hardware-based circular economic projects such as Precious Plastic. This will be crowdfunded to ensure common ownership and stakeholdership. This will be supported by on-chain tracking of all recycling activity which will have a recycle-2-eajjrn cryptoeconomics model underpinning it.\n\nWe are currently creating a crypto-back solution for the world of recycling & reusing. We\u2019ll accomplish this by tokenizing existing points-based recycling/reuse-2-earn programs administered by not-for-profit organizations such as Circulr.ca and RedeemClothingRecycling.com. This allows us to better empower end users with an interoperable incentive that would have a unified reward pool amongst all of our partners as well as grant more autonomy to our partners to scale their operations.\n\nThe high-level summary of our tokenomics is as follows - there will be a dual-token system whereby:\nThe token users will earn will be created by coalitions between brands and nonprofits so what we mean by this is - depending on the material in question and/or other factors, we\u2019ll have coalitions of for-profit and nonprofit organizations that will mint a utility token together for earning. As an example - ideally, all clothing-recycling will have one utility token governed by all nonprofits that handle clothing recycling whilst the for-profits will be sustainable fashion brands. Likewise, all plastic-recycling will have one utility token governed by all nonprofits that deal with plastic recycling whilst the for-profits will be sustainable toy/merch companies. In that latter example, there may be multiple coalitions given that the toy industry is a specific/niche market. But regardless, we\u2019re starting with the fashion industry as our MVP.\n\nThis utility token will not be tradable in the exchanges because Circonomy itself will have a token that will be liquid in the exchanges out there. This token will be token-bonded to the utility tokens within Circonomy\u2019s ecosystem and thus in order for users to either obtain other utility tokens or liquidate them, they\u2019ll have to exchange their utility token for the Circonomy token. Each utility token will be exchangeable for rewards such as discounts or exclusive access to brand events that are token-gated or NFT phygital goods. But if they don\u2019t care about those things, they may simply liquidate by way of exchanging for the Circonomy token and then selling their Circonomy token, or they may stake the Circonomy token for gains of course and helping to drive value.\n\nGrow Your Own Cloud, @_GYOC: develops regenerative data technology, storing digital data in the DNA of plants and trees, to create carbon absorbing data storage. \n\nIt works! We\u2019ve just been awarded the science breakthrough of the year from Falling Walls for our functional prototype 'Data Garden'. We\u2019ve also just finished an EU-funded research project that demonstrates how urban scale implementations of GYOC could absorb megatonnes of carbon and store terabytes of data.\n\nNow we\u2019re developing a unique Web3 offering we call \"Non-Fungible Plants\" (NFPs). NFPs are physical plants with data encoded within their DNA. Data like JPEGs and MP3s. They\u2019re the first truly plant-based NFTs ever created. They\u2019re the first step to build data systems that work in harmony with living systems for maximum positive impact.\n\nTo enable our vision, within Web3 we are forming GYOC DAO: an internet-native organization dedicated to accelerating the transition to truly green data storage. Funds raised through this bundle will help the continued growth of an organization which more closely resembles a public good than a traditional tech company. Together we can create a future where server farms could be replaced by data forests. \n\n", - "website": "https://www.notion.so/Climate-Research-Bundle-Project-Description-4254cf8973f14b428feacc157dbc2021", - "bannerImg": "bafybeibpeazvzjn4eewcj2t3p4ylifuxlurgwz3hhkml3vh5ux7ebgdqza", - "logoImg": "bafybeidgeo5rhrpc4lly4e3gpjwim4zyatofeg4wbflpmmbhr26dh23bpy", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiah6du6ip5csrtwedu2qdlaubg5hadxsr536auvrfrjtt6aefk6zq" - }, - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "hs/BHT4QKvU7oSE/EF8o7RZig5w6y9dHLbl3/EP+okwc/4VwxKeTNPelvDG+2tDr", - "encryptedSymmetricKey": "6bfc8a57ccb2779ff3064dfe9607cf5b8379b2a3056641837ffb3f09a2f39e361fe40a40e15d273971a3a30a51c1dc13ecaca528131d05a454acebef99645927b36d548f2ce9ce2988b61066fda9cb3259d690459793d06ed9f4d743fc76b0b923f51e81723d5f4269b6ec2f81f0d90c31fe7a78faee080c5b12987d27268ad4000000000000002096df0e0bbdad8199a34bb1f62df294f2b54e1b566ad74fac0fccf6dd0aac764dc79badecb2764a17ea3db8cd17441581" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "8" - } - ] - } - } - }, - { - "projectId": "0x5c31eaad4f03c467e71bdc6edbc2360a014b2001045b0d583167544c032a8fde", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0x8ce1585e1d673566b055736edad5b64cd1c5b87b731c89b67131f7d8801741ee1f12bf0d92be5548574f943c7c0929d489f5e63aceb8a63b1f84dfc95d68e93e1c", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0x7f722b8b013Ac7Bd654B3B102Acc7573A32DB9bc", - "project": { - "lastUpdated": 0, - "createdAt": 1673499386437, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:144", - "title": "Saving forests in Colombia with KOKO DAO", - "description": "KOKO DAO is on a mission to reduce deforestation in Colombia \ud83c\udde8\ud83c\uddf4\n\nWe work closely with the local communities to create viable economic models as an alternative to deforestation.\n\n\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\n\n\nWhy Focus on Small Scale Forests? \ud83c\udf33\n\nRural communities and small land owners\u00a0have neither the resources nor sufficient amounts of land to receive compensation from forest preservation efforts through carbon offsets. This makes deforestation the most economically compelling option for them.\n\nFortunately, blockchains allow us to demonstrate the proof of impact of small scale conservation projects in a transparent and trustless way. \u2028This makes it possible for us to design new ways to compensate rural communities for preserving their land.\n\nWhy Colombia? \ud83c\udde8\ud83c\uddf4 \n\nColombia is the second most biodiverse country in the world, the first in varieties of birds, orchids and butterflies.\nThis biodiversity depends largely on the survival of ecosystems like forests. \n\n50% of Colombia\u2019s territory is covered by forests, however, we are losing 500 hectares of forests every single day.\n\nWhat is causing deforestation in Colombia? \ud83e\ude93\ud83d\udd25\n\n- Lack of opportunities and education in rural communities. \n- Solutions to forest preservation like carbon credits are not a sustainable economic model for small-scale forests.\n- Increasing deforestation in protected areas like national parks.\n- Cattle farming and extensive agriculture\n- Ilegal drugs production \n- Lack of infrastructure \n\nHow do we avoid deforestation? \ud83d\udc12\n\n\nOur model aims to create avoided deforestation credits for small scale forests and collectives. Supporting local communities to actively create and manage their own projects. \nMore info and model in our website www.kokodao.xyz \n\n\nWhere is the money going? \ud83d\udcb5\n\n- Onboarding non web3.0 impact projects to crypto\n- Recruiting team for social media and product development\n- Support local school in the creation of an endemic tree nursery\n- dMRV technology implementation in our pilot project: 15 hectares of native forest in Huila, Colombia.\n- Legal expenses. \n\n\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\ud83c\udf33\n\nFind all our docs in: \n\nWebsite: https://kokodao.xyz/\n\nNotion: https://kokodao.notion.site/KOKO-DAO-c2250b8ab58548ad8a0cf487ff4f4522\n\nOther links: \nTwitter:@kokodaoxyz https://twitter.com/kokodaoxyz\n\nDiscord: https://discord.gg/B2vgk7NwHq\n\nYouTube video: https://www.youtube.com/watch?v=Q6a6fJ9W4Vg\nContact: hello@kokodao.xyz\n\nKokodaoxyz.eth \n\nThank you for your support \ud83d\udc9a", - "website": "https://kokodao.xyz/", - "bannerImg": "bafybeiaobzaukind446e6ynsvjqyscvx4kyalzl35w4bkrd2yjaeg7ml4m", - "logoImg": "bafkreifyiohonjowzayoeemo5cuoje63zklgt54sjbldfeqlph7h5bynwi", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiganuwrrxlzlami5vtrmx5kxzgkjewhdc74uvcskxx2ibh5s4pfwu" - }, - "projectTwitter": "kokodaoxyz", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "dJvaTxQzKz9RYuN+BN6h+ekbTtePhjTD+Z0IOw5QPNgyTDYkr2G/3j01tVFGZ9Yy", - "encryptedSymmetricKey": "087ad36985c059346e0e3941e5ec4635bc6dc6be2658703031da55c97bb2728b0ce7ef601b7e1816b291c12c8a6a900c8cb410b2e0df6395d8eb03334c3d9681aaf77b31042716e94b9d2fed35c3441889bbff797bae1a012af39ca6fb37aeb34bdc1c12c77c6f6b1aae86360b296d4b97d06df4efa08f66c4789551c2f093030000000000000020a1b6892f0fb56d1f35d97414de027c7c761c1992eef5fde9967cf9b55be59eb766ffbd7576948b7770d382ba1d990891" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Gitcoin" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "1" - } - ] - } - } - }, - { - "projectId": "0x70d59317f7bfd1fb5b9a757c3f30f52f536ad7eb219504a5dc8e8414a2fcb66b", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0xb897e22d904d8910dc8faa72ee6b1207968c81f029396e475bfc8b3a6e77552a2264dd8824565506125acc2731bf35303d9182af493c9f8d8b9c101831607d031c", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0x2DeE5D7e77A1212b21139Bc1d98B249DCc52055D", - "project": { - "lastUpdated": 0, - "createdAt": 1673385018110, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:108", - "title": "Natives in Tech", - "description": " \n\ud835\udd46\ud835\udd66\ud835\udd63 \ud835\udd44\ud835\udd5a\ud835\udd64\ud835\udd64\ud835\udd5a\ud835\udd60\ud835\udd5f\n\nTo cultivate a tech ecosystem of Native technologists crafting free and open source technology for Native communities\n\n \n \n\ud835\udd4e\ud835\udd59\ud835\udd60 \ud835\udd4e\ud835\udd56 \ud835\udd38\ud835\udd63\ud835\udd56\n\nA community of Native/Indigenous peoples and allies working to build open source projects, educate Native technologists, and onboard Natives into Web3\n\n \n \n\ud835\udd4e\ud835\udd59\ud835\udd52\ud835\udd65 \ud835\udd68\ud835\udd56 \ud835\udd52\ud835\udd63\ud835\udd56 \ud835\udd68\ud835\udd60\ud835\udd63\ud835\udd5c\ud835\udd5a\ud835\udd5f\ud835\udd58 \ud835\udd60\ud835\udd5f \ud835\udd5a\ud835\udd5f \ud835\udfda\ud835\udfd8\ud835\udfda\ud835\udfdb\n\n\ud83d\udd38 Lakota AI Code Camp\n\ud83d\udd382023 Conference\n\ud83d\udd38Native Job Board\n\ud83d\udd38Organizing members around Regeneration projects\n\ud83d\udd38Governance models, signaling and voting on proposals\n\ud83d\udd38Crypto education\n\ud83d\udd38Web3 stack education for Web2 developers\n\n \n \n\ud835\udd3d\ud835\udd66\ud835\udd65\ud835\udd66\ud835\udd63\ud835\udd56 \u2119\ud835\udd63\ud835\udd60\ud835\udd5b\ud835\udd56\ud835\udd54\ud835\udd65\ud835\udd64\n\n\ud83d\udd38Upgrade our open source project, \"Native-owned Businesses\" to use decentralized storage\n\n\ud83d\udd38Fund open source Web3 projects built by Native technologists to support:\n\n\u25fd\ud83d\udd39Regenerative agroforestry\n\u25fd\ud83d\udd39Media + education (e.g. participatory media, nature documentaries, knowledge content, created and distributed by local communities)\n\u25fd\ud83d\udd39Local natural research and biolearning\n\u25fd\ud83d\udd39Cost-savings on infrastructure like solar panels\n\u25fd\ud83d\udd39Land back\n\u25fd\ud83d\udd39Tribal Currencies", - "website": "https://nativesintech.org", - "bannerImg": "bafkreicaixlctocpmyo5x6pifmsbmbgxkegfmcciutcarwwd6xtxvgekbe", - "logoImg": "bafkreicpvd7sn2ejfa3kuh2hic4aw34ojdp4vzb4ohnfc7fleezsg6dopq", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreih5rd3xrxxeefvaol63kt6ss7l2orhleo4jtnz3wp3s5owesdojj4" - }, - "userGithub": "hollygrimm", - "projectGithub": "nativesintech", - "projectTwitter": "nativesintech", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "g50lvchkrr/wKPZD85I6qnSImpfkDJMXB0ln4KvLwikwX09t3HQTGHzm6epE9hX2", - "encryptedSymmetricKey": "86737c306c08ec503e8ab522f9372631a23340766fdff40d64225901458116c838b59c486acea654583d458c798159107c3a0f61e581fe552b08f49032153b44adb77422bfe969d72180a6e55691e68cf08d1966101df6686a543b3f9a41d78d49524bb2c8a91c6ef998da28a3f72c473ee91d12e50afea34d8e092999d2fb7000000000000000203da23733bdfb601fd0bb7cc0510c7828300d481b8e01208460f77fbaa39f8c9cc31a98019423c6edc95d60234750f4a7" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "12" - } - ] - } - } - }, - { - "projectId": "0x7352c239d0dd8c39062300c7a507aed952f61908a44b0a0e146d8b6eec846e58", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0x6f5e2ba0d328319706b9e0ad82d7a86e757e10909893c987deeb0830eeaa2d7112b10c52db71d10fde6c4b27a318fbbe5a27b10b965d5b9da39c988171013ed01b", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0x86579EBcE57605929Da73d8cE17f40960c3b052a", - "project": { - "lastUpdated": 0, - "createdAt": 1673525126583, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:158", - "title": "Shamba Ecological Oracle and DMRV Network", - "description": "About Shamba:\n\nShamba is building a decentralized monitoring, reporting and verification (MRV) network to power regenerative finance - ReFi. Shamba also runs an ecological data oracle powering several web3 applications.\n\nWhat we have achieved since GR15:\n\nSince GR15 we have completed the development of our web app solution to support farmers getting into regenerative finance. We are now deploying this solution with farmers who want to start regenerative projects. (https://refi.shamba.app)\n\nBuilding off of our success deploying the first web3 ecological data oracle last year (learn more at https://docs.shamba.app), we are now aiming to roll out a full digital MRV solution to support the ReFi projects.\n\nLast year also saw us roll out tools for analyzing satellite imagery from various space agencies (https://insights.shamba.app) as well as tools for generating smart contract code that uses satellite data (https://contracts.shamba.app). These tools were developed to support the developer community to easily utilize ecological data in their web3 applications.\n\nWhy MRV: \n\n\nCarbon projects MRV has traditionally been expensive and oriented toward large-scale projects.\n\nOur goal is to make MRV affordable by leveraging satellite data, machine learning, geospatial modeling and ground sampling. We aim to combine this with a network of skilled people to provide the data needed to characterize natural landscapes and quantify the impact of regenerative actions.\n\nWe aim to provide a cost-effective alternative to traditional MRV which is unaffordable to the typical smallholder. Once deployed, our solution will enable smallholders to access MRV services at an affordable cost.\n\nAlpha Round Goal:\n\nIn this round, we aim to fund the collection of scientific data to establish carbon stock baselines. As we support farmers kicking off carbon project pilots in Kenya, we need to create datasets that reflect the above-ground and below-ground carbon stocks on these farmlands to act as baselines. This will allow farmers to quantify in the future the impact of their regenerative activities on carbon stocks by having a point of reference at the start of the activities.\n\nBaseline data:\n\nThe data we collect will be synthesized into carbon maps that will be available to anyone who needs such data. Open data is one of the most important classes of public goods and we believe the datasets we produce will impact multiple projects and serve multiple beneficiaries.\n\nThe data will benefit not only small farmers launching carbon projects but also researchers and policymakers who need to make data-driven decisions around the climate and agriculture.\n\nPilot sites:\n\nWe will begin by mapping out carbon stocks in several sites in Kenya where pilot projects are starting, then expand to cover other bioregions as we refine our techniques. The funds we receive on this Alpha round will inform the geographical extent we can map under this initiative.\n\nTarget datasets:\n\nWe aim to create soil maps and land use land cover maps to quantify below and above-ground carbon stocks. \n\nWe will use a combination of ground sampling, remote sensing, secondary data and geospatial modeling in creating these datasets.\n\nLearn More:\n\nGet more details on our plans to collect baseline data for carbon stocks across African farmlands by visiting this link:\n\nhttps://shamba.notion.site/Shamba-Gitcoin-Alpha-Round-Page-3cf3475e7bc64d8f9a649aadf4f4a37e\n\n\nVote of thanks:\n\nWe thank you for supporting us in developing our solution and look forward to your support as we roll ReFi out to rural farmers across the Global South.", - "website": "https://shamba.network", - "bannerImg": "bafybeibjosjhc5m3k2e726eojfk4ecgnnsobotc6za56ccxyaieoufqhj4", - "logoImg": "bafkreih6jg7hvrrgme7jnsuaaonyxeioroqnm7wldmqxg7hl4ra6qjjqja", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreif6ppj3mimzyqgt3m5rmcftmls2roxwtkgyyaxndvy6jwrwojtawm" - }, - "userGithub": "kenGIS", - "projectGithub": "shambadynamic", - "projectTwitter": "shambanetwork", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "c4mvEs3DlkYfB0GkyPfV9WWerJ5vMoDQrqQUicy5i0eSxd5rCKKcHXAxE38yBXLH", - "encryptedSymmetricKey": "f72c33d3008622be228ec0e09333b4c41fbf0eb21583a6d0e55af6723cc5352e28a044d37b209ef50546c4d204240b0f0ad59c98eada80b3b207de9d07256d072f864f6102025e06b063d62872f8758777255a1e8fe579cb56cb427ea903d999d17c922b5cfa61b9ee3bdbe5048fa6e591a889da12289bb232f23e906c01c7c300000000000000203b1ffa7acb300cdf812027836a9faee23675d64a610bd245fb2153e057fc75b90993809500719555a57318c2f4a9e897" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Gitcoin" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "7" - } - ] - } - } - }, - { - "projectId": "0x785ab248b1c65ee0605ae77c028ec5c79fe96cf57ca184c3fdb8da7c224b6e0e", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0xd52c2f3602657669c7b72e275024df26fc25e601250d37005b6db46ba0e62ce433cb4f44cff12fecb9ed70d3eb21f08a250ce5f5dad383a693d53f0ef2ce3b2f01", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0x476Bb29493fcB007e3F80c83A3BF80f3f34610fb", - "project": { - "lastUpdated": 0, - "createdAt": 1673041366937, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:51", - "title": "Bens Test Thinger", - "description": "This is a test of the Canadian broadcast system... \n\nThis is only a test... ", - "website": "https://benwest.blog", - "bannerImg": "bafybeidy7vbgqjl5xjmjoeefxh2lthgigs7irthqfvru2cvubvotjuj22q", - "logoImg": "bafkreihjbhnw54f5wikgp34ufbtuom4dgskrtiqfkunp4b5fedybk3ey5y", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreihy55vazev5ucpjqbccjxlh2jztpzlgmgqdm35pdbbpkodrjp7dve" - }, - "projectTwitter": "benwest", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x41105A64A7Ae18Bd6c31363ef5FD99dD574f7874", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "hash": "v0.0.0:U1McTB5MVxdvgQMA1bwZm6Zf7W3ZNjlMJytM5rTFZYw=", - "provider": "ClearTextTwitter#BenWest" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-12T03:15:41.581Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-12T03:15:41.581Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..m7QZzyte33WoUJnuJpsgH4xA_V8hLjMVY1apvrN-19-D8AafA1UOI2UHyAoAxgRKyd3Gu8MylkHmxbSsS88MAw" - }, - "expirationDate": "2023-04-12T03:15:41.581Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "+RpciZXzwK33j7Lnti5CBdXYI4ZgcfchemeNUNChC9c=", - "encryptedSymmetricKey": "00ad2f62a0c8ade3157e02f1e20c39b2f6e8e6cf346d573e47c6f82a71829fa5826b230140ca49d7d3bdf604fbef4709a5e409db9c6a6a2f7b4b44bad202a56294780175e6435c9e12948a44ed2dba1947403952be794b5b2a1bee67c4c32a8094de3aacfee094c77024fbe9d67cb86bacdcddcd1625929c1e0bd25b62eff8e10000000000000020109adcbd9c01f8ccd7ee55e12d1305b9f1cde959b8d78965a843030f9578be3680a7ac4d72aa7c282af3bf49a9476f83" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "E.T." - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "1.333" - } - ] - } - } - }, - { - "projectId": "0x78b858009ecfa46c866a7765cf0665699dd097eaadc3bdf9fc4f1f2229823bf5", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0xfdd417c7d5fae5a36d0e75ab2c3f39c0a0bc672795b4f2bb1211ef7bea5b09d458559fbd1ba30c468caaec0bb9ba1a731b2b6e494472a4af66ac279efbca719201", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0xF427EbbEb0AeE1b06C99333001009188B5086934", - "project": { - "lastUpdated": 0, - "createdAt": 1673365909936, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:100", - "title": "WaterDAO", - "description": "WaterDAO GR16\ud83d\udca7\n\nThis WaterDAO grant is a continuation of the ReFi DAO Water Circle grant made in GR15. Since GR15 the WaterDAO has grown quickly. The WaterDAO has already begun multiple research projects such as credit class development, solvent extraction desalination testing, and Solar energy desalination analysis tool feasibility. The WaterDAO also has two pilot projects planned to begin in 2023 to treat water. The goal of this grant is to help to bring the first RH2O credits on chain earlier than expected by focusing on developing automated monitoring systems and broadening our verification efforts. \n\nThe purpose of the WaterDAO is to create transparency around sources of water, how they are generated, and establish a water credit classification system. We believe this can be done by creating a trustworthy and verifiable water credit that can be easily purchased and used to offset water usage. This would allow companies to continue to focus on their operational efficiencies while supporting the replacement of their water usage with equally efficient water producers.\n\nThe purpose of the WaterDAO can be summed up through four main goals:\n\n1. Create a universally accepted water credit that is first supported by the Regenerative Finance (ReFi) community and eventually, by larger outside organizations. This credit class can serve as a building block for many types of water credits to be created.\n\n2. The WaterDAO will act as a support mechanism to verify credit quality. The DAO will oversee specific verification standards to provide a certain level of quality, standard for the credits issued through the DAO. \n\n3. Incentivize companies to be \"Water Positive\" or at lease Water Neutral. This will come as the DAO expands and gains more influence. The DAO will make the process of becoming \"Water Positive\" a significantly easier process than it was previously, leaving companies fewer excuses to maintain their indifference. \n\n4. Incentivize more environmentally friendly forms of desalination and other water treatments. This is done through a tiered credit system. For example, a water producer using desalination methods that require energy intensive methods and that has a potentially damaging runoff, would only qualify for second tier credits. To receive top tier credits, water producers must power their operations with cleaner and less energy intensive methods while mitigating harmful runoff. \n\nRH2O water credits will be validated through the Regen Network. \n\nIf you are interested in joining our mission, please visit our website and join the Discord channel to get involved, we look forward to seeing you!\n\nA little bit more information if you have read this far:\n\nThe WaterDAO will not only be validating water credits, but also actively working towards increasing the development of water treatment and credits by funding targeted areas that the DAO deems to be impactful. These areas will likely include:\n\n-Funding of specific tier 1 water treatment projects\n\n-Water technology development\n\n-Pilot projects leading to IP development\n\n-Sponsor water research and development\n\n-Acquisition of a specific water asset that can be licensed to water projects\n\nBy funding water treatment projects, the WaterDAO is able to further develop the water credit space. The WaterDAO treasury will hold assets that are created or purchased by that DAO. These assets can be licensed out to water producers to help them provide higher tiered credits. The DAO will get to vote on the licensing agreements for specific projects as well as which ventures will receive funding. \n\nValidating water credits:\n\nEach credit validated by the WaterDAO represents one cubic meter of additional treated water that is added back into the water system that is represented by the credit. Water generators who participate in the WaterDAO can mine water credits using Proof of Water (PoW). Once a water generating facility is certified to produce regenerative water (e.g. solar desalination), it will receive a blockchain-enabled IoT smart meter that communicates directly with the network through Proof of Water. PoW is a way to secure water by ensuring that every regenerative water credit (RH2O) is backed by a physical unit of water mined on the RH2O network. Water miners are rewarded with water credits by using Proof of Water to validate the generation of a unit of water and communicate the data associated with that unit of water through the IoT smart meter. In the future RH2O tokens will serve as water contracts where physical water can be collected. In addition, the physical mining of water ensures that the creation (supply) of water credits is limited by the capacity to generate physical water and the value of each RH2O token is a function of the balance between supply (miners) and demand (users).\n\nThe WaterDAO will have specific credit classes based on the Regen Network that water producers must fall under in order to produce a specific credit. The first water credit will be for desalination projects and will generate RH2O (Regenerative Water Credit) tokens. Each Regenerative Water Credit measures one cubic meter of treated water that is added back to a specific water system. In other words, these credits are localized and set to the specific water system in which the water has been added. RH2O credits are only produced when water is verifiably added back into a water system.\n\nWe will create three tiers of water credits based on the applications suitable for the quality of treated water. The credit tiers are based on a 100-point scale designed to promote the activities we deem to be the most advantageous for the health of the environment and to stimulate technological innovation.\n\nThose wishing to be funded through the DAO will be required to fill out an application form. Once completed, the DAO review committee will evaluate the results and assign values based on eight parameters.\n\nThe results of the application will designate the project as one of the three water credit tiers based off of Total Dissolved Solids (TDS) in the treated water.\n\nPotable Water Class: TDS less than 400 ppm and sterilized\n\nAgriculture Class: TDS less than 700 ppm and healthy for the environment.\n\nIndustrial Class: Water of any TDS with a pre-approved buyer or application.\n\nThe WaterDAO could really use your support both through GR16 as well as participation in the DAO. We hope to see you around. Thank you for your contribution \ud83d\ude4f.\n", - "website": "https://www.rh2o.app/", - "bannerImg": "bafybeifhr3uqq3gl6oozrk6pioaanmry5wp3sk7z7rjjgeh6ai6fywo3mu", - "logoImg": "bafkreiaxav5skvd3rbqpp3krysistzgs2horksjpzk5mj6ymzbexdnqmru", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreibn2fwzegvbnghmm3osf7dix2pwgbmqvqaowhr46dontbzc3expkm" - }, - "projectTwitter": "@_WaterDAO", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "Fw8F4M///iKMsoQ1pos2OfeLGtzZ9/3JHTsmMZWuhFPHXt3kJfdykjw1JkYdppYE", - "encryptedSymmetricKey": "51d7d0d769a1863b9d95e2012ea2eba015015f42476bea689af31e93e970e6218a72c56bdc35df5ff82059855492a707cbcb578377b7f265a386828eaa560c409db7a8f9fc6a13242479fccff1b8417bba65dcaf74ae0b0856482b44ae8dc496c3536614bdfb04b9c11d18686ba3fa584c3e9608b242b45ba087ee4e0631c71c0000000000000020d464feedb4303f9cce8071ce13f9ae043f5e5ea53e7b0a2f8ac1c818994f4bfcffa23cbac63e23d8a8bf06ffd3f7c184" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Wacomet Water" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "5" - } - ] - } - } - }, - { - "projectId": "0x7c08d17ecd83e74334fa1bf2a0110224bced6b68ea852943f35641aa6f11469e", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0xbb425d7915a519ce7494d792396e80e416caa5f6c24152353602924249ff67c1269964dd09365bf442dfbef397f8426ababd91042bd0525f66ac1180124259ff1b", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0x9D120Bee68ed792884D340f911D8434306b28605", - "project": { - "lastUpdated": 0, - "createdAt": 1673494640981, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:142", - "title": "ReSci Network", - "description": "**ReSci Network is leading ethical, ecosystem regeneration-centric Decentralized Science (DeSci)**\n\nWhat?\n\nIn many fields, industry bends the arm of science and casts a veil of validity via \u201cpeer reviewed studies\u201d to influence the public\u2019s perception of a product. \nHere on the emerging frontier of ecocredits, we have the opportunity to shift the paradigm of industry science away from centralized + corrupt to one that is decentralized + credible. ReSci posits that an entity benefiting financially from the creation and/or sale of a given ecocredit should not be involved in the process of reviewing a methodology for approval and adoption as an ecocredit. \nThus, ReSci Network aims to provide independent review in order to best prevent potential conflicts of interest. \n\n**Our essential responsibility is to assure that ethical science is at the core of ecocredit methodology development and peer review. To this end, we act as a community leader catalyzing the formation and flourishing of distributed communities of regenerative practice** \n\nHow? \n\nWe hold a 3-pronged approach for achieving our mission\n\n1. Scientist and Methodology Project Databases\n\nHuman capital and expertise are crucial to achieving a project\u2019s mission. We\u2019ve created a two-part database in a public-facing Notion so that projects developing methodologies can find scientists with appropriate expertise (and vice versa) to consult while they are in the early stages of developing their methodology concept. \n\nScientists: Please visit https://notionforms.io/forms/resci-network-scientist-directory-intake-form to complete database intake \n\nMethodology Projects: Please visit https://notionforms.io/forms/methodology-project-directory-intake-form to complete database intake. \n\nWe appreciate your participation!\n\n2. Communications Hub\nHosted in console.xyz, our communications hub is designed to natively host curated conversation as well as relevant resources such as Notion. Scientists and Methodology Projects alike can request access after completing intake to our database. The goal of the comms hub is to spark connection for collaboration and to support the methodology development and peer review sprints that we hold space for. \n\n3. Methodology Development and Peer Review Sprints \nMethodology Development sprints are intended for projects who have received approval of a concept note (from Regen Network or similar) and have not yet begun the process of methodology definition beyond a general outline. \nPeer review sprints are reserved for groups that have dedicated a significant amount of resources to the development of a methodology (specifically, collaboration with credentialed scientists). These projects are at the stage of a first draft whitepaper. \n\nWe at ReSci Network are passionate about the role of ethical science in ecosystem regeneration. We believe that holistic ecocredits, if implemented via methodologies developed by ethical science, can act as a crucial component in a flywheel mechanism for long term funding in environmental stewardship. \n\n___\nHow You Can Help\nPlease help us reach our goal of raising a total of $25k in Gitcoin\u2019s Climate Alpha round by making any donation that is accessible to you and by sharing our project link to others who are passionate about science\u2019s role in ecosystem regeneration. \n\nWith $25k, we will be able to perform a full scale alpha methodology development and peer review sprint. Funds will be allocated to sprint stewards, a communications steward, and scientists who contribute to the sprint. Within the container of an 8 week sprint, we aim to compensate scientists at a competitive rate of $50/hr for their expertise. Beyond the cost of the sprint, funds will be allocated to cover a. further research of appropriate legal entities that can meet the needs of a truly decentralized scientific community and b. basic legal costs of organization upkeep. \n\nWe were selected as a runner-up project in the December 2022 Future Quest Climate Pool and need funding to be able to sustain our momentum in building and weaving. Thank you for supporting our sustenance and nourishment through the winter. \ud83d\udc3b \ud83d\udc9a\n\nSincerely, \nSage and Ned\n", - "website": "https://resci.network", - "bannerImg": "bafkreid6gs7go3w7ew2uyhpvnbcnxkxplwagars3ziraycinmgyutonal4", - "logoImg": "bafkreifal5y7aou2b5nw645e4hrsbucn264yey2vgt4n7zcdblbunxpxrm", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreid7vpabh4nwy2pwd2ssj7sgh6qs27pwyo2rvtu4wp7tm2vperm55q" - }, - "projectTwitter": "@ReSciNetwork", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "jVD0TygjqFJdrdiD/j+oI+6CEe8gGp/DuazCOauStA8vE3NA3hAMAhcZcqy2qBZ7", - "encryptedSymmetricKey": "cd3a9a06f8ea48b1701174e71aae453732b32c2f573507c70ae9058ff68b46d8df4fc0ea74aaf18ee5165ef22db1370d57536b18dfb9bbd6c93b635af5597eb8680f2c660a05cb97f3d868ccd15f3d70097c4f0f23b0a01902231c86e0a7338c40870b53beec0398872a5e81e023509f03797a5da9a226c684ea7d4b6769672400000000000000209dc4028ba4acbcec04567edd803b1ac73d9ba01d5c987af74c274442b31c2df1c8a7bbed823f7b4b43e1bbe04fffd58a" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Gitcoin only" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "3" - } - ] - } - } - }, - { - "projectId": "0x82c3e8a9200b9f87d9b025a8bb3f9fc6720a7c315773e0ec990915430529db51", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0x4d01948a7a02e3f088137091f0848266eeacd5cbfab34ea0c7b72629e2ed6c861edffcf05569b9f3ead5058b1b9525871b52641c42252a578fc18e7c9c0d1adc1c", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0x0ea26051F7657d59418da186137141CeA90D0652", - "project": { - "lastUpdated": 0, - "createdAt": 1673234646657, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:80", - "title": "Kokonut Network", - "description": "### Wouldn't it be nice to create a perpetual protocol backed by natural assets unrelated to the crypto market, and eco-friendly and regenerative?\n\nI'm Wasabi, the founder of Kokonut Network. We are building a bridge to connect web3 and agriculture. We are creating a blockchain-based cooperative to develop and manage a network of coconut farms.\n\nOur main goal is to address the worldwide lack of funding for agricultural projects. We help farmers get the funds they need while creating opportunities for web3 communities by giving them access to perpetual natural assets.\n\n### TL;DR\n\nKokonut Network provides blockchain governance and open-source accounting to the agricultural industry. Our mission is to promote, organize, fund, and manage coconut farms. We collect funds from the community through the Kokonut DAO framework for decision-making and allocating treasury funds.\n\nKokonut Network can establish a lifetime partnership with its members through the Kokonut DAO by using a formula of Agriculture, Blockchain, Web3, Perfect Soil, and Weather. This opportunity does not have an expiration date, as coconut trees are replanted once they stop bearing fruits.\n\n**One-time contribution equals a lifetime of rewards and benefits.**\n\n## Why coconuts? Zero Waste Circular By Default Crop.\n\nCoconut is the most cultivated and vital palm tree in the world, as it is the main source of vegetable fat. It is one of the plants that provide a wide variety of products and by-products, serving as a primary source of food, drinks, and shelter for animals.\n\nKokonut V1 is a real-world eco-friendly agriculture project in its plantation phase. We have obtained planting permits and 620 acres of soil-tested land in optimal conditions, with access to water and the best weather in the region.\n\n**Coconut products market outlook**\n\nThe coconut products market size was valued at $11.5 billion in 2018 and is estimated to reach $31.1 billion by 2026, registering a CAGR of 13.6% from 2019 to 2026. In 2018, the coconut oil segment accounted for more than half of the total coconut products market share.\n\nCoconut is a versatile fruit with many health benefits. Its derivatives, such as coconut oil, water, milk, desiccated coconut, coir, and copra, are used in the food, beverage, cosmetic, and personal care industries.\n\n### Kokonut V1\n\nOur first plantation will yield 18 million coconuts annually, enabling us to generate multiple revenue streams in the food, health, and automotive industries.\n\nThis project will benefit the entire society of the Municipality of Las Salinas, Barahona Province, Dominican Republic. The coconut plants will be planted 7.5 x 7.5 meters apart, equating to ninety-six (96) plants per acre of land, or 60,000 plants across the six hundred and twenty (620) Acres of land. This variety of coconut yields approximately three hundred (300) fruits per plant, resulting in an annual yield of 18,000,000 units. The Kokonut DAO treasury will receive 100% of the profits.\n\nThe organization seeks to create 10,663 direct and indirect jobs through investments in this project. These jobs will focus on essential agricultural tasks such as weeding, applying pesticides and fertilizers, irrigation, and harvesting.\n\nLearn more: https://kokonut.network/kokonut-v1\n\n### **Kokonut DAO**\n\n*The DAO is the core vehicle for all fundraising, rewards distributions, and governance decisions.*\n\nKokonut Network is a platform built by and for people. At its core, Kokonut DAO seeks to empower anyone who adds value to the Kokonut Network ecosystem, regardless of their social status or prior accomplishments.\n\nLearn more: https://kokonut.network/dao\n\n### **Our Vision**\n\nKokonut Network was created with the aim of reducing the obstacles to agricultural development, and rural project funding, and democratizing investment in real-world projects. We will use blockchain technology to establish multiple plantations across the country, providing advantages to the global crypto communities and everyone in the network.\n\n### **What makes us different?**\n\nMany DAOs have great ideas, copywriting, and marketing, but without a solid business model. Unfortunately, many of these projects are rug-pulled or abandoned by users due to a lack of quality products.\n\nKokonut Network has a distinct approach. Rather than establishing our proposal or business plan by taking advantage of our users, and attempting to get them to purchase some non-backed token, we have created a resilient system over time. It is backed by coconut plants on our land and has a DAO for governance, funds allocation, and rewards sharing.\n\nLearn more: https://kokonut.network/about\n\n## How are we doing so far?\n\nHere is a simple list of completed tasks: budget research, business model, revenue streams, and technical details about the Kokonut Network.\n\n- Lifetime Profitable Business Plan\n- Government Agricultural Permits\n- Agricultural Company Registration\n- Core team Selection\n- Full Fledge Budget\n- 620 Acres of Land\n- Multilingual Agriculture Software\n- Kokonut v1 Soil Test\n- \u201cAs Seen On\u201d Public Speaking, Podcasts Interviews [https://link.kokonut.network/press]\n\nResources\n\n- https://www.kokonut.network/\n\n- Let\u2019s have a chat at https://link.kokonut.network/meeting\n\n- Web3 Workspace https://link.kokonut.network/charmverse <> Get a meeting for a Guest NFT :)\n\n- DAO Governance https://link.kokonut.network/dao\n\n- Join our Discord https://link.kokonut.network/discord\n\n- Kokonut Blog https://office.kokonut.network/blog", - "website": "https://kokonut.network/", - "bannerImg": "bafybeigmr2frrdfc2xz6z5nz2akr6z773wecnhcwaeuzai2r6wlovpeb4i", - "logoImg": "bafkreifhuzqbc4v6lpjjiajnaiue6xc3ww6ho6xa7vzq65phfxar4oubfu", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreidr6czqmkfzfokakqpws5mea753nc5vg7diqpto27nqi5lwoyomwy" - }, - "userGithub": "aaempire", - "projectGithub": "", - "projectTwitter": "KokonutNetwork", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "kM3QoQeRlG4iNYa59unqmRwKuqKpSNOaXx5FqJot/7xAQFJbPIH5NonTV7lwNSvs", - "encryptedSymmetricKey": "74d32bf90ec314bec8e2aea49b4aca1176c39e615e0388282f99d61720559dae400f25ba03ea0eac04f5f7904694de17772cb7b3fc39a37cd8eeadd5a9020175ac429b12327e482af66c39f6f9e033c6dbdd8eeb44ebf09a6dbe57d07230c9acbad20c8d723bee3c0f1d4db99b6b73ee79f465ca687feff2e278e209d4ff92df00000000000000204efe31037df27ea8142c202a757ab636baf6d491326a8c9d521a474007011f46c162a4d8a0a7ae076ac98cf89b3d18ad" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Kokonut DAO & Core Team Resources" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "6" - } - ] - } - } - }, - { - "projectId": "0x84e5ecb55ea744764c11c1600cdaba725af5cd9bef1456cfb4f1b16069f3f6a7", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0x00b05c4386dba4c66766d41b0663595b607ee6b32192db210f3d5a683db29d450c2ef8611a84ed7bf943744e5f82fce20388afcd789534830d49d682ef38221d1b", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0x59490C362C54C1b60158F19CE499C82aa3669820", - "project": { - "lastUpdated": 0, - "createdAt": 1673381883339, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:106", - "title": "The Impact App + Eco Labs", - "description": "\n\ud83c\udf3f About \ud83c\udf3f\n\nThe Impact App (TIA) is a mobile dApp for on-boarding + paying Regenerators & verifying practice-based climate solutions.\n\nTIA is a project developed by Eco Labs, in coordination with key partners & collaborators: dMeter, Silvi, Digital Gaia, Regen Network open source methods registry, ReFi DAO, KokoDAO, Coffee & Carbon Collective, AgroforestDAO, ReFi Zone, Regen League, and Common Action / Myseelia. TIA will be complementary to other ReFi and dMRV projects and benefit the entire ecosystem by reducing on-boarding friction, and helping increase the supply of new ecological assets.\n\nTLDR: Eco Labs is a collaborative on-boarding ecosystem for regenerative action. TIA is a mobile dApp that does three things:\n\n1) Reduce friction by guiding people into ReFi projects that value impactful action\n2) Collect on-the-ground data used to issue ecological assets such as Eco Credits on Regen Network\n3) Pay Regenerators anywhere in the world by integrating with Celo\n\n\n\n\ud83e\udeb4 UPDATES: Thank you to all the regens who supported us in GR15 \ud83d\udc9a\n\nthis is what we've been up to the last few months:\n\n1) Methodology Development - we worked with Djimo from Silvi Protocol & Diogo from AgroforestDAO to submit a concept note to Regen Network for our \u201cAdaptive Agroforestry and Smallholder Stewardship'' methodology we\u2019ve been developing while in Colombia. We also launched a 9 week collaborative sprint where we brought together folks like Ana Maria from KokoDAO, Darina from Coffee Carbon Collective, and Charlie from ReCommon to support each other in writing and editing methodologies.\n\n2) Grants & Accelerators - we participated in batch 6 of Celo Camp, received an additional NSF grant to do 100 stakeholder interviews (starting February), and were honored to be one of the first 17 winners of the Future Quest grants! \n\n3) Pilot Projects - our team spent 3 months in Barichara, Colombia where we developed relationships with a network of regenerative projects, syntropic agroforestry food forests, and community farms. We learned a ton about regenerative practices and were able to begin development on the methodology mentioned above. The next step will be to return to Colombia this Spring and start implementing and testing the methodology & technology stack for dMRV with at least 3 specific pilot projects around Barichara.\n\n4) Technical Lead for Eco Labs - during our time in Colombia, we had the pleasure of getting to meet & befriend Jillian Burrows, an extremely talented & experienced programmer with a diverse & esoteric range of interests & knowledge. We\u2019re so excited to bring her on to Eco Labs as our technical lead, where she\u2019ll be helping us weave together the many collaborative pieces that make up our ecosystem & products. \n\n\ud83c\udfaf Q1 goals: \ud83c\udfaf\n\n1) additional fundraising - as we continue development of our tech stack, it\u2019s clear we\u2019ll need a lot more resources to successfully weave together an effective tool & platform. \n\n2) stakeholder research - we\u2019ll be conducting extensive research & interviews on the market potential for Eco Credits\n\n3) testing on-boarding & dMRV solutions on-the-ground in Barichara & other pilot locations around the world \n\n\n\ud83d\udcdc Full Description: \ud83d\udcdc\n\nThere is a growing number of people who want to take action to help regenerate our planet. This includes both existing land stewards who could benefit from more sustainable & resilient income, as well as communities who need to restore their local natural resources and build resiliency. One option for them to do so is to sell assets into the voluntary carbon or ecosystem services markets. However, the way that market is designed makes it difficult for would-be Regenerators to participate, as the costs for MRV (measuring, reporting, and verifying) their efforts are substantial, and therefore work only for large, professional projects.\n\nThere is simultaneously a growing amount of capital being raised to fund impactful activities, through for instance: NFT fundraising, individual donors, & companies who are committed to net-zero and other social good commitments. In expectation of increased demand, more and more markets for ecosystem services are being developed. As Nori founder Paul Gambil says \"demand (for high-quality carbon credits) is not the problem, supply is\".\n\nOne barrier for increasing supply is the lack of decentralized, low-cost MRV solutions. This remains a friction point for small-scale, community-initiated impact projects to start and scale quickly. Nonetheless, such projects represent the fastest and most robust path towards impact, as small communities form a ready-made, decentralized global community which has the capacity and incentives to develop a wide variety of local projects and maintain them over the long term.\n\nEco Labs aims to reduce the friction of these two forces connecting: Patrons (markets that support impactful activities), and Regenerators (people who want to get paid to take action). \n\n\u2747\ufe0f The Solution: \u2747\ufe0f\n\nThe Impact App is an app designed to on-board Regenerators into existing dMRV platforms and collect data in-app to provide additional basic dMRV solutions. It will include both a directory of user-friendly how-to guides for existing low-cost, transparent, and verifiable methods of impactful actions that anyone can get paid to do in their local environment, as well as versatile, adaptable, and modular solutions for innovative forms of smartphone based data collection. It will be built in collaboration with existing and newly forming communities & DAOs to seamlessly co-create custom methodologies that measure, verify, and compensate for regenerative actions of all types.\n\nThis mobile app & platform aims to help bridge the gap and reduce the friction between those who value impact (ReFi projects, carbon & eco credit registries & marketplaces, ImpactNFT collections, and Impact DAOs) and those who practice impactful & regenerative actions (Regenerators like farmers, land stewards, urban Regenerators, climate activists, etc.)\n\nBy aggregating, integrating, and partnering with existing dMRV platforms, TIA will be able to act as an index to guide Regenerators on exactly what options are available to them, how to start taking action & get educated on regenerative practices.TIA will build custom data collection tools built into the app to:\n\n1) on-board new Regenerators into both established and developing ReFi & dMRV ecosystems\n\n2) provide direct-to-impact financing for small-scale regenerative projects\n\n3) increase the supply of new carbon & eco credits to carbon market platforms by improving accessibility, awareness, and education\n\n4) facilitate knowledge exchange within communities by integrating with projects like Common Action\n\n5) ultimately increase the volume of net carbon sequestration, watershed & soil health, habitat biodiversity, ecosystem restoration, and other regenerative practices\n\nWhy build an app?\n\nAn app makes accessing & recording information simple, which can:\n\n1) Increase awareness of and make on-boarding easier for organizations that have ways of valuing impact, for example: Nori, Regen Network, Open Forest Protocol, EcoNavi, dClimate, Digital Gaia, Orgo, Pozzle Planet, Littercoin, TIST, and many more.\n\n2) Provide those who value impact that aren\u2019t currently implementing MRV solutions to create simple systems of data collection that verify impactful actions on-the-ground.\n\nHow will it work?\n\nThis Android and iOS mobile application will be built to serve multiple functions:\n\n1) List an index/directory of all actions one can take which already have a funding counter-party and an existing MRV methodology.\n\n2) Provide simple, user-friendly, step by step guides on how to utilize existing MVR methodologies & obtain a Bioregional Passport\n\n3) Facilitate in-app payments to regenerative actors by integrating with Celo, a mobile compatible blockchain.\n\n4) Register and verify information about its users using the Common Action ontology in order to filter what actions that individual can feasibly take part in (such as location, expertise, access to land + size and existing resources on that land, access to a vehicle, physical capabilities/disabilities, etc.) as well as link their profiles to Common Action to find experts, peers and resources that will help them on their regenerative journey\n\n5) Collect data for custom methodologies using in-app tools such as images, video, location, audio, & temperature. Upload that data in public and transparent formats using IPFS / Filecoin such that anyone is able to verify and cross reference.\n\n6) Provide resources & clear pathways for regenerative actors to obtain additional equipment or expertise which can increase the quality of data collected / increase pay. This could take the form of classes, obtaining certifications, purchasing IoT sensors or specialized measurement equipment needed to unlock higher paying methodologies.\n\n7) Optionally redirect funds paid for regenerative actions to purchase products in-app, such as dynamic NFTs which can showcase & illustrate ones impact over time, and merchandise / accessories / tools which aid the regenerative actions (UV-protective clothing, knee-pads, gloves, tools tailored to specific methodologies)\n\n\ud83e\udd1d Collaborations: \ud83d\udc96\n\nRegen Network Methodologies\nWith their many decentralized methodologies being developed, Regen Network will enable Project Developers to issue EcoCredits of all types. Eco Labs is working directly with the Regen Registries team to make the process of learning how to start taking part in that process simple & clear within the Regen specific actions listed in The Impact App, as well as developing our own methodology, currently titled Adaptive Agroforestry & Smallholder Stewardship.\n\ndMeter\nEco Labs is a founding organizational member of dMeter, where we are working to weave together dMRV techniques like human-sensing, sky-sensing, remote-sensing, and reputation-sensing as the low-cost, decentralized source of ground-truth used to issue and originate our Eco Credits. Leveraging the dMeter framework and ecosystem of partners will be key in our solutions.\n\nRegen League\nJan from Regen League has been working on a simple version of an on-boarding app to start mapping out regenerative projects, hubs, individual regenerators, and infrastructure platforms. This open database will provide a foundation for us to start building Regenerator on-boarding systems & user profiles that will be utilized in The Impact App.\n\nCommon Action / Myseelia\nCommon Action is an innovation network focused on accelerating climate and sustainability action, by connecting individuals and organizations with each other and to actionable knowledge and opportunities. The Common Action Ontology - MRV module will be developed as part of this project, to organize information about geographically-based impact needs, regenerative projects, and resource requirements. \n\nSilvi Protocol\nSilvi has been working on solving the human-sensing & tracking of tree planting using a mobile app. With the clear overlap in needs for human-sensing dMRV, Eco Labs & Silvi have partnered to build on top of the foundation of technology already developed, and use the Silvi app to perform human-sensing as part of the dMRV stack used to verify & originate Eco Credits. \n\nDigital Gaia,\nWe\u2019re working closely with Digital Gaia to apply our methodology within their active inference & digital twins system, so that our Eco Credits will have a Digital Gaia FERN score associated with them from the very beginning. This collaboration includes working on UI/UX tools for Regenerators, creating models for regenerative practices, and supporting each other as we try to solve the challenges of making regeneration an occupation. \n\nEco Art & Impact NFTs:\n\nEco Labs originated as a hub for collaborative, carbon negative NFT collections and ecological creativity. We're actively supporting and working with artists & creatives to inspire climate action, shape the narrative around regeneration, and help fundraise to support TIA development and compensate for regenerative practices once the platform is live. Here are some of our teams' current initiatives:\n\n1) The World After Us: Imaging techno-aesthetic futures is a traveling solo exhibition of sculptures, installations, prints, and photographs that combine plant life with electronic waste, and scientific experimentation with artistic exploration + Phoney Plants, an illustrated, cross-chain NFT collection based on this real world work\n\n2) Concerned Plant Society: a pfp project that is part of the ReFi NFT Coalition, ReFi Zone (a collaboration with ReFi Punks & Solar Sasquatch Squad)\n\n3) Dynamic NFT experiments - this year we hope to explore the ability to link an NFT directly to the regenerative projects it\u2019s associated with. More to come as we experiment with what\u2019s possible!\n", - "website": "https://eco-labs.xyz", - "bannerImg": "bafybeihotlchmyggpkungtdrs7y2s7rqqx3mqnyeegmjxuqv6madr76pzy", - "logoImg": "bafkreiephqesggcpazke2t65oqdyxxrgqxxavtn2nlz4y4m7rxdqtsce7e", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiav3ikgeuq7c4gopvosriinndgorkwd6f45u74hnhep3vxzb3jlbm" - }, - "userGithub": "https://github.com/sevnightingale", - "projectGithub": "https://github.com/Eco-Labs", - "projectTwitter": "EcoLabsDAO", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "VgaCHKVlX9b6p3sGQsAurnUDCvoKwMufCc6X++spp+0fPE6Lj4VoQi5SAflc+h94", - "encryptedSymmetricKey": "707e792cf834882cab4b20d86b30fd23996751a78ce87bc0c9f76af8f03eb4b808c9990524bf43dec37611fbf59c361829e111fcaa4b88b9d481db9297e46406dc7edcce64791299b922ef6f6f94e8dabb7fcaee3bf21872108017ceb912df98f5500dcb6abec51d99ca9603abc61cd4fb95a2adf7d545142ab045aff621dc3400000000000000200bb64774e7c6a4fa6f4d208e4a5a8d4171840c366a06d63c38a8f4efcc2fd5878ae8ba210e5799438446a06013e3af84" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Currently only grants and hackathons - NSF, Future Quest, Celo Camp" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "4" - } - ] - } - } - }, - { - "projectId": "0x89c4fbe0d97ba25cba17b36c837c27cb7b39c96ccc8b43a99df2dfaca9732763", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0x9d64a0c7e4c154c5c5785c3ebdf0a2ccf539f03a85d2fd4b60e38fac7f8488bd05ff95d0db5d3e26d9b7d9dce30d0b47f19c4ebe6c76ea14bc4a7e86dbeeb43e1b", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0x48f2696FB6FAB7ac0956175b2E25B456E61B3FCf", - "project": { - "lastUpdated": 0, - "createdAt": 1673547890227, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:164", - "title": "Bundle: Oceans & Forests", - "description": " \n\ud83d\udc49 Who are we? \n \nWe are independent teams of conscious humans, climate tech entrepreneurs, computer scientists, and environmentalists, that are united by the mission to protect and restore the forests and oceans of our beloved planet Earth. We believe in a power of coordination so that collectively we can tackle the problem of biodiversity loss.\n \n\ud83c\udf33 Gainforest: A decentralized fund using artificial intelligence to measure and reward sustainable nature stewardship @GainForestNow: GainForest is a non-profit developing impact evaluators, transparency dashboards and accountability protocols for nature-based assets using DeSci, artificial intelligence and web3. \n \n\ud83c\udf33 Vlinder: Restoration of degraded mangrove areas, @vlinderclimate: Vlinder develops Verra-certified mangrove restoration projects to provide a variety of ecosystem services, climate change mitigation, economic considerations, and active participation of the local community in coastal areas.\n \n\ud83c\udf33 Salt Spring Solutions \u2013 Sequestering carbon via forest preservation & regenerative agriculture @SaltSpringSols: Our projects are systemic solutions to carbon sequestration on Salt Spring Island, BC, including managing a recently-purchased 75 acre forest as a community park to sequester carbon in perpetuity, and sequestering carbon through regenerative agriculture that also improves food security.\n \n\ud83c\udf33Bloomeria, an organization to help communities safeguard green areas. @bloomeria_dao: We help fund reforestation and conservation projects, we connect environmental organizations and companies willing to fund meaningful projects and we help companies prove their ESG commitments through a simplified view of their relevant on-chain actions, in a graphic and interactive way.\n \n\ud83c\udf33Treegens: Evolving Degens into Treegens, @thetreegens: We\u2019re making Degens bullish on trees through the world\u2019s most transparent & rewarding tree planting. PPGL tokens are pegged to the cost of each mangrove tree we plant - $0.094. Our machine learning / AI tree counter then counts each tree from video footage, & airdrops Non-Fungible Updates. To reward holders, we\u2019re also tokenizing carbon forwards & airdropping a portion of carbon forward revenue to the holders. \n \n\ud83d\udc49 What we do? \n \nOur bundle mission is to protect and restore forests and oceans with the support of science and technology. Received funding will be used to:\n\n\ud83c\udf33 support impact projects of our members, \n\ud83c\udf33 improve collaboration between our teams via joint projects,\n\ud83c\udf33 facilitate dMRV and verification of impact for greater accountability.\n \nOur bundle is organized as a DAO with a Treasury Safe managed by the simple majority of the bundle members. Projects will be nominated by the bundle members and voted on by the DAO.", - "website": "https://vlinder.notion.site/Oceans-Forests-f3c665c5162547eea874ec031f0cd8fc", - "bannerImg": "bafybeihr2d2rq3d3rdm2cr6vwpzbqnse7w67qsbvgdynfcoxs7obg3orz4", - "logoImg": "bafybeibm3xi7hjhbiiw2ek3mq4havabxmuok6wf2eqnefi67mdhq7zxgtu", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiaq3lsb4mqiooklxql4gq544nw27i6baxlor6vg766cu4n3we6i5y" - }, - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "PR4eZV4kA7jmIUfJ9wuWSmf2Df81xZua9AChvyWRIZbQvpge7GP2HxUZp6a+eRRZ", - "encryptedSymmetricKey": "a0a7d92dfef24733c2bb6490c9f5c775ce6c7f832172cda62df53e001d25f664712b7fced6b0503c9ef3203c2e54280031f5d5ab67b4985f5d012bb976b21ae684b2747fddd57f84ad94c238240349d04ace2c6b7c3298e56c4ff15c8f4f61a632540510e3846a6d90a9c3d5983d5915f3737e8f45a382064b2e4411aa6231b300000000000000201f15e63e31fac2cbb2bb48b5558ea273b426706424a8da8b21cff5fcb808e104fd1ac96dba716d65ccb7369652467991" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Various" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "Various" - } - ] - } - } - }, - { - "projectId": "0x8d8fc88fb4591a5d918cbd945137e29b9275b4f983902901edb6362ee11154c5", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0x75628d677a5d879c9d86f6c725d03b6a83cfa97ef1c1bb370d9c73886fabae3532dbe4e46db07c1e29012d4d7052376c0c1cd5d140a70d215b8e038797a9bf1e1b", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0xa0b8de7ee87605c820ab83ddf4605bb0bc9fe6f1", - "project": { - "lastUpdated": 0, - "createdAt": 1673530557332, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:160", - "title": "BaseX \u2014 new definition of value", - "description": "Fixing economic incentives related to climate change.\n\n\u2022\u2022\u2022 TLDR \u2022\u2022\u2022 \n \nNew definition of value.\n \nBeyond GDP.\n \nGDP only - fresh air has no value. Air pollution causes disease, people in hospitals, and medical bills - good for the economy.\n \nLiving elephants have no value. Dead elephants have more value \ud83e\udd37\u200d\u2640\ufe0f that\u2019s why they are poached for ivory.\n \n(the list of examples can go on and on)\n\nThe key concept of \u201cTriple bottom line\u201d (people, planet, prosperity) \u2014 https://en.wikipedia.org/wiki/Triple_bottom_line \u2014 has been around for a while but we have the capacity to address the problem.\n\nThe timing is perfect for this project to succeed:\n- satellites\n- drones\n- IoT sensors\n- big data\n- blockchain (transparency, integrity, incentives)\n- awareness of climate change\n\n\u2022\u2022\u2022 MORE INFO \u2022\u2022\u2022 \n\n5 minutes pitch: https://youtu.be/6-6QSYeZqjg\n\nSlides: https://docs.google.com/presentation/d/1UMTaGACNjKgVuWBhAhvKtBeA6quGPI-j3G8Z14jR4Lc/edit?usp=sharing\n\nWorking prototype: https://alpha.basex.com/\n\nGoogle Doc with technical explanation: https://docs.google.com/document/d/1bGWu7U8qN6YZI4s4Z7lq7H-HDlAD8fFwgZdCujNSSjo/edit?usp=sharing\n\n\n\u2022\u2022\u2022 PROGRESS & NEXT STEPS \u2022\u2022\u2022 \n\nToucan grant - rejected. Kleros incubator - rejected.\nThe work on the project continues regardless.\nThis is one of the most important projects that can ensure the human race will survive.\n\nSpaceship Earth. Infinite growth on the finite planet? We can change the metrics of success and continue to grow in a regenerative way.\n\n\u2022\u2022\u2022 TEAM \u2022\u2022\u2022\n\nSee the blog post of the founder Mars Robertson describing his areas of interest and expertise: https://medium.com/@marsrobertson/so-what-do-you-do-ba0f598af5c3\n\nWe feel strong alignment with the values of ESG DAO - https://www.esgdao.earth/ - and we are looking forward to productive collaboration\n\n\u2022\u2022\u2022 CONTACT \u2022\u2022\u2022\n\nIn case you have any questions or would like to work together.\n\nIt is not easy to explain a new economic paradigm and all the crypto magic that makes this project possible.\n\nBest way to keep in touch:\n- https://basex.com\n- https://twitter.com/basexhq\n- https://discord.gg/tBF7cGjzsS\n\nThank you for the support \ud83d\udcaa", - "website": "https://basex.com", - "bannerImg": "bafybeihhaxaveoldmvjkn7lr7onl7ijgbxxuc54gb76hpmumk2kmazymhy", - "logoImg": "bafkreid7j2wc4izkvomlh2cponi6kikl653peu4oxnohce45zefra7de6a", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreigrkvigtwm2fjcwppu4mihe7cvzawuv4h6taqjphtildamw33txy4" - }, - "userGithub": "marsxrobertson", - "projectGithub": "basexhq", - "projectTwitter": "basexhq", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "OQI4WV8gka3mRyjRCW8Pinyo90DhONabTbe7WHjEEhY=", - "encryptedSymmetricKey": "5d4372646bafd97938dcb7d756583cc5724378cae50833dcf18acb444ba986ac45ad1751e553012430726a169b423f09cf1935b303429c7d19428094043615cf597e8907d4fe4a9f3a7d800c49190242eef6c30c61a90ebc18b3608502a121a8b4f6b0780f6e35c104509f6acdf4f371626c43c850dd6619f5784bd8c10f65ac000000000000002005bfed20eaeb85cdf40cfae096915af2e116d7063c105cd276edfdae6c728c375410deaaee909c46233d30cd5c4545b1" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "No external funding." - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "1+" - } - ] - } - } - }, - { - "projectId": "0x9575cc4fc36454d4fd20fe68f980a72247e115363927b4ffba3a59f713f65351", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0x939ad27723255c2820971ae1846e415bb23d4ebb455b6662d0d7b5be473dd7934f7ebf52736e763a56dc73ab7664ba2de5ccb91ebe385b7016f975d45177bc461c", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0xa7CA400d49BBa87EB606ee05af93689BD21FaB99", - "project": { - "lastUpdated": 0, - "createdAt": 1673447166774, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:121", - "title": "Silvi", - "description": "Silvi is helping build economic and coordination tools to contribute to the trillion tree target.\n \nWe believe the bulk of the solution is twofold:\n \n\ud83d\udcb0\u23f3 Upfront project funding via Tree-Commitments (We\u2019re calling it Tree Forwards) to incentivize and reward performance-based tree stewardship\n\ud83d\udccd\ud83d\udd2d Extreme traceability and attribution of new trees, not just for accountability and inventorying, but to unleash the community effects needed for tree-planting to become a thing!\n \nLet's unpack that \ud83d\udc46\n \nTree Forwards:\nSilvi is collateralizing the net present value of New Tree Forwards by locking commitment budgets into performance-based schedules that reward tree stewards as tree milestones are verifiably met. This is built at the unit-economic level but scales indefinitely. Because there are 50-60k tree species, Silvi is supporting a p2p library of species-specific methodologies. Think of it as DeSci tree wikis for tree science and intelligence and citizen science participatory model for the ground work/truth\n \nGround truth and MRV:\nOur focus has been on building a stack to serve the human-centric stages of the tree lifecycle while setting a strong and reliable decentralized science and open data foundation from which other Monitoring, Reporting and Verification (MRV) can happen. We're collaborating with dMeter and Regen Network on a Filecoin grant delivering a Claim Resolution Framework. Further, we'd like to collaborate and interop with other projects and technologies on techniques for statistical sampling of ground truth as well as remote sensing inference. And ultimately, we'd like to vertically integrate with carbon-certifying projects. \n \nInterface:\nSilvi is building an app where we're leveraging social media mechanics with citizen science frameworks to develop a Pokemon-Go-like experience for gamified tree planting and stewardship\n \nTokenomics:\nSilvi has finally started bringing its data on-chain via NFTs, IPFS. After that our long term plans involve launching a native governance token issued through tree commitments. Governance tokens will spawn utility NFT pairs that contain all the data and contracts for each tree, as well as the instructions on unique release schedules and requirements for commitment budgets based on tree type, location, timeline, relationships and stakeholders.\n\nPilots:\nTo date, Silvi has already deployed several pilots in the United States, including planting of 5 hardwood species and pines in a retired golf course while partnering with a conscious festival called Fire Flies Forest and experimenting with sapling distribution to homes and neighborhoods in Florida. Additionally, Silvi is partnering with EcoLabs and AgroforestDAO on the development of an adaptive agroforest methodology leveraging Silvi's Tree Forwards.\n\nSilvi's biggest focus is currently in Kenya, where it is connecting communities such as schools and small holder farmers to Kenya's last rainforest, Kakamega forest. The project aims to build a methodology to help establish small, distributed nursery beds around the forest with the goal of improving supply of saplings. With the help of Gitcoin funding, Silvi has established operations in a dozen schools and 8 small holder farmers and approaching 100k trees propagated from seed. The project is in close conversation with the Forestry services and the Forest-run nurseries, Silvi is helping expand capacity of reforestation via its theory of change that a greater number of independent nurseries run by community members via a participatory model will help increase capacity and coordination. Silvi is close to being assigned an exclusive area for planting and forest management where our MRV and methodology will be put to the test over the following years.\n\nPartners:\nWe're so happy to be part of dMeter where other awesome dMRV projects like EcoLabs, Athena, Avano and Orgo are working together to solve planetary restoration and natural capital creation! We're partnering with Ecolabs and AgroForestDAO on the development of an agroforestry methodology and also a core member of dMRVNetwork, an MRV research group aimed at serving small holder farmers. We're also proud to be supported by Celo and the Climate Collective and incorporating Celo's stables for payouts in Kenya\n\nPlease reach out to us if you or anyone you know would like to be an early adopter of our tools and methodology towards hyperlocal reforestation ", - "website": "https://silvi.earth", - "bannerImg": "bafybeif4gscd7hssgankvzfrs4a4i6tka5ewbc44ydw4bkrwl5zllkyida", - "logoImg": "bafkreia2lxh62vyemnumlun3kzafdqlsuszyvneipn67xacw6nfs445nd4", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreidmbz63c5qlpie6vcmu2cjw22zynozpejveuofzwa2s2ozj4fqmo4" - }, - "projectTwitter": "https://twitter.com/SilviProtocol", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "uVg3pr1vo5AEM9TRIQHFxCBIJKJKM/oIsNZZ5J9ej0rgIqcv9verXzlbsiPJG2k/", - "encryptedSymmetricKey": "8d3a69ac641a3a4801532b93c0a66c9b9e159744cc711e80ad65af7aec8a9f34569e104cbad3e5416ae7904b40c18d150c72133611e7b4576867dd06ef2e5d1107805098ee5f4190840629afae1c9ad95c6dc30e08a16e20e2db96d93489968227afe1fc3c44f97e9ade40c7d742a22a4cbdec5efd3dd828b114ca9df909aa7600000000000000202bfd7e8e12aafe6d777a33a8198f4f5403e348efea2d42774ec168af3c904e9d2a72634a47343be79bb2eecfa27551af" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "8" - } - ] - } - } - }, - { - "projectId": "0x95adaaef6d0a11b862f47a236bbca9d93dcfe35d1ae044edc0223d5485e1bfbb", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0x2607e68d6c05fa9f1e575bbbf28cc4686482657310ae146eb80a6c8910755e9b36df309e9b37a054f02c49863c5abe7ceb50b014bc7512ef0dfdc8d5689adaf01c", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0xb0b0c51D98d3c49f7a5E61735db4f084d62954A1", - "project": { - "lastUpdated": 0, - "createdAt": 1673458182671, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:123", - "title": "Bundle #3: Verification Infrastructure (Impact Certs, Measurement, Reporting & Verification (MRV) and Oracles)", - "description": "Verification Bundle - 12 innovative projects proving impact and unlocking critical funding in the climate and sustainability space.\n\nWhy: Verification as proof of impact\n\nHow: MRV, Oracles, Impact Certs, Active Inference, Digital Identity\n\nWhat: An anti-greenwashing toolkit\n\nBundle Description\n\n\ud83c\udf0d\ud83d\udca1 Introducing Bundle #3: Verification Infrastructure \ud83d\udee1\ufe0f- the ultimate toolkit for proving \ud83d\udc9aimpact and unlocking \ud83d\udcb0funding in the sustainability and climate solutions space.\n\nThis bundle brings together \ud83d\udd25 12 cutting-edge projects that are changing the game for measuring, reporting, and verifying (MRV) impact. With our bundle, you'll be able to confidently prove that your projects are delivering real, tangible results.\n\nLet's be real, in order to fund the solutions we need to save the planet, we need to show that our projects are \ud83d\udcaf and that the impact is \ud83d\udcaa. That's where MRV comes in - it's the bridge between \ud83d\udcb0 and \ud83d\udc9aimpact. These projects included in the bundle offer MRV solutions through \ud83d\udd2eoracles, \ud83d\udcbbimpact certificates, and MRV protocols which are making it simpler and more transparent for projects to prove their impact and secure funding.\n\nThink of this bundle as your one-stop-shop for proving your impact and unlocking funding \ud83d\udcb0. Whether you're working on \ud83c\udf33carbon removal, \ud83c\udf31afforestation, regenerative agriculture or you've doing grassroots community building - with this bundle, you'll have everything you need to prove your impact, access funding and receive rewards.\n\nWith this grant, we're powering up these projects to take the MRV space to the next level\ud83d\ude80. Let's work together to make sure funding is going to the most impactful solutions, and let's make a real difference in the fight against \ud83d\udd25climate change.\n\nWhat\n\nBehind every product lies a hidden infrastructure\u2014a complex ecosystem of factories, ships, robots, processes, and people working in harmony to deliver value. The web3 climate economy likewise requires an infrastructure of technologies, people, and services. That's us.\n\nThe Verification Bundle comprises a range of approaches targeting different pieces of the verification value chain. This includes project evaluation networks, oracles, impact certificates, and MRV protocols. We are also building apps and interfaces enabling climate entrepreneurs to easily plug verification into their projects. We are for climate entrepreneurs like what AWS is for developers.\n\nWhy\n\nCurrent verification methods are expensive, inaccurate, inaccessible, or untransparent. These shortcomings are a bottleneck for both funding and entrepreneurs. Funders, from small donors, to institutional and sovereign funds, will not fund climate initiatives en masse until they can verify climate impact. Meanwhile the legacy, off-chain verification organizations cannot scale to serve the fast-growing, dynamic, and global mix of climate entrepreneurs.\n\nWeb3 technologies, like blockchain, enable new verification solutions that decrease cost, democratize access, increase accuracy, and create transparency. However, these solutions are not automatic. There is tremendous work to be done designing user experiences, aligning incentives, and building applications. Furthermore, we need to tailor solutions for the wide range of climate and sustainability initiatives.\n\nBeyond accountability, verification projects are the foundation for a more immersive, and rewarding impact sector. Impact certificates (NFTs linked to verifiable impact) enable projects to symbolically represent their work with creative smart contract structures. For example, a tree planter could sell tree NFTs that produce carbon tokens for holders. These carbon tokens could then grant holders exclusive rewards from video game skins, to store discounts, backstage concert access, or project voting rights.\n\nIf we are successful, donating to climate impact will soon be as good, if not better, than buying things for oneself.\n\n--------------------------------------------------------------------------------\n\nExplore each individual project\n\n\u2b50 Athena Protocol @_AthenaProtocol \n\nChanging the way the world runs on data to include ethics and equity through cryptographic security. Athena Protocol is building the smart contract primitives required to facilitate on chain claim resolutions to claims involving payments for ecosystem services. Our work during q4 of 2022 re our GR15 grant application \u201c ImpactNFTs: An on-chain resource for validating impact\u201d has resulted in the collaboration between several organizations within the dMeter ecosystem to adopt ours as their shared claim resolution framework. We are seeking additional funding to grow our core team, to expand our educational material on the importance of data sovereignty, and to continue development of our claim resolution framework and ImpactNFT primitives.\n\n----------------------------------------\n\n\u2b50 Pozzle Planet @PozzlePlanet \n\nPozzlePlanet is social app \ud83d\udcf1and protocol \u26d3\u00a0where users earn our native token POZ by sharing, joining and documenting planet pozitive \ud83c\udf0e activities via short form video\u2019s called pozzles \ud83e\udd33\ud83c\udffd. On the outside, a social app where people generate positive impact by sharing videos and earning rewards. Underneath the hood, a DeFi protocol that passively farms users activity into NFTs backed by real world assets like CO2. \n\nOur mobile app went LIVE in public beta in November 2022 via AppStore and Goggle Play with 1500+ daily active users. So far 24k+ pozzle videos added, 8k+ activities verified by the community, and the protocol has rewarded the community with 18k+ POZ - see the latest \ud83d\udcc8\u00a0real-time stats here https://www.pozzleplanet.com/ \ud83c\udf0d\u00a0\n\nLinks \ud83d\udd17\n\nVideo Demo: https://twitter.com/PozzlePlanet/status/1591662766947201025?s=20&t=zsAvCXhjeJpGyAQpVV6R6Q\n\nWeb:\nhttps://www.pozzleplanet.com/\n\nPurple paper:\nhttps://pozzle-planet.gitbook.io/poz-purplepaper/\n\nTwitter:\nhttps://twitter.com/PozzlePlanet\n\nMedium:\nhttps://pozzleplanet.medium.com/\n\nDune Analytics for POZ:\nhttps://dune.com/swarthyhatter/POZ\n\nGITHUB: \nhttps://github.com/PozzlePlanet/\n\n----------------------------------------\n\n\u2b50 Digital Gaia @_digitalgaia www.digitalgaia.earth\nIf you want to teach people a new way of thinking, don't bother trying to teach them. Instead, give them a tool, the use of which will lead to new ways of thinking. (Buckminster Fuller)\n\nThe funding from this grant will support the launch of Digital Gaia's first product, called Gaia. It is the culmination of Digital Gaia's MVP sprint in Q3 and Q4 of 2021, which was partially funded by Gitcoin GR 14 and 15. \n\nBackground on the research and thought leadership that goes into Gaia can be found at: https://docsend.com/view/s/gexztbntbf5vxsn9\n\nGaia is an AI-augmented assistant that helps the global regenerative community achieve more impact faster and with greater confidence. It is built on a novel decentralized AI platform and backed by state-of-the-art science. Gaia provides context-specific information, knowledge, decision support, and Impact assessment for the first mile of Impact rooted in the collective intelligence of a global network of practitioners, experts, scientists, data providers, and indigenous communities.\n\nGaia is built on Digital Gaia's open technology platform and will enable multiple high-value services missing today that are essential to scaling regenerative agriculture and healthy bioregional economies, including:\n\n1. Expert Assistance for the first mile of Impact: Each instance of Gaia is a standalone AI for a specific ecosystem and community context. It supports and gathers context from land stewards and experts through local inputs and the use of multi-tiered remote sensing and other forms of MRV.\n2. Open Access to a global commons of data, information, and knowledge: Individual Gaias are interconnected in an AI-augmented global network. Digital Gaia's AI tools autonomously integrate all the local information and knowledge into continuously improving scientific models. These consensus-based models feed back into the network, enabling exponentially faster learning and continuously improving performance against targeted outcomes at the local level.\n3. Transparent and Immutable Proof of Impact on Regenerative Outcomes: Gaia produces real-time project assessments from pre-feasibility stages to end-of-life. It serves as an Oracle for both future predicted performance and realized impact across the life of projects that can scale from project, to portfolio, to bioregion.\n\nObjectives\n\nOur objectives for the first six months of the Gaia launch are:\n\n- 125 Project Onboarded with >10,000 Hectares impacted\n- A pipeline of over 1250 Projects in the onboarding pipeline with >100,000 Hectares impacted\n- 7+ project aggregators integrating Gaia into operating models\n- 55+ SMEs, Experts and Data Providers engaged in our global community\n- 7+ SME organization, academic institutions, data aggregators integrating internal resources with the Gaia Network and Gaia POI oracle services\n- Integration of Gaia POI Oracle Services into 3 Marketplace channels\n\n----------------------------------------\n\n\u2b50 Katalyst.earth @KatalystEarth www.katalyst.earth\n\nScaling Nature Positive Credits through Digital MRV\n\n----------------------------------------\n\n\u2b50 POCA: Proof of Climate/Community Action \n @Poca_earth \nis like a POAP but for climate and community action.\n\nIt\u00a0is a reward badge to add to a collection of actions you participated in, whether it is building a community or taking part in a climate action.\n\n----------------------------------------\n\n\u2b50 LunarPunk Labs @LunarPunk_Labs \nFacilitating community articulated Active Inferencing Models.\n\n----------------------------------------\n\n\u2b50 SproutUp @sproutupapp \nThe impact certificate fundraising platform for web3 charities. Turn good deeds into NFTs and earn crypto donations.\n\n----------------------------------------\n\n\u2b50 EverGreenCoin @evergreencoin_ evergreencoin.org\nEverGreenCoin (EGC) is a native blockchain PoW/PoS hybrid cryptocurrency, now full PoS, launched in 2015. The EverGreenCoin Foundation, Inc. is a 501(c)3 public charity launched in 2017. Proof of Environment (PoE) is a program of the foundation's, by which it rewards environmentally-conscious activities and observations with EGC, launched in 2019. PoE rounds run monthly and the reward pool is grown throughout. Submissions are publicly scored. The reward each submission receives after month's end is proportionate to how it did in public scoring. We believe we have an amazing platform established for people to share, and be rewarded for, any environmentally-conscious activity. We are requesting grant funding to scale EGC\u2019s PoE and ready it for a global stage.\n\n----------------------------------------\n\n\u2b50 ORGO @orgo_earth \nORGO is on a mission to regenerate the planet by creating an economy for environmental and social causes. Impact organizations that are focused on making a difference need better visibility and access to funding. ORGO\u2019s philosophy is rooted in liberating impact data. ORGO aims to close the gap in sustainable finance, reward positive behaviors, and eradicate greenwashing and fraud.\n\nWebsite\nhttps://orgo.earth/\n\nJoin our Discord\nhttp://discord.gg/qhg6wqWE5j\n\nBlog\nhttps://medium.com/@orgo_earth/our-philosophy-279431efc41a\n\n----------------------------------------\n\n\u2b50 Earthbanc Protocol @earthbanc\n\n----------------------------------------\n\n\u2b50 Project Themistoklis @p_themistoklis \n\n----------------------------------------\n\n\u2b50 Buan @buan_fund\n@buan_fund on twitter / mirror.xyz/buanfund.eth / https://t.me/buanthereum\n\nB\u00daAN is minting digital twins of RWA on Ethereum with a focus on environmentally valuable areas of land which can form the backing for impact certificates which can be sold to businesses. With the ultimate goal of rekindling societies relationship with nature. Think of us as The Federal Reserve before it moved away from the gold standard except our treasure is biodiversity. By developing the rails to on board RWA to the blockchain in a legally indemnifiable way we hope to encourage others to innovate within the same framework.", - "website": "https://verificationinfra.notion.site", - "bannerImg": "bafybeigs5mqiitcx7s5u6n3u2g36j7ais4usfdcahl3cbmr3hpylqfx5ru", - "logoImg": "bafkreib4uv3ymk3274tcyvx6hiwpvgtn7v3t7rd65fgl2jpsqvwdtnd5ri", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreid6ltdqw5z2t7xc5uwa63lheyce6vzsew5ukk6rgnz6xvlxfory4e" - }, - "projectTwitter": "verif_infra", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x05e0a46a3a96478f8c6915f57E8089b3397E7cea", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#verif_infra", - "hash": "v0.0.0:ktjXtp/rAAb6gQvRyspNtbldSfnCnOoqIdiCBgFksFc=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-12T00:35:30.790Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-12T00:35:30.790Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..5KU0dQ5XkJJ9QUrmpbV8wDv57mefHzwR_VFKLyp_tb5EF3QD2hOz3iIVEjaqq3wFK8KLYQdvgu-ShKRea471BA" - }, - "expirationDate": "2023-04-12T00:35:30.790Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "M9lJLnrvgT1kmHoPD0e3GM94bKQtY5XNNyxSHgqZT9N1Kl5u0kZYUQdp2L2Oz7Ut", - "encryptedSymmetricKey": "ac8fc50e892c840d129f84d4c38108c93c312e400973dcb7d1d3e7d12c2f35739caf156dc3d9d99ac65a93765611ae185a3bc999405f9d52e951d4d3495993c7b143def4aae3051d9f17bd3a2ff0118a0dd60e3b1c830ec2ef40c2f57387408e8d5a04914c7fd62b6751d8463c20cdbecfa41c608830970e63a18976d193318c00000000000000207a5dc6b0379170ce6ecf5e216a3fcd6e0dc87074160d9f69a4cfc47fe824ce52c621639ea961dbd172b4892bb78b7cb5" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "grants, hackathons" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "10+" - } - ] - } - } - }, - { - "projectId": "0x9b8fd21ff33280aa6dddb9d073a527ab490b07fd3ebd91850b6b0f2065542af5", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0x548cc616e850a54ef1226ef8ee634be1cd45236e3abc04eea19bd5ecde7e92b951aaf72ff7cd701df51f99a71ac59159a9cefb67e93f094ecdb1f4edf18f7e951b", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0xd6b97e042d03EdBDc100Eb55fbE43Eb75f2e3036", - "project": { - "lastUpdated": 0, - "createdAt": 1673249480048, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:81", - "title": "$Earth - Solarpunk Dao", - "description": "Hey Solarpunk, stoked to have you here \ud83c\udf1e\n\nWe are building $Earth - First digital currency to be backed purely by climate solutions. Our goal is to -\n\n1. Mobilize over $ 5 Trillion/yr for the next 30 yrs to provide primary finance to projects in clean energy, regenerative agriculture, clean transport , ecosystem conservation and clean tech that will build the necessary infrastructure for a net zero world.\n2. Appropriately value natural ecosystems and their services while creating a monetary system that is backed by climate/ecology positive projects.\n3. Build the Solarpunk paradigm\n\n\n$Earth has been designed to make this happen by - \n\n1. Incentivizing users to purge their petro $$$ to mint $Earth directly at the protocol and use those $$$ to fund projects in renewables, permaculture, Ev charging stations, electric buses/trains , ecosystem conservation/regeneration, agroforestry, energy storage, clean tech etc\n2. Inherently ascribing value to ecosystem services created by the projects we fund, by selling $Earth at a premium to the $ value of projects in the neoliberal world. $Earth acts as a unit of account for the $ value of the projects in our treasury + potential yields these projects will generate and the positive externalities created by these projects ( healthy soil, carbon sequestration, clean air, biodiversity etc)\n3. Creating utility for $Earth by creating a network of regenerative/solarpunk merchants who are willing to provide their goods and services in exchange of $Earth. \n\n\nThanks to your love and support during GR 15 we have been able to -\n\n1. Onboard developers and designers to help us build our website ( love to have some CRITICAL feedback) which is now live. \n2. Our tech team has also been successful in encoding $Earth tokenomics into smart contracts on which we have now conducted over 1750 test transactions. \n3. We have also onboarded 3 solar energy projects in India, Malawi and Nigeria that we are going to pilot with (details on website) and are in talks with 5 more projects in regenerative agriculture and EV space that we will onboard in the coming weeks. \n4. Take active part in hosting Refi India\n\n\nThis Alpha round Grant money will now be used for - \n\n1. Compliance/Legal for $Earth and Solarpunk Dao\n2. Hiring for Community Building and Credit Risk\n\nWe are incredibly grateful for all the love and support all yall Solarpunk shower on us. We are building strong in this bear and truly appreciate any contributions you can provide to make anthropogenic climate change history and make the solarpunk paradigm a reality.\n\n10 % of the fund raised will be allocated to projects working at the intersection of Refi x Rwa. List will be announced on twitter. ", - "website": "https://www.solarpunkdao.earth/", - "bannerImg": "bafybeiedqfk4rvzsw4tezhpq4shiy372mfacbnafvomig6o47spnj4zitu", - "logoImg": "bafkreic7sr4vs7bql7ta3tcrerrl5rkxjf4sduen4eebgk2si43rg6bohe", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreibnutdathxyj53lsnhxovynvrlpxcp3g463ej7lffstv35hni3uhm" - }, - "userGithub": "peacefulprogress25", - "projectGithub": "Solarpunk Dao", - "projectTwitter": "https://twitter.com/solarpunkdao", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "nGMJgJ/2g4PDkiuYNOdnVqMSTmrRg6Ikx61PHuGuZPjVTk2ui0uZamn65Irmry66", - "encryptedSymmetricKey": "0122213edf30f36fc61ebdd5ac1411517bda7c51828f3432c7f7825c5693d9d8a9ab957733b546051fb5eee5869034136e6780602d8e8cabbfe66fd325ba416180cec253c6d6894464969a534b946f839971b4299aaf13af198e868100250488f3b868fc1db0064f2450cfe72e212bd977bbc60555de9cfcafd2fee51851917a0000000000000020feef142478d8fa844cd30a18056d8fb9bd4d8069f19fddee5d1ef37890f05773d13bdce6232f9bd9c966e0e5120865ad" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "5" - } - ] - } - } - }, - { - "projectId": "0x9c9f6f054c70be233af788cafeb5073d41df5667a572819ce21b60f5424caff5", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0x5fa0b033cccb8c2352ad7b6906683c9007ebf569480ede786c9d566132e706f84f30c0aaa1b1fc68b0959e1ed3dc58cc62f31f23f09df18f15a3bf5842ccf7321b", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0xCbbd18d3aC27ab0FFfD04BCCd091B2802c92e0ca", - "project": { - "lastUpdated": 0, - "createdAt": 1673294946122, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:89", - "title": "TaterDAO", - "description": "TaterDAO is developing the legal and technical primitives to bring real estate on-chain.\n\nThis is an important problem to solve because the foundation of all sustainable efforts to reward and shape climate solutions are grounded in real estate.\n\nOffices, factories, solar farms, homes, farms, and every other real world asset touches real property (i.e. real estate). Low hanging fruit climate solutions involve LED lighting, solar power, biomass, soil capture, upgrading of HVAC systems, wind energy, etc. All of those efforts happen in or on a building, home, farm or other form of real estate.\n\nIn order to identify, create and develop climate solutions, we need to accurately identify and classify land and bring that land on-chain.", - "website": "https://taterdao.com", - "bannerImg": "bafybeifneoabjokuzoaqqg7lwjojp2unzhxvrcedwl2tnetksgkn47wsxi", - "logoImg": "bafkreicixvulwarty26ezmxgur3njc43wjqt6e57yh6elrksrsiemxu254", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreifvvvvvmeho6tz4k4qn3vfnhsgdckmb3paunaosq7dzl5ysuwkbw4" - }, - "projectGithub": "https://github.com/TaterDAO/app", - "projectTwitter": "taterdao", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xCbbd18d3aC27ab0FFfD04BCCd091B2802c92e0ca", - "hash": "v0.0.0:WRZ7aErP/Wa7KS4tD5mEoKk4rRH+Ezx7yv5y1v1VPlI=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#taterdao" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-09T20:08:38.426Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-09T20:08:38.426Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..9dPHmej-mHOB4UmjP-AXri2ap6iDr2OHFmeNxR0PcckjXYfb9-JYYKOGpxU8EuwOAUyXjeOmyNyFz0j0soLUBw" - }, - "expirationDate": "2023-04-09T20:08:38.426Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "SJooQGG3B3/+ZMutYgQvzOZL/lX5w1bH1HXmoB3JKZJYVxcPO5cr+M+MVD7gPwmB", - "encryptedSymmetricKey": "4df47c0e08c3ae7c5ecf06e6d991f07a027a176fbbddb759728bb95666ffd23f8e352ef4ccbb8d62ff99414799a15408e411a61df5afd584c6f63a4f1fcc778daf07689d39352ff032d5604aefa3bb526a3ac0d9acf3abfa9ee5e2aa636d1d85db6134de949a6388de44e75e21881922ec7f33074f8d8da1fceb3ff0aa5b515300000000000000207f2700acc6ff8bf7361ad2c6267881081af521ea84ce98002ba75fe0ac7e7b0293fb95be391a84514a63c02af772f780" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Self-funded" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "3" - } - ] - } - } - }, - { - "projectId": "0x9e8896090abff240885c74b27cd32f3917d2471e504e82db21e309360bbf2903", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0xfdb6a142775a6eb2ef450148f2929133a8f01ca4f427fcfeb68189079e5f0801448258876268819adb7397ab0d2d5ba7ab67b7baaacf263d1057f08da439baa91c", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0x41DdE2Dc7f718D5F764fc97e8d122864587642d4", - "project": { - "lastUpdated": 0, - "createdAt": 1673545266638, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:163", - "title": "Astral Protocol", - "description": "At Astral we build tools to enable the location-based decentralized web.\n\nOur vision is for to support peer-to-peer, user-controlled alternatives to common location-based apps we use every day. We want new category of dapps and protocols that use spatial data to be open, interoperable and composable.\n\n\nThe Astral Protocol has three components:\n\n- Astral's verifiable spatial data registries - smart contract-based registries of spatial data objects like points, lines, polygons and raster images, \n- Verifiable location credentials, to serve as presence claims in the Astral ecosystem, and \n- Web3-native geospatial data storage technologies so the data backing these systems is user-controlled, cryptographically verifiable, uncensorable and permanent.\n\n\nThese are linked components that will enable the ecosystem to build a Web3 map of the world, and location-based dapps that use that map.\n\nAstral tools and standards will be useful in a range of different use cases ranging: \n- Regenerative project development and dMRV\n- DAOs / digital governance: geofenced local and regional DAOs, local currencies, spatial demurrage\n- Mobility: defining policy areas like congestion zones, capturing the position of connected devices like IoT and smartphones\n- Natural capital currencies: defining ecological zones, storing physical measurements of ecosystem conditions\n- Metaverse / gaming: virtual land registries like Decentraland and Cryptovoxels, and AR games like Pokemon Go\n\n\nGrant contributions will fund the development team building these public goods. Specifically, we are developing a Solidity library of topological and geometric functions, Web3 GIS tools and a mobile SDK to create verifiable location credentials. \n\nTeam\n- Holly Grimm: Tech Lead\n- Daniel Serrano: Software Engineer\n- Tsondru: Software Engineer\n- John X: Architect\n\n\nAccomplishments so far:\n- KERNEL Genesis Block final presentation\n- Kolektivo project partner, developing GeoNFTs\n- Filecoin Development Grant for storing satellite imagery on IPFS using decentralized identifiers\n- Presenting to the Open Geospatial Consortium\n- Winner, Arweave Prize, Future of Blockchain 2020\n- Speaker, European Space Agency's Living Planet Symposium 2022\n- Grant recipient, dClimate\n\nAdvisory Positions:\n- Member, Celo Climate Collective\n- Core Leader of Analysis Working Group, dMeter\n- Advisor, CarbonPath\n- Advisor, SimplexDNA\n- Founding member, ReFi DAO\n- Co-leader, Regeneration Guild, KERNEL\n\nFunded:\n- zkMaps\n\nFor more on the verifiable spatial data registries we're developing, read our litepaper: https://docs.astral.global/astral-litepaper.\n\nAlso, we're excited to be a part of the Radicle Drips experiment! We're supporting Future Foundation, Natives in Tech, Bloom Network, Return Protocol, Kolektivo, Silent Auth, ReFi DAO, The Commons Stack and others with our drips streams \ud83d\udca7", - "website": "https://astral.global", - "bannerImg": "bafybeie3fbdw7t5pbpkph4ymxrp2xmplgg3oqjolvjc7k7wvcydng25sky", - "logoImg": "bafkreifo4ja4zx7zmpbslprno7zrpfyev5ou35g24bmvd52c77ihmivjle", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreidpnmexkbo4vkjy2nq7nlctzlltw5ppbxkodkpy3vcel4aqolcvye" - }, - "userGithub": "johnx25bd", - "projectGithub": "AstralProtocol", - "projectTwitter": "AstralProtocol", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "HgI62zYvQjXTBSIHcx/YKlVS0rsi04D+ssD255XiuTZu9XFaEKxt43+n+9pkxFU8", - "encryptedSymmetricKey": "c0055dc66adced0c4cce0e8c6381fd1bc404184dadb750aa0785e0edf54ad11bc277c813491630d27a464f15c4e2d014c10c40ad3801a032221a691e42d31ec45d31dc2cc143dc09c139343e9360f5de2be85ea4dfa18232e55b258db3c731b8b53c6372ddbf04d69c6770db7e0c85b102c73f6e35eb1cdbd986303df72ae3e200000000000000203cacaffab9ccd76cd7e588b7aee07c22a85437d25bdc325250f5df2a3fd446c18e0dc7a7c51196edaa7290d0929a5089" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants and public goods funding" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "4" - } - ] - } - } - }, - { - "projectId": "0xa35e52635d40be090a49c587e58fab7410c30b9cff7ad5cc66b547d88cb93200", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0xb1a7df6ecc62c32be777357edfee2eba9a9890b5521d68ae71cddf80478595535d480e471a655ed4b769469e62327e6e1ad067f72716ed141186428c9bfff7921b", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0xb6e780438882f2daa11dA0972807f4D12166af8b", - "project": { - "lastUpdated": 0, - "createdAt": 1673453147140, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:122", - "title": "Impact DAOs Research + Podcast + Book : Impact DAO Media Season 2 ", - "description": "We aim to create open source knowledge on Impact DAOs, the future of organizing for climate and social change. The knowledge we create will inspire millions to build in web3 and to effectively organize for causes on the internet as DAOs. \n\nThrough our research of mature Impact DAOs and sharing knowledge through books and other engaging media formats we plan to create awareness and inspire change for a better world. \n\nGitcoin donors (GR14+15) enabled us in Season1 to publish a book on Impact DAOs, launch a podcast, All About Impact DAOs (21 episodes) and conduct research on 12 mature Impact DAOs including Gitcoin, Proof of Humanity, Ukraine DAO etc.\n\nThe book is available for free at https://impactdaos.xyz/. Listen to ads free podcast on Impact builders sharing their stories at https://impactdaos.buzzsprout.com. \n\nIn Season 2 (Jan 15 to April 30), Impact DAO Media plans to:\n\n1. Conduct research on 8 mature Impact DAOs through one on one conversations.\n\n2. Publish 22 podcast episodes of authentic conversations with builders of Impact DAOs. \n\n\n3. Build a network of Impact DAOs learning, sharing and growing together.\n\n4. Break down Impact DAOs book in multiple media formats to make knowledge easy to understand.\n\nDonate to your sovereign, decentralized women led media DAO, Impact DAO Media. Your donation will help us stay independent and fearless in pursuing the truth on Impact DAOs. \n\nThank you to all our donors, past and new for believing in us. We\u2019re a team of passionate changemakers that\u2019ll make you proud. \n", - "website": "https://impactdaos.xyz", - "bannerImg": "bafybeigb5kwsz3ruq3sla3vyuhg52t6qm3d6hkbdhh62eihfd5jwamogzm", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreidrfrijey4n74cwm6ppeipvww5c4az7vjnb4vhy4ait3ylkttdqky" - }, - "userGithub": "deeparocks", - "projectGithub": "deeparocks", - "projectTwitter": "https://twitter.com/impactdaos", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "9gwrESEsOUcjCqP7qsg9UUzl/Lkrw1K8/gOgPT30728e3txky+PHPR7uVYapMIss", - "encryptedSymmetricKey": "0c5848271878dc66a088e81d5ab11805206e189c67f100e80969010348db5bcb51441b2a967fabd97f069330e079d712d72a1a7843b039218007b7506699fda6311f2cdcda248fa298a5f2fa67f327628b2d3f1f56a8cd8fa5e20b8660c3448b4a928ab7693d80de06ac71654b168d09348e3fd85a8334eefeee51e8f880c1260000000000000020d67c9ed1dabcdf0da4af6155e92d9a2dda78b9bc9d208a8cf97e66a2c7d3333ab26e2e4e5b2f52cb4b4418e0323481ad" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Gitcoin Grant Round 14 & 15" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "1 Full time, 10+ part time" - } - ] - } - } - }, - { - "projectId": "0xa367f29625986a243fea7298958367a08679e748a57d3de6ae17a8a0317fef49", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0x26d1e8b54ad59a658d0bc6f2a638342285fecc2f774378bc69c5666e79f72c0925299bddae8a3c6ab2c2fe651de7658497f8b2a78a3d738035f0e8876b6520d81b", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0x65eD9a7CD4890E23Ac5bc8D51498ae955aF00724", - "project": { - "lastUpdated": 0, - "createdAt": 1673626395746, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:188", - "title": "CyberBox ReFi NFT Marketplace", - "description": "CyberBox is a ReFi NFT Marketplace on the Celo Blockchain that helps anyone become carbon neutral by offsetting carbon (CO2) through NFTs. You can contribute to offset by trading any NFT in our site, since we utilize part of the trading fees to purchase tokenized carbon credits.", - "website": "https://cyberbox.art/", - "bannerImg": "bafybeifs4vjggzwfbnxyzq6wadv4u7tb6sqwzpxcv26lxmw25vsnslvpo4", - "logoImg": "bafkreibgyx46agvo6oojboh7goqqxlmvmceoag7esdnupybihwrfewujby", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreigfjwq76jsx5kqshouoqr3r3f3ce46fgtpjxeooktpmxlauggy5mi" - }, - "userGithub": "LordFernando", - "projectTwitter": "CyberboxArt", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x65eD9a7CD4890E23Ac5bc8D51498ae955aF00724", - "provider": "ClearTextTwitter#CyberboxArt", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "hash": "v0.0.0:sp35VNa4iGGgVGqpdmETROGAfUVAZFwm5MnlWU3VCwI=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-13T16:11:17.664Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-13T16:11:17.664Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9.._QtAxqXR1q3uiDj581ZgIqOZssNBjh7sn82iueEPfFSVUUu3B5wpRUF_TPWUOloUfPmSaXYmBmp4S88_ACXWDw" - }, - "expirationDate": "2023-04-13T16:11:17.664Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "jdblPfY73KAG6xQKls48rFzIlZsibhxutIsGf7CD+YarQKOZpdZ/oM46gLKh+sps", - "encryptedSymmetricKey": "462ed1228192355b9d059fa3940dbfad89c4e94a5822cbb3341288ddfc58923fdd30b5e9a950048a1ef302a77aa71a142f93f5e91da2da620eb7cd01eed9ff0a4c3a169440f3c76d2f76cbf7c444cc279de16c88e7bf7daa311a99433970f1b112dadb4869324f3963f035e65ecb557c9bd5bf39ee727c8a85fe8d01afd1f4f300000000000000205c323422702e57aab3deae3426c18738db0242c3c2934296b8bf8890598e59a8ce731abc937c58e12a8c81423d549083" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "investors" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "5" - } - ] - } - } - }, - { - "projectId": "0xa429920058b543ded8fc02ca3aa69a9353faf3f1346b7f1b39e7b5ae5bac3777", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0xa63c54359e90a00c23c0f71a05b05a9c2a24a51a299ddcb38dd584cf0493b89f0d61121bce67f2ccf8768dedc83c65f56c687fb0d0f44266b5e7e103e24697f61c", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0x18ddbb6e344B11eeDff5A49fA0C0f1a03cc1097E", - "project": { - "lastUpdated": 0, - "createdAt": 1673576233547, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:171", - "title": "The CM Guild", - "description": "THE CM GUILD\n\n-The Concept-\n\n\nThe CM Guild, or Community Managers Guild, was born out of the idea that community managers and the ReFi community could really benefit from having a similar experience to that of founders within the ReFi Dao Founders Circles. With this in mind we are building this hub within the ReFi Dao server alongside, and with the guidance of the ReFi Dao team. The intention is to be another service within ReFi Dao, with Community Managers and ReFi community building as the focal point.\n\nThe Community Managers Guild is focused on creating a central hub for Community Managers from ReFi specific projects, to come together. A place to learn, teach, collaborate, and grow together. It is designed to be a safe place to enhance, learn new skills, and make connections in the space. The idea is for those who take part in the guild will become better at growing the ReFi community at large. With new skills and tools to build and attract more individuals to the ReFi space, and thus grow the overall impact being made.\n\n-The Initial Structure-\n\nThe CM Guild will hold weekly workshops hosted by professionals in the space with an expertise in a variety of fields that are directly related with growing and engaging communities. There will also be product showcases where tools for community managing are shared. Representatives from those tool protocols will provide walk through training, demonstrations, and answer questions from Community Managers. All of these workshops will be recorded to create a library of educational content for future members to engage with.\n\n-The Near Future-\n\nLike the Founders Circles, the CM Guild will establish a cohort where circles are formed based on community type, location, phase of community development, and other factors. This will help ensure the greatest possible outcomes for the participating members. Each cohort will last between 6 to 8 weeks initially.\n\nWith the Community Managers Circles, fellow CMs will become more connected, and strengthen the overall ReFi community. The bonds created between fellow CMs during this time will carry beyond the cohort to further foster collaboration and community growth within the space. Cross pollinating and establishing a more connected tightly knit ReFi community overall.\n\nWe are also looking to create training courses utilizing a learn 2 earn platform, as well as providing access or memberships to paid for services which are beneficial to a Community Manager.\n\nThe training courses would offer a verifiable way for a community manager to prove they have completed a specific course and possess certain knowledge. This could be beneficial to future job prospects, or even current jobs.\n\nThese L2E courses will expose CMs to the experience of educational content on a platform that benefits the user. Together within the guild, members will have the opportunity to begin creating ReFi specific educational courses to be shared with fellow ReFi communities.\n\n\n-The Immediate Impact-\n\nOne of the initial public goods the CM Guild will make available immediately, is the Gitcoin Grants Give-A-Thon. This is something one of our team members had started with another organization, and has decided to bring to the CM Guild believing it would be a better fit.\n\n\nThe Give-A-Thon is a marathon Twitter Spaces for ReFi grantees that takes place during the Gitcoin Grants Round. It plays host to a number of co-hosts from large organizations who are looking to support grantees in the round. Projects are invited to sign up for 10 minute slots and present their work and how the grant will help them achieve their goals. The intention is to give these amazing projects the extra exposure to potential donors, and grow the community.\n\n-The Goal-\n\nOne thing that is certain, is that climate change is a global problem. The more people we can on-board to the ReFi space the greater the impact we can achieve. Community Managers play an integral role in growing, shaping, and engaging the very communities which will generate that impact.\n\nBy being a member of The CM Guild, Community Managers will have the opportunity to not only expand on their own knowledge and learn new skills, but help shape the entire ReFi community as a whole.\n\nIt makes sense that we invest in the people who are building these communities up.\n\n-Use of Funds-\n\nFunds from the grant will be directly deposited into a Multi-Sig for the following uses.\n\n1\ufe0f\u20e3Operational costs, e.g. funding the Gitcoin Grants ReFi Give-A-Thon \n2\ufe0f\u20e3Creation of Learn 2 Earn courses designed for CMs as well as ReFi specific courses for the ReFi community\n3\ufe0f\u20e3Access to tools and materials for CMs\n4\ufe0f\u20e3A drip of funds to the communities that members represent, to be used specifically for community building events and campaigns to attract more individuals to the ReFi space\n\nFuture voting by well established members to determine best use of funds to help support and upskill Community Managers in the ReFi Space.", - "website": "https://www.notion.so/refi-dao/Community-Manager-Guild-643e545b6f5d4417b9352bc170fc5491", - "bannerImg": "bafkreibix5flnp3yxjm4zcbntlkksgw4nbv4nvxkc2gjbtvzhxvmduwit4", - "logoImg": "bafkreie7qhbhokqhzd27tydpgaet5ebli5fupjghxllp7zculh62zbzvsq", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreicsu2mjtkuzipcreipeavv2nsu5s4nnkwsvpwpzwruch6un3fkgo4" - }, - "userGithub": "", - "projectTwitter": "", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "0DVYFa8xWhgqJsAPA7WH9pWIindIeyv94MFZHF+6/Pj5Z3D0ecW8bVlsd9eN7uRP", - "encryptedSymmetricKey": "63805e2cd46cbb3d45ff9200d04c1a1eac39befdcffe98eec5565611bf5febd1f6cb650959141defa146343755c752142f0cf19af6c160b89a32e47fbd655bcae65dc08965335d7cf9e1baec4f06074842074bc227a5393f6c9ffbc9bb59f4a511b1b71286c4bb8306add747ab5fb631ae5f21cd038fec2e2942aafc9188ce5e00000000000000205f87eb4ac52995a2390f7a1d89a0bebaf624c4f2c8fdfe13eca2f78d94190395861584a25133c5ead710a2123a9c4aac" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants only" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "3" - } - ] - } - } - }, - { - "projectId": "0xa8570318dc5eb4618cb030b0f06ea912302efedecf23d819710ae76ff9f238ad", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0x8af885b4ca86362a9100760667a9a29dba532911356bfa02ad9bcb2f425f9ae5779f865b5c83f17c7d6e5a8c2cdd09837da74af0a39958b6e040ab8947e2d4011b", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0x81c776d0D7F7d9D3699851993EcAa88A46187F11", - "project": { - "lastUpdated": 0, - "createdAt": 1670271645479, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:8", - "title": "Treejer Protocol", - "description": "Treejer is an open protocol connecting donors to rural planters worldwide. The project leverages cutting-edge concepts such as decentralized finance (DeFi), non-fungible tokens (NFTs) and smart contracts to unlock new opportunities in financing forest conservation and rural development.\n\nTreejer acts as a seamless, transparent bridge empowering local communities through crypto donations even in unbanked and remote areas. Treejer's approach incentivizes not only forest plantation but also conservation by locking up the funds in a smart contract and releasing it over time as planters and other data providers continue providing updates from forest status.\n\nThe protocol also provides proof-of-impact to donors in the form of dynamic tree NFTs that have real-world attributes. These NFTs are linked to each tree and are minted on Polygon network.\n\nTreejer protocol has several smart contracts and two main interfaces: a payment and forest tracking interface offered to donors on \"https://treejer.com\" and a dedicated mobile app for tree planters and rural ambassadors. They use it to submit new trees, provide updates and unlock conservation rewards.\n\nBesides using official interfaces, builders can integrate the tree planting plugin with their existing products.\n\n\ud83c\udf33 Product demo (v1):\nhttps://youtu.be/ZTcy-6IxT7U\n\n---=== The impact of QF donations ===---\nThis quadratic round will help us build the next iteration of Treejer protocol (v2.0) and expand the adoption of our current products. Please find an overview of the works we've done after each QF round on Gitcoin so far:\n\n\ud83c\udf33 cGrant profile:\nhttps://gitcoin.co/grants/1080/treejer-a-climate-action-protocol\n\n---=== Learn more about Treejer ===---\n\n\ud83c\udf33 Documentation:\nhttps://docs.treejer.com\n\n\ud83c\udf33 Discord:\nhttp://discord.gg/treejer\n\n\ud83c\udf33 Twitter:\nhttps://twitter.com/treejertalks", - "website": "https://treejer.com", - "bannerImg": "bafybeidkgbti4vnunhyfigt6cahe2v7rxsujdmpjbpqpahw5bra4ld43di", - "logoImg": "bafkreigbovyjh2noqfyrq4gazjce5koyafawah2alzfro2wyep6zkbvzde", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreibxjm5pxg65hmfclh6l2juopcvbsreditujsroj234pd25iaoteya" - }, - "userGithub": "ermio", - "projectGithub": "treejer", - "projectTwitter": "TreejerTalks", - "credentials": { - "github": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x81c776d0D7F7d9D3699851993EcAa88A46187F11", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextGithubOrg#treejer#36486470", - "hash": "v0.0.0:uwBpeP6wfDAcr+1/HT8fAqoLO7YnlHuk4uQV+PEZNkU=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2022-12-08T03:31:45.379Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2022-12-08T03:31:45.379Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..KAgtTj_hBMVRm8LK2w8v7X4_0JZtDHMnYL2HM3lzC87uCBcR7byR5nRNL6s2lJOGDdAf-x9L_9VCmG6xUG4dDg" - }, - "expirationDate": "2023-03-08T03:31:45.379Z" - }, - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x81c776d0D7F7d9D3699851993EcAa88A46187F11", - "provider": "ClearTextTwitter#TreejerTalks", - "hash": "v0.0.0:TRYeZAqisZtVtLr1w4GvkYzH0PJpYBQfKNekheWa4oU=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2022-12-08T03:31:38.308Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2022-12-08T03:31:38.308Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..mcqsqMOnmSbgsypjZLr-3iQljM4AeO2Vn2sL070YKM5Vs-BS_fUS-DVzq4SynftIYXDwniazWdD3h0bXbl9FCw" - }, - "expirationDate": "2023-03-08T03:31:38.308Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "PeHlsLnZ01ZJ/zuiH0doGnZRa8hyigIq+h4dR64DRJ8BXIDkUIrab0PcUzNUXUzF", - "encryptedSymmetricKey": "e919d91cb78c221d585d0350bdfb21529d1da0dadd5e4f109ee64b049497dc5e2fd3f3c6d37284f538a78cec707b3507cd69f8717e1f269a4ba021e5c98a0bee0fb162977ec1faa03e82f0f7681c5ed2066c638b23cf7e0031de14b6eda342a2f58604d2aa368eee7851ed6da3dd281f14c589af59ebeee43f5cec1d7c4bb08000000000000000202fac1ffade3e099e0ae0e0f936349e0dc19666cccae0fecef8e021086cd04d464f7b1e9ca5462ddf7dea51c8b25b75a4" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "UNICEF and Gitcoin Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "10" - } - ] - } - } - }, - { - "projectId": "0xb63a68c4f785e348b96618bf48d466ffeabad13402f4f4ce93da66ede1cf3a98", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0x31c06f0327726a736e4e3261979063abdbd2efa8ed3358bcd28fbbd0441cbf2f15c82deb208dc2ab9e8fb3d27db21233fef863e285c4c16ad8dab9826e0b51b01c", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0xdD866169DBCf639ed57f0020c5C9F4F4E1AAB263", - "project": { - "lastUpdated": 0, - "createdAt": 1673196621219, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:79", - "title": "AgroforestDAO", - "description": "We are building a global community of support for those willing to engage with food, forest and culture as public goods.", - "website": "https://rooted-club.web.app", - "logoImg": "bafkreid7th45iisaeqf7jpdreeq7e7cwvm7elypiolntexo52hsvlrxecq", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiclj4oszgoyai5b623ptbysnurc6vxkkfnzgiqcrzzawqs62vfmwi" - }, - "userGithub": "DiogoJorg3", - "projectGithub": "Rooted-Club", - "projectTwitter": "agroforestdao", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "/3CVcW6LuDj0ToPlgenKgzJOVF8fIG0QbyZ/twRliWr3FgE069nb0cRVDLi4euFL", - "encryptedSymmetricKey": "2182202da0562c242392bd63077969a0e240e784a5ee964e13a5de38a056008febbbe215d6fa5d7b2b4174cc2b0b600a6c9f558ee9caaecd121d8ddccaa79b2b9a57c63149f088872503b7cc50ef9dc7dfa52766e9223b71d37454d4e2722fab6fc619feef5428116b3d7a5a2486182bb7a8bad90118a8f97fbbaed2973ef72700000000000000209330aa2a1ed7ff51014f353ffe5b79aa6c0c08a025e809ecd9727366f10905dd9329abac511db1ae58cdc47b11055785" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Gitcoin Rounds" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "4" - } - ] - } - } - }, - { - "projectId": "0xbd90cd76d77905c0600a5d21e5f8120ac756385175f1c2345efd88e2d39d4554", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0xb7bad57b0cc6e5c5928a863f4529dd4f014b4a7a379656fae61052b7cf60bdb23dddb3d4ba449bc3e60f2e9c891c6cd24413df95ed279e94bb362e768a90960e1b", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0x1b4463971582f485138879F0e509C160BeB8D5e6", - "project": { - "lastUpdated": 0, - "createdAt": 1673465193660, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:124", - "title": "MRV Foundation (previously MRV101)", - "description": "ABOUT\n \nMRV Foundation is a project that spun out of a founder\u2019s circle in the ReFi DAO. Effective measurement, reporting and verification (MRV) of soil regeneration, crops\u2019 health improvement and biodiversity enhancement is critical to help small scale farmers and growers navigate tough challenges of climate change.\n \n \n \nTHE PROBLEM\n \nTraditional MRV approaches are prohibitively expensive, often constituting 30-40% of the costs of implementing regenerative practices for large projects over 1200 hectares. What\u2019s worse, these expenses are always upfront but the project developers are not able to receive revenues until the credits are sold after 5 years or longer. Additionally, the current MRV methodologies are analog, difficult to understand, very lengthy processes and often do not include regenerative practices valued by the local communities. Data gathered during traditional MRV practices is usually kept in silos and has no useful application or benefits for smaller farmers.\n \nSmall farmers produce ~85% of the world's food supply and they don\u2019t have any viable solutions and support to switch to regenerative practices. This scenario offers us a significant opportunity for regenerative impact. MRV is a key component of building a system that can drive financial means to small-scale projects. Not only in agriculture - forestry, ocean, city regeneration.\n\n\n\nOUR SOLUTION\n \nTo help small scale projects get full benefits of carbon, ecocredits and other incentives for ecosystem services, MRV Foundation is working to publish MRV101, an open source software-based guide to help small projects to quickly understand and implement relevant MRV best practices and reap the rewards. In the guide\u2019s first edition, we are starting with agriculture, agroforestry, and small-scale farming examples.\n \n \n \nDELIVERABLES (Each Phase lasting ~ 9-12 months)\n \nPhase 1: Understanding traditional MRV approaches (Completed with the help and support from Solid World Carbon Expert, Mr. Durga Prasad)\n \nPhase 2: Learning relevant MRV practices for Small Scale Projects in the context of pilot projects based in India. \n \nPhase 3: Combining our learnings with on-ground best practices and publishing the guide.\n \n \n \nGR15 UPDATE \n\nWe raised ~$45,000 in Gitcoin GR15. We are grateful for the Gitcoin Platform, the whole Gitcoin team and everyone who believed and supported us during GR15. Over the last three months, we have worked on the following:\n\n- We did meetings with the ReFi leaders to learn how to best utilize the funds for MRV research.\n- We welcomed a few open contributors to the core team for the agenda of research. \n- We organised deep-dive sessions with experts in the field of IOT, ReFi and Carbon Space to provide us with guidance during our weekly meetings.\n- We invited pilot projects to submit project proposals as per the guidelines set by Bati.\n- We received 5 pilot project pitches during the submission phase.\n- The leaders of these pilot projects were also acting as open contributors for our MRV research. Hence, unfortunately, the question of conflict of interest started to arise. These leaders were also busy leading their own individual projects and were not able to contribute fully as per the needs of the MRV Foundation. These factors slowed down our research efforts and therefore, we unfortunately had to fully restructure our research team in December.\n- For research, instead of relying on project leaders to act as open contributors, we have decided to partner with the agriculture scientists who are already doing research in the field of MRV. As the first step, we are partnering with Junagadh Agricultural University to engage with the academic researchers.\n- We are also in discussions with a few farmer collectives to get access to their farmlands for implementing pilot projects.\n\n\n\nUSAGE OF FUNDS FROM THIS ALPHA ROUND\n\n- Providing stipend to academic researchers and core contributors - 50%\n- Documentation of research - 20%\n- Providing for operational expenses of the foundation - 20%\n- Providing for legal and compliance expenses of the foundation - 5%\n- Towards strengthening ReFi Space in India to ReFiIndia - 5%\n\n\n \n \nIMPACT AREAS\n \n- Incentivise smallholder farmers for doing regenerative practices and MRV documentation.\n- Improve the scope of VCM to include Biodiversity and other forms of credits.\n- Increase citizen participatory methods in VCM, ReFi and climate action.\n- Build collaboration with the DeSci community.\n- Bring existing MRV tools for the application in small scale projects.\n- Develop new tools where gaps are identified.\n\nCORE TEAM\n\n- Bhavesh Bati (https://twitter.com/Bati_ReFi)\n- Priyank Bakshi (https://twitter.com/0xClimate)\n", - "website": "https://mrv.earth", - "bannerImg": "bafkreidoebxh37edccxwyefwjurr2jlnyymb6mjx3w5nhzckczd3bzmi4e", - "logoImg": "bafkreieezh3ibgiteyabnqn32d2jvxifwlatfoaj7q7af7bdja2fswv7cy", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreidygcxtpi4ongosm5tdzursbyvpuon6cdg5rzsikvtlrnzk5dref4" - }, - "projectTwitter": "MRVProtocol", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xCd818A14C8c74426D417B0E04Ea227BD5a243Ca0", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#MRVProtocol", - "hash": "v0.0.0:ECXS84qjafawKBJfQOiMvwKs1nffUzParcuzUCvmZnc=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-13T00:20:43.005Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-13T00:20:43.005Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..pepOoMRjUOHOn56fRdNjLUbhbwAyt1QOjkL18H33xdgiAEKQc0vVksnrQ6zNoEp9gHwYN5PE4bJrI6vVJMxjBA" - }, - "expirationDate": "2023-04-13T00:20:43.005Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "9wViUjiQ3ckDzWC0gMM7riS57ICVQ/+ISn/TJGw/5RYVTS8F70Gd9lUdZ6Vivjf6", - "encryptedSymmetricKey": "66c25ab41c636f599dde8093a0078b454fd7bf00f84ab1c69c0c0740b9f727a43f9cd6711c591d9241a92dd1c20aad11ed2b82706216c43ebef3655afbf6bfa7aa6790a4496a400f97447527397583bccfdcb1b3d21bd9ce9d02a80be33304b74827488d9d55e94c534dedbc5b042ce5cb0981fd236226601f73ea6a3fa9db8c0000000000000020e28b589ef7ea7cb8075748e45c1c9cfd9ed22cddb26107adb80f6a06372ce73fbd35aba190f9031be6b445dee5169084" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Gitcoin GR15" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "5" - } - ] - } - } - }, - { - "projectId": "0xc3b35b0cb696ab824b9d2d0a515ffd79fc1cf3950442bc0ca91a3c6441cdfa7a", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0x5f389ea7c43943e1d16567a82647c538cdf686f61c1ef8f42dfc52d98fdde79d70a48ed64570c12a371917adac0610924ce549795fb3f0ac442777028d5dc41b1c", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0x1a6ef6cc28cf60aa0504cfb21cdffa48cfe3a8fb", - "project": { - "lastUpdated": 0, - "createdAt": 1673193838381, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:78", - "title": "Hibiscus DAO", - "description": "What is Hibiscus DAO?\n\nHibiscus DAO is building the first transparent, open-source, community-owned toolkit for the fashion creator economy.\n\nWe want to return power + ownership to creators and producers - and eliminate negative human rights and environmental externalities from the fashion supply chain.\n\nWHY?\n\nCurrent Landscape of Apparel = Exploitation\n\nThe apparel and luxury market is growing exponentially: reaching $1.9 trillion globally in 2019 - and expected to surpass $3 trillion in the next decade.\n\nBut the industry's success is rooted in exploitation. Its business model is based around maximizing profit - by minimizing value returned to stakeholders.\n\nTraditional Fashion = Humanitarian Exploitation\n\nSlave, child, and sweatshop labor are all common in the supply chain of traditional brands.\n\nThese human rights violations are well-documented but suppressed via marketing and PR. \n\nTraditional Fashion = Creative Exploitation\n\nTalented young designers generate massive value for brands - often with little to no compensation.\n\nA successful, popular design will earn a brand millions, yet the designer behind it will see none of these earnings. Instead, their designs become the IP of the brand.\n\nTraditional Fashion = Environmental Exploitation\n\nFashion brands intentionally leverage planned obsolescence and instill an increasingly consumerist mindset based on overconsumption to feed their continued need for profit. \n\nWhen overconsumption is encouraged, true sustainability is impossible to achieve.\n\nWe\u2019re a **black-led** team and here\u2019s what we\u2019re working on:\n\nEnabling Profit Redistribution + Transparent Supply Chain + Community Ownership = Human Rights Impact\n\nHibiscus recently created the first ever on-chain profit redistribution contract for garment production - redistributing profits from FWB merch sales to supply chain participants.\n\nHibiscus is looking to build on this by onboarding sewers, pattern makers, printers & other workers from the garment industry who are \"stuck\" working for a factory with no access to profit redistribution - giving them ownership over the value they create.\n\nBuilding cryptographic profit sharing into our tooling enables the creator economy for apparel production by retaining and redistributing the value created in making and wearing apparel. \n\nCrypto technologies help share ownership with stakeholders:\n\n- Community owned ateliers vs. factories and manufacturers.\n- Fork-able concepts and tools can be validated and iterated on by community creators.\n- Designs registered as on-chain vectors - enabling proper credit and compensation.\n- Future royalties of products can be distributed back to creators and the community.\n- Locally accessible physical design and fashion resources.\n\nBuilding a Transparent Supply Chain\n\nCreating open source, end-to-end apparel production supply chain + tech infrastructure that allows creators to easily create new garments on existing bases - via on chain portfolios that can forked, remixed, and recombined.\n\nCreating \u201cProof of Ethical Production\u201d + Oracles\n\nEventually, we want to create a system of producing clothes that uses consensus-driven blockchain technology to verify products are being made ethically.\n\nFighting Fast Fashion = Environmental Impact\n\nAs a part of our stack - we are working on the first solution for holding fast-fashion polluters accountable.\n\nSince the last Gitcoin grants round, we\u2019ve created the first model for on-chain profit redistribution in fashion - successfully experimented with the on-chain profit redistribution to stakeholders who previously had no access to upside from their IP. We\u2019re almost ready to drop a case study - open-sourcing the process behind this historic collection.\n\nNow we want to enable supply chain provenance and environmental transparency in the garment production process: create and test the first functional model for an open-source apparel supply chain to show how the garments were produced and the corresponding environmental impacts. \n\nSupply Chain Accountability\n\nWhat does this look like in practice? \n\nNow that we\u2019ve experimented with profit redistribution - we want to run experiments to figure out how to capture garment production metadata on chain.\n\nAnd after that - putting these new data capture + manufacturing processes into practice by experimenting with a garment collection that incorporates provenance and accountability around environmental impacts of the collection.\n\nWe hope that our efforts will set precedent and can serve as a model for future apparel projects. The current landscape of crypto fashion is \u201cmerch\u201d that encourages wasteful consumption, enablement of existing exploitative power structures, and no regard for the environmental impacts.\n\nHibiscus seeks to change that by providing an alternative approach that enables sustainability which already reduces waste or gives accountability around environmental impacts of garment production.\n\nOpen-Sourcing a Model for Ethical Clothing Production\n\nThis experiment will inform the development of environmental oracles that will allow any apparel project to open-source their environmental impact and adopt new environmental standards - all done via leveraging supply chain metadata arising through the garment production process. \n\nThis supply chain experiment will be done with local supply chain participants in Toronto, Canada - with the hope of subsequently expanding out into other countries. \n\nHibiscus is creating and open sourcing the first model for a decentralized, transparent supply chain in fashion. \n\nHow = Utilizing L2s for Real-World Crypto Use Cases\n\nBlockchain technology is often criticized by naysayers as not having real-world uses. \n\nHibiscus\u2019 goal of creating an open-source, community-owned supply chain is one of the strongest examples of an IRL use case for crypto. \n\nIn order to create a truly sustainable, community-owned supply chain for clothing, Hibiscus needs to focus heavily on grassroots community work - onboarding sewers, pattern makers, textile producers, and other supply chain participants.\n\nIn many cases - these supply chain participants are members of underrepresented groups: people of color without much exposure to technology - who would be vulnerable to exploitation by traditional fashion industry structures and institutions.\n\nThese participants in the garment supply chain have never heard of blockchain before. \n\nOnboarding them onto Ethereum mainnet - and having them pay anywhere from a few dollars to a few hundred dollars in gas fees - is simply not feasible for this demographic.\n\nInstead we will work directly with these local supply chain participants to onboard them into crypto via L2s - which can provide an accessible, feasible entry point to these new ecosystem participants. \n\nWe hope to use L2 infrastructure as foundational substrates to build real world utility and onboard new non-crypto native users.\n\nWe will open-source this process to create onboarding resources and serve as a model to other projects who are building real world use cases on L2s - to help accelerate driving real-world adoption.\n\nWhat\u2019s next on the roadmap?\n\nWe\u2019ve hit our short term goal to use liquid 0xSplits to experiment with redistribution contracts for primary sales for garment workers since the last Gitcoin grants round.\n\nWe seek to build on this success by creating garments made using a transparent supply chain by open sourcing garment production metadata - proving out our model for supply chain accountability.\n\nThrough this process - we will onboard underrepresented communities onto Ethereum L2.\n\nAs mentioned above - we\u2019re working towards a system of producing clothes that uses consensus-driven blockchain technology to verify products are being made ethically, without negative human rights and environmental externalities. \n\nWith an improved model we can build better to do more, produce less, and return value to creators and users.\n\nFor a deeper dive into our ecosystem, we invite you to read the first edition of our whitepaper linked on our website: hibiscus.tech. ", - "website": "https://hibiscus.tech/", - "bannerImg": "bafybeidgibzxids55bfmkawolgolm4r45a7tsqbky5eawpyczqy2sy4m5i", - "logoImg": "bafkreiaz2jwfowlu3shqoyo6354yynnd3aujqrlkngrnbnahcynokfqgj4", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreic5kdhtk7t7rhcfjfgkmrzj7naq2xez53rilwl5p2khjifqi2zbvi" - }, - "userGithub": "techspecc", - "projectGithub": "HibiscusDao", - "projectTwitter": "hibiscusdao", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x1a6EF6CC28cF60aa0504CfB21CdffA48Cfe3A8FB", - "provider": "ClearTextTwitter#hibiscusdao", - "hash": "v0.0.0:05fIXKrKoaLNMS/4RZuBkF75O/HhnXJa1VEp9Icy/R8=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-13T18:13:52.265Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-13T18:13:52.265Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..wfTLLLBy8iCQJu0fNCCTvoM8ZZfORDDcTyM_fyp7xhRD8YgstK2xsPjOyXhXpWdRJGemK1e4VvXyo9V1Oh54DA" - }, - "expirationDate": "2023-04-13T18:13:52.265Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "zPzHBEUZ/xvn1vJFOubEUgzat1lYcuxtJJsxeI2L+4w=", - "encryptedSymmetricKey": "9e9c9f2ba085412395955b0cea7ca6c5779b522fcd84cdedd5df07a56fdfda3a557b27fe0acf6ddb133283a4e6c07c0592fca38f5c6147f0764ecbb185fd20da3f65529e602523f194c796d579dde50edc9e0a812f27cf1771d331a7d8383a84c950c2af216c28a12230f4f32a81ac6facede275063f9b6dbaa7cbc811073b78000000000000002061699eee005210f42d57d972e340dda054573578a5c20bf4e20aa73ad1fc08a90acd71e28909b187e617db76d66e4bb2" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "3" - } - ] - } - } - }, - { - "projectId": "0xc8c5d94192210bb9b341f13bab13b64a04a893fd50fc554fd6661b6b58fd5360", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0xa59a67eee2ae97dc706640ab2dcff60935b5c84e55068ad67563e2edf30d24501e4007d5ac5ce707b1dc169efceafb6c7cc58ee1f5e3eca83d35c87b1c8308d601", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0x3460BF837B6741035d20Ea2D894A4423A859af12", - "project": { - "lastUpdated": 0, - "createdAt": 1673350863806, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:95", - "title": "The Angry Teenagers - democratising investment in reforestation projects", - "description": "\ud83c\udf33\ud83c\udf34\ud83c\udf32\ud83c\udf33\ud83c\udf34\ud83c\udf32 \nWhat can each of us do to help regrow the world's forests?\n\nSo far, the answer has been a very frustrating, \"not much\". \ud83d\ude21\n\nUnless you have a few million dollars to invest, until now you simply haven't been able to directly help plant forests in the places that most need them. So we've been forced to rely on governments and big companies. \n\n\ud83d\udc68\u200d\ud83c\udfa4\ud83d\udc79 THE ANGRY TEENAGERS ARE ANGRY ABOUT THIS \ud83d\udc79\ud83d\udc68\u200d\ud83c\udfa4\n\nNow we've channeled that anger and used to blockchain to build a solution. \n\nWe've created Angry Teenager tokens that each hold a vote in a DAO. The funds raised from selling tokens goes into the DAO wallet, and then they vote to release funds to plant trees in the real world. \n\nThis has involved innovation not only in the smart contracts that manage the DAO (check our white paper for more details on \"opt-out voting etc), but also in real world legal contracts \ud83d\udc73\u200d\u2642\ufe0f. All of that work is open sourced, of course. \n\nEach token is geo-located to a specific square within the project \ud83e\udde9. So buyers can see exactly where their money is going, and the piece of land that they have reforested. They can also watch \ud83d\udd2d the trees grow over time because the tokens regularly and dynamically update with photos and other data. \n\n\ud83d\udc63EARNING CARBON CREDITS\ud83d\udc63\nAs the trees grow, token holders earn carbon offsets which they can use to offset their carbon footprint. You can have 100% transparency and so 100% confidence in the work that is creating your carbon offsets. \n\n\ud83d\udcb0THE VALUE PROPOSITION\ud83d\udcb0\n=> Individuals and small companies can now fund the creation of a forest on a specific square of land in Africa, starting with investments as low as $150. \n\n=> They can watch that forest grow, and share photos and other media about the project with their customers and friends. \n\n=> They earn super high quality carbon credits that they can use to offset their carbon footprint. \n\n=> If Ever they want to stop earning carbon credits, they can sell their token on the open market - if the price of carbon credits has risen, this might even make them a profit :)\n\n********************UPDATES SINCE GR-15******************\n\n=> Smart Contracts fully audited\n=> Artwork. Beautiful artwork is complete. \n=> $10k Pre-Sale tokens sold to raise funding for the first test planting on 2 hectares. \n=> Verra Project Design Document 90% done. This allows us to generate Verra-authenticated carbon credits which have the highest value. \n\n********************END TRANSMISSION********************\n\ud83c\udf33\ud83c\udf34\ud83c\udf32\ud83c\udf33\ud83c\udf34\ud83c\udf33\ud83c\udf32\ud83c\udf33\ud83c\udf34\ud83c\udf33\ud83c\udf32\ud83c\udf32\ud83c\udf33\ud83c\udf33\ud83c\udf34\ud83c\udf33\ud83c\udf34\ud83c\udf34\ud83c\udf33\ud83c\udf33\ud83c\udf34\ud83c\udf33\ud83c\udf33\ud83c\udf32\ud83c\udf32\ud83c\udf33\ud83c\udf33\ud83c\udf34", - "website": "https://angryteenagers.xyz", - "bannerImg": "bafybeig7ip2u4akhi374jf6rt2b2r5lntt7dnvn2dv646bnka3blztx5kq", - "logoImg": "bafkreiaakmi74dz7rkjcvyk2ryim2ejo3dactx6h3qfpg6a36ofbvnzvvu", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreifwbx77npipn4rjnpzpmmteh5zjiltwkbsv57ym4k4gq6nbgfadxe" - }, - "userGithub": "benwhately", - "projectGithub": "eco-mint", - "projectTwitter": "AngryTeensNFT", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "tvUrtetmdpkzorxvGaEmTBODI9gkuv6zCGNWEyMDHA0=", - "encryptedSymmetricKey": "4c9d6ee319a87c1209601b443817f273a102b24304c152a7e30c44a734c68a4cfcc5ea086f1281ea9f1db4c3b2975602798732e588c45ff537e506133f421211e243f6ab3386833c4762bd8f56d7a092884ed2313f6a041fe54ce3a5e97bb5a8520bfb011be77fe3854dc21faac8083e15ccc803ed98a13f97ba8574f44f495b00000000000000206a6beeaa66b43540bcca0d61fb1bc400568a92d272fe56e81800db6da296f0d8e99c490ee81794740ca1d2fd8403068a" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Tezos Foundation grant, Gotcoin grant" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "5" - } - ] - } - } - }, - { - "projectId": "0xcaa2f99f0e54943da441af228296cf621a7a1eab4949305785e51e342a5afd15", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0xf5951bcbbe116750d2490ccfdde9d48de83bc61b973c82edcfbafdccbd0a0dab2d3e3d050bfd8d7a4fef576829658b844206a75394b1583c06626f2b7a419fdc1c", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0x16d46098e455A04Cf7F3e43c3b2706614fDbEC85", - "project": { - "lastUpdated": 0, - "createdAt": 1673324860449, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:92", - "title": "Myseelia \ud83c\udf44", - "description": "\ud83d\udd78\ufe0f \nWe are weaving information into a shared knowledge network, a coherent systems map for cultivating collective inteligence. \n\n\ud83d\udd25\nHumanity faces a converging cascade of interconnected crises: ecological, economic, geopolitical, educational, psychological.. without a shared map for collectively navigating away from collapse and towards a flourishing future for all.\n\n\ud83d\uddfa\ufe0f\nMyseelia means to map the pathways towards planetary regeneration by cultivating a federated knowledge graph, integrating individual perspectives and data silos into shared knowledge and wisdom.\n\n\ud83c\udf31\nWe are starting with people and projects already in the web3 impact space. By giving them tools to grow their own profiles with their wants, needs, ideas, values, claims etc, we can connect these subjective perspectives together into a coherent systems map via Myseelia.\n\n\ud83d\ude4b\nOur proposed solution, a searchable knowledge base, can address key questions:\n- How can I generate wealth aligned with what I love and what the world needs?\n- Who is already creating impact? How?\n- Where are there regenerative investment opportunities?\n\n\ud83d\udcbb\nWith funds from this grant we will build out the first stage of Myseelia, including\n- A backend graph database\n- Semantic search\n- Personalized recommendations\n- Graph visualization\n\n\ud83c\udf32\ud83c\udf44\ud83c\udf33\nOur future development will include integrating additional domains of data, AI assisted services, APIs, a decentralized graph database, a regenerative financial model, and decentralizing governance focused on commoning.\n\n\ud83e\uddd4\ud83d\udc69\ud83c\udffd\nOur team includes \nDarren Zal \nJenn Baez\n+ key collaborators in the web3 ReFi ecosystem.", - "website": "https://notion.so/jennbaez/Knowledge-Network-for-Regeneration-82a964f84d204e978d665be22cc64bd4", - "bannerImg": "bafybeiaplfu4rglnf5eenpw52k6oy5ituuna2skib3qfxhxg5vo4tx7phm", - "logoImg": "bafkreiddtoumf52t3haqvrwtg3v3c3pubhnh4qvxahcgx57kl4aoxakt7u", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiepf7kc3m2qbmvvk2gkgu4dhg2ugjmdt436bmc5qfb6bkrcn6c5vi" - }, - "userGithub": "https://github.com/DarrenZal", - "projectGithub": "https://github.com/DarrenZal/Myseelia", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "y+M2xZdbvpDSfRH5e3SW8sfV642YnfAkVeeEkGRq9dhEXq7NTJ6oSXvYfRyF2Ilj", - "encryptedSymmetricKey": "0142e67ccd84559ad78da93ce258ce95754949a3417ae9fe5eb8c2c7f43195f9060cc228419c814c4c311d18f57ee90485c14c5015dda85fa086aa5b0a2aad91ace5cbc52249b8a1dde9ba55171f46b72cf4ea2c33c3f4a8737600b430294882c77b799ed563d6632856e00212f394fa3626253b9bd30598264ea42a18c0344d0000000000000020b7789673d641ce89398a499176d778e6817dd6de08e3aaafa2753dc60d034e60f8ab73b76dcde53af19cb8a32a877c87" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "2" - } - ] - } - } - }, - { - "projectId": "0xd5b16b89145a20eac6baec6b21b640eb86df90d36102d9bc808ec2e858557ec4", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0xbb83c8a66388335a831258b667efdcd341bb4a4e33e31bbe60cbd1d7998a88954efa6bb3c1b534f5e2cd43abe385ab89b6eee0c6cd342217e16e07ca04292ec91c", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0x348D5e7A1D24B58665a822D3766db5b2A92eC8DA", - "project": { - "lastUpdated": 0, - "createdAt": 1673900316264, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:231", - "title": "Living Ground project South America", - "description": "We\u2019re in trouble! Our soils are dirt. Soil is the most valuable and least valued resource. There is drought, flooding and leaching of our soils. People are diseased. Our food is deplete of nutrition (even organic) and we face a growing public health crisis triggered by the decline of beneficial microbes and the rise of pathogens. Mother Nature does not need us...but we need her healthy and strong.\n\nLand degradation is a collective threat for everyone. We have a plan and creative vision that can reverse this damage and make farmers, gardens and plants both abundant and sustainable. It is vitally important we make this transition. This is our mission.\n\nProblem #1\nSOILS all over the world are currently DIRT. They are losing microbe life and the foods we eat have little to no nutrition as a result. Without \"good guy\" microbes, soil, plants, and humans are unhealthy. \n\nIT IS TIME TO IMPROVE THE HEALTH OF OUR SOILS which is intricately entwined with HUMAN HEALTH\n\nProblem #2\nOur envisioned Project Site is currently being prospected by a gasoline corporation. This is a classic story of: Little Microbe vs Big Chemical Corp. The time to act is NOW!\n\nThis project site would become the center of operations for Living Ground and we intend to become the Microbe Education Center for South America. \n\nNow for the good news. Living Ground a project in Ecuador, South American. We are creating a project that mimicks Nature. We are farmers of beneficial microbes. We have created a change the world project that addresses and initiates solutions for many problems including climate change.\n\nOur primary intention is to heal the soil by farming and spreading the beneficial microbes but Living Ground is so much more. We've created a whole system project where microbes, people and plants can enjoy success and health! Microbe tourism, education center, gardens, restaurant, cooperative, gourmet store, essential oils, apprenticeships, health clinic, regenerating land, office to preserve land and water......and more!!!!! We've created a whole system where microbes, people and plants can enjoy meaningful employment, success and health.\n\nThe Soil Squad Ecuador found the perfect site for our microbe mission to house the Microbe Education Center. BUT, we discovered a gas station was interested in this same property. So, we made a deal to purchase without the funds needed.\n\nImagine a project that circulates around the beneficial microbes to ensure success, health, healing and touches life with hope! When the beneficial microbes are healthy, the earth's soil sponge is health. The soil sponge is responsible for healthy climates and ecosystems.\n\nIt is important everyone understands that soils (sand, silt and clay) hold massive amounts of nutrients and carbon in soil everywhere.....but these nutrients are not in available form for the plants without the beneficial microbes. Humans have destroyed this microbial web. We have a chance to reverse this in a way to rises microbes, humans and health. Our mission is to empower the web of life and ensure health for all.\n\nIt is time to gather everyone who gets the importance of this work, Please join us in creating healthy success. When the little guys (humans and beneficial microbes) come together, everyone wins.", - "website": "https://www.livingground.art", - "bannerImg": "bafybeidzfhbfenyzxo7mpvkyhdpdceb5ebqnxqpm6gsvmojqc7vcuodrbm", - "logoImg": "bafkreid2kzcg3recyabyigsbqflwnka6ntjpsetltxwwff5a4gu222tu5m", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreie7y3cldvjaiqfohpqjcjwhcvu3gvwdcg5vezokxjjmddfc5gyvw4" - }, - "userGithub": "", - "projectTwitter": "https://twitter.com/living_ground", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "Ah5lyEB5ubCdNVv+NszjhDtY0QFsORGk9c7MBiZkONFg9AyLbUKk6SMQMFv/qOIa", - "encryptedSymmetricKey": "2841e64d3b6e3320b54f70cbd55eb9944426d97e537b045776c712997f7f70b9e4061704940e3f0eb48f5d1d9cebda164d5c6b94f3c3476790660977fa6e6c3b1d77f94838312e1b6385c1ceb79f13ce7118fcfc2235f21d8786450516995c98ef485c97436bb3a9f01ca02147309a4bbf43327dd7b8a80be0c3933eb3c71e6300000000000000208391402190c3b235b2b420f64acf9bf8fe704f599399dde3ce74f2d74de87a70866c832b22cdd6301cb444ad71deb380" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "self funded" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "6" - } - ] - } - } - }, - { - "projectId": "0xd716c3a7c353f0458ff8387fb435606934e25b631a83db017e5eb9a0022358f0", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0x7ba7ea07fc0db1da63e2892ee273f2bf9481beebeb6e7507b43160d8a42b92a40e8e955d59a5742f43925a7971548effc21abb30da4b1a37fbd8e88178bc485901", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0xE07b0f3c2A669b656476e4D6A054F4922D539D3D", - "project": { - "lastUpdated": 0, - "createdAt": 1673538825374, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:161", - "title": "Bundle: Carbon Markets", - "description": "\nA collective of 13 cutting edge projects working at the forefront of the digital carbon revolutions.\n\n------------------------------------------\nAbout the Carbon Markets Bundle\n------------------------------------------\n\nCarbon markets are an important way to reduce greenhouse gas emissions and slow down climate change. These markets work by allowing people and companies to buy and sell emissions reductions. This GR16 bundle is a collection of projects that help people understand and reduce their own emissions, and make it easier for them to buy carbon credits to offset the emissions they can't reduce. This bundle includes projects innovating to raise awareness, create demand, and facilitate the supply of carbon credits, all of which are necessary for a functioning carbon market.\n\n------------------------------------------\nHow the grants funds will be used\n------------------------------------------\nThe funds raised will be divided equally between all bundle projects. Funds will be invested into increasing demand through improved scoring, increasing supply and improving guaranteed quality of supply, promoting the marketplace to ensure demand can meet supply. Ultimately, the consumer is best served through a strong marketplace when there\u2019s competition and choice. The grants funding will contribute towards that.\n\n---------------------------------------------------------------------------------------------------------\nThe funds raised in this bundle will be shared equally amongst the following 15 projects:\n---------------------------------------------------------------------------------------------------------\n\nDottyland Impact Self \ud83c\udf33 @dottyland_xyz : On-chain Impact Self. Turning climate-positive actions into functional and serviceable identities across web3 applications, starting with on-chain carbon token retirement.\n\nCarbon Flow \ud83c\udf33 @CarbonAntiTheft : An anti-theft solution for global carbon markets, a multitoken system restricting the amount of carbon tokens converted. Multi-trillion carbon market just makes no sense without anti-theft. It is a smart contract that limits the amount of theft in carbon markets. Everybody can create a carbon token. The owner of a carbon token can allow conversion into it from other carbon tokens, and set limits (absolute or per a period of time) of conversion from that other tokens. So, for example France\u2019s DAO sets the amount of Paris\u2019s carbon tokens that can be exchanged for France's token. So if Paris is found guilty, France can pause exchanges from Paris tokens and devalue their token. If Paris during some error produces a septillion of carbon tokens, they can\u2019t be exchanged for an upper level, because of the anti-theft limits. Tokens can be retired (voluntary denial of carbon production) and retired tokens are meant to be used as a means of payment. Every carbon token owner (such as a notary) can set his \u201ctax\u201d on the retirement of tokens, so notaries and DAOs compete on the free market. DAOs can also mint retired tokens to reward somebody, e.g. for climate science progress. The smart smart (not a typo) contract is developed, it remains to create a DAO around it.\n\nCoorest \ud83c\udf33 @CoorestOfficial : A decentralised application for carbon offsets utilising a 100% on-chain CO2 sequestration via satellite validated NFTrees, CO2 tokens and Proof of Carbon Compensation (PoCC) certificates. \n\nKlimaDAO Name Service \ud83c\udf33 @knsdomains_ : A domain name NFT that permanently locks up carbon credits, continuously offsets carbon credits and can be used as a social representation of climate impact. Currently integrated into KlimaDAO pledge dashboard, making it easy to access climate commitments using .klima domain names. \n\nClime Tech (Formerly Clime DAO) \ud83c\udf33 @ClimeTechInc : Climate action and resiliency tool used by cities and business for adaptation and mitigation. Carbon reduction verified, stored on chain and issued tech based carbon credits. \n\nMangrove \ud83c\udf33 @mangrovecarbon : Mangrove is building the operating system for carbon removal companies to eliminate the risk of double selling supply, improve sales processes, easily bring inventory into the refi ecosystem and ensure compliance with government and registries. \n\nERC-Cool\u2122 \ud83c\udf33 @TresCoolLabs : The ERC-Cool\u2122 is an improved implementation of the ERC721 smart contract standard that weaves real world, perpetual, carbon removal into any NFT use case that adopts it. An open source - planet cooling - super sustainable - delight. Designed to spark a removal revolution, enabling action to become the fabric of web3 and sprinkled to every corner of the internet.\n\nKUMO \ud83c\udf33 @kumo_dao : KUMO unlocks the value of natural assets by providing interest-free loans against their market value. Loans are issued in our native stablecoin, which literally locks carbon into money. KUMO turns the act of owning a dollar into a climate action.\n\nECORISE DAO \ud83c\udf33 @ECORISEDAO : ECORISE brings liquidity to the real estate and natural capital asset market and unlocks stored value through tokenization of these assets and bringing them on-chain. Landowners are incentivized and rewarded for regenerative and restorative actions that increase their natural capital asset value and provides new sources of revenue from ecological economics. \n\nCarbonland:\nCarbonland Trust \ud83c\udf33 @CarbonLandTrust : a carbon credits registry offering natured based carbon removal credits from biodiverse forest land that is being enrolled into perpetual conservation. \nCarbonland DAO \ud83c\udf33 @CarbonlandDAO : a Nature Preserve Timeshare that leverages the Carbonland Trust protocol to issue and sell carbon credits from its own forestland. Carbonland DAO acquires property by selling CDAO tokens, the governance token of Carbonland DAO. Token holders can use CDAO to vote where Carbonland DAO buys property, and can spend CDAO to make reservations to visit and stay at Carbonland DAO\u2019s nature preserves.\n\ndisCarbon \ud83c\udf33 @discarbon_earth : creates transparent and verifiable emission estimation and carbon retirement and tools available as public goods within the Ethereum ecosystem. disCarbon\u2019s aims are to raise awareness about the impact our actions have on our planet and accelerate the adoption of on-chain carbon credits.\n\nChangeblock \ud83c\udf33 : investors can gain access to groundbreaking green credits that are streamlined and independently verified, allowing for the creation and listing of unique instruments on our platform. As the first to offer an end of life plastic credit in collaboration with Fusion One, we have demonstrated the ability to develop credits for any green initiative, providing investors with a unique opportunity to support and benefit from innovative sustainability efforts.\nChangeblockNFT: ChangeblockNFT helps demonstrate commitment to sustainability and social responsibility. We enable NFT companies to improve their reputation, reduce risk and attract top talent whilst making a positive impact on the environment. ChangeblockNFT has the following 3 key features: \nNFT Asset Wrapping: Enhance the value and marketability of your NFTs while supporting UN SDGs with our asset wrapping service; \nRetroactive Carbon Offsetting: Eliminate the negative emissions from your past NFT transactions with ChangeblockNFT. \nAutomated Offsetting: Ensure all future NFT transactions are offset with our automated offsetting service. Choose the green assets you want to support and make a real world impact. \n\nThe Eden Dao \ud83c\udf33 @TheEdenDao : In 2022, Eden Dao launched the DRM Syndicate, which removed 760 tons of CO2 permanently removed from the atmosphere to rise to top 25 in the world alongside Stripe, Microsoft, and Harvard. In 2023, Eden Dao Lab builds regenerative financial infrastructure, decentralized lego blocks, and public good utilities to accelerate time-to-market for ReFi startups.", - "website": "https://www.notion.so/Bundle-Carbon-Markets-cc64342f73b9467f969b031811066397", - "bannerImg": "bafybeiexckaeuirr5fxztoox2o2lpp6pkpcob5wyuuozproc5nb6ycorea", - "logoImg": "bafkreidzxaury4tzglu35h6zqkfkdtv77pvvwirbslwuvcuqevmx6hmplm", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreifbvcdq5iyejzyhrke74qra5l5rjyblzgstuekviqtr525v7a43d4" - }, - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "8du7uadOjOHdbDfaegd4iBcGsZcjxPHxYFTBhqmTvoc=", - "encryptedSymmetricKey": "488555986ab35d72ff78070a6fa34c6cab96ff33f6e384272a919e6bf73a9be53a7394b70ea266ed8199bc3cc2343a18c02d3ac05ffb4d7c616015c2aadb8c903eb98891d45428b2ad535c0a6857ed2b8fea11ad1a5a6342fd0fe55a898ca1816946652a02cdf0130b10a553c9d101352ed6d52a92b1dba02e167555162e64c80000000000000020a586b584f7ba56d5b85c20920915c1db313519b9913698bd85cbb8d9e6109d23a82d818340230fd8fe65c14abb1115af" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "13" - } - ] - } - } - }, - { - "projectId": "0xdbcd05ba701119f00aafd0212c87aded137112a007f4cc56340dc9124515e329", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0xb736d87fdd2df9299c2c4bc4d63da6562c161159d615a5f672480b9c33601df0557203412efa9d6183c53abf9d32ed2bcb0d5efad54bcef899f55de2106d21141c", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0x035A1F3419DD223293e5411133d9C786f5885425", - "project": { - "lastUpdated": 0, - "createdAt": 1673612327244, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:181", - "title": "Carbon DAO", - "description": "Introduction\n\n\nBorn from Carbon DAO, The Aetlas Protocol is a ReFi protocol that is designed to connect the ReFi ecosystem and unlock new inflows of green capital. We designed a liquidity and retirement mechanism that offer the best of both a liquidity pool and an NFT marketplace. This offers the ReFi ecosystem a liquid marketplace that retains the unique values offered by each individual carbon project.\n\n\nWho\u2019s this for and what are their problems?\n\n\nThere are five types of users in the Aetlas Protocol:\n\n\ud83c\udf31 Project Developers: \nA user who manages a carbon sequestration or emission reduction project issuing carbon credits on a supported on-chain carbon offset registry. Their main objective is to sell the carbon assets they created. Their considerations are a balance between time to sell and price per carbon metric tonne. With greater liquidity in a carbon market, comes a significant reduction in time to market. However, liquidity focused markets often mean the project developer sacrifices any additional value of their individual project.\n\n\n\ud83e\udd1d\ud83c\udffd Carbon Traders: \nA users that buy and sell carbon assets for profit. They often look for opportune assets to buy and supply willing buyers who don\u2019t have the time to search themselves. The problem they face with existing pools is the additional fee they incur (up to 10%) for withdrawing carbon assets from liquidity pools. This reduces the number viability arbitrage trades which creates a less efficient market and creates barriers for new inflows of green capital.\n\n\n\u2747\ufe0f Liquidity Providers: \nA user looking to capitalise on 15x expected increase in demand for carbon in the next 7 years. They are users who hold carbon assets and who provides liquidity to the ReFi ecosystem. The problem they face is that carbon is a depreciating asset. An 2005 carbon credit is worth less than an identical 2020 carbon credit.\n\n\n\ud83e\uddfa Offset Funders: \nThis is a protocol or community who funds offsetting of the carbon emissions their users generate. The barrier for funders is the technical requirements, sustainability expertise and co-ordination to design an effective on-chain carbon portfolio.\n\n\n\ud83e\uddcdOffset Curators: \nThis can be an individual user or a sustainability focused DAO. They often have the time and sustainability expertise but lack the funds to execute their vision for a greener tomorrow.\n\nAetlas Protocol solves these dilemma by separating the retirement and carbon portfolio curation process from the transaction of funds. We have designed a series of deployable autonomous liquidity pools interconnected with a carbon NFT marketplace and powered by a carbon offset funding mechanism.\n\n\n\ud83c\udf31 Project Developers will have access to instant liquidity for their carbon assets but will be able to monetise their additional value post-sale. This is achieved by a Dutch auction held by the liquidity pool for all newly deposited carbon assets.\n\n\n\ud83e\udd1d\ud83c\udffd Carbon Traders benefit from zero % fees for withdrawing carbon from liquidity pools.\n\n\n\u2747\ufe0f Liquidity Providers have minimised exposure to the depreciation of individual carbon assets with a liquidity pool acting as a carbon index that actually generates a yield from the retirement of sold assets. The healthy connection between the NFT marketplace and liquidity pools also helps prevent stagnation older assets.\n\n\n\ud83e\uddfa Offset Funders are unlocked with an incredibly simple funding mechanism. It can be deployed as simply as \u201cSend X USDC to this address + a list of wallets who will curate your portfolio\u201d or the funding process can be integrated at a transactional level within the smart contracts.\n\n\n\ud83e\uddcd Offset Curators are empowered by the funding mechanism to design and implement any variety of impact investment strategy.\n\n\n\nThe Technicals:\n\n\nFunctions - Instance of the Tokenized Vault Contract\n\n\nDeposit Function: This function allows traders to deposit TCO2e tokens into the tokenized vault contract. The function first checks that the receiver's token is held by the smart contract, and that the sender has approved the contract to transfer their tokens. It then checks that the sender's tokens meets the pre-determined selection criteria using a function called isValidTCO2e. Upon depositing a TCO2e tokens, the function then calculates, mints and transfers the appropriate amount of xCLP to the sender using a function called calculateXCLP and the mintXCLP function. xCLP represents a percentage ownership of the underlying assets held in the smart contract. If the TCO2e token does not meet the criteria, the function will reject the tokens and return it to the user.\n\n\nWithdraw Function: This function allows users to withdraw TCO2e tokens from the contract by burning a corresponding amount of xCLP in the users wallet. The function should check that the user has sufficient xCLP and that the requested token is held by the contract. If these conditions are met, the function should burn the xCLP and transfer the requested TCO2e tokens to the user.\nRetrieveTCO2e Function: This function allows a user to retrieve an array of all the TCO2e tokens held by the tokenized vault contract.\n\n\nSwap Function: This function allows a user to swap a TCO2e tokens that is not held by the tokenized vault contract but meets the tokenized vault's pre-determined selection criteria with a TCO2e tokens that is already deposited and held by the tokenized vault contract. The function takes three arguments: the address of the sender (the trader who is sending their TCO2e tokens), the ID of the sender's TCO2e tokens, and the ID of the receiver's TCO2e tokens (the TCO2e tokens already deposited in the tokenized vault contract). The function first checks that the receiver's token is held by the smart contract, and that the sender has approved the contract to transfer their tokens. It then checks that the sender's tokens meets the pre-determined selection criteria using a function called isValidTCO2e. If these checks pass, the sender's TCO2e token is transferred to the smart contract, and the receiver's token is transferred to the sender.\n\n\nisValidTCO2e Function: This function checks that a TCO2e token meets the pre-determined selection criteria for the tokenized vault. It takes a single argument: the ID of the TCO2e tokens. The function returns a boolean value indicating whether the token meets the criteria or not.\ncalculateXCLP Function: This function calculates the appropriate amount of xCLP to be minted or burnt when a TCO2e token is deposited or exchanged in the tokenized vault. It takes a two argument: the ID\u2019s of the TCO2e tokens and the quantity of each. The function returns a uint256 value representing the amount of xCLP to be minted or burnt.\n\n\nmintXCLP Function: This an internal function mints xCLP for a given wallet address. It takes two arguments: the address of the wallet and the amount of xCLP to be minted. The function updates the total supply of xCLP and the balance for the specified wallet address. The amount of xCLP minted is must be restricted to a 1:1 ratio with the deposited number of TCO2e tokens.\n\n\nFunctions - Instance of the Treasury Pool Contracts:\nFundOffsetUSDC Function: This function allows users to deposit USDC into the contract. Upon deposit, the function mints the ERC20 token OFT (Offset Funding Token) with a 1:1 ratio to USDC deposited and proportionally distributes it to a list of wallet addresses provided by the user. The USDC is then added to the contract's funds, dedicated to purchasing TCO2e tokens from any instance of the Tokenised Vault Contract.\n\n\nFundOffsetERC20 Function: This function allows users to deposit any ERC20 with a corresponding Uniswap USDC pair ****into the contract. Upon deposit, the function swaps the ERC20 token for USDC using the correct Uniswap pair. After USDC is depoisted into the function mints the ERC20 token OFT (Offset Funding Token) with a 1:1 ratio to USDC deposited and proportionally distributes it to a list of wallet addresses provided by the user. The USDC is then added to the contract's funds, dedicated to purchasing TCO2e tokens from any instance of the Tokenised Vault Contract.\nRetire Function: This function allows users who received OFT to retire specific TCO2e tokens held by any instance of the Tokenised Vault Contract. The calculateXCLP function in the relevant instances of the Tokenised Vault contract holding the specified TCO2e tokens is called to retrieve an array including each xCLP and the corresponding amount required for the transaction.The calculateUSDC function is called for the array of xCLP required returning value for the requiredUSDC. The OFT equal to requiredUSDC is transferred from the user to the Treasury Pool Contract. The swap function on the UniSwap USDC/xCLP pool contract is called to exchange the USDC for a corresponding amounts of each xCLP. The function should then call the **Withdraw** function of the relevant instances of the Tokenized Vault Contract to exchange the xCLP for a specific TCO2e token held by the contract. After the exchange is complete, the function should burn the OFT and route the TCO2e tokens through the Retirement aggregator contract.\n\n\ncalculateUSDC Function: This function calculates the appropriate amount of USDC required to swap for a list of xCLP variants.It takes a two argument: the ID\u2019s of the xCLP tokens and the quantity of each.The function calls the quoteExactOutputSingle function in the Uniswap USDC/xCLP pool returns a uint256 value representing the amount of USDC required for the swap.RetrieveTotalFunding Function: This function allows a user to retrieve a uint256 value for the total amount of USDC deposited.\n\n\nOther functions:\n\nRetrieveSourceOfFunding Function: This function allows a user to retrieve an array of all the total amount of USDC deposited by each corresponding address (AKA funder).\n\n\nRetrieveFunderContribution Function: This function allows a user to retrieve a value for the total amount of USDC deposited by a specific address (AKA funder).\n\n\nRetrieveTotalRetirement Function: This function allows a user to retrieve a uint256 value for the total amount of TCO2e tokens retired.\n\n\nRetrieveCurators Function: This function allows a user to retrieve an array of all the total amount of TCO2e tokens retired by each corresponding address (AKA curators).\n\n\nRetrieveFunderContribution Function: This function allows a user to retrieve a value for the total amount of TCO2e tokens retired by a specific address (AKA curators).\n", - "website": "https://carbon-dao.com", - "bannerImg": "bafybeidmitno76ts5cf2ma75kxivmbt262ox7vq5lmjajueg3frcugz6ei", - "logoImg": "bafkreidxhjq7bj7aeh4dw7anq3i7fhgyita5e2kgzrrj36hzadt2wcsp6i", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreieyfs7lkblmxundnc2v5rayq5b4mwwx3cfpwh3nqg7cz6h7xhjige" - }, - "projectTwitter": "carbondao", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x035A1F3419DD223293e5411133d9C786f5885425", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "hash": "v0.0.0:R0/TOx8wPjYYUa4q9NfAiuFat/tp3Qp0VbS32B24qyE=", - "provider": "ClearTextTwitter#CarbonDAO" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-13T12:16:10.901Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-13T12:16:10.901Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..NSUh-z_WhY1WOEgygof-IpV52iPLdYsNErVqib0AKk9EQg6KD5xDdXbx_kilzwvUjNLSIRBxGDxj0ZnMSaZEAw" - }, - "expirationDate": "2023-04-13T12:16:10.901Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "YvtT8ONQhrp9f3DEWs07gAY7jhHRzDoPWDw5Bz7VH9aHWxGXtzHVe+u/KOEl9TNu", - "encryptedSymmetricKey": "34b5fe263a45e830f49dcd7cfd8c449e76eeca808d3088ce06b0aa1796097f7ac2c7ff6f5902fdcc0c0e56ef99268803383c2844bd0cfeba411fb02ec0fbad189efc7f805b5289c56728fb2b33b7286a91723288afe00e133084e2345893deb9c81037b77e59a8f3d9faeca8fa6d6c8f12620a04e87c2899569f237a472832fd0000000000000020f4f3bea4820731e7473708586f9603dba309acb1f321d331c1cadf7fe1c3459ae2472298274f6a400c14d8422bd69986" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Gitcoin" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "5" - } - ] - } - } - }, - { - "projectId": "0xdbce25d3279d12e5a6de4a541b1ccb6669e1271f53f180442b5c5d527ebd0f58", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0xccfed20eb0644182da20521a1d7c511241bd41049a382f99e29f9e0972e6ae654c851525a039169af37efad343b082df9a37abcc8e5dc4019e2fe12f07f9e4ab1b", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0xd68e5b216FC2AF2854152EAC501F9E00807d8C1d", - "project": { - "lastUpdated": 0, - "createdAt": 1673508434016, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:149", - "title": "Scaling Grassroots Commons for Local Regeneration in E. Africa and S. E. Asia", - "description": "The essential preliminary data required to formulate a hypothesis around decentralized technology, ecological data, and regenerative economics is not visible to us.\n\n\nMeasurement, results, and verification of ecological health, as well as transparent accounting are not recorded in a standardized and secure manner. \nThis siloes grassroots savings cooperatives from the formal economy of climate financing.\n\n\ud83c\udf31\n\nResearch Narrative\nChamas operate as commons of ecosystem regeneration and community finance. They are however excluded from the billions of dollars of Climate Financing due to a lack of proof of regeneration and inadequate KYC/AML.\n\n\nUsing existing open ledger technologies and participatory verification; our project will develop a framework to explore the integration of these economies into the global financial system in order to sustain viable livelihoods of land stewards. \n\nIn so doing, we make their value legible to open up new pathways for funding and support, and to forward planetary regeneration.\n\n\ud83c\udf31\n\nRegen Foundation will steward a research study into the existing governance systems of regenerative savings groups called Chamas. \n\nThis research is a pilot study to establish a baseline framework on how Chamas can integrate ecological monitoring technologies with ecosystem service markets for the development of viable local regenerative economies. \n\n\ud83c\udf31\n\nWith the amount raised in #GR15, we have worked on\n1. Identifying Chamas in regeneration\n2. Initial stakeholder meetings \n3. Advisor and expert search \n4. Feasibility studies\n5. ReFi Literacy gap identification \n\n\ud83c\udf31\n\nThe proceeds from Alpha Round will be used for\n1. ReFi bootcamp for land stewards \n2. Web3 Encyclopaedia development\n3. Feasibility study into DAO tooling for Chamas \n4. Video content generation on the powerful work these groups are doing \n\n\ud83c\udf31\n\nWe invite you to support our work by contributing to our grant.\n\nMore information on Chama DAO is available at https://bit.ly/3XGZ0Cn\n\nContact details : contact@regen.foundation\n\n\n\n", - "website": "https://regen.foundation", - "bannerImg": "bafybeidloip3ejod5ihjtiithxbrevxinuki6xp7yhrpvvphlthgerabjq", - "logoImg": "bafkreifpzpuln7f75acbc4ygnp4bgr7bnz646tjzshup76kdxhjgnrjiti", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiehoe3jwejxldhnbgbgghs3eqfyrbb2inkw53uwksnqpivz3fbmce" - }, - "projectTwitter": "RegenFdn", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x5c7291e18c3ecF30E14CCf1DCD646c0CA3309113", - "provider": "ClearTextTwitter#RegenFdn", - "hash": "v0.0.0:lGJi+YrYtPH+wSyDpEYL4YcL/5wpR13n3du+th9KbRw=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-12T07:25:32.171Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-12T07:25:32.171Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..fvIzghfXtvQX-87F0erlcvubwi2Rw3Og-dL6_VhQY26UWCI8GIjQMsGTsU0BzWlhJO2TSVymcUzByNrcAZi6Dw" - }, - "expirationDate": "2023-04-12T07:25:32.171Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "9hsmsLMIizMYd0ujtDK9pBWQwgpp4fx3oJc2v2GSilrcyxfhx1T+GNTUvITP0Ycs", - "encryptedSymmetricKey": "e9be9fcef870c009a7951e8d7455f7aa50001a8f2125ce7b4920434a2c256929f569894e0c479844ff14ceaab4356a16d131274ef14be982515fb5c96e008c42fa51ae4e3430a154e3877ff2164e7c45e246e904905fd4b8210d09c037978f89bbe414b8a7ac7083153bed9deeb939b83f50b908d9614805fc83f819504ebd2c00000000000000209e29b55bf9f2b964feac3c70e275ebfe875217a88678693e549ac82af8b1b62856e4c76714f73209130eadc6db093c92" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Community ( GR15 $8000)" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "4" - } - ] - } - } - }, - { - "projectId": "0xdfa4e3f6ae4072b9dee18452491dc0212ff00714b1d7469d6768ff0af8ad8444", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0x5d8c5085b326ae4261bd4c03b70d2e846a337afd793847579f0c0e8e48f5f7043103479b9d2be2ce6e2ff9043642f889e1a7f8d3a952bc9eb2963468b1a657ff1c", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0xc2d706398A978b8c5Aa4EFCd824b57E978841107", - "project": { - "lastUpdated": 0, - "createdAt": 1673615408391, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:183", - "title": "Earthist - Decentralize Hemp Seeds", - "description": "\u2757Problem Statement\n \nThe financial and political incentives to fight climate change, soil degradation and systemic degeneration are insufficient to mitigate and reverse the risks we face as humanity.\n\n\ud83d\udcc3Our Proposal\n\n\ud83d\udfe2Why?\nToday, most commercial seeds available in the market are bound to intellectual property rights \u2013 the majority being owned by an oligopoly that is slowly becoming the owner of our food chain. \n\n\ud83d\udfe2What?\nHemp is an ancient plant that has been used for around 10.000 years, and one of our most powerful instruments for producing positive socio-ecological impacts. It has an extensive application range in various industries such as food, textile, construction and many more.\nDespite such functionality, the highly centralized ownership structure makes it harder to experiment with hemp and adopt sustainable & regenerative business practices with it.\n\n\ud83d\udfe2How?\n\ud83c\udf31Earthist considers heirloom seeds as public goods. We aim to protect nature\u2019s legacy and transfer it to future generations without degeneration. We work for sustainable land regeneration at scale through hemp farming and aim to incentivize small/family farmers to adopt decentralized MRV technologies for positive ecological impact while producing carbon-conscious raw materials.\n \n\ud83e\ude84Since GR 13:\n\u2705We have found and collected four different types of lost heirloom cannabis seeds from across the country and have safely stored them in our seed bank.\n\u2705Over 6.250.000 seeds were successfully planted and harvested by farmers in five different regions through our network.\n\u2705We have given away 70% of our hemp seed related products as a gift to the community in order to improve health and raise awareness about regenerative hemp farming and heirloom seeds.\n\u2705Collaborating with amazing climate projects such as dMRV Network, Atlantis and Digital Gaia (Augmented collective intelligence to integrate real-world data with natural models to continuously evaluate real global impact, using seeds as an ancient tool for cybernetic communication)\n\ud83c\udf31We\u2019ve invested in mechanization and bought a hemp seed dehulling machine to make the first local hemp hearts from heirloom seeds. \n\ud83c\udf31 We have opened a Gitcoin community-supported \"Everything-Hemp-Store\" in Istanbul \ud83d\udc9a Thanks to this, we will also have a small space for 9-10 people to host hemp and regeneration-related workshops.\n\n\u27a1\ufe0fNext\nGitcoin Alpha Round \ud83d\udc9a\n\nThe number of local farmers in the country by the end of 2021 was 512.000 as opposed to 1.122.000 in 2011. Moreover, with inadequate political and economic decisions given by the government, inflation rates in the country have risen to 181%. \nThere is a bottleneck between farmers and the market as a result of the lack of investment and equipment in our sector.\nAs Earthists: \n\ud83d\udfe2We have to be the market makers, farmers, producers, subject experts and consciousness changers all at the same time. This is not an easy task though!\nNow, \n\ud83d\udfe2We need to improve our machinery to accelerate the production of hemp goods. In this way, we can show the proven value and amazing potential of the nonpsychoactive variety of the cannabis plant with more than 96 different hemp-based products. All made by Earthists for health, cosmetics, textile, paper, construction etc.\n\ud83d\udfe2This is an amazing opportunity to show people that they can eat it, drink it, read it, tie it, wear it and live in it all while rapidly generating the soil and protecting the climate with your support! \n\ud83d\udc9cHemp is hope and a vital part of the solution to today\u2019s problems!\nThank you for your support.\n\nAll previous Gitcoin round supporters are invited to the store to pick up a free Earthist Garden Hemp Seed Oil by displaying their POAP!\n", - "website": "https://earthist.notion.site/Earthist-Decentralize-Hemp-Seeds-Gitcoin-Alpha-d48f1494b9a94cfe9cb5d2a23770a63b", - "bannerImg": "bafybeifj3geh7cecy4l5s4ns7v4ftxqcnlhrv2g4jqvse477p5pvt3mwty", - "logoImg": "bafkreiboym44w2hqgqhfvsdpfip6cmb2ayt644k3yvvovy5eopjt6k3goa", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiengydcvbxi4y32fg3ykwy2yatpdsgny7ejpwkwopnuyweyhl53ni" - }, - "userGithub": "berksohto", - "projectTwitter": "earthistdao", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x5076f87610Ff3D5f859d562a050Dae82F6b3C63e", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#earthistdao", - "hash": "v0.0.0:2Cthi9WcTWSalkOJYZCfyBDvF5HRFG2xHtj9mvjS0vQ=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-13T12:54:10.457Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-13T12:54:10.458Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..hlB3KDxi3_ot6rb-C12i-ZMVsTpsGFoSy1Wf3b-CETK9RVCyEvkFsKPoX4llTzB0dMNWg27zKEvUCa7qZO6qBQ" - }, - "expirationDate": "2023-04-13T12:54:10.457Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "eTaCa3pJuKD1t53gfBC+dtVcph3Mzv5PYez5Y/JW96gm3BqRRc1ueNWkFC6s5dPk", - "encryptedSymmetricKey": "acb9ff4c697fae3e1597b7f574b7aa82202a1f79be7a6e52eaca490150e645f218d08ae3f6cf1030ad05562a1977bb08bd4d09d0b9e60f84e98725b89a4f3520d04ede8fff9fdc6281fd41ad64cdfe48192991425d1e26a4dfd1507186c873b9afdfcee718cbede3356190f1c69c78654888d234d15555ab13662730b7bf837e000000000000002022014f2b42da4dde6a6d676281ce8d6b7c17c6fb956e3721bc404f5f61da78185d6b1782bcb648c6c20d74eb1c2ce481" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "9" - } - ] - } - } - }, - { - "projectId": "0xe8017af6c0a19b08c86e8ef94d9b3dadcbe8f55bc446d7359a6f294d68227b84", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0x7b73ca43494d3dde10a255570b20202b46092675f5d8210652170e2579bc07487cf65a24a3535c90bbab68307d54dfaff1d73148907900e1678b4c48ebcab5f81b", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0x315E6c37077cC5772709Bb7fEcd6d7606b4443c4", - "project": { - "lastUpdated": 0, - "createdAt": 1673468497239, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:125", - "title": "Community Engagement - Bundle 6", - "description": "\ud83d\udc9a Who are we? \ud83d\udc9a\n\nWe make change happen through community! \ud83d\udc65\ud83d\udc9a\n\nAll the projects and organisations in this bundle focus on change-making and innovation for, by and with communities. \u2728\n\nWe are all cutting edge projects \ud83d\udd1d building and curating communities with planet-positive impact, including web3 conferences, ecovillages, podcasts and learning journeys around regenerative economic systems, new ways of living and climate education. \ud83c\udf40\n\n\ud83c\udf0d The global impact of this group ranges from the United States, Guatemala, Brazil and various countries in Europe and Africa. We travel the world! \ud83d\uddfa\ufe0f\n\n\ud83d\udc65 All of the grantees in this round are working to remove barriers to save the planet, from addressing gaps in language access, lack of knowledge, access to Internet and climate resources and education, digital literacy or capacity to participate in climate action, or the simple ability to connect to nature. \n\n\ud83c\udf38 We are all builders who are using decentralized processes and other accessible technologies for social good. \n\n\ud83c\udf3c We all operate in the climate, health and social justice space. \ud83e\udec2\n\n\ud83d\udc49\ud83c\udffc By donating to this bundle you will have the chance to kick off the new year by supporting global builders in our efforts to create digital public goods alongside Gitcoin. \ud83d\ude4f\ud83c\udffd\ud83e\udd8b\n \n \n\ud83d\udc9a The projects \ud83d\udc9a\n\n\ud83e\udd38\ud83c\udffd\u200d\u2640\ufe0f The Undivide Project: rebuilding, reclaiming and connecting communities to climate solutions and web3\n\n\ud83e\udd38\ud83c\udffe All for Climate DAO is building the Greenpeace of the 21st: a decentralized community of active citizens that take initiatives to transition to a more regenerative world. @allforclimatedao\n\n\ud83e\udd38\ud83c\udffe La Matrice Multiversity Campus: La Matrice Campus is a hotspot of transformative education with a focus on the transmission of regenerative practices, in a vibrant ecovillage. @MatriceCampus\n \n\ud83e\udd38\ud83c\udffe Closer an operating system for regenerative villages. We are building systems that support the governance and operations of regenerative co-living and co-housing projects. @closerearth\n\n\ud83e\udd38\ud83c\udffc\u200d\u2642\ufe0f Translators DAO: a collective of translators and interpreters who ensure communication across the world in five languages and more, for grassroots, non-profit climate justice movements. @TranslatorsDAO \n\n\ud83e\udd38\ud83c\udffe Samara Trust is a decentralized organization of facilitators who help organizations and communities attempting to regenerate our Earth (revitalizing soil, forests, waterways, capturing carbon, etc.) and regenerate our culture \n\n\ud83e\udd38\ud83c\udfff Hazel is gamifying carbon removal using a web3 game to help bring consumer spending to the carbon removal market. @hazelclimateapp\n\n\ud83e\udd38\ud83c\udffd\u200d\u2640\ufe0f Pythagoras Ecology Works uses forest waste wood taken in wildfire mitigation in decentralized manufacture of furniture and structures without use of metal fasteners. @ecologyworks\n\n\ud83e\udd38\ud83c\udffc\u200d\u2642\ufe0f Future Diaries: a dramatised speculative fiction podcast that highlights a variety of social and environmental issues! @future_diaries\n\n\ud83e\udd38\ud83c\udfff Borderless Money: @borderless_refi is the first non-custodial decentralized endowment platform, where contributors retain control over the principal, and only the income generated is distributed to initiatives. @borderless_refi \n\n\ud83e\udd38\ud83c\udffe La Matrice Multiversity Campus: La Matrice Campus is a hotspot of transformative education with a focus on the transmission of regenerative practices, in a vibrant ecovillage. @MatriceCampus\n\n\ud83e\udd38\ud83c\udfff ReConnection Tech (devices & experiences) seek to materialize this kind of world through experimentation with Music from Plants, Smart Forest Baths and more. @emergir.co\n\n\ud83e\udd38\ud83c\udffd\u200d\u2640\ufe0f Open Source Ecology: Open Source Manufacturing: An Affordable Housing Solution\n\n\ud83e\udd38\ud83c\udffc\u200d\u2642\ufe0f ReFi Bootcamp: Learn to Earn Regenerative Finance Education\n\n\ud83e\udd38\ud83c\udfff Cambiatus Complementary currencies and collaborative businesses on Blockchain. @_cambiatus\n\n\ud83e\udd38\ud83c\udfff ReconTech: technology as a mean to reconnect the humans and more-than-human pluriverse.@recon.tec\n\n", - "website": "https://dao.allforclimate.earth/gitcoin/bundles/communityengagement", - "bannerImg": "bafybeiazrujqcqcpsq3xy4au2isrvobuyyv2rkvbqa52wzark7r4hpnohq", - "logoImg": "bafybeiduh7dlopm4xrqk26uhaowlizeebvgv756qsfxdz7dtx44ki3kmvu", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreic6wkbnmb2tgtw24cxizesyen3oaspo5gwedekhmoxnugl2xchun4" - }, - "projectTwitter": "projects_unite", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xF9903c5d11E8f4bFebcf02747D53319E9c4a10c6", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#projects_unite", - "hash": "v0.0.0:Y96s2L5X8vumQ9EkKCirPgqr2cooTauWCw+fweHsWgU=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-11T20:19:51.945Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-11T20:19:51.945Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..VO5oVjkul7hHAzPIodLLQ-KPbvLkJruIFgY64RUGkOe6yaXuMbZlRtV0r-KH45lYklpzYgMBhC35vkxNauiBBw" - }, - "expirationDate": "2023-04-11T20:19:51.945Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "SwZfeKAh6dHYW0D/Kvi1ba7H8Ct5X+f79e7wLu/jbf4Po6vvnxRgZGqnGqqhE9RG", - "encryptedSymmetricKey": "8cf3667886b760f261fbc4322f5cbd7c6676d4c0e62422328c030e77efc668f18b08f76428b76a3d089cfed64268d80598ec27510b2233aaa1cf66062c4713f40f96ae5800cbda49a3e5ea7fe971cd44ec35b53f1d81270bf7f7b975ae488f833a3e7fff4be2ed497e8a7bf4f310cf6d04863553ebf0f83450535f0e0cc38c290000000000000020b1447fbe826c7d5003669afae3162b07739a4adc6ec4870af1693b4fe791c33686b653bf1d920340e0d20016cab8dc91" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Gitcoin grants mainly" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "Counted 14 live projects in the bundle" - } - ] - } - } - }, - { - "projectId": "0xe94883624f3bd962753c133346b353817cf0c2accec7259d3eb59219dd2761ba", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0x91ebe74397188de164041dba5b65383655df11f4a2a914b0e3d97302c7205c3477cf440f441dc6d7889f6797847007bda47ad8df3e36f4e27a5400fcf2de68e41c", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0xd2993E8217063c72BBE8c736404c7fC02adC9761", - "project": { - "lastUpdated": 0, - "createdAt": 1673519363659, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:156", - "title": "LOA Labs : ReFi by South", - "description": "ReFi by South is a community building project with a goal to localise and scale climate action - through technology and community organizing - (ReFi) in the global South. \ud83c\udf0d\n\nSupport Climate Action in the global south by contributing to our project. \n\nQuadratic funding rewards your support with a higher matching contribution from the common pool.\n\n\ud83c\udf32\n\nContext\nThe climate crisis has an undeniably more destructive and noticeable effect on communities living in the Global South.\n\nAt the same time, Climate action in the Global South can be substantially more permanent, effective, and impactful especially considering the populations and the solution opportunities available there.\n\n\ud83c\udf32\n\nOpportunity\nThere is an urgent need to build Climate change mitigation, adaptation, and resilience solutions. \nThis can be achieved faster and at scale by leveraging technology. The current systems of banking, finance, carbon markets, nature based solutions, and conservation are inadequate to serve planetary regeneration. \nBlockchain technology enables collaboration at scale, decentralized governance, and crowdsourced financial models to Climate Action. \n\nMost of this ReFi activity is concentrated in the global North.\n\nOur aim is to accelerate\n1. Education around Climate and Blockchain. \ud83d\udcd6\n2. Project discovery, Funding, and scaling. \ud83d\udcc8\n3.Supporting Proof of Concept's as well as\n4. Enabling \"interoperability\" conversations around Language, code, tokens and regulation.\ud83e\udd1d\n\n\ud83c\udf32\n\nPast work\nOver last year; we have been actively surfacing the global south across ReFi conversations in the ecosystem - supporting projects, individuals, and initiatives.\n\nSeptember 2022\nSupporting Founders in ReFi DAO with grant applications and a marketing guide in conjunction with ReFi DAO\n\nOctober 2022 \nLOA Labs organized the Greenhouse retreat under the BICOWG aegis with active participation from the global South\n\nNovember 2022\nIndia\u2019s first ReFi summit with active participation of Climate changemakers, ReFi Projects, Founders, Investors and Developers.\n\nDecember 2022\nGrants Roundtable with Gitcoin, Polygon, Celo, Climate Collective, Solana Foundation, Regen Foundation and Hbar Foundation. \n\nReFi Gratitude NFT collection\n\nTwitter spaces in local languages across Nigeria, Singapore, and India\n\n\ud83c\udf32\n\nOver the course of the year; we have supported projects across Australia, Japan, Abu Dhabi, Africa, and South America.\n\nIn order to bring this global need to local action, we need to leapfrog communities onto Web3.\n\n\ud83c\udf32\n\nGoing Forward.\nThe proceeds from this grant round would go towards\n\n1. Educating Climate(mitigation, adaptation, and offset) projects around leveraging tech(Web3) to scale MRV, project funding, market access, and interoperability\n2. ReFi Gokarna - India\u2019s first ReFi Hackathon at a biodiversity hotspot.\n3. ReFi Ambassadors across Singapore, India, Nigeria, Uganda and more\n4. Roundtables with Regen Investors and around raising Grants\n5. Documenting Climate(+ impact) blockchain projects as use cases for local Industry( and Regulatory ) engagement.\n6. Innovation corridor ( Accelerator model ) enabling cross pollination of capital ( nature based or otherwise), technology transfer, assimilation of indigenous nature based practices and Harmonization of Standards and practices across Language, code, and tokens\n\nThis would be in conjunction with Web2 and Web3 industry.\n \n\n\ud83c\udf32\n\nDrip\nFor the Gitcoin Alpha round, we shall be sharing the grant - with 5 % of proceeds going towards the ReFi Gokarna Hackathon. \n\n\ud83c\udf32\n\nWe cannot address climate change without onboarding the global south to technology and governance models that scale impact. \n\nWe invite you to contribute to this initiative to scale Climate Action through ReFi. \n\nFor more information on our work;\nplease visit our website and follow us on Twitter for updates.\n\nThank you for your support.\n\n\ud83d\ude4f", - "website": "https://refibysouth.com", - "bannerImg": "bafkreiedppai6zaryzhnfccsbjve7rqcfae2y4b6wiooigshw3vrxh3nqy", - "logoImg": "bafkreiaukz23so5otpokyp4tgsm5oq7dgwfuasssffzumaoq2fh5jbiybi", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiay2lykn54hrpbrrzy4cydh63wi3bszvjkf4ulwie7ouoldljjepq" - }, - "userGithub": "knome7337", - "projectTwitter": "refibysouth", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x5c7291e18c3ecF30E14CCf1DCD646c0CA3309113", - "hash": "v0.0.0:j0c5WiqS88HCT15hxRX32jCGTOP8U9BJ+68gO7uqpFM=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#refibysouth" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-12T10:27:08.373Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-12T10:27:08.373Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..y85belCppECcrbgGqnjp4cEGa0x_uyPrWxXcmdDcSaPdBpnyJtC5QsS79OjD-3tbIzn0p4U2wBOwhsJkHUk3DA" - }, - "expirationDate": "2023-04-12T10:27:08.373Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "Tpr4uPPIAi6slHA0Vkr7zdFgmJrCx9mbiwmnND0Q+k3nXqYPjhRT/ovFiZZR6HUk", - "encryptedSymmetricKey": "d60eb2e6988a032ccc196e77716453c997d08b460394211cd943a6030e35b5d00f56643e4cc752c21ea09c2114c3a011ea1b2c5f17250b0062a382faa7b306216979f1fde64dd11abad002eac860232cf0de229b1e309c74090da82c5ed4e296803f02f10ba01f4b3dfc56b7ee7094a691165b2fb167b6bcd7e347a2bdf7fa9f00000000000000209e36b1f66cc65bae8198434b3b7fcb1e264bb177526497c5a8b88b12181b93bb9d44d5c23d69887f2d34ad7471c87386" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Community ( GR15 $ 13000)" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "6" - } - ] - } - } - }, - { - "projectId": "0xe9e32a25dc4acd136fc1a77f49e80ed75ff1d9c4bdd2f3818753d6b106627f09", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0x971347d8ca982447a47a02616c0d7836bbae04259bfde4712b1605be4cf282c673cd2e8def41a6fc9c05c253a15c994b5e86ca2cadb3b9fbec8a48decfe9f99d1c", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0xAd24474f7e779931e37172017278d15a71F6E4Ec", - "project": { - "lastUpdated": 0, - "createdAt": 1673859009603, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:220", - "title": "Climate Guardians Impact Gaming", - "description": "Climate Guardians is the first web3 impact game where players team up to fight deforestation. We develop fun to play casual games to educate as many people as humanly possible on the Climate emergency. The gameplay will be carbon negative leveraging Toucan protocol\u2019s Nature Carbon Tonne pool. Players can actively reduce their carbon footprint by in-game offsetting! Our mission is to accelerate decarbonization with gamification and the blockchain technology.\n\nGame basics: It\u2019s time to win back the Rainforest! With the Amazon on the brink of collapse, rise up and become a Guardian. Players start their adventure by building their own eco-friendly village in the heart of the Amazon. They build, research, and unlock buildings to train troops and acquire resources. It\u2019s a social game where players can team up and form their own tribe. Gamers are introduced to real world environmental projects and educated about the climate emergency in a fun way. In the second phase players engage their forest-friendly troops to launch attacks to take back the rainforest from evil and corruption.\n \nClimate Impact: Climate Guardians gamifies carbon sequestration in forests. The forestry systems and their climate-related functions in biomass production, conservation of ecosystems, sequestration of carbon, are critical to prevent climate change. These functions need to be enhanced worldwide while their degradation needs to be stopped in tropical countries. Recent studies suggest that this contribution could be doubled if the right incentives would be provided to support afforestation and forest management. By gamification we want to make as many people aware of these pressing issues and enable them to take climate action in-game. \n \nWhat\u2019s next: We continue to focus all efforts on developing great games with real world impact and gamified education. Together we\u2019ll accelerate decarbonization and preserve the rainforest for generations to come!\n\n", - "website": "https://www.climateguardians.io", - "bannerImg": "bafybeibi4n2moomgnqrv2cz23upqeafo7lnthv2p6akouzgxvn25vvg32m", - "logoImg": "bafkreicdcvlfshyijlymvr5n2qo3slopfb2zeisb2uyzlscvalkqmuseoe", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreigfh5h42ybrgxalpdjqoywuudezzep2yggzdq6vd4fkg433pietrm" - }, - "userGithub": "RACouperus", - "projectGithub": "https://github.com/climate-guardians", - "projectTwitter": "@ClimateGuards", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "Cbira6xuIIG6GmkY8dERDCZRbCwiU//0It+FaEdK+dmGqgZs4wJWh7OZw+oseH92", - "encryptedSymmetricKey": "95d1bd80981e7baf13c5c3f59756c6b1e8bd925bb681b66e49b8d946d73cb2b2a3fadfcf53a92569c104463d4021ec07ab9dd194cc2fe4e53670ff647f8aef23adcff83331c8640bc804a69bd66fe3fbce58817f284401ad1157d22cec4e04a0246d321a4e4c5814cabf220e96134cced0c9ebb1fbf9b4a7e86d6e534d6b6ab600000000000000202a379dfa21ed62f0a9046cef007dc2727c11fc2e7bc8c17c5f4a144fad9efa454492897e09d17581dfd60d2532a4e6a0" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Celo Foundation, Toucan Foundation and Hedera Foundation" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "8" - } - ] - } - } - }, - { - "projectId": "0xea014245840ff70f7c7060ed89882aa30b1da5246b7c4000b6a9e85930f97613", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0x66137e0fc828766371837688d4fe59a2beb5c20ce3f6d37328a0edc192a0bd9309b09d834965e571c34260ba075075b050de619f1c193cc1f316faebb040de1b1c", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0xEFEdaf9c07E6eB56BB8F82f30018e4461B1c5F4c", - "project": { - "lastUpdated": 0, - "createdAt": 1673336291159, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:93", - "title": "Web3beach", - "description": "Accelerating web3 education and adoption through social and environmental impact. \"Impact Onboarding\" creates onramps and upward mobility in web3 for unbanked, disenfranchised, and historically overlooked communities. WEB3BEACH educates, coaches and empowers community leaders from diverse walks of life to use web3 tools in efforts to improve living conditions for all. This includes environmental impact, health services, education, recreation and the ability to carry out their own public goods initiatives through our mini grants program. As a byproducts, we're creating circular crypto economies in our communities. \n\nSince GR15: We've launched programs in five communities throughout Honduras and will continue to expand in 2023. We're also advising projects in other countries so they can adopt Impact Onboarding strategies in their region. \n\n\n\ud83d\udd0dTransparency Reports: We include expense reports with all of our events and currently working towards creating a standardized grantee reporting process. \n\n\nOur services include:\n\n\ud83c\udf0aEnvironmental Impact\n\ud83c\udfe5Health Services\n\ud83d\udc69\u200d\ud83c\udfebEducation\n\ud83d\udcb8Economic support for micro entreprenuers\n\ud83e\udef0\ud83c\udffeMini grants program\n\n\nCommunity Services offered since GR15:\n\nEnvironmental Impact - Beach clean ups \nhttps://twitter.com/web3beach/status/1597629431597903872\nhttps://twitter.com/web3beach/status/1603773200017784833\n\n\nMental Health services - Therapy for Honduran buidlers\nhttps://twitter.com/web3beach/status/1595500429898665985\n\nKids web3 education:\nhttps://twitter.com/web3beach/status/1592969376051105792\n\n\nSocial Impact - Training local teachers in Emergency First Response because we don't have hospitals or ambulances on our island:\nhttps://twitter.com/web3beach/status/1565425933686898688\n\n\nMini Grants Program -\nhttps://twitter.com/web3beach/status/1597670782121148416\n\n\nProgram Expansions\nWe plan to continue expanding our programs in LatAm and other regions. . Ultimately we'd like to create a model anyone can copy and paste anywhere in the world to benefit their local environment, economy, and the lives of their community.\n\nUse of Grant Funding:\nWe'll continue to use all of our funding for our community programs and will begin compensating our community leaders for their work. Web3beach founder (Carlos Melgar) will continue to work without pay or benefits from grant funding.", - "website": "https://web3beach.io/", - "bannerImg": "bafkreiatmypzrrw6rrnxdxs6wzkubzr7eskm243t3b4kfuz6g3k3bwerqa", - "logoImg": "bafkreih4es2d5t6twhario7f2xopopz77f3pqpux46so4xgvjzhaos632y", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreibxhsyyaqpo3kxbk3cxol7puwtufys3k2h3hm4fokybjqdvrqmphy" - }, - "projectTwitter": "web3beach", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xEFEdaf9c07E6eB56BB8F82f30018e4461B1c5F4c", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#web3beach", - "hash": "v0.0.0:DwnKrBh3ba5emJDf1DZHi7Wie7k+5rTlIcR5ddYIqLk=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-10T07:38:00.191Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-10T07:38:00.191Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..5-ErXJjXL2q43ayQBx9VxbtA-dUs73FkzNpqB-ctIngVCUSlhmbkMNVhkUuuH4stpnY2nheBWI8MWJNVZDGRAA" - }, - "expirationDate": "2023-04-10T07:38:00.191Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "KMPYxq24aLjPe3Uz3gLHCzyXHVl2/4/esqjf8dewIfDEXSUg6amQAGj9qps1K07/", - "encryptedSymmetricKey": "ca4f120861d2b12551e5b3282771033bfc3a603202f8d63783c730553380fdd19d8be603b98451509b8dd477090d751932431f3061e7ca369ddcb4c7573ead146b04d13b7e427f047490905638a6038cf79ac7d07b4ffa03be15b09f7d096a85b2ce9024f7e2d378c18d39e382dd8d9158ee03c83d732d5e4acb0c37baad201f00000000000000206a792b14c907d1a0310ac18692866230206352ac56424ffae51d4cbc3b903e32b509ec61d5c5e2b109b7691a65258486" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "bootstrapped" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "1 founder, 5 community ambassadors" - } - ] - } - } - }, - { - "projectId": "0xedc8c2863195c102234eb522c94568c4aabd91d4eb2df52d2c4dc9f953e01295", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0x9f73705d30ef3c44c0831b8d006fe3111a5c23ae65ec479c70da89a860c0dacc703e36b6cc21af8b5f2b5e17eb2a6e4173113bdac54bbb0a4abe5028e553d0681b", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0x4574e76CbB9891A90d46b0788cC4094B9275b61E", - "project": { - "lastUpdated": 0, - "createdAt": 1673477650158, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:131", - "title": "Bundle: Emerging Economies and Indigenous Communities", - "description": "This bundle unites 12 exciting projects working either in Emerging Economies or with Indigenous Communities around the world. \n \nHumanity must choose to either embrace economic transformation or continue down the path of destruction, desecration and resource theft via war, infringement and oppression. We see many people, worldwide, standing up to denounce the latter. The mission of these projects is to steward and lay the foundation for emerging economies and indigenous communities that are built on the principles of abundance, knowledge sharing, trust and an intimate connection to our fellow human beings, nature and ourselves. \nThe initiatives represented by this bundle include work in First Nation and Native American Communities, LatinoAmerica, Uganda, Nigeria, Kenya, and India with disparate aims but a common mission to demonstrate and expand the role of Free Open Source Software in public goods funding. With your help we will be able to continue our work in climate action, clean energy sovereignty, indigenous justice, the global water crisis, postCapitalist education, regenerative agriculture, mangrove restoration, SolarPunk IoT, and advocacy of both people and Earth\u2019s rights.\nGitcoin offers a means for each of us to reclaim agency over the economic system that we rely on. Let us be empowered and demonstrate the potential of quadratic funding to allocate, prioritize & support transformative change.\nTogether we can empower communities through sustainable, scalable agriculture, climate action, clean energy sovereignty, equitable access, resiliency, advocacy and local environmental achievements. \nIf you would like to know more about the individual projects that have gathered in this bundle, check below!\n\n\ud83c\udf1e KhalonBridge, @KhalonBridge: Nigeria is at the leading edge of the web3 ecosystem but suffers from a notoriously collapsing electrical grid that impedes developer talent from keeping up with the digital economy without having to buy pollutive generators. Khalon Bridge is a development studio collective of over 40+ web3 operators and continues to provide residential solar to emerging talent in the region to advance the digital economy in Africa.\n\n\ud83d\udce1 ReconTech, @emergir.co: Imagine a world in which our technological devices help us to interact more intimately with the more-than-human world, expanding our consciousness by cultivating new cognitive and sensory perceptions. ReConnection Tech (devices & experiences) seek to materialize this kind of world through experimentation with Music from Plants, Smart Forest Baths and more.\n\n\ud83c\udf3b Urb\u00e1nika, @0xUrbanika / @urbanika.lens: An immersive activism school that turns passive citizens into active city shapers capable of using web 3.0 tech, peer governance, and commoning to facilitate transitioning into regenerative ways of living.\n\n\ud83e\uddd1\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c\udffb Vlinder: \"Papariko\" - Restoration of degraded mangrove areas in Kenya, @vlinderclimate: Verra-certified mangrove restoration project to provide a variety of ecosystem services, climate change mitigation, economic considerations, and active participation of the local community in coastal areas of Kenya.\n\n\u2615 Coffee Impact Collective, @Coffeeimpactco: The project supports coffee farmers in their transition to regenerative agriculture by providing agronomic guidance and rewarding them for implementation of new practices. Coffee Impact Collective creates an ecosystem that provides multiple services and opportunities for farmers, allowing them to become a part of a decentralized marketplace where \u201cregenerated\u201d coffee is traded along with eco credits (like carbon, biodiversity, water quality, social impact and eco tourism), not separately. First pilots are starting with farmers and cooperatives in Colombia.\n\n\ud83c\udff5\ufe0f Kangra Gardens, @Kangra_Gardens: The Kangra Gardens are a place for people to express gratitude and give back to the earth by respecting and learning from it. The purpose of the Kangra Botanical Garden, which is a part of Kula, is to regenerate the local ecosystem, promote biodiversity conservation, support community health, build towards food sovereignty and nutrition, and engage people in connecting with the environment. The garden uses Ayurvedic medicine production and syntropic farming to achieve these goals facilitated through a Bioregional Learning Center. The grant for Kangra Gardens aims to fund new as well as current contributors and the development of the gardens themselves to share with the global community.\n\n\ud83d\udc18 Elephant in the Room: @ClimateRace : Strategic Climate Solutions Campaigns. We work with Indigenous organizations, voting organizations, neighborhoods, cities and activists to promote climate action to communities around the world and to counter the vast array of fossil fuel advertising and disinformation. Over the past year Elephant Room has also been creating strategic communications that are focused on the web3 community.\n\n\ud83d\udee2\ufe0f Beyond Fossil Fuels: @BFF_campaign : Indigenous Legal Fund for Climate Action. Presently supporting 2 major projects - 1) Tsleil-Waututh Nation Sacred Trust\u2019s opposition to the TMX pipeline and 2) We Stand Together : a legal climate case that is aimed at ensuring systemic climate planning and remedies for legally binding, science-based climate recovery policies. First Nations have standing under the ratified UNDRIP (United Nations Declaration on the Rights of Indigenous Peoples) Act in Canada and can invoke their unceded rights in legal proceedings to effectively defend and protect the environment.\n\n\ud83d\udc68\ud83c\udffe\u200d\ud83c\udf3e Project regr\u00f2 : @projectregro Under the increasing climate emergency pressure, the regr\u00f2 project aims to connect land owners, farmers and growers, interested in sharing resources to build resilient agro-ecologic systems through Regenerative and Conservation Agriculture, Permaculture and non-invasive practices.\n\n\ud83c\udf33 Ayowecca: Wetlands and peatland ecosystem restoration has been our focus. Together with the local community, we are restoring encroached wetlands and protecting those that already exist. Our strategy involves agroforestry and afforestation. We are promoting agroforestry, by giving farmers fruit trees. Climate change adaptation and mitigation are our primary goals in promoting agroforestry. The effects of climate change on agricultural communities can be lessened by planting trees in agricultural systems. Growing the amount of trees on agricultural land decreases tree cutting and boosts carbon sinks.\n\n\ud83e\udd8b Cambiatus: @_cambiatus - social currencies to foster planetary regeneration. Working with the Paiter Surui indigenous community to create the Paiter Coin and onboard their members into the web3 space.\n\n\ud83d\udc2cProject Toninas: @yaqupachauy Project Toninas is long term project focused on the research and conservation of the Lahille\u2019s bottlenose dolphin T. truncatus gephyreus, a subspecies of bottlenose dolphin that only occurs in Brazil, Uruguay and Argentina. They are only ~ 600 individuals left across the entire distribution (Uruguay population~ 70\ud83d\udc2c). Project Toninas is carried out by Yaqu Pacha Uruguay, a civil non-profit organization dedicated to implementing and promoting projects for the conservation and study of aquatic mammals in Uruguay and the Southwestern Atlantic Ocean. ", - "website": "https://tinyurl.com/EmergingEconomiesBundle", - "bannerImg": "bafybeib24bxcvaozehkot63sawz62el6n7jp4fyvkrv26jaznaskrrbcqq", - "logoImg": "bafkreidrap5gj445mflaaryngaudaoqjaxwjqe56epanekt7eqrjznadwa", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreibwdcyjyxmzakrdsus7m5jxyl3tdcwp2n2ek4uciodnrhbluifaw4" - }, - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "G9u60OGyxUkgPKFn2kol+pRPnpRa3Pgzz8F6RLmHIkNyoM09/AG4if7omVlUn02+", - "encryptedSymmetricKey": "066dc618a3d4486c2965ab9c041a99c916b8145055303bbee2dd03378c4f71ce23f18ac7e039784179068536e633b318c2c40e693c208d69bb0b91fd5ac571d77d96550fdea69592aa7a2d6e930b2b5bd8b95d5f69608767155d76a5b7dc73a42b76f112e96e0bc5619475776a199e52c9889264a2bac5c9e287661ab127cda10000000000000020253c5e439e7cb11b576b13757e52a648bf477015e42d7488e103b7799e11970012c4120a78ed33ae52d5bbda79d65fa7" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "12" - } - ] - } - } - }, - { - "projectId": "0xedd3049723764122bbed15c36557ab9c5057fded298af97b68dc226969cc3664", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0xa3e8657f08eb94c005c6468505394575f8919c87f219c38b200b401a5fa3a5657042471590b585a18ef74da5a3df7301304cba92ec758ffdde51f6938f9cf5641c", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0x1C4a70EaDeCc48e436Efd0E997445D71DF57a4ED", - "project": { - "lastUpdated": 0, - "createdAt": 1673353485145, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:97", - "title": "Plants And Pillars", - "description": "About\n\n- Plants and Pillars is a decentralized organization that aims to encourage people to plant more trees and make Earth a better place to live in.\n- We aim to build a community of enthusiasts who'll help us achieve our goal of solving some environmental problems by incentivizing them and gamify their contributions to the environment.\n\nCore Objectives and Future Plans -\n\n\ud83d\udd17Connecting: Our aim is to connect and make people aware of the importance of trees to human mankind.\n\ud83d\udcb5Award: We'll randomly award our supporters to add a P2E environment to this projection in order to keep the people engaged in this project which will eventually help mother Nature.\n\ud83d\udd14Update: With the help of the PUSH protocol, users are notified whenever they get anything credited/ debited.\n\ud83d\udcc8Streaming Money: Send money over time with the integration with Superfluid.\n\ud83d\udcdaEducation: Our Organization will also make people aware of the current situation on Earth and educate them regarding the global issues of SAVE SOIL, GLOBAL WARMING, etc.\n\ud83c\udf0dPlants and Pillars DAO: This will help our community take all the essential decisions and help in the smooth functioning of the project.\n\ud83c\udfafGOAL: Our Ultimate Goal is to reduce and neutralize carbon emissions by planting more and more trees and educating people about our current environmental issues.\n\nRoadmap\n\nCurrent MVP\n\n- Plants and Pillars Web App where people can participate in a lottery game by minting the photo of the plant they planted as an NFT.\n- Wride.io where people can publish blogs regarding current environmental issues and can spread awareness among people.\n- We\u2019ve started building the Plants And Pillars Mobile App for both iOS and Android.\n\n2023 Q1\n\n- General availability of Plants And Pillars Web App and we'll be using these Gitcoin grants to incentivize the devs for their contributions to improve this open source project.\n- General availability of Plants And Pillars Mobile App for both iOS and Android.\n\n2023 Q2\n\n- Launch the Plants And Pillars DAO which will give equal rights to all the users to take decisions about the future plans of the project.\n- Collaborate with different open-source projects to scale the platform.\n\nWhat we did after GR15?\n\n- Started working on the Mobile Game\n- Made an MVP of the blog platform - Wride.io\n- Onboarded 50+ writers from all around the world to write about climate solutions and several different topics to spread awareness among the people.\n- Started working on the Game mechanics and incentivization techniques.\n\nWhy a Gitcoin Grants?\n\n- We want to make the web app more accessible so that people can get a better way to contribute to the environment by getting incentivized.\n- We are looking for blockchain developers to develop the Web App.\n- We will be looking for mobile app developers to develop and ship Plants And Pillars iOS and Android apps.\n\nTech Stack For Now\n\n- Next.js as a frontend framework\n- TailwindCSS for design\n- Lens Protocol for user profiles\n- Polygon for on-chain storage\n- IPFS for file and metadata storage\n- Chainlink for the Lottery Game\n\nWeb App - https://www.plantsandpillars3.com\n\nBlog Platform - https://www.wride.io\n\nTwitter - https://twitter.com/plantspillars3\n\nNotion Page - https://subsequent-guilty-25d.notion.site/Plants-And-Pillars-95884cb336794be7ad0f883a0e771411", - "website": "https://www.plantsandpillars3.com", - "bannerImg": "bafybeihfcw6cpnnsanxo6wqyfhf7cnc7cqy4lhn6wbvvwyim7ch2mfdlre", - "logoImg": "bafkreibkh4yv7fipyzlkajhqa3bewxhnxfx23kech2jn7wsd6hkgmnw54q", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreib6in2hmp66ew4plhwfl43jzaocahcgcox5yslg7t4zezy33j52vy" - }, - "userGithub": "aviral10x", - "projectGithub": "Plants-And-Pillars", - "projectTwitter": "plantspillars3", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x1C4a70EaDeCc48e436Efd0E997445D71DF57a4ED", - "provider": "ClearTextTwitter#plantspillars3", - "hash": "v0.0.0:6AwY7A31mXRD4t1Sj/vqIbk/OWGnBU+1vEoZxWLy+LA=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-10T12:23:55.421Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-10T12:23:55.421Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..gBHqLrT65nNxpbEbFKuF7A3f_wmhjGEeQtAJpLO4_qfHb8J9jm-NZNYF1SvO45MkTRRASnelrPhC7seXVbVUAQ" - }, - "expirationDate": "2023-04-10T12:23:55.421Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "b+l13p/0DzXpMJI5Jyf0YXnUkdldgrUMWkFBQJm6zJtD1/PL8OrtplE+OffPWHQ6", - "encryptedSymmetricKey": "ae96438b83ffd33c65c1804a26463a2c313277fbc87c4279463f3b294589a01cef6f332e91647c90518d749d780d4e07231abd455d1023261508a2c6be73bb0ccf49d81be2dbcadb5ce02138279bd90584838e318b30d98b7628584dbabcbf8d295c3a6aa4c44c5ebb425e8f6745adf2a9d174897a8bc397c1feb8bc524d6b150000000000000020198512b8ac23d9ad7b224b068c95229795cccaa319b2783c1b124cb9149ef79c37a7fcb9352e965fc2aae9275fbc5d88" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Gitcoin Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "3" - } - ] - } - } - }, - { - "projectId": "0xf39a20c932f2445f48214e8726d305bac89d54b3c99940d601a168e2b8745014", - "roundId": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "data": { - "signature": "0xbe1f3c2f7e09591dc037c22a52675cf5f7a23399e61fbb2e1cd975e0e3c197177d95a2e4d4f10c78470ae529e91463d50dd6459d4211f381fbe776c17a697a161b", - "application": { - "round": "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0", - "recipient": "0x2129fCc2baD30a0c7A448FE802265A14643092df", - "project": { - "lastUpdated": 0, - "createdAt": 1673468795694, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:126", - "title": "Bundle: Creative Works", - "description": "\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\nAre you looking for a way to contribute to a positive impact on the world through creative works? Bundle: Creative Works is the place to look!\nWe are believers in regeneration through art and unapologetic creativity. We are the solarpunk artists, changemakers, shapeshifters and out-of-the-box creators from all around the world.\nThis group of innovative projects is using their creativity and expertise to address important environmental and social issues. From using art sales to fund social causes to immersive activism schools these projects are making tangible impacts IRL and on web 3.0.\nThat's not all. There are also grants DAOs supporting and funding diverse and creative projects with the potential to make a positive impact and collectives of artists raising awareness about the climate emergency within the group. Creating digital artworks about climate change, producing eco-conscious handmade hemp goods or high-impact filmmaking for climate awareness are also among what amazing projects of this bundle are doing.\nJoin the movement for a better world with the Creative Works Bundle!\n11 creative projects related to art, film, games, solarpunk for Climate Action\u2026\n----------------------------------------------------------------\n\ud83c\udf31 Future Quest\nA web3 ecosystem committed to fixing our future. Part game, part launch pad for public good Quests for our planet.\n@FutureQuestDAO\n----------------------------------------------------------------\n\ud83c\udf31 ColtonArt\n100% of my art sales fund social causes. $154,389 have gone directly to support the Gitcoin Matching Pool by selling over 200 individual artworks over the past year. This grant helps cover my living expenses so I can continue creating solarpunk art that funds our shared needs and hopefully inspires more artists to join the regen movement \u2600\ufe0f\ud83c\udf34\n@mettahead\n----------------------------------------------------------------\n\ud83c\udf31 Urbanika\nImmersive activism school that uses AI and XR to teach about the intersection of web 3.0 and urban governance. We aim to turn passive citizens into active city shapers. Our first course is being co-created with David Bollier and targeted to policy-makers, urban activists, and social entrepreneurs. Enter to urbanika.my.canva.site/ to immerse yourself into the micro-learning videos that come with virtual and IRL\n@0xUrbanika - @urbanika.lens - urbanika.my.canva.site/\n----------------------------------------------------------------\n\ud83c\udf31 Decentralized Desires Studio-Lab (Former: \u201cDynamic Energy Budget\u201d)\nWe are an Art-Science Studio-Lab for DeSci ecosystems - hosted at Omega/TEC. We use art as an inquiry (Practice Based Research in the Arts scientific methodologies) to engage interdisciplinary teams on climate related avenues of research. We develop prototypes and artistic creations to make alternative futures tangible for all.\n@BudgetDynamic - @JeanneBloch - decentralized-desires.com\n----------------------------------------------------------------\n\ud83c\udf31 Climate Change Countdown\nFrom 01/19/2022 and for 10 years, the project regularly creates and posts digital artworks about Climate Change, exploring a variety of forms of visual and non visual arts. The artworks are published on the artists social media channels. The core of the project are periodic expeditions on the field to document causes and effects of Climate Change and positive examples of sustainability and activism. All the artworks are available for free to any nonprofit climate project.\n@Marcobear_eth\n----------------------------------------------------------------\n\ud83c\udf31 Vanara\nVanara is an ecological arts & crafts collective working with hemp not only to produce slow-fashion goods, but also to regenerate the ecosystem as a whole with the strongest fiber in the world. We support economically disadvantaged artisan women and young digital artists by creating and producing with freedom both in the metaverse and in the physical world. Processing hemp to make yarn with authentic methods and techniques is our primary production line. We are preparing to launch an NFT collection of digital art pieces of Hemp as utilities for our workshops, IRL products and community events.\n@Vanara_Co\n----------------------------------------------------------------\n\ud83c\udf31 Ranna\nRanna is an open network of filmmakers dedicating their tools and skills to creating quality content for the environmental and climate justice movements. We create high impact films that provide activist-led, top-tier coverage to climate action initiatives. We are sharing and amplifying the voices of those working for a better collective present and future. In doing so we aim to inspire, engage and mobilize more people to join the fight for a just, livable Earth.\n@rannamedia - ranna.pt\n----------------------------------------------------------------\n\ud83c\udf31 nfDAO\nnfDAO is a grants DAO with a mission is to discover, support and fund diverse and creative projects we believe can make a positive impact. We award micro-grants to promising early stage projects and guide them on their first steps towards success.\n@dao_nf - nfdao.io\n----------------------------------------------------------------\n\ud83c\udf31 Artists for Climate\nUsing art to raise awareness on the climate emergency! Artists For Climate is a collective of humans who use art as a tool to generate an emotional impact on citizens and motivate them to take action in solving the climate emergency we have created. We work together and share knowledge, resources, techniques, inspiration, and much more. The group is managed and coordinated by artists and for artists.\n@all4climatedao - allforclimate.earth\n----------------------------------------------------------------\n\ud83c\udf31 Solarpunk Art DAO:\nWe are a collective of Solarpunks helping create and fund more Solarpunk art to reimagine a regenerative future where humans, nature, and technology live in harmony. Solarpunk comes in many flavors, and it varies based on the needs of every community. We intend to empower local artists to design their local Solarpunk reality by helping them with funding for local IRL exhibitions.\n@all4climatedao - allforclimate.earth\n----------------------------------------------------------------\n\ud83c\udf31 W3ST: Solarpunk meta-nation\nAn impact network of regenerative projects (nodes) united under the symbolic entity of a globally distributed country to transition to new models of political, social and economic innovation through the will and direct action of its citizens. We are working through 3 ACTION STREAMS: NODES (territories and positive impact initiatives) + ACTIVISM (direct actions and artistic interventions) + FUNDRAISING (help like-minded entities and collectives)\n@w3stdao\n----------------------------------------------------------------\n\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\ud83c\udf31\n", - "website": "https://tinyurl.com/gitcoincreative", - "bannerImg": "bafybeibptkvyxj3mchbk5qgchhj5i6glmjegaglnvhrseqtjl63qh72veq", - "logoImg": "bafybeienbtvud7wqtlvwesdff44xmss2bdojkjgjqx7gdvmtber4cdkceq", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreig6ayyiuc77cklkerc6wqhthirx7vbcnh46tru6mbfw7stknj4q6u" - }, - "projectTwitter": "", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "31/NvRa82Wxek2vWNU48rYi7Qu8pc7X7WTrElGdzbH7tFPAGuabyxu5qFRLb8m05", - "encryptedSymmetricKey": "097251872908c1a2b5f7e2e0cb0cc8083663c9f1a6478981e77ba1c93075b2608d712f8c63fb0a5d6a5497c15ebf09194e5d4e093f5494a8704b3594d9951b60d24bda7746bfdae3c97328f2c1f2be9761018d45e1d5c7e217218692038b1c8acdabdcfaf06d5bab8256fc217e46ced62e8fc702e7639b8ea237f7f7d71935e800000000000000209cbc2527e7a810a0d6cfc6746bfe4940e9356afcaf77ed391b7337b46d77d7d3a01b535e224680a867e2624f7b11c588" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "11 Projects in Bundle" - } - ] - } - } - }, - { - "projectId": "0x0067d80a449812df249712d8bfffcc41b0efc3a02f6494fab80b685044206001", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x1f687c9c1f1c6d6ba0a26a903d8455bfd17d6210e8dab085ad132ad338a994be49cd824440ff44356a7aacb26af82daaf38caf7cc8aa052175b8ea7dc703501a1b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x95a807bcAb5a16901628acF90FC3057061a3fce9", - "project": { - "lastUpdated": 0, - "createdAt": 1673038231950, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:45", - "title": "CashmereLabs", - "description": "Cross-chain DEX aggregator built top on Layerzero.", - "website": "https://cashmere.exchange", - "bannerImg": "bafybeihk7xad5spxyge2um3mfqcuh3ueax6so25obyademareqwib5ahwa", - "logoImg": "bafkreigtzxmrn2jv3d5oc5ibqwfcezqct23l7bhjttatpnmatvin3den7u", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiepwo5bo23ho56dvxxbeko2v4lkl5iluav7tnfutpmrm46imdayhu" - }, - "userGithub": "cashmerelabs", - "projectGithub": "cashmere-labs", - "projectTwitter": "CashmereLabs", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x95a807bcAb5a16901628acF90FC3057061a3fce9", - "provider": "ClearTextTwitter#CashmereLabs", - "hash": "v0.0.0:t1c6BHVbYu9NfqgpWfNlX8PQBnUItQiVViR0Cg141ys=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-06T20:52:52.398Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-06T20:52:52.399Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..5A2oI9WJBGIF6mHeYc7Pp9pIhu02Y8dLSrQnENOz4aaeRtO-76I5OMlpE0rNbwqsJGIj_bRAFQsHnTTQRuM7Dg" - }, - "expirationDate": "2023-04-06T20:52:52.398Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "UcSnZj+HAi0u+TdQXNNWP10JPh6OF4Gz3qFEi2ufI+N1BM63+qI037mbYUvtABPL", - "encryptedSymmetricKey": "81ffad5b15c5b8e8e98eb0d57c557e2e3b8849a22110f8f92ddf0ec830b6079e98475c140514eaf0449a853b13ddc015fc902109620cbd176e99f7af4f56d9705a976b9b72ce1fd34ab165694f5b0cda54eb8398ac2f44bf3801de4b99c054a6ad49011fad71389e111cdbdec53360a753fc1ae6eb2fc86ff694e3879fc94d2400000000000000204099e134adce5ae15b971bf1130d35d5689a4afb5a8d523d17973942967004cf60395b6cdc4332ac2bd70178cb6bacb5" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "USDT" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "10" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/cashmere-labs , https://github.com/cashmerelabs" - } - ] - } - } - }, - { - "projectId": "0x07961486ee21b1c67495f7f01e21c4d976a654da5b3ce8ad31c78181438a86fa", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x3cf9eeea625004eec70e2ab12dac6357226de24b9d793672ff167c4432618eb6285dd50eb933c095205c0e23bcc2e6cb15b37f7bac46470db3c9511732accb681c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xeEd99E93e073C092131C245C3fDa23781563d67D", - "project": { - "lastUpdated": 0, - "createdAt": 1673038676821, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:46", - "title": "Zk- Block | Tools for Zk & Web3 Dapps", - "description": "zkblock started as a boilerplate for developing zk dapps using circom ( groth and plonk).\n\nIt provides two basic apps for zero knowledge ( age verification, zk voting using semaphore). Since then the project has evolved to include blog and other tools for solidity and zk ecosystem. \n\nThe goal of zk block is educate and help users to develop quality zk and web3 apps. \n\nWith recent developments in zk-evm ecosystem, we will work to provide tools and boilerplate to work with zk-evm such polygon zk-evm and new paradigms like polybase. \n\nAll the project related work can be found at - \nhttps://boilerplate.zkblock.app/\n\n", - "website": "https://www.zkblock.app", - "bannerImg": "bafybeidhdogxj2q7rz5zt74fyvx5hvvfatotl5s73zqfvwikwsj73wlqxa", - "logoImg": "bafkreihahjguto4njk4yxpz4hswwnoz3yrankgfmnezyvu5pcde2ld7yxm", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreifht57lf3ysp6jqptvjz5wkpvwj2cfdvw7pfphclqujjxz7k6cf4i" - }, - "userGithub": "heypran", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "REIGfPDa/CY2NRGPpV0gxjecXcSXUDURSB67kFgEAN8yMD2gnzB+sNrQJBhyeqVb", - "encryptedSymmetricKey": "dae5e41b28d14cd79efaa91bf58d9408d3be4365b025747adf9b33c1a682ec387681c3a2c71bd6a86a5e083c5d5acb0faba9c8a15f95845dca75cae536ea4d3bdbe07bfc56246ec7a75d6c916bc96521a335e357fe75441026661f05648e29a62cd74a33170e9b974f6e4d1bc99bc4b6a18263f34a7222f39dc5b6a96f20707600000000000000205285606a27a1c758d08a1818d0e3163051ced4f2656a5189d8c5d986643b59d78734081d1e72cedae166ab5a2ef8e4b7" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Open Source" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "1-2" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "It was verified before on centralized gitcoin website" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/heypran, https://github.com/heypran/zk-block" - } - ] - } - } - }, - { - "projectId": "0x0d1d9c4e5785c2d5e3cb1df956dfec6cc3f3729d64cf53989653960e4a80e2df", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x83504fcdda88c4c55b401f45e755265879d9991a982be3592a0348c287c9b875285adb26b9f6ff7d6dee4873bc903b8699589a4c6d16ee50bb7fab9413ef818c1c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x6A3738c6299f45c31697aceA647D49EdCC9C28A4", - "project": { - "lastUpdated": 0, - "createdAt": 1673625029803, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:187", - "title": "web3swift", - "description": "A full-featured native iOS/macOS library that provides Web3 functionality in Swift with native ABI parsing and smart contract interactions on the Ethereum network.\n\nWe are working on a universal library that provides web3 functionalities in Swift language so that developers can build full-featured native dApps on the Mac/iOS ecosystem. \n\nDevelopers can find out-of-box functionalities that they usually need in our library, such as web3 web view kit, ABI parsing and decoding, smart contract interactions, etc. Moreover, since Swift allows compilation to WebAssembly, the library also supports WebAssembly. This allows iOS/MacOS developers to work in their native interfaces. As a result, the library greatly improves developer productivity, and helps fulfill the vision of decentralized applications.\n\nThere are several other open-source projects in the field of web3swift, such as [Web3 (0.4.1)](https://github.com/Boilertalk/Web3.swift), [Web3Swift.io](https://github.com/zeriontech/Web3Swift), [web3swift.pod](https://github.com/bankex/web3swift), etc. But in terms of the technologies adopted, our library is yet the most advanced one tha\u3119 most of them, since we have full support of such features as **TxPool, ENS, event loops, etc**. Our library is therefore more widely used by the community.\n\n\nWe provide the community with **convenient tools** to work with Ethereum blockchain in Swift. Developers can therefore attain the ability to **quickly create secure decentralized applications** for Apple devices, without studying cryptography beforehand. This allows developers to focus on the content quality and UX/UI in DApps, which in turn **increases the adoption** of Ethereum blockchain and facilitates community growth.\n\nThe library was an essential part in several winning projects at ETHBerlin2018 and ETHDenver2019. We made it possible to work with Ethereum from mobile devices. Nowdays, our library is one of the most used iOS/MacOS libraries for Ethereum, and it was used in almost all ETH-related hackhathons.\n\nOur project is in great demand, more than 10 dApps have been using our [codes in production](https://github.com/matter-labs/web3swift#projects-that-are-using-web3swift), such as [Loopring](https://github.com/Loopring/loopr-ios?files=1), [PeepETH](https://github.com/matter-labs/PeepethClient), [ENSWallet](https://github.com/barrasso/enswallet), and many others. We have [more than 1000 references](https://github.com/search?p=4&q=pod+%27web3swift%27&type=Code) in GitHub.\n\nAs the library is so popular, our users also keep pushing for updates. There are [several new features requests (25 open issues for now)](https://github.com/matter-labs/web3swift/issues). But since this is the team's open-source side project, we can't spend the money we raised with Matter Labs to support it, especially when it's unrelated to the main goal of Matter Labs: To scale Ethereum.\n\nWe already put in a vast amount of work to support the most used functionalities, including the following:\n\n- \u26a1 Swift implementation of [web3.js](https://github.com/ethereum/web3.js/) functionality\n- \ud83d\udcad Interaction with remote node via **JSON RPC**\n- \ud83d\udd10 Local **keystore management** (geth compatible)\n- \ud83e\udd16 Smart-contract **ABI parsing**\n- \ud83d\udd13 **ABI deconding** (V2 is supported with return of structures from public functions. Part of 0.4.22 Solidity compiler)\n- \ud83d\udd78 **(ENS) support** - a secure & decentralised way to address resources both on and off the blockchain using simple, human-readable names\n- \ud83d\udd04 **Smart contracts interactions** (read/write)\n- \u26e9 **Infura support** , partial Websockets API support\n- \u2692 **Parsing TxPool** content into native values (ethereum addresses and transactions) - easy to get pending transactions\n- \ud83d\udd87 **Event loops** functionality\n- \ud83d\udcf1 Supports Web3View functionality (WKWebView with **injected "web3" provider** )\n- \ud83d\udd75\ufe0f\u200d\u2642\ufe0f Possibility to **add or remove "middleware" that intercepts** , modifies and even **cancel transaction** workflow on stages \"before assembly\", \"after assembly\"and \"before submission\"\n- \u2705 **Literally following the standards** (BIP, EIP, etc):\n\n - [**BIP32**](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki) **(HD Wallets),**[**BIP39**](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki) **(Seed phrases),**[**BIP44**](https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki) **(Key generation prefixes)**\n - [**EIP-20**](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md) (Standart interface for tokens - ERC-20), [**EIP-67**](https://github.com/ethereum/EIPs/issues/67) (Standard URI scheme), [**EIP-155**](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-155.md) (Replay attacks protection)\n\n - **And many others** _(For details about this EIP's look at [Documentation page](https://github.com/matter-labs/web3swift/blob/master/Documentation/))_: EIP-681, EIP-721, EIP-165, EIP-777, EIP-820, EIP-888, EIP-1400, EIP-1410, EIP-1594, EIP-1643, EIP-1644, EIP-1633, EIP-721, EIP-1155, EIP-1376\n- \ud83d\udddc **Batched requests** in concurrent mode\n\n- **RLP encoding** Base58 encoding scheme support\n", - "website": "https://github.com/web3swift-team/web3swift/", - "bannerImg": "bafybeig4mswudhxo7rlpi2urdvukjmflj6zte5vswf26j5svcuropens3e", - "logoImg": "bafybeibnguyv4ykek3fh6ur7y7uprnzkkh4vt2hr2aivxeu53p4lhu7pie", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreig4hjypvn44zegiacgpp3ninz56rm7bpe253thp3xqbu6rxrie6va" - }, - "userGithub": "skywinder", - "projectGithub": "", - "projectTwitter": "skywinder", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x6A3738c6299f45c31697aceA647D49EdCC9C28A4", - "provider": "ClearTextTwitter#skywinder", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "hash": "v0.0.0:m7yma7D5vBv1jkpAU9l9Xs413wHm+R9R3c8UlN+A7GA=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-13T15:44:11.488Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-13T15:44:11.488Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..SGuqzs1mMjhjsECevM4THSkoD2ezkhIxQBwM3wC2xz2cscla7SKPUzeYXJdqP6pDpTWYTd27DWGdKYoFrJcQDg" - }, - "expirationDate": "2023-04-13T15:44:11.488Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "03H2Yc/T27XwCgyhkQMBXCaHkOeJFfuXvhrKrJTT2b8f0cotkuWY/05KxUitfJXr", - "encryptedSymmetricKey": "731f5e82b42f32cdb9fdb74bc918db92cf1526e7c36cd9b7612e73d8fe8dd307162349311c446e34bcf1451c61ec2e007aa7af6db18ad13422a9174d1609baf42d8f4a365814f93e8996dfecbec3c51832be67a664a63e119517b376909219a96c30d9c1c501b0a6cbfcf718cf9b93ca0767a3c29ef4de4592c742556aa62db500000000000000205b2b00ec2c313fb57c18a3287f7eef9cbd9019adc1b57242512eb8a9ac6e20b3728cc1a947f5233d66beba939b55c9b6" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Ethereum Foundation + Gitcoin" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "3 devs" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/skywinder + https://github.com/web3swift-team/web3swift" - } - ] - } - } - }, - { - "projectId": "0x0e5ec25307b1588028b629bd76e2161f57a5407c73cf1fcd82817e63bb794648", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0xeb23c76c5e766be1996f6b9d27757d24ba2b46f174138b0acb197e849e74b7bd1e875d0ce1fd7c9f791f8a1f291f8b3717879d164966c423eb3e556fdd3eb78700", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x75DeD588d2a4734D0a61B9953A3C4e6C6D00AbC4", - "project": { - "lastUpdated": 0, - "createdAt": 1673619861585, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:184", - "title": "Proof of Integrity", - "description": "We are bringing the benefits of blockchain technology to vulnerable sectors to generate an equitable, inclusive and sustainable society. We will use the funds to make #aPRENDOcripto, a personal finances and crypto training program in low-income neighborhoods of Buenos Aires city.\n\n\n\n\n\n\n\n#aPRENDOcripto: Blockchain for all\n\n \n\nThe program consists of 4 workshops with theoretical and practical content where the participants will learn about personal finances, blockchain technology and possible use cases, with the close supervision of mentors to facilitate the learning experience.\n\n \n\n\n\nWe aim to:\n\n \n\n\u2022 Give a brief introduction to basic personal finances so the participants can have the necessary tools to take care of their income.\n\n \n\n\u2022 Introduce participants to blockchain technology and the crypto ecosystem, sharing its use cases, contributing to an education for the future and helping to bridge the technology gap.\n\n \n\n\u2022 Create and encourage a crypto community in the neighborhoods, uniting young people with the same interests to promote collaborative learning.\n\n \n\n\u2022 Make the participants interact with decentralized technologies, facilitating access to the creation of a profile in Proof of Humanity, a social identity verification system for humans on Ethereum, where they will acquire a first contact with the world of cryptocurrencies by receiving the UBI token and become part of a DAO.\n\n\n\n\n\n\n\nWhat we did and what we will do\n\n\n\nWith the funds we received in previous Gitcoin grants we were able to:\n\n\n\n\ud83d\ude80 Put together a team that will help us achieve the goals we have planned. Our team is made up of professionals who share a passion for blockchain technology and a socially conscious outlook. \n\n\n\n\ud83d\ude80 Set up one edition of #aPRENDOcripto which has already been completed in May 2022 and start to deliver another one that is taking place right now (will finish on Sep. 13th) at Barrio Mugica, a low-income neighborhood of Buenos Aires. \n\n\n\n\ud83d\ude80 We are launching the third edition of #aPRENDOcripto in Villa Lugano (Buenos Aires) that will take place in Sep. 20th.\n\n\n\n\ud83d\ude80 Paid for all Proof of Humanity profiles generated (Ethereum mainnet fees, ~0.03 ETH per participant)\n\n\n\nOur goal is to deploy 20 more training \ud83c\udf93 programs in a year, to do so we will need:\n\n\n\n* 2 or more venues to make the workshops (we already have one confirmed in Villa Lugano)\n\n* 15 mentors (volunteers)\n\n* 6 teachers (volunteers)\n\n* 18k USD on operative costs (900 USD per edition)\n\n* 8k USD to onboard 400 participants to Proof of Humanity (Ethereum mainnet fees on 2022, and Gnosis fees on 2023)\n\n* 42k USD to cover annual headcount expenses\n\n\n\nAbout Proof Of Integrity\n\n \n\n\u2022 We believe in the social impact of the blockchain.\n\nWe want to transfer the benefits of blockchain technology to socio-economically vulnerable communities to generate a more equitable, inclusive and sustainable society.\n\n \n\n\u2022 We promote technological inclusion\n\nWe are going to design and promote initiatives that reduce the technological gap and generate actual opportunities of inclusion and development.\n\n \n\n\u2022 Proof of Humanity\n\nWe are integrated with Proof of Humanity, a digital identity verification platform on the blockchain, through which the UBI token is distributed.\n\n \n\n\n\n\n\n\n\nIn Proof of Integrity we connect the unconnected.\n\n\n\nGet in touch with us. We'd love to hear from you.\n\n\n\n\u2709\ufe0f info@proofofintegrity.org\n\n\ud83d\udce3 Follow us on Instagram, Twitter and LinkedIn for more updates!\n\n", - "website": "https://www.proofofintegrity.org/", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreieptxgwzqh62uyw5yuljfuodg4v4lbsnidx53gqjv6wffez5j2dky" - }, - "projectTwitter": "proof_integrity", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x75DeD588d2a4734D0a61B9953A3C4e6C6D00AbC4", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#proof_integrity", - "hash": "v0.0.0:b8u4ux9g6DqOgfkPXUTMfLAJgUR/pkgvs1B7m8UFcQc=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-13T14:24:06.741Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-13T14:24:06.741Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..xLHFybmVdn1CXDuDtj3Z_WK_gOJBKe3O-dAwTDdOEOvdttR261YCKTFl-xjlnocOAqu9y_7OMVepiHN1NGxHBg" - }, - "expirationDate": "2023-04-13T14:24:06.741Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "6un6gvKclOYugphQqRbrmtKvEsWnrGOQyTNLW9+mSXJLYObHH6RG1wD/cgLG85JZ", - "encryptedSymmetricKey": "53ede8f1e01dfe5e39f978fdab384227265ed28acdad820d86bf85f0cfec80b06224c9e4e16ced41d649288203e15817cf422b288da766a3941aaafafc07fa44c06a4c0df4441b47b8233b8e9f6529ce85670e74e0afa396dfd9bd7ed003a28373478f036564cbe6247ce1eabb92675370c8f4a30189b58211820f7322350d8d000000000000002042c37cc5c0eec1ad1b1cad505ce7d2678474e3e0ddc7ea9c5dc6af7266758c9dfb6ed9cda89e36554a84e07bc903cd94" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Gitcoin community, individual donors, Ethereum foundation grant and EthColombia quadratic funding" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "10" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes, Twitter. I could verify Github as well. " - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "Organization: https://github.com/BEON-Tech User: https://github.com/michocohen" - } - ] - } - } - }, - { - "projectId": "0x0f1d31d427400106f3d2958225dd235ae60b6a7572fb5155201b723e1ae79632", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0xbe90d0fefbc66a6ffd4fa29ba0bc1584e7a112dfd085c52d5ed7232050f6b7581a37e9ae08eacd57429f6c63e09abdc0a57111075488aa74d878ff166e2bcf451c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x01d79BcEaEaaDfb8fD2F2f53005289CFcF483464", - "project": { - "lastUpdated": 0, - "createdAt": 1673505944140, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:148", - "title": "Lenstube", - "description": "Decentralized video-sharing social media platform, built using Lens protocol. \ud83c\udf3f\n\nWe aimed to develop a decentralized video-sharing app, where content creators own their video content. By storing videos permanently in Arweave and the metadata stored permanently on-chain, no one can restrict users from creating content of their choice. Creators can always monetize their content with various means like nft modules and tips.\n\n- Features\n\n\n\ud83d\udcfa Create channels.\n\n\ud83d\udcc0 Publish any video content or NFTs.\n\n\ud83d\udd28 Collect video as NFT.\n\n\ud83e\ude9e Mirror and share videos across Lens Dapps.\n\n\ud83d\udcb0 Set membership fees to your channel.\n\n\ud83d\udd14 Notifications about new members, comments, mirrors, and mints.\n\n\ud83d\udcb2 Customize who can collect your video and associated fees.\n\n\u2764\ufe0f Support any creator by sending a Tip.\n\n\ud83d\udc4d Like and comment on videos.\n\n\ud83c\udfa5 Short videos called Bytes\n\n\ud83c\udf3f Watch later and recently watched videos library.\n\n\ud83c\udff7 Video Categories\n\nand more.\n\n - Links\n\nhttps://twitter.com/lenstubexyz\n\n", - "website": "https://lenstube.xyz", - "bannerImg": "bafybeibvfmuckpzz7hkaptacrydt3pllmdedkvh66odkmryjtyjwroqpxq", - "logoImg": "bafkreicowrkp5yfzvr2smtpk57yhjwvmfx36mbpr3tiqti4x7z6wsqx5ge", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreibg5l6stgwvani5dzts5pr5wgyahqfpbmujuhhkeyawvxbrsbazam" - }, - "userGithub": "sasicodes", - "projectGithub": "lenstube-xyz", - "projectTwitter": "lenstubexyz", - "credentials": { - "github": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x01d79BcEaEaaDfb8fD2F2f53005289CFcF483464", - "provider": "ClearTextGithubOrg#lenstube-xyz#29498872", - "hash": "v0.0.0:WsrV5SViv2yByCUBeo4ct0Df6rj0sBG8PH4EYx8blNE=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-12T06:45:32.088Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-12T06:45:32.088Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..pacT4RJiYdxItu856rhdunNZNz7Hz_UjQMpFIcID-Ja97AEBzrkpr2_Dys2sKBnW7FqhQ516c7AM2cxXMVGTAw" - }, - "expirationDate": "2023-04-12T06:45:32.088Z" - }, - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x01d79BcEaEaaDfb8fD2F2f53005289CFcF483464", - "hash": "v0.0.0:myzHWJR14zEnVnRl5lUCuYFgJjlen4lAebo/Ni7BN3E=", - "provider": "ClearTextTwitter#lenstubexyz", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-12T06:45:21.645Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-12T06:45:21.646Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..m_MIOG9wllc3y5vgrDzy9M34xvx1s9nxJ0kw8qgAX_i-YlS9o8WyOe8-LUW0GXMxZWIAv14XT-mRA6pvT1PDAw" - }, - "expirationDate": "2023-04-12T06:45:21.645Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "/WGM1ZxeSO/6VTgvGzK0qBiW0Hjsuf9vGDBxMh2evJw=", - "encryptedSymmetricKey": "1cfb813a3a941f4c805fb1e366bf1709de96ab4926d296d533a0e2189d752c997c65c365e1b432b6ba60d51b72f22400b8f5bf28b16990e0d0c1f075cc09b61c790258088c590af4d3f3b4b12bcf103506e8bab126acdee5e993ad3f7ed305845ac34e85fcb1ecb24f0491c7de6291dd06e1088063d78576b1c42bf0e2592c8800000000000000202b548e105153f94300521d9e618aea9afe794c509185f33118f66a9c4be47198fac6fdff0aa182c7fe8ecb2598a2f484" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Nil" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "1" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "User Account - sasicodes, Organization Account - lenstube-xyz" - } - ] - } - } - }, - { - "projectId": "0x0f648ff5caf73611e70ebaaa9df9bf0dc81f5a633af3996672c6a5e44df791b1", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x943f24d9078d9023ba57614def0db6aee031420b30f23e8ab874417d6d0c995a1d707c23cbd74ea00880405c8d29ca57fbc7bc7e21e507ed969dd50ca4b367ac1c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xB67FD6f4B908d702c2CF0E2b9d30d52D4EA5B2bC", - "project": { - "lastUpdated": 0, - "createdAt": 1673792533169, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:211", - "title": "ECHO", - "description": "ECHO is the first decentralized social engagement protocol based on Arweave. \n\nOur goal is to provide the fundamental infrastructure of Web3 social by introducing the first comment widget that can be deployed on any Web3 website with permanent data storage, so that users can speak up for themselves in a decentralized, permissionless, and censorship-resistant environment. It is our conviction that every person deserves to be heard, and we strive to create the right tool to make that happen. \u201cLong live our opinion\u201d, as our slogan goes.\n\nMore importantly, as we are providing a multi-chain, multi-platform, and multi-disciplinary solution, ECHO will energize the social mobility in an aggregated manner to address the current social segregation issue in Web3. And our protocol-based data structure of social activities both on-chain and off-chain will be the cornerstone of the future Web3 social paradigm.\n\nOur opinion is our intellectual assets. People don\u2019t own their voice in Web2, and people have no tool to own their voice in Web3. People are awakening that decentralization should not be limited to finance, but also in other fields. And we need a product so that people can speak freely and equally without worrying about censorship and privacy issue. And Arweave is a much better storage solution than IPFS that the technology is mature to make this happen. \n\nECHO provides a neutral commenting tool that can be used to comment on anything, including Gitcoin grants.\n\nWe have established partnerships with companies and products such as Arweave, .bit, everPay, Mirror, Mail3.me and permaFacts.\n", - "website": "https://0xecho.com", - "bannerImg": "bafkreih7xjji7i3jxzfjudbfc4nxhepmu6tp35pbdxjkfstnht77c3uxtu", - "logoImg": "bafkreift6xd2sfqcftpsnaue5xovdz6qvjpdzbq3vcndomtc77dogbkdae", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreicb4mawy7wbwp777czuxfc3psv3qab24iw4gp7jyrjuj7pmagunqe" - }, - "userGithub": "airyland", - "projectGithub": "0x-echo", - "projectTwitter": "0x_ECHO", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x3c98b726Cd9e9F20BEcAFD05A9AfFeCD61617C0b", - "hash": "v0.0.0:4uwu5ZftEGmViOdGEwoUjpLzNpAoV5aQVhcvbWy44Nk=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#0x_ECHO" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-15T13:54:52.255Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-15T13:54:52.255Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..15A66Sl4MT19drmKKU9iWtWvVdwY0Eo7X1kZXHjGRK9kZr_eC7O9OOj8lhP5r9Fndwq7Hk-oioD2uds7sWZsCA" - }, - "expirationDate": "2023-04-15T13:54:52.255Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "pQWJCN01W7TB4Wlhdcq+DujJje4eZ/D+wucaRSw1mVk=", - "encryptedSymmetricKey": "f519f2bdbb8c37e3027c126e8b54a391fba0ecce4c5f60ad72bd1d8ec9629fb3735be2dd30215614c2ab1e63a8f9df13965c16844cfbbdf6eb727069715242b10ed1c677658ff89e788aa0cf6f10e43e084f55354f40e3b62860bc0ea8ae71a3b677be71d684c7f692dbc3a92e79457e182eb72969c4db4c48b926300b187ceb00000000000000201f5565a5efd0dcf0a34568d053e4b86f28a799fe1b6152e01909ee968d5a1db2dc3a700c23d07df73f4aa3e90b2754b1" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "4" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/airyland https://github.com/0x-echo" - } - ] - } - } - }, - { - "projectId": "0x1152027a98d2653f1cbf55912b2005b62477efa9dd11bf2bcd19b88a8edf134c", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0xf55da9acf9cb0a7392a1e663cdfbd2bee2db6429d796089fc6eee1666894404a257a8bed7d51580308d147d77e41a7b1c3e353756513376c63763cac4166bd601b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xced950CDd8D7Cc656a44D7C834a21A1A4239C491", - "project": { - "lastUpdated": 0, - "createdAt": 1673945691259, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:241", - "title": "Know Your Degens Oracles - doing compliance the DeFi way \ud83e\udee1", - "description": "PROBLEM \ud83e\udd15\n\nInstitutions, DAOs and Web3 projects, all encounter the same problem: How not to accept \"dirty\" money on their Smart Contract without killing usability with a tedious KYC process?\n\nSOLUTION \ud83d\udca1\nIntegrating KYD Oracle into your Smart Contract allows it not to accept transactions from blacklisted addresses by your chosen set of rules, i.e. addresses that have ever interacted with Tornado Cash or those flagged by forensic companies \ud83d\udd0e\nHow's that possible? Every time a wallet wants to send a transaction via your protocol RedStone KYD Oracle attaches to that transaction's call-data a note if a given address should be allowed to interact with the Smart Contract or if this transaction should be refused. Hence, the UX stays the same and you are protected against known malicious actors \ud83d\ude0e \nKYD Oracle is available on all EVM-compatible L1s & L2s.\nCheck out the Twitter thread explaining how that tool could facilitate entrance of institutions into DeFi \ud83d\udc47 \n\nhttps://twitter.com/redstone_defi/status/1599803069058777093 (There's a blog post too)\nDemo video \ud83d\udc47\nhttps://drive.google.com/file/d/12ijNmgSOin0pUokbDaTmqKk4WuwE0zyE/view?usp=sharing\n\nHOW WE WILL USE THE MONEY\nWe'd dedicate money to further development of the tool, security aspects as well as first implementations with Institutions, DAOs and legal companies \ud83d\udc68\u200d\ud83d\udcbc", - "website": "https://coinbase-kyd-showroom.redstone.finance/", - "bannerImg": "bafybeidvicxv5vgaiwqgz5f4uy47bolmrj4b7pq2ougaqr6dssj2wrn4oa", - "logoImg": "bafybeicbtmn5fqnxoaqn7ngdq3eyrdowuq56mienfql6wdg3z5xvxy64gm", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreigl3vgpqfzqk3wizbhb5nmevwugnbdpa25gee4lqwf5lhijkt5ony" - }, - "userGithub": "Kazik435", - "projectGithub": "redstone-finance", - "projectTwitter": "redstone_defi", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xced950CDd8D7Cc656a44D7C834a21A1A4239C491", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#redstone_defi", - "hash": "v0.0.0:A+ZW6+WyLVDSc4yaFR4twB5tZ6M3ByI+RFa/6lQZT1w=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-17T08:53:41.636Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-17T08:53:41.636Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..X-81NEinyJgyUPqsP8y5jyb0Uj5Zyz2VvfGQnR1bN_sFaPKwQvORBMcKQeeGhaMDjosp1Nebc4Pxz05qCLRiAQ" - }, - "expirationDate": "2023-04-17T08:53:41.636Z" - }, - "github": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xced950CDd8D7Cc656a44D7C834a21A1A4239C491", - "hash": "v0.0.0:g2McLmeXm0berNHMTCqftj3DLObnn7N06uL7sTnZbfo=", - "provider": "ClearTextGithubOrg#redstone-finance#36930397", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-17T08:54:18.229Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-17T08:54:18.229Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..P0_sKJtPAsrH5LZlhrnBiOTLccSFHLZ_ZlsPFwvRLOv9e1wdqmzqgWnNTgGR3wXtCBwG-BPcrb-5raq4IVr4AQ" - }, - "expirationDate": "2023-04-17T08:54:18.229Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "flssA80WLbO7XQg2mOF16LXT6Lvf9Og3fnYN5IvzCQspKwEahyiuuWzohjOIFnIH", - "encryptedSymmetricKey": "d5f6e7193890fbbc1f612f07bda9cb7a02f7bd9eacaa988d40e071ebe47294d9789fc5077ff07e0ef05aab2752881d03b5709e23095c54b6150ec22b69038293bdf9d676848e9ee32de839bc96e9dcac1145f47f9774d788f5b6a9c55dcca6a621dbc6aa4d20c040c3f081b7c48571c68f8c8c19eff5743b9d6d57a6ed9703ea0000000000000020d968c8be164d8194b0ae48f2f7ddf29cd464640c932938be5d9e1ebcc03b31fccb6c2a91da845a336f68fc97f68e32aa" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Bootstrapping based on infrastructure of RedStone" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "3" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "User: https://github.com/Kazik435 ; Organisation: https://github.com/redstone-finance" - } - ] - } - } - }, - { - "projectId": "0x128a79c5f52d33bc49f5677dd0fcd695e44f22916b920dc3490c18f10099db66", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x8093008f330aa34b939bfc383852bdd22dd2223bde7a779ba4a331f05864723d5380095d5906349bc2d7b710458cb8425f79c862ca93cb4d75611e66f254744b1c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xE6D7b9Fb31B93E542f57c7B6bfa0a5a48EfC9D0f", - "project": { - "lastUpdated": 0, - "createdAt": 1670116734938, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:3", - "title": "Chaineye", - "description": "ChainEye aims to build the world leading free and open source omnichain analytical tools for retail investors. Launched in the Q4 2021, Chaineye has a total of over 100k user visits.\nCurrently, it has the following core functions:\n \nBridgeEye - a multi-chain bridge comparison tool. Users can use this tool to find the optimal bridge option given the source chain, destination chain and the amount of asset. Supported Chains include ethereum, polygon, avalanche, bnb chain, aurora, fantom etc. \n \nCEX transfer fee - Uses can check all the CEXs deposit and withdrawal status without logging into CEX. Users can find the cheapest route between CEX & On-chain transfer by sorting out the withdrawal fee. The data is updated every 10 minutes.\n \nMultichain Gas - Users can check the gas history and hour distribution for various chains in one page.\n\nETH Staking - Users can find eth staking metrics such as 7 Days apy, effective apy, TVL, stakers, liquidity, volume, rewards cycles etc. for different staking protocols. \n\nRPC List - Users can find the best public rpc in terms of height, latency , 24 hour status, provider information etc. We provide the most complete rpc public nodes in the market for the following chains: Etherum, BNB, Polygon, aurora, fantom etc. \n\nStable Coins Dashboard- Key data metrics include native chains where stable coins are issued, price, month off peg , market cap ,market cap changes, collateral value, collateral composition, audit report etc. \n\nChainMap(coming soon) - Users can find interesting participating opportunities on each chain such as yield farming, swap&lending,NFT mining, airdrop, DAO governenance etc. We will start with Optimism and expand to other chains later on.", - "website": "https://Chaineye.tools", - "bannerImg": "bafkreialbihpudovcg44jew4ompuxqhruco5fp2nlkn2kalqpk7epltxva", - "logoImg": "bafkreifj4zsebd6taptf4vlwjnssn5h5nelfoeqwtbz5ugczxigdk4337y", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreidvzfnmulfaw37e2djwbbwpswfpfnrikjritpdjxikwpmts5ed7wq" - }, - "userGithub": "DeFiTeddy", - "projectGithub": "DeFiEye", - "projectTwitter": "biteyecn", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x112E372bb5EC17c1ea6b1d679EA72aFBD2A94404", - "provider": "ClearTextTwitter#BiteyeCN", - "hash": "v0.0.0:RbcEpvmCM+vgVe3JEoyp/Qvoqy1WLecdiG9Niz2lfRo=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-09T04:48:08.677Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-09T04:48:08.677Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..n2Vz7QEQV76DI74Idghoz9NvYhY_4EW7dCs_sDt_BG5x_MM3Xw9E_Tq0_dUCRUzK9htZkfsc4lT0WO9CkarpAA" - }, - "expirationDate": "2023-04-09T04:48:08.677Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "jTTvnsd4+Ew+sMXqvmnoff1V653b2eU5+vKYuJ6ePozWYaD+UxC1Ct3qyHQqHq8K", - "encryptedSymmetricKey": "a8835be5cc4bab90c53a315ca77d2f305e8aea8c4bb78b4ca4ac415436955b4fa77b5334f7ddc97e86c5f8f069a8790abb741c0bc84ead1cbf6c7c8107e1d6b78f6b566e074f78d4866a3bdeede0ada34c5ff937fa9243f8d9bbf2f76b1701a114b8320a9600180f67aec851ac2784e3a519c91929ee73988a2a3d605a032a8f0000000000000020390d2700a5477a69af3ba15ef3dd0210a8c1e193d0be4245213be9d3317a00b3479d7791daffe74de465b5639af6e8b4" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Gitcoin" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "7" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Verified Twitter ( Github verification has technical issues)" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/DeFiEye , https://github.com/DeFiTeddy, " - } - ] - } - } - }, - { - "projectId": "0x13f8b39159680f9e0bc9aebebb09c978d9c02060b55d9c5224a6c6fbaf8572bf", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x3754abc6868566eac1859222cd91e2e0c018414e25ce852940f6b23fec9bf59a2cb91fd0496a37496c70d25bd1eddee465a2cd0dfe5993afcc2240ae3f95fefd1b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x77D70A4df6436E1979986ecea54A95e3A0E21531", - "project": { - "lastUpdated": 0, - "createdAt": 1673937717930, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:239", - "title": "Phi", - "description": "Phi is the immersive social world created from ENS and on-chain/ off-chain wallet activities, enabling easy visualization of on-chain identities. It incentivizes users to interact with various Web3 protocols, which provides positive feedback to all protocols and accelerates the overall network effect of the Web3 ecosystem.\n\nOur experience lets users generate their own personalized space using their ENS domain and allows them to claim in-game objects based on their wallet activity. Using the objects, users can build their own Web3 world to show off their on-chain identity.\n\nOur world is a pixel world, designed by world-class pixel artist, eBoy (https://en.wikipedia.org/wiki/EBoy). eBoy\u2019s accomplishments to date are unquestionable: They have been active as a pixel artist since the dawn of the Internet, and have collaborated with lots of top brands, including Saint Laurent, Paul Smith, Balenciaga, and more. Also, they co-founded Nouns and designed its iconic pixel art, which has become the symbolic CC0 IP representing web3.\n\nAfter launched two times before on Gorli & Mumbai testnet, we just launched our product on Mainnet on 15 Dec 2022. As for our traction, we have 25k+ unique users, 1.15M+ Total In-Game Objects generated, US$ 12k Monthly Revenue from customers even though it's less than a month after launching our product. Also, Phi is featured by leading media, The Block, The Defiant, Bankless, Ethhub, and more.\n\nMindmap for Phi\n\u30fbPhi Avatar\n\u30fbPhi World Map \n\u30fbMusic NFT Integration (royal.io & sound.xyz)\n\u30fbCommunication Features (Text chat/ Voice chat)\n\u30fbPhi Dungeon Game\n\nTeam (Twitter Handle/ Position)\n\u30fb0xshugo - Co-founder/ CEO\n\u30fbZkEther - Co-founder/ COO\n\u30fbZak_3939 - Co-founder/ dev lead\n\u30fbeBoyArts - Pixel Lead\n\u30fbopen3x - Frontend Dev\n\u30fbta2nb - Pixel Artist (Final Fantasy, etc...)\n\u30fbfuzuzu - Pixel Artist (Created famous Japanese Anime titles, such as Chainsaw Man, etc...)\n\u30fb0xOzh - UI/UX Designer (co-founder of Zypsy)\n\nOfficial URLs:\nWebsite - https://philand.xyz/\nTwitter - https://twitter.com/phi_xyz\nLenster - https://lenster.xyz/u/philand\nDiscord - discord.gg/phi\nBlog (Medium) - https://medium.com/@phi.xyz", - "website": "https://philand.xyz", - "bannerImg": "bafybeidtkli63nnvgahuy56e66fss22rfqyk3wlt2vhpmqcgkqjd66xnqm", - "logoImg": "bafkreiefhgpjwg2odwf4jc63nubdekzbh4rvzarar5hesppkjxgfncx5em", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreifbwsrphisufrpgbxbhvgnv5znct3g3g6m7qh2fhelrvuw3ubg6di" - }, - "userGithub": "phi_xyz", - "projectGithub": "PHI-LABS-INC", - "projectTwitter": "@phi_xyz", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "STY/AUnxrl1LPxahZPrQtCTkwwoiYGkH2Qt4tYEOPnJ6qyfiH6toJVOrEJ5CHwhW", - "encryptedSymmetricKey": "5ec7d893c3cc1e6b5e897c233c2be2d4f0516a25bcbeb945dab4bd231c6f0c1de97ace2f0b0808660743c8733913020a8793fa20a64aa73f3408f7a92caa3e4eee8d2f60b8258513b54c0172b707c95314d2a02f491a40147bb3cd13159620ae2365f724ff1fd2a919579cd77622f694fb1ee50e4b6eb43b9d417511ff9996750000000000000020c5ffb9f3ca06c04522c0c21edc41dafc4783e9fc7bac07a55fb5dd1330200b05e8596e26ceacfaa8378ea4497561ea89" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Self funding/ External funding/ / GR15" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "12" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Not yet, I'm not sure how can I do that. There was error" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/PHI-LABS-INC" - } - ] - } - } - }, - { - "projectId": "0x14e03fe716c103abf237c9a027c36f1f64cbe901482e768e73331462792dbdfd", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0xe2504fc0f634ca3b0c47ddbb7d9dfd3c4fd817ba3ca0ad32e7141e77a1f962ac367c3c98b3945b42b7801e5d56f1fc73f4fb73ef8d0957f09ca71b4ff2792a8f1b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x698CcCCB5947c54684e17545327A77b9103F1f7a", - "project": { - "lastUpdated": 0, - "createdAt": 1673554458919, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:168", - "title": "Maven Foundation ", - "description": "Maven Foundation is building Web 3.0 protocols, tools, and applications for the Creator Economy.\n\nWe are building a decentralized Video Streaming Platform Maven House .\n\nMaven House is redefining physical and virtual experiences by providing a platform for vloggers, influencers, musicans, creators, artists and creators to create, manage, host physical and live-stream events where they can connect with their fans globally.\n\nThis gives artists complete control over their performance and monetization while also removing barriers for the audience. Platform is able to handle traffic for an event of any size, from anywhere in the world.\n\nDEMO LINK : https://mavenhouse.io/\n\nThe Problem with existing Video Streaming Platforms\n\n\u2022 Current Video Streaming Platforms are owned by Centralized Organizations like YouTube, Facebook(Meta), Twitch, etc. and the creators itself has no ownership of their content.\n\u2022 It is difficult for streamers to make any earnings out of their content as these platforms levy 50%+ commissions from the user's revenue also the user himself has no option to earn royalties from his content.\n\nCommission rates of centralized video streaming platforms.\n\n\u2022 Twitch - 50% of subscription fees & 29% from Donations.\n\u2022 YouTube - ~45%\n\u2022 Facebook - ~30%\n\nThe Solution\n\nThe value of content should be decided by the audience & not by the platform. The incentivized platform for all users with multiple inbuilt streaming features.\n\n\u2022 One Window that does it all\nMaven House has all essential features like YouTube Chat, Video Preview, video editor, recent events, stream labels, and dashboard in one app so you can save your monitor real estate and CPU usage for something else.\n\u2022 NFt Ticketing for Physical & Virtual Events\nCreators can sell, host and schedule live or physical events with their fans and sell tickets in the form of NFTs.\n\u2022 Memberships NFTs Or SuperFan \nThe content creator can set up customized plans through his dashboard for their die-hard fans.\n\u2022 Creators NFTs from Livestreams\nCreators can create and can sell their streaming-video clips as an NFT with their fans.\n\nTech Stack\n\n\u2022 Polygon for on-chain storage and NFTs minting.\n\u2022 Livepeer for decentralized video streaming\n\u2022 IPFS for file and metadata storage\n\u2022 XMPT for chatting.\n\u2022 Unlock Protocol for Membership and Ticket\n\u2022 Next.js as a frontend framework\n\u2022 TailwindCSS for design\n\nRoadmap\n\n2022 Q3\nIdeate, design, prototype, test and refine of the user interface/web-flow\nRelease of MAVEN HOSUE beta to public test-net, and allow all users to test MAVEN HOUSE without any gas.\n2022 Q4\nRelease main-net P2P Streaming platform with all in-built features like membership, audio-filter along with NFT minting and creation of tickets and events.\nGeneral availability of the MAVEN HOUSE Web app to public main-net, we will be hiring some devs to improve the dApp and make use of the Gitcoin funds as bug bounties to the devs.\n2023 Q1\nOfficial Launch of MAVEN HOUSE with Web/Desktop application.\nPartnering with verified content creators worldwide.\n\nWhy a Gitcoin Grants?\n\u2022 We are looking for full-stack developers to develop the dApp and make it more usable.\n\u2022 We are looking for mobile app developers to develop and ship DeStreamLabs iOS and Android apps.\n\nSocial Media\nTwitter: https://twitter.com/MavenFoundation\nDiscord : https://discord.gg/GF3N2fbapn\nTelegram: https://t.me/MavenFoundationChat\nInstagram : https://www.instagram.com/maven.foundation/\n", - "website": "https://mavenhouse.io/", - "bannerImg": "bafybeifo3nx6oe4wqwmnt44iskznadpukywxiti4y7ux6qhkbf6dm3obaq", - "logoImg": "bafkreiervciiugrd52qnkleioog3ryizodah26gtbpjhsc2xzmb4alzgce", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreigulgdmarkiwgoj4mtx4kyyhndd6h6rqtghocoa5mjniwhw65efti" - }, - "userGithub": "MavenFoundation", - "projectGithub": "Maven-Foundation", - "projectTwitter": "MavenFoundation", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "hIXV8IPWHJ7RDl66Y31VSIwNoppVMVxa+RqXvuKOypkJkQicGX2SwwUWj2LuHTSv", - "encryptedSymmetricKey": "955b2ebaf0eff1655fba14227709c1b9c5bc19ed659f86a4229aaaf6a110de93e5ce8ebc154ca7a2950021d918d35c0dcd5e3018ee7947dbb9f75b0ec268b8cb5ac105e30899c9abbe553f38d739a28e43810a412abbe73622c21f6c4961cc96da74405f260128ec8f9e3a426f8b356e0b94f432ab540699a70493f858e8257600000000000000207a3f124c87468a08e5aeaf9185ccb2a46f67f2dd1c2bcfedaf550df1d618b8897252cd842e268585c13080a16aca1094" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Friends " - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "5" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/MavenFoundation , https://github.com/Maven-Foundation" - } - ] - } - } - }, - { - "projectId": "0x185931d3283ae56d89d72da6988a8d50f27b1d236c5612397cfeb357b5d7c3d7", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x46d4ed78ffdb8fe266f6811da9a0938b59ae5b8baffe65f36dc3cc8ff8e9274725117aecbbb4965c288e81984d164f4a05bbefbf08464f9a6aaa0c3ad7eda1491b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x3394F31640dc15c1CC6259402fd774436a3e56aC", - "project": { - "lastUpdated": 0, - "createdAt": 1673917449024, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:235", - "title": "orb", - "description": "A decentralized social media app where the user has complete control over their identity, content, and monetization.", - "website": "https://gitcoin.co/grants/7785/orb", - "bannerImg": "bafybeidcg4jcnvtz6pfyowaxirjc5pneoldooeb62tve5vy4zbqbdbxkca", - "logoImg": "bafkreicu32ngslaodqln3rabz3ycjxymbkdkev3bfwu6vruwqtqmjfs7si", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiauglxwc6ianicvwnyvflwxa46byedjjutuz4iwsn7lwn5ctdez5a" - }, - "userGithub": "nileshrathore", - "projectGithub": "orb-club", - "projectTwitter": "orbwagmi", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "GIP18bWKwF8cq2YDViW+4PQP0YQyC5BIkqF/4wJItAk6bfmCAAlL57vbQLRWYRRS", - "encryptedSymmetricKey": "70363e11f99a2de3a8f995885719b052b101507a43e143c26e93209bca8e3ded342ff0f823e4bfc5e34615842487b615fb53258350f0a012703d89b06f0259d34c33c04801eaf4adae88b9e1d2c4355e0108f89ebc3bb6d069d456786cbf26aa91be337c47c647175f6a6064e719b17a959c4eae67c32779ceb5ffc7d2b6787b000000000000002074172905401c394c2ba24d32312cb4ad859f39d214cace0ab4f3f909884695704a52b5c841cf1f2a2be6463af39a5cae" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "3" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "github.com/orb-club/" - } - ] - } - } - }, - { - "projectId": "0x19dd6925454ca97651eeb60ce52f79c0458a3c0edbd83b66a3736991ea339191", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x10e2f7166ba96913f88b4dac649515b186fbb53ee36e06ec23c80883ba7fe1c253c1aa82e7fc90fb4fa198ea2eb8683e41fcca3a6c8150a264cf360abe914cea1c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x62179dB9a70cB6005596c04e6faa8274DFa7B2D1", - "project": { - "lastUpdated": 0, - "createdAt": 1673954146124, - "id": "10:0x8e1bD5Da87C14dd8e08F7ecc2aBf9D1d558ea174:56", - "title": "B4B WORLD", - "description": "B4B.WORLD is a Web3 influencer ads platform with reputation-based rewards.\n\nB4B allows Web3 Companies:\n- use the influencer Ad channel with safe borderless payments \n- make fast and quality ads with active and advertising-ready influencers\n- get approved privacy information and open the reputation of influencers for a better choice\n\nInfluencers can:\n- receive pre-paid Ad orders on the free dates\nguarantee of full payment after posting ads via smart-contract\n- increase reputation through activity on the platform and quality of ads\n- earn transferable Rewards monthly based on Reputation\n\nB4B.world has a dual-token reputation system to motivate influencers\u2019 activity and long-term work. As a result, Advertisers choose an influencer based on a transparent portfolio and receive advertising approval within 24 hours on the desired date. The best influencers earn more rewards and withdraw it into real money.\n\nYou can test the App here: \n(Aurora testnet)\n\tInfluencer App - https://testnet-influencer.b4b.app/\n\tBrand App - https://testnet-brand.b4b.app/\n\n\tDemo with workflow for brands and influencers:\n\thttps://youtu.be/u9WSZr2Jg2I?t=86\n\nMainnet release B4B 1.0 :\nhttps://b4b.app\nhttps://influencer.b4b.app\n", - "website": "https://b4b.world", - "bannerImg": "bafybeihn6ctulcl27j2oauqikgizfixag63fnr2t6luudh5zjsusr4ylii", - "logoImg": "bafkreiduqs7rdfwhccpvd5raz35rpoxxp3pjtyohy5tdr3etvmhvm3z6cy", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreibfkts2f2tlb6nubrgry6qqf2bildgecmswnkq4czc65wvea62ly4" - }, - "userGithub": "@antonpecherkin", - "projectGithub": "https://gitlab.com/b4b-world/b4b-contracts", - "projectTwitter": "b4b_world", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x62179dB9a70cB6005596c04e6faa8274DFa7B2D1", - "provider": "ClearTextTwitter#b4b_world", - "hash": "v0.0.0:HgQl7vVXU2djqKWjo8DyXG3Z8VmndM7zK9C1rSjez2Y=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-17T11:06:56.525Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-17T11:06:56.525Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..jRlCRXOhmuwm0Raj_-sjzxNvEZ8mSg98wxV9uTZDLwEiC-KfBaBN5CmpG76f5VLGGYhypQ_wdk0u8_idCzeQDw" - }, - "expirationDate": "2023-04-17T11:06:56.525Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "c4B8udaT9OWAWXsLQLU1XHwnA5+nwjCvvX1pqQ5w1sRry2q8K0BXeQ3xkRPCqSX1", - "encryptedSymmetricKey": "00953ab0c808dccfa3b74b98131d8969eb2b0e96ce06481ed3e1624cb897513e6e9dffb46538962238aa97bd5e7e9b11e6eb07bbbc6c09ef6e58d9c6a01100dc9c27b70c3dc126a3776e8cb7377c3b5fa19cf421b39ea004beb362544b7efe933a3bf3c2ad967308aea685abfc7fba1c46e4bd46336123c1971e5e00b905f25d0000000000000020beb47c60fcf7f5ab5b6110092683320bc1fb42b72435cb8018048dd7feee7e34516698d107802714a06d852488fbfc94" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Aurora Grant, NEAR Grant, TRON Hackathon, Axelar Hackathon" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "3" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Verified Twitter (b4b_world), and have open-source code on GitLab" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://gitlab.com/b4b-world/b4b-contracts" - } - ] - } - } - }, - { - "projectId": "0x1b1c2d37550147e9173cc1f470fa88cb972f45375f24b3f09477695d529ef84a", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0xed119d50b76104c25b683d71609272b8aa97a46f8043161774eb7ccebfd7a6d014b0e7717ebae327dd5e38243e7b923f751b6dd714ae254f214b101d9215b82e1c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x1F51c8990234522b66A9A3D1B48552Ee0728493D", - "project": { - "lastUpdated": 0, - "createdAt": 1673915689584, - "id": "10:0x8e1bD5Da87C14dd8e08F7ecc2aBf9D1d558ea174:55", - "title": "Spotify for WEB3", - "description": "Grant for WEB 3 Web3 Open Source Software Round", - "website": "https://open.spotify.com/", - "bannerImg": "bafybeiebmg6xw7lmwxtvh766muhbb42mfr6kcocthjz2etm7zd3jz24klm", - "logoImg": "bafkreifjk7ebowupixcqdesbioko4azbl6hoolbypxtoiv7xam4cn4lkbe", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreidnkytgx63twptyxmc2627kpkpvcyojq2edusurg2cogoeygucegq" - }, - "userGithub": "https://github.com/Jensnicolaigustavsen", - "projectGithub": "Hedera-Hash-developer", - "projectTwitter": "polkadotlover33", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x6d1B1F95A4E55b3417c6f6D0D5036ba3520D5b79", - "provider": "ClearTextTwitter#polkadotlover33", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "hash": "v0.0.0:6w8+86LzSWvj/q8Q/Nv3yuIEMC2eNlhwLRUPvYypvjM=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-17T00:34:00.098Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-17T00:34:00.098Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..PJc1uNsViTA3iokVktFUQk6VtCEZVb9V_wZYVAqoIWKQxGorVN0JAMCenJHChp2we7snEBc3mAIOubcCcJH7Cw" - }, - "expirationDate": "2023-04-17T00:34:00.098Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "x0nRCrpQn6oLiS0+yLTTONl5boGvOKAePNcWtu8uK2zVzJUwzOiTZdH2aRElrDbx", - "encryptedSymmetricKey": "2179c8d3a07a6c3300f7de9998a375edf8bc1660ea337faadb36b25aa14fb53fbfc153455206cad13851233aaeca3d11e32c3a8246c35fcead1b271b170fdce1b202d9929518e5c6cc9c3e257776a8180fc8a2c9f7d1dcfdd95da1a8e3be6db7f824f35e76297f56bbd4fed053ae8a844c1314816aa44cfb6d5acfd1c1f39d7d00000000000000207d31129b001c6e4df67b545cbb63669d19f0a068ea37cfadfab7e851f171c6007e900f4dbe1de3bcd2bdbbf21855f287" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants and savings" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "6" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/Jensnicolaigustavsen" - } - ] - } - } - }, - { - "projectId": "0x1ceee39da9972d78ca42f37445a55a7252d549d58c4546f521766c7900753f48", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0xebf6df6b16f6dd9c942e703911907eb98306ef1df9e2235f1169f9342d8a7fab1573149a4979273c5ffc80ba3cd8e66fc3b37b95f74d82840fff59892cd050171c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x1D6cB99ff20223d730Ae5D4680EC5154B7FdAefe", - "project": { - "lastUpdated": 0, - "createdAt": 1673892341673, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:227", - "title": "UBI", - "description": "Universal Basic Income aims to address economic inequality and provide security for every human on Earth. Let's fight poverty with $UBI\ud83d\udca7", - "website": "https://ubi.eth.limo", - "bannerImg": "bafybeid4ozvu6ksqtjipaxxpteehfkiftokhbps3yjtjw6g26jsskxvrye", - "logoImg": "bafkreibvjxo4rz2vtdigha46gik7tecbzqhdrsb6wwvakpqwrxwcdrboka", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreihmcxpqlhz43t4k2malp7ymhflqlblxyjeyoyyqcf5yz3axujbkmm" - }, - "userGithub": "santisiri", - "projectGithub": "DemocracyEarth", - "projectTwitter": "ubidoteth", - "credentials": { - "github": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x2A52309eDF998799C4A8b89324CCAd91848c8676", - "provider": "ClearTextGithubOrg#DemocracyEarth#2153166", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "hash": "v0.0.0:WbZfIKmPh5YWPqwLY3tHQ4OWFBjCII1jalia5Zw0OfQ=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-16T18:05:25.118Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-16T18:05:25.119Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..9Njdh-CM3RvNa9ixmBrqgskpjlxSY8cusrEYKoodgbeO0H061XQbnNdf-TcCX7hsBymViY5KZA5cg2C4wllzAw" - }, - "expirationDate": "2023-04-16T18:05:25.118Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "CHfcYvbItpVi0sIWQqomPC4TUsUmZbXqQGfJzAY51bBwfqitmwyWLRko6jU22ONb", - "encryptedSymmetricKey": "1516fd6bf52b4c178797d363799cece83c1d6f2bc15c15462d708bbdbe0195da5123712be4dd83de1679b8dc8bfb0d1960f6fa6c7159e49e3d00cbb2b81c9e889f6a5005a389b9e553e73caddae6a723789c9d6f73758f733d5890396703d3a7a877e3f3b4303918535678119c9fbf91cfe639b9ae2c7d7ab0e390281d3d2f650000000000000020f8f094550b6a401c958b514890c0376e0c44d387fa5eaa8ad0f9cba3e572dd7f923d9da00976c4e1a446893bf17814a6" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Non profits" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "5" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "Democracy Earth Foundation" - } - ] - } - } - }, - { - "projectId": "0x20632d089357836c07c38ae6a8b50449fa86c9eef6fd494afee9156474ce8d0c", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x34b5c9a3b75e9f3cdccfad801957f02fc10a93dfb2b09d6edd6bdb3a096706c042e1c785750c28b2fddb48b3affc6425f5aba1d246b71f9f5f11188dfbc824231b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x7bD7De26eBD064465Bb9c272513Bb3bcBdDb1E93", - "project": { - "lastUpdated": 0, - "createdAt": 1673126057405, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:69", - "title": "White Hat DAO", - "description": "Safety and security should be at the heart of all platforms, especially public goods services, which is why we are passionate about reporting on the safety of web3 projects and protocols. The team aims to use its knowledge to give back to the Ethereum and wider web3 community with our due diligence and smart contract testing. Our website launched in the final week of 2022, marking the public launch of our safety ratings platform. The platform is a public resource that aggregates information on projects and their teams, token ratings, price information, available liquidity pools, and more. Our aim is to make interacting with the blockchain as safe and secure as possible.", - "website": "https://whitehatdao.com", - "bannerImg": "bafybeie6w57ksrrv67djlhbh6schefbafrnpfuvb4qv6r6u65zemlumtt4", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreigaxepkunacqc5uq7cjot7gx644lz7znw4p2uis2r54oihefwfbym" - }, - "userGithub": "NF-Thinker", - "projectGithub": "WhiteHatDAO", - "projectTwitter": "White_Hat_DAO", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "7QGXTQc6f+30QtXADPCupYxCr5UNT1Ge6JZy+qz8CBzP9wqSi3AeA3uj42sJDoOV", - "encryptedSymmetricKey": "7527bd6136ee88277546f6ba1f22d021ff48c150cd5b25fbca8d3f6ea56629b1b32223553d17138d0b19f9d7b59221032eeba431efacd101b99396c37ee92b3c9d26d01ca10c2677d01cb8d5163e2912096d89c8c48e4893557c6860f9970a925b8231a088b9b3bfc158c19fd0b63174ebf96fd8a84a91406c33011faeecb02a0000000000000020b28f5fcd49d8c4140e28210e3c15498bde135bd1982ae1592851e7cb6f89e946e158c50c8e4aab70e158f7596b302081" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants + raising funds through smart contract audits and web3 services" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "19" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/WhiteHatDAO" - } - ] - } - } - }, - { - "projectId": "0x2a42d7a39be87557896cdfde9b096df6cf49fdfad9e4949cea8c1b94fd364348", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x8aca166b744153e0cb2b575c512cff6433564b198826f48e1b9097ecad97940c497676d45ca2c733af956a9c6aab347632f7c8a029d767159d0070f17e13560f1b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xEee718c1e522ecB4b609265db7A83Ab48ea0B06f", - "project": { - "lastUpdated": 0, - "createdAt": 1673629364369, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:190", - "title": "devpill", - "description": "DevPill.me - A public good blockchain development guide. \nhttps://gitcoin.co/grants/4975/devpillme-a-public-good-blockchain-development-gu", - "website": "https://devpill.me", - "bannerImg": "bafkreifzd5d7cqtb3gno7deor7f7zqp2gflgvon26fuwqq4fumysspxi2e", - "logoImg": "bafybeigegllxawn4taovpqwm3edg2qcuvu73ll5fip57hmsrda5nl5sjzu", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreibw4ec23hkd2bme24cmdl6ekycrv2gf2qbtagvldzh67ycyv3jf6e" - }, - "userGithub": "dcbuild3r", - "projectGithub": "dcbuild3r", - "projectTwitter": "dcbuild3r", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x642C7F7040C656d633A9267284B338FF41051541", - "provider": "ClearTextTwitter#DCbuild3r", - "hash": "v0.0.0:c2fA+yiV/IMf9vBKHvr+o1SuyMLQSRku9pASuCgn2g8=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-13T17:01:07.689Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-13T17:01:07.689Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..K9UaDqMfWcK7S14fh3vNP715921dSodob0vNHzntbCJuzhZdMveW62O3aWvUksjJWKw4TT72jOlGoBDsz8tMCQ" - }, - "expirationDate": "2023-04-13T17:01:07.689Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "QgdEJ7WBDCMLSQzSjO+7Ut7pIfWVHjMvtmkaCkol2Xct3OxDwtMsh3CLCAzpW2oh", - "encryptedSymmetricKey": "e7143c1842a6f3a1f20493cd8ff1d5499bcc2da75e8dcf9f55d803707470726b920d1b3cb11c6b2012b4882a96da3201f5dae01f3da2f61eb82d6a46edb332dba64ee1d6264adc1fc9e0631bff9a86d496b473e2c203b0007037f94bc4bfa2971d776d5ffcf9fbaeec7fedbe33e1a4a2ae5c4a946bf82d6068d6ece876dd57260000000000000020d6d21328f8da314121c9ac661f124ca4ece6c28c2a34040d6cb24681d5f00c3351d868d8d4df7899cc38c63bd2091585" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Gitcoin grants, Mirror.xyz collection NFTs " - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "1" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/dcbuild3r" - } - ] - } - } - }, - { - "projectId": "0x2e640d65f775bc1ee5130ccc4b16d49d155214fb8f996ba7ad91515c06811480", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0xca29df035ebc2131232d4adc41c229fa2a1356b45bf55286fac648340a00e5b62a2685e50707c99e95d3105cfacf992c36682f9ca40e6c115b2599c60f7e1a741b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x8012B593917f74dD8C5233FD509B9a02d1bC7079", - "project": { - "lastUpdated": 0, - "createdAt": 1673320475022, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:90", - "title": "Metopia", - "description": "Metopia is a non-transferable badge protocol for communities and contibutors. It is also a platform which empowers non-financialized DAO governance and reasonable incentive systems.", - "website": "https://metopia.xyz", - "logoImg": "bafkreicsdvcuxzbp2amduqs6rvttdf57ygxo3eekta6kfdkpxcwybo76lq", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreibxffcml67ckuakmguiu777obrry4b7vbogzm4l3qc2vslb6whesq" - }, - "userGithub": "MetopiaDev", - "projectGithub": "Metopian", - "projectTwitter": "MetopiaMetopian", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x8012B593917f74dD8C5233FD509B9a02d1bC7079", - "provider": "ClearTextTwitter#MetopiaMetopian", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "hash": "v0.0.0:4izoq+dM9CBfyC03El0zz0sJCOQUxnf9t0HbtP99vD0=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-10T06:18:06.570Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-10T06:18:06.570Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..O0Uis9r0vvgAE6IuaiuEBRC3JMLT6GEaUE9eKGl4CWyqe5qfd4hyLkTm90uXJvH16-8C9AyyEwstNQ7M2YuoCA" - }, - "expirationDate": "2023-04-10T06:18:06.570Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "rnjc+HsrmvyaCRIcnnNsWjQp8+ovh8ipjVLm7TBnMDR2teHK9zUsvG4P5x2iZo46", - "encryptedSymmetricKey": "7d0f5dfa8d5d5c3d908306051c18402a40baf5890792a09b79eb17dbc048f94778da32d7e764e02fc1cabf6cb78b820e32e7a8eb4bcb506c62e3753dafdd19da06f2d60b6e66f19222149860fa5d7130294c7059919dad02905d36cb28a8f291d17c14b4df6ee9085174cc38f740c00613c6302832dde428830f3b48e56dd62c0000000000000020aa00eadaf51132ae994bdcc6bf4fc790cd23ccc60311cdefe7e8d04be79ec881c5413b1d04e56b077097d4e96a58b085" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "GR15" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "10" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/Metopian" - } - ] - } - } - }, - { - "projectId": "0x2f2cf669aa8a9d5fadd1811761c1d83f37bd3ec7d6d029dca741a901587a850a", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0xc793f88d3e03ebfbf83e0b06cbd281b6a149b4bf3bda95aa3901cb716b680b9a0414906d985c13a8d6150581d87c226509a563dafa7df04955604f1852a15d181b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xB25C5E8fA1E53eEb9bE3421C59F6A66B786ED77A", - "project": { - "lastUpdated": 0, - "createdAt": 1673510573999, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:150", - "title": "Officer's Blog", - "description": "The best Crypto OpSec guides & tips - for your safety!", - "website": "https://officercia.mirror.xyz", - "bannerImg": "bafybeib2smuo3uszf46du332mem2hxilbigaia4xecsxomseoic6vqoukq", - "logoImg": "bafybeicxh7iykmllb4usnnlcrbakorsi53ibxdh4x2awpd5ojgstmkep24", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreicflohb5m3cqkkyfr2pjsh2ebernodnz2ypzepaqb7fftxnvv5uny" - }, - "userGithub": "https://github.com/OffcierCia/Crypto-OpSec-SelfGuard-RoadMap", - "projectTwitter": "@officer_cia", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "cTT3FsykJUd5Cj9Daygwqf+mbELNGmmkqkhpzX52nnwk/g1FY7sbzkTTo5co2j9C", - "encryptedSymmetricKey": "5322a500990ce352d051617c97c922f1ac8b62d5e512e38505193910e5415f5fc58674e005dbd108f44376f0b7b738088736d6acb0e9086a18d730a79957b262ebaa38254a858ae6d3bdfa98fcc001be9152043aba1d3c64a1175757aa64eda6336f5e7e2de916c4ccc6184d63c829d7fc8a822bb9d80725a5303a27bee0f98700000000000000205fd7bd84241805d9e0442ce1951ce7de506e7f82b6879fdaf6dbed53e9c67031e4151c5c063585d15ed70abdb188fa97" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Gitcoin, Pessimistic.io " - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "1" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/OffcierCia/ultimate-defi-research-base" - } - ] - } - } - }, - { - "projectId": "0x2fc1f04d7ca2fe96643cd2f25bbb0cc3e67cc7de03ad54693040ea0d578a7699", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0xc3c73d256de401ab3351447b838595ec43cf5454dcc35a6b1267c2609dc470794fcccf47df58205d7875161d43eb84263e3696693eec491828e68afe6c9067e01c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x9fe6764778db6AD5c5ED86242485d1a868a8c52A", - "project": { - "lastUpdated": 0, - "createdAt": 1673345920512, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:94", - "title": "DefiLab.xyz", - "description": "Building \u2606 Tools \u2606 for the Defi Community\n\n\n\nSmall independent team creating tools to help Defi Users quantify the risks and the rewards of providing Liquidity to various Defi Protocols.\n\nAll our tools are Open-Source and free to use.\n\n\n\nDevelopment updates:\n\nQ2 2021\nCreation of Uniswap V3 Simulator --> https://defi-lab.xyz/uniswapv3simulator\nCreation of Polygon Network dashboard (Gas fee calculator) ---> https://defi-lab.xyz/polygonnow\n\nQ3/Q4 2021\nBacktester Functionality added to Uniswap V3 Simulator\n\nQ1/Q2 2022\nOpen source Uniswap V3 Backtester functionality --> https://github.com/DefiLab-xyz/uniswap-v3-backtest\nCreation of Perpetual V2 Simulator --> https://defi-lab.xyz/perpetualsimulator\n\nQ4 2022\nSupport different Network (Optimism, Arbitrum, Polygon, Celo)\nBacktester improvments", - "website": "https://defi-lab.xyz/", - "bannerImg": "bafkreig7llxd5usx5zrnj3kapuosj4zftuzm7wlv4folgwdn6oudnfpn3y", - "logoImg": "bafkreid2vjfkrvifojgfxxciq5ehut6u2ym7sdtirao4umy6yedypwgyyq", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreic32qt3m5awzxoswxhu6q53226vswir23uevkvfcxj7xbaf7ses6u" - }, - "userGithub": "staceb", - "projectGithub": "DefiLab-xyz", - "projectTwitter": "DefiLab_xyz", - "credentials": { - "github": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x9fe6764778db6AD5c5ED86242485d1a868a8c52A", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextGithubOrg#DefiLab-xyz#5744432", - "hash": "v0.0.0:ffoV6PEeBBiIMBj40x3N39BhJrt836HIiyxonTeWEmQ=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-10T10:18:25.140Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-10T10:18:25.140Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..3z3dqUMUZPYoY304KjGXa5MM0UGjD7o2WZyQU1UPoBL3kToLFG8CH-M9pZjjXytKPk141GT3kMq4JJdVRcu1Bw" - }, - "expirationDate": "2023-04-10T10:18:25.140Z" - }, - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x9fe6764778db6AD5c5ED86242485d1a868a8c52A", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#DefiLab_xyz", - "hash": "v0.0.0:4xhkGK8PXqgWw2ZufoXOEGEiHXj1Dpg5IYxtWzb18Ic=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-10T10:18:18.845Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-10T10:18:18.845Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..mAf2gFvjheqvKtL7vQiUoQaf197LJvv6SwrMKbJ8GhQYbD_pGDtSYsebLVnQ95xhAKYCmF88jJgTQ_eMFzTBCA" - }, - "expirationDate": "2023-04-10T10:18:18.845Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "+cI/3RZWjFeYLtwkaiaauBCcP/wCKhdxULVdpyo/tchDoFavHUnqs6W24QnBPyDc", - "encryptedSymmetricKey": "fc2b61e9edf72ba8d0f05fb8147cc2c0f66120f408805e4a15dbf450245b06b8a01742b25153646338f4eb927a0776167a81108a7818a2eb318aac02476b2c1783057329934a0a73cbd81b625e988251b34679f54c0ba5e536c188e8d122cb9621ab0fa44f524cd368ff1ebbfa3b199739150f43c71c6f82b4408a7a8f7a2a2d00000000000000207ac1d796c45c7934dd28ac0e23f584f575409ecdda55f3c382751fe92c8bc7fa5e5b95722760be922578f9706224a9a2" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "2" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/DefiLab-xyz" - } - ] - } - } - }, - { - "projectId": "0x322e5846abc1bee517e01016b3921ed3703593379b621e65dd3b3a84d4ebf5ff", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0xe6499baa94c489726a3260dee9b8fdef9ebe572107680f4d9bbbeb0d27935e7c563784f4790e4aa3f2873f69866b5a62fff9688b6a7c9a710bf99cb2f2d6c2c81b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x619B75f4D55285741a24b047944FBdF27E49f9d1", - "project": { - "lastUpdated": 0, - "createdAt": 1673086433497, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:64", - "title": "Nflow", - "description": "The Nflow protocol can tokenize your nft and nftize your nft token", - "website": "https://nflow.online", - "logoImg": "bafkreiavya3fvhapvrlj3lyc7jtqo3ss76bknmbksy53uwr564tvmpleyq", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreihxnlcaayq74l3q5sj7czr6bqut4455ahzuac4pebmlinzpo24jsy" - }, - "userGithub": "", - "projectGithub": "Nflow-Label", - "projectTwitter": "nflowlabel", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x619B75f4D55285741a24b047944FBdF27E49f9d1", - "hash": "v0.0.0:YCX8iV26375lf2UIC0LpYlRj29WmHgVTRK/wgD5UHLQ=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#nflowlabel" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-07T10:13:28.054Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-07T10:13:28.055Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..RHA40k_bYHzdbStRQHKI1ZWLHcgViOgBWTbkyZlKl9EtilCeH6T00eVgVeOmMYevbqlfP0bWtHAxnd3fwECeDw" - }, - "expirationDate": "2023-04-07T10:13:28.054Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "m4NLlPIElAzqh3BhVXyjrcIuge9IwzeXmqpMJibAq5/FCScC+XOpHyYZawGIgL3k", - "encryptedSymmetricKey": "3902cc0c19c13c3aac7c802f439320eead3ac0da65fce2d18becd7c0002e8a048b5a47f4fc1bcfd8ad6af68f06fb440cce54e3d27a15a99d273718cf93933c8c676ae4dab913f8c42c7b274e4a076039068ec68f234f649f83f943c1dd570e99797873a966ffe2d145e0187273a6ad81b611a07542ef7bd6b3f587a29a5757820000000000000020feaf5ef5bc875c7dca9cc82eda81270a7536fb9287c088f75b02527ffdcfce26dd5d36cb5df51d51ff211f38c823d998" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "none" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "1 person" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "yeah" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "confrimed" - } - ] - } - } - }, - { - "projectId": "0x33f99ab46fef5cc3e9dd080f68b059afcfe2608579d3476286a7eae6ad2bc938", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x41c3caf1c6e7cc5970df1761bd9a4b55368bbfb0857ff9d0db7e04922cc62f2a7cd6584634884c83e0e0d59dc2e9e8421a95d1773c26faa38fe554fde1b6b50401", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x81Bbc5E83901CA95bb85e3D1916D04D434e7f2bD", - "project": { - "lastUpdated": 0, - "createdAt": 1673925931200, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:237", - "title": "Dweb Movement", - "description": "A movement to create a Decentralized Web that serves all, not just a select few", - "website": "https://getdweb.org", - "bannerImg": "bafybeigkzinsaxjpmhbrpessdnewsj2utin6thbtpwo7pnicbz5cs6crjy", - "logoImg": "bafkreicqtwre3num2keszw3pyfuvdsorc2khzufd7csrvag37rst53sesm", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiawxtwervkgjftjwohakap5wra57y52iwmho4nf4j7it3oq37k434" - }, - "userGithub": "https://gitlab.com/getdweb/dweb-gatsby/-/blob/master/README.md", - "projectTwitter": "GETDWeb", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "S4dEbTzSJiTH1Sy4zwAdZ8bRZvdJUFcuhroYeUI24MbDHOF3TUG2CuRB4GD2s81A", - "encryptedSymmetricKey": "323c59403f21ad9a4364aad94e971a8c595fc5cd5882de1c4f5dce894f9c5a5ffaedd42845680a84bbccce3de67a5e1530ac9b129e5a21bcb56e93995dfd58f20d7f32c71281c146dedf08b420506df6f77f87b55a528a399e4911222cd67c8f89719382c8081efc9bb99202dd130ab16b3cb30508cd0f234d12dfdbf3b3d02000000000000000201886f5f5b54a40809f704015b4ce0422feaec3ee459a3b2ec3e9f8923a700e3b41ce5adaebf3f885a2091c22de76bbb8" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "donations" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "12" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "we use gitlab (in the name of reduced centralization!), twitter is verified" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://gitlab.com/getdweb" - } - ] - } - } - }, - { - "projectId": "0x3b839e762e389f72b3c43b70aeb7bb5c43a3781feda8683c29d5ae4896c6166c", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0xd38f8e0f742f3f5904766546b92fe5a5b42e2c0568d81dc8a7bf2fe712d30dca659eb0e1ccfb40fd36df888b2ea390db930b46c47977c560ca58352d360fb9c91b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x7D658841f8Ba93299970f6e765C2CE205f1E70DD", - "project": { - "lastUpdated": 0, - "createdAt": 1673554263944, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:167", - "title": "Loanshark", - "description": "Introduction:\nLoanshark is an aggregation and automation platform created for DeFi borrowers.\n\n\n\nOur Motivation:\nWe identified a few key issues with the current state of DeFi.\n- High operational burden to constantly monitor yields and health factor especially if users have multiple positions\n- Low capital efficiency from a lot of manual operations\n- Poor UX from a lack of support for tools like automation/notification bots\n\n\nOur Solution:\nLoanshark offers the following features:\n- Automated position management toolbox that allows users to create workflows that span multiple protocols (e.g. Set up a workflow that automatically withdraws funds from farms and then repay your debt based on health factor and/or interest rates)\n- Simple and protocol agnostic interface for borrowers to originate loans\n- Aggregated liquidity across different lending platforms to offer the lowest rates\n\n\nDemo video:\nhttps://www.youtube.com/watch?v=5sO5kgp_CJg\n\n\nJourney since GR14\nJuly: Joined \"Startup with Chainlink\" Program and demoed on Binance Live.\nAugust: Launched our closed beta\n\n\nJourney since GR15\nOctober: Added automatic debt repayment as a possible workflow action\nNovember: Rebranding with a complete UI refresh\nDecember: Added action history to allow users to check all their automation history\n\n\nRoadmap \nFebruary: Public V2 Testnet (Get whitelisted at https://forms.gle/uTZVqZDPezYhtf2v6.)", - "website": "https://loanshark.tech", - "bannerImg": "bafkreidci533bt5tqtooy65k6al7ye3iewjdo5qsjvg2ljhaod2xtanjaq", - "logoImg": "bafkreihar773ybi6fe3ylfjdi4jwcrznibfhhg6afwyicfkxxlfh3wan34", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreib3tsvv25cb2rp4575yx5enffyqnr63uxslzjdxhlf2j6qv4jglky" - }, - "projectGithub": "loansharktech/loanshark_frontend_v2", - "projectTwitter": "loansharktech", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x7D658841f8Ba93299970f6e765C2CE205f1E70DD", - "provider": "ClearTextTwitter#loansharktech", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "hash": "v0.0.0:OUB+ebABvwHHvZO+q2F//GeYpzZqMJ2bN2kI1+SEgRM=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-12T20:10:34.797Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-12T20:10:34.798Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..U4C4oUSqX7_oWmgOnuGT3Xm763L-LAa-RnxGjEX71H9Pkm0VrBG8-K_OJOeiMkA67TVrlG4xian25FJQg9-sDw" - }, - "expirationDate": "2023-04-12T20:10:34.797Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "RNWg7gXr8sezoa9VG7okPwo43LhCsxgqtVKcYTTihyLG4PVEKwZKFDU3eGIYQVMX", - "encryptedSymmetricKey": "be11f4e314bdd0943f18c460ebff8da8838a85212f9acf086e39705223099cb68b4918c674702d2ec332924cca5d2714033a197df1eb34e78b17cfb94d52d4c4696d50f573b74827133a02ca9f73bad3a254d7a14e283c9510e9fa617185878ef800bd954dbe8e1efa9c10b46d9c1ab2e2f6add69ef822aacf7b3ca00a1d3c970000000000000020dd31842c03fd7726db590528ed68c361cbac2a9d221365b7b8364ebce5e1aff523be14f62d466a1c46a1eb0b3e188cad" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "5" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Twitter is verified but cannot verify Github due to error" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "Developer: https://github.com/codeislaw1993 and https://github.com/yyeeaahh987" - } - ] - } - } - }, - { - "projectId": "0x3e4b3f7089aa5cb6614b67e235624d01364febe418419bc1b165e77d8589e5a2", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x0ae243a035c28d2a85fab9589017c8d14060c2385b4255c7751db4947d3054ff3cb7277bd0daccb3e1a7ed3208b0a1752a2c2fb6d478d6b3501be75d3451201c1b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x1208a26FAa0F4AC65B42098419EB4dAA5e580AC6", - "project": { - "lastUpdated": 0, - "createdAt": 1673776626606, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:210", - "title": "Optinames | ENS on Optimism", - "description": "What are Optinames?\n\nOptinames are tradable and transferable sub-domains wrapped as ERC721s & fully integrated with the Ethereum Name Service (ENS). They can be resolved on L1 Ethereum by utilizing an off-chain resolver.\n\nImportant Links:\n\nGithub: https://github.com/stevegachau/optimismresolver\n\nOff-chain Resolver on L1 - https://etherscan.io/address/0x9fb848300e736075ed568147259bf8a8eefe4fef#code\n\nSubdomain NFTs on Optimism - https://optimistic.etherscan.io/address/0x9fb848300e736075ed568147259bf8a8eefe4fef#code\n\nSubdomain Example on ENS App - https://app.ens.domains/name/nick.ecc.eth/details\n\nSubdomain Example on Etherscan - https://etherscan.io/enslookup-search?search=nick.ecc.eth\n\nSubdomain Example on Rainbow Wallet - https://rainbow.me/nick.ecc.eth\n\nSubdomain Example on Opensea - https://opensea.io/assets/optimism/0x9fb848300E736075eD568147259bF8a8eeFe4fEf/2\n\n\nWhat We Do:\n\nThis project is leading the charge in making it easier & cheaper to acquire and utilize ens domains. We are implementing the latest technologies released by the ENS team (CCIP Read & Off-chain resolution) to make it possible for users to register subdomains on Optimism while making them available & resolvable on L1 Ethereum.\n\nIn addition to providing free ENS subdomain on Optimism (currently ecc.eth), OptiNames is partnering with NFT projects & gaming communities building their games on any Layer 2. These communities will be utilizing our tech and smart contracts to provide free usernames & gamer-tags that double up as ENS subdomains.\n\nAdoption:\n\nThe first project utilizing Optinames to issue subdomains to their community is ECC Name Service. ECC Name Service has since grown to become the Number 1 domain collection on Optimism.\n\nRegistrations: 17,725\n\nWhat Next?: Optinames is working on and will soon be launching ENS Wildcards on L2\n\nMany NFT communities on Ethereum and L2s have expressed a desire to use ENS names and subdomains to identify and connect with their users and holders. However, requiring each NFT holder to manually register an ENS subdomain can be cumbersome. This creates unnecessary friction for NFT holders, who often stand to benefit greatly from the usability improvements offered by ENS names.\n\nWildcard subdomains offer a solution to this problem by allowing every NFT holder to receive an ENS name automatically at no cost & without any registration step. The process for the ENS domain holder is simple: just link their domain name to the NFT collection they want to support. From there, digit subdomains (linked to an NFTs token ID) will automatically point to and resolve to the current owner of the NFT in the chosen collection.\n", - "website": "https://optinames.eth.limo", - "bannerImg": "bafybeidzfmpm6ua2lviqprjznrp4qcj54ihyuiaoliry5ldktygaysthhq", - "logoImg": "bafkreig6io7p6k3q53wbu4h3qz7cbnkcrldatu54tlxioej4ovby2gd7yq", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreidlknkjnz4hrgqq67m75s5fzikueuxt3lqib7xgsfscdng2ldllxe" - }, - "userGithub": "stevegachau", - "projectGithub": "stevegachau/optimismresolver", - "projectTwitter": "OptiNames", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x1208a26FAa0F4AC65B42098419EB4dAA5e580AC6", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "hash": "v0.0.0:zj78rZgjM8zMmI9vOQ7+jGKDe85/M38oJYzjqiaDsvM=", - "provider": "ClearTextTwitter#OptiNames" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-15T09:45:10.133Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-15T09:45:10.133Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..ERrmBR3nXVBjrbMq3z9h3imSniXMJcxHY18On_FsIXvfEO2yhWmy8OKJjTkyXY8isaX6MGdlWRcVDl0EkZnpAg" - }, - "expirationDate": "2023-04-15T09:45:10.133Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "hGFgHmosVx5fczl3HkWMiwAxZGv2V2EzO52b32MjYqI=", - "encryptedSymmetricKey": "84fded4bd0bec3b259a9864dc4205e8024ac2067360ec4badf301a71d3891999e57988a3aac28ebc0e1c351d92c5081676e98967d8ad02b58110abf54550f734240ef499880f66016db8caa087a087a0b86d0f5cae9c91e72ea6d35005e172a9b8e0cb0b382096fdd2efd93f334e85e2d6356ce103f19c38f2db2de5f547af670000000000000020ac0c982bf89421089a43d1d0c7d26662a6777816ac77edfcab930b9a85d728493d059eef87127340a50b8d19b6ce9cab" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Gitcoin Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "2" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/stevegachau" - } - ] - } - } - }, - { - "projectId": "0x41963755a6073b9828e00e9c0b715d5763d1a1447505aa3ed7964d88269f6c24", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x32ac4b14626637e5272959d5dd72e6932395d6348496dc0d422f6b06224a248e5293e874b5f86a53d7e5bbce9aab5e16d7856eecb87a46998c760d96ff0fef1b1b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xf0dBDe527c63B63178576578777f0b7E24755ABb", - "project": { - "lastUpdated": 0, - "createdAt": 1673094061335, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:66", - "title": "Using ZK for game optimization in Dark Forest", - "description": "A development team focused on Dark Forest,\nworking on a more user-friendly gaming environment.\nDark Forest is an MMO strategy game built with zkSNARKs on Ethereum and xDAI. We had full fun playing Dark Forest, but at the same time, we have some ideas and plans to improve the game using zero-knowledge proofs and blockchain technology.\n\n\n\nWe have many ongoing programs:\n\n\n\nGame experience optimization, timely release of user-friendly plugins according to the latest game rule changes.\n\n\n\nWe recently release DF ARTEMIS, which is a Planet-targeted bounty mercenary system.\n\nFunders can publish tasks to planets, mercenaries can attack those planets and get rewards.\n\nDF ARTEMIS provides a new game mechanics to Dark Forest, which can bring fun to both new and old players.\n\nBesides, DF ARTEMIS can be a DAO governance tool, which efficiently distribute tasks and corresponding incentives.\n\n\n\nthe open source code: https://github.com/dfarchon/df-artemis\n\nWe released DF GAIA , which is a user-friendly dark forest plugin development library.\n\nthe open source code: https://github.com/dfarchon/DF-GAIA\n\nIf you have any functionality you want the plugin to implement, please feel free to send email to df_archon@hotmail.com.\n\n\n\n\n\nAcceleration of \u201cmove\u201d operations: According to our in-depth analysis of on-chain data, the fastest player in Dark Forest can currently perform 8 on-chain operations in one minute, which is unimaginably slow in the traditional game experience. We can leverage some of underlying technologies of the blockchain to accelerate operations, including but not limited to the modification of the zero-knowledge proof scheme and the parallelization of the on-chain transaction.\n\n\n\nGame Strategy Evaluation Sandbox: Empowers advanced players to evaluate the excellence of their game strategies in a more quantitative way, including but not limited to fine-grained real-time data analysis, simulated opponent matchups against specific strategies, video replay analysis of past games, and more.\n\n\n\n\n\nWho are we? \n\n\n\nDfArchon is a newly established gaming group focused on Dark Forest, with three members currently. Our members are all blockchain developers, dedicated players of Dark Forest, and also have art design skills. \n\n\n\nWe are working on game strategy development, experience optimization from blockchain layer to client-side game, sandbox platform for game strategy evaluation, etc. More ecological projects are waiting to be discovered. \n\n\n\nThe DfArchon team has received a lot of help from the official Dark Forest Discord server, the Dark Forest Chinese community (especially the wechat group organized by keke.eth) and MarrowDAO during the process of getting to know the Dark Forest game. We would like to express our heartfelt thanks to those friends who have helped us.", - "website": "https://dfarchon.xyz/", - "bannerImg": "bafybeiee6qooeznpymkxr5oumlylqk6dlosi6ygcxjjki477qwwetgjxza", - "logoImg": "bafybeib7e7opijzkqv6kob4kbjzbt73z52t62kuqddgxnu6paci2f2s3im", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiaszyq5mk34ywdbjsyeg53xigh2dbi3s2drogytc2nnstoq3lx6mq" - }, - "userGithub": "DfArchonX", - "projectGithub": "dfarchon", - "projectTwitter": "DfArchon", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "dremt4NNl/Xy1jnJ+T17P/WCF/JRVPC2CtbhFjqLCjK2X5NL2G5YnfyQeFm+QcYy", - "encryptedSymmetricKey": "b792f5654159670b4ef86d492ea1b1cc0ad3b9064485b256d2a7e3504dacbfa124c6747d80bf3668ec716f6312a71610c4d855852121461926fd9bab84eab9ca95443e2880eb33b1309abebd85bddc2349dccfec41712b2301c18f9c35c22aa4d50b33e9d85905a1ea434fe0f90b97e9c51527c9d28ee75831752b0a58f32c6800000000000000207ff7ca3679e796969ac4a3e298c7a0a46610bb5375a00c197f216feb2bb0f2105fec9ff5983155cd33fe11f1fd0bf185" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "all from gitcoin grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "2 members" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "my github account: https://github.com/DfArchonX organization account: https://github.com/dfarchon " - } - ] - } - } - }, - { - "projectId": "0x42528ac5ae7f27b36de1e40649628a762a8746d07b1440c32d30ded000ff125c", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x965450a68509fb710d02b2e192f5f9d5a1eff5cb0c0c771772de94f0860acb4f0c2d121d404eb91b3d5c2b100a98a286703d2ae1306ae61dbc425f6d19db81e11c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xF0D7a8198D75e10517f035CF11b928e9E2aB20f4", - "project": { - "lastUpdated": 0, - "createdAt": 1673505243199, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:147", - "title": "Jolly Roger", - "description": "Jolly Roger is a complete SDK for building decentralised application\n\nit includes:\n\n- hardhat-deploy: (https://github.com/wighawag/hardhat-deploy) the most popular hardhat plugin for contract deployment that supports unique features to easily deploy contract, track them and test them. Plus it include Hot Contract Replacement to easily test complex scenario for the frontend\n- web3w: (https://github.com/wighawag/web3w) a library to handle wallet and connection while tracking transaction state\n- ethereum-indexer: (https://github.com/conquest-eth/ethereum-indexer) a typescript indexer module that support in-browser indexing allowing application to have zero backend and only require the user to have a wallet connected to an ethereum node, nothing else.\n- jolly-roger the template : (https://github.com/wighawag/jolly-roger) which include everything organized to develop applications easily\n\n(Note that currently repository are spread on different account, the plan is to consolidate all of this under Jolly Roger umbrella, all of this work has been done my myself, see my previous grant)\nThe goal is to continue provide the best SDK for decentralised applications.\nI use it for my onchain games since 2019", - "website": "https://jolly-roger.eth.limo", - "bannerImg": "bafkreiao7to6dtmg6fcxceqc2r6kd77et76d3qp5loqeauo4ajfqat6g4u", - "logoImg": "bafkreiewzcnhazxn4xaqbjhyv23jcsjd2cispeztb6voweooib4hexgwne", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiaumm7oo6j2mhbuoqpogthfsdzidnwyiqffamdzg7ztbtfikbto5y" - }, - "userGithub": "wighawag", - "projectTwitter": "wighawag", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x7773Ae67403d2E30102a84c48cc939919C4C881c", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#wighawag", - "hash": "v0.0.0:WGD/ZoZhfPja/Rz+v2G5sn0Wm3PQPSWb+fVoLU8vboY=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-12T06:33:46.955Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-12T06:33:46.955Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..9WVssVCTqIci2tQLS9mA2-v9b1iJ5QvxqZAcUjm93oURqKflRoQ2AV0P7ALVQDp6IY8R_uL2KSbg7Z1-NSCtAw" - }, - "expirationDate": "2023-04-12T06:33:46.955Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "ns1aUEoOgeNhDKApKfR/6UPBshGGF4iTi9D4S9q9IlHUmrumWWfY8kvbBmTD4Trj", - "encryptedSymmetricKey": "2ad8e5af6ccfcd92fe261821a36b3cf9ac8c1fca41ad28e5967945a3291dafc318ebb6ac49ecccf6e5f894e32a8ce10a0213c7cc6b7ac50e8f28035415ea932c488ae9404c787cc9836af599d7d5c473469de59213b47cb20c389fb8dbbc9c904afa77693fae437b96e448a44169c526c7754c4a1f21cef2c8b5b47d2e96176b0000000000000020fcc34978a7356a252c85c2d78b44070aa62ba1fdff99f360b3936427f4c5d78551ac8849f997b2ff247ece3dad0fd0af" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "None" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "1" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/wighawag/" - } - ] - } - } - }, - { - "projectId": "0x43b94c544e8ac90c535752b8624e730820a5a752b361776cda996b40c5e2dbfc", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x59a32d48cf42be496fea0973cbaf5537c7602f1a8499e11b3bd874de13eaf4d1081a4344b1b4062037cc96f6ab069e092a376a065f6aee382de889a557e4900c1b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x799B774204A348E1182fE01074C51444bA70A149", - "project": { - "lastUpdated": 0, - "createdAt": 1673163072791, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:72", - "title": "0xDeadList", - "description": "Inspiration\nWhen we say that an Ethereum account has been lost, it refers to two cases:\n\nThe owner forgets the private key, which means the assets are permanently lost.\nThe owner leaks the private key, which means anyone with the private key can act the same as the original account owner.\nOur project aims to protect account owners of the latter case, which is very dangerous: the account owner loses the exclusive right to use the account, which indicates the account is not secure anymore.\n\nFor leaked accounts, DApps should be aware of them on time to protect the original owners of these accounts. For example, when one reports that her account is leaked:\n\nMulti-signature wallets (e.g., Gnosis Safe) should ban this account.\nWeb3 email providers (e.g., MetaMail) in which users log in with signatures should suspend everybody's access to emails of this account to protect the privacy of the original owner.\nElectronic agreements based on ETH accounts (e.g., ETHSign) should disqualify this account from signing new agreements. Because the new agreements signed may not be authorized by the original owner.\nTo solve the above problems, we propose the 0xdeadlist.io project to maintain a list of addresses whose private keys have been leaked. By rewarding the burier NFT (Non-fungible token), 0xDeadList encourages users and hackers to report accounts with leaked private keys, and stores the information of these leaked accounts on the chain to facilitate DApps project parties to query these insecure accounts.\n\nWhat it does\n0xDeadList is a public good that encourages users to collect and report addresses whose private keys are leaked. Users can directly log in to 0xdeadlist.io to report the leaked address. The main contract of 0xDeadList provides two steps (lock address and bury address) to report leaked addresses under the following considerations:\n\nPreventing the reporter's NFT reward from being stolen by front-running attacks.\nEnsuring the reporter has enough time before the private key of the leaked address is fully disclosed.\nIn step 1, the reporter locks the address to be buried, and the contract records the address of the reporter. At this time, the private key of the locked address will not be disclosed.\n\nIn step 2, the user uploads the private key of the locked address in step 1, and the reporter address recorded in the contract will receive an NFT reward, indicating that the address is buried, and the buried (or say, leaked) address will receive a tombstone SBT (Soul Bound Token), which is not transferable. In step 2, the private key of the buried address will be made public (recorded on-chain), ensuring the leaked address is indeed leaked.\n\nThe 0xDeadList project is fully open-sourced, and here are some resources:\n\nWebsite: https://0xdeadlist.io\n\nGitHub: https://github.com/0xDeadList\n\nContracts: 0x59451a98d772f2a53ca2241a884b1703f8c55218", - "website": "https://0xdeadlist.io", - "bannerImg": "bafybeicecz5fdbadlzyx4gfzwqaxpm2ngvqrkhybuizkwkd5wmm2wlixam", - "logoImg": "bafkreigdv5xynidonbbjmfeqiamlbbg3ae42zz5ckd3zbuibicziddnc7y", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiabzassay643qjdpkqgnhs3setgxmlcgbuylbmatc4iznqyikcwla" - }, - "userGithub": "colinlyguo", - "projectTwitter": "0xDeadList", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xEE12C640b0793cF514E42EA1c428bd5399545d4D", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#0xDeadList", - "hash": "v0.0.0:JgcthI1bWjj1s1kfm84q0isfpnFqR+Sn6//uyLV4aAw=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-08T07:30:59.722Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-08T07:30:59.722Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..-RQko-fGyGpP-vcGpsmiMSXe999wf7u7a9jfBV4Le0I7RfGav2NhZIJKohxTWd1siaY5QGdmCgcpLhX-WxUQDA" - }, - "expirationDate": "2023-04-08T07:30:59.722Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "HJXk1g3tmkTUxby3ABD8jqR8dejiNsWoApNS2AWSMGk+DoAoDjoGNm0g82GxPd84", - "encryptedSymmetricKey": "90511fafcd3074ed681d46e1fd9fddba66ff522ec2abb6d8a7fc3aa18c9d3d602e983a3b583ddbcb58c17653e48d4814e49fa22d84306223060f3f20bb28b9c5939c6425db68511abb1f9154d7c0537cf6cc92e465003c40a47a5dd3e618bb99fb79dace772df1cc3c47034269ec9a3c3c8100d4262c87476e4424108846aaf700000000000000208fc62526e2d8314d9a0af4275257d6543e573e2376f014c94050c9defa005bd182960b2d111cf34b73997d735d3427a1" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "None" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "5" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/colinlyguo" - } - ] - } - } - }, - { - "projectId": "0x46ddc886ac23d5bc2cbc96cd2aa990627bcd98c881a953070f94c15e03267707", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x94ae2ebb1d4066d7ca4e41af331d0a92a9481d94703e14233193f3eecd763263733ce84506cb654eb7df6c81e7253171370ce2003608b59e3290b4afba9e5d5b1c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x08a3c2A819E3de7ACa384c798269B3Ce1CD0e437", - "project": { - "lastUpdated": 0, - "createdAt": 1673387415396, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:110", - "title": "DefiLlama", - "description": "Open and transparent DeFi TVL and analytics", - "website": "https://defillama.com/", - "bannerImg": "bafkreiebqpvhoo5tlugo5nlfv3f4nrh66mrodrfovd7wg42wykfd4s5wjm", - "logoImg": "bafkreid5azwcyt3gqwus46rjg77j43qud5c3n4t25xjauzsdof53bhbwni", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreia3aztvqjh6svnfimgv5r47bhmjqpqbxzju24hxupua4ke35pghry" - }, - "userGithub": "0xngmi", - "projectGithub": "DefiLlama", - "projectTwitter": "DefiLlama", - "credentials": { - "github": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x08a3c2A819E3de7ACa384c798269B3Ce1CD0e437", - "hash": "v0.0.0:JhN6QtxC7EJnJ4xasFMzE+wO9L3RwnXy5aIyZCNXFE4=", - "provider": "ClearTextGithubOrg#DefiLlama#80541789", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-10T21:49:59.679Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-10T21:49:59.679Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..L2v4sHEcvDO3eSDJdIOSLChgjd7I5itQeW0672GiKz_WhSKIh5TAvSouuSJgqK1asotdzan1mCBR434YMhMqDA" - }, - "expirationDate": "2023-04-10T21:49:59.679Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "t/qqLMH2cRvCoeN+xp3bRsCCzZRPP9cHST98Gp7daWgWSscAiWPE/BU+JmGbHShX", - "encryptedSymmetricKey": "abd3547a9987c862cca35c7b21c1cdeee2c195548c38cc73e8ffefd8bef0841573dc5e849af0881d7c1629d220bdf2028e42d36d7e1f1332a8ad78d2f8ab37171e4fe3eb66d4a074db9f1ba631551ac65871e4ff308df3cff0ee027a690644b4ff9c2a7af49d345855d7736977d2d85b53d5285623fa10f931e02c6f012162840000000000000020f6fcc0d361fa77b402b997b4cb69c01737b6379af84ed11dab14971bce95e0b30a6c2d0435285bd197faf00a183647a4" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Donations + self-funding" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "11 full time people + 2 interns" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "org account: https://github.com/DefiLlama, my account: https://github.com/0xngmi" - } - ] - } - } - }, - { - "projectId": "0x49fd9097e9f5e67cc4b74c22972fc61f7656f6c9e63e93a3e6ce8fa2d82fb39e", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x5d5027a6c0af1e3d6792a25f188738b566603d5ecbaa5d9955199576904bfda6342a05327d3b6f6e14f13e644bccea820a3e7e7ca0aca34a0890797015991e9e1c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x5a741ab878Bb65f6AE5506455FB555eaf3094B3F", - "project": { - "lastUpdated": 0, - "createdAt": 1673653679863, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:199", - "title": "LexDAO", - "description": "LexDAO is a longstanding 'metaguild' member of the web3 community. \n\nWe are the schelling point for 'codeslaw' public goods & services. \n\nOur OSS projects include:\n\n* https://github.com/lexdao\n\n* https://github.com/kalidao\n\nOur growing community of core codeslaw OSS contributors include:\n\n1. Ross: https://github.com/Ro5s , https://github.com/z0r0z \n\n2. Shiv: https://github.com/nerderlyne\n\n3. Audsssy: https://github.com/audsssy\n\n4. Jordan: https://github.com/jordanteague\n\n5. Tenfinney: https://github.com/tenfinney\n\n6. bestape: https://github.com/bestape , https://ape.mirror.xyz\n\n7. Drllau: https://github.com/drllau\n\n8. Erich: https://github.com/ErichDylus\n\nCodeslaw is a meme of the \"code is law\" & \"work in public\" web3 virtues, integrated with the 'code deference' legal philosophy pioneered by LeXpunK army and refined by LexDAO contributors. \n\nIf we think of Solidity \"smart contracts\" as codeslaw initially invented by legal engineer Nick Szabo, then it's apparent that codeslaw is one of the most important forms of OSS in web3. \n\nCodeslaw is for the 'unlawed' what Proof of Work is for the 'unbanked' https://distributed-autonomous-society.quora.com/The-Unlawed . \n\nMost of our members are cryptolawyers and legal engineers, but that's not a requirement. All codeslaw fans are welcome!\n\nAs a DAO, we fund a variety of internal & external projects that span the multidisciplinary requirements of codeslaw public goods & services. \n\nLexDAO does a lot of codeslaw pro bono work, ensuring the funds we have get the job done regardless. Sometimes codeslaw is more important than money!\n\nAll donations to this Gitcoin Round will be used by our DAO to directly pay for OSS codeslaw development. Additionally, we always prioritize positive impact DAO and projects that offer valuable practical-web3-experience student education opportunities. \n\nIf you'd like to get involved in LexDAO governance, membership is open to everyone! Please visit http://lexdao.chat to join our community and subscribe to our newsletter at https://lexdao.substack.com .\n\nSupport codeslaw by proudly wearing this designer hat https://shop.metafactory.ai/products/codeslaw-hat !\n\nOur legacy cGrants page https://gitcoin.co/grants/4811/lexdao-providing-legal-aid-to-impactdaos-funded-by . ", - "website": "https://lexdao.coop", - "bannerImg": "bafybeierh7worujpoelf2o5762growe55ptk5wbrj5fndrl25cntltnrh4", - "logoImg": "bafkreiewxqylj5oqtdsgpkrokydlxb67hk5hdf25msklw27govtzlc6wyu", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreicj5ujjdtp72vqd6ns7ffxqvqgzru4tsffqhquaeoep5yiiwh2pay" - }, - "userGithub": "bestape", - "projectGithub": "lexDAO", - "projectTwitter": "lex_DAO", - "credentials": { - "github": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x0D89421D6eec0A4385F95f410732186A2Ab45077", - "provider": "ClearTextGithubOrg#lexDAO#3211305", - "hash": "v0.0.0:MrpWsEk6bCmn99XgQWcdKEyDSe6aVMsd2B9iKwFeLyo=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-13T22:56:39.833Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-13T22:56:39.833Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..N5Rp2KavVXa8xfUYOGhr0P4w-H9l7Xe_zuV_9mHGoXhp1DqLKEYF4H2k_p_xGb1zFQbFLLTqxwBYVuZ6mG3sCw" - }, - "expirationDate": "2023-04-13T22:56:39.833Z" - }, - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x0D89421D6eec0A4385F95f410732186A2Ab45077", - "hash": "v0.0.0:+18PNN7nLFjalx3TbEDEQslhkTJXdrkTe18ayLEim18=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#lex_DAO" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-13T23:42:13.252Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-13T23:42:13.253Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..3cLAtd6JixNcxE0kDreDtFXXmYorAf-PACnhJG_PhRsJLSTHxEny1zHZUJrczI2kgMHKiQupKHeL3WyfgNCDCw" - }, - "expirationDate": "2023-04-13T23:42:13.252Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "n+ohJTSqfbmxqRuLk468YyaifLel+NaZWlQFZbXc5lOAkHNB/BHPudwRVCC7xvSU", - "encryptedSymmetricKey": "190605938d32545a8a98ceccc5e48bc687f6f62653a823bb9c1b6bb3b3b54f514eeff4f77beefa6da0a7d0ce1490590634155185ad35cdfbf80d82eca7cda38d8b3e8ae181533ba9d7e26c95504ac767f2c5ffac6f24ce5b4ac89ae5fb76228ee83634bfd140d14b6e377a2658dab94c18a3ff92a1bc724e584e608bd04719750000000000000020ea58b711fe75ba16b6315a31b1c7f93d6736fdbb87d5de2eb3a4daebc2ccce289bab7dc1cf09b4e337f3ed4c91ebe196" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Cryptocurrency donations & grants, modest invoices." - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "~200 guild members, ~20 core contributors" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes for Github and Twitter." - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/bestape , https://github.com/lexdao" - } - ] - } - } - }, - { - "projectId": "0x4cd41869f9b2d95c05e2cb13643f1ab7ae05ebd439349c0024aeba44a249b1d8", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x84c491d03cc70df2810f650ff2bf91a348d3ef5d74392ceb8c23bbde90ea2dfd5e62d38402d754862d13b238c1ef2ebdee1ed084e331cd11fba219de9de9205c1b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xBEC643BD5b7F5e9190617CA4187ef0455950C51C", - "project": { - "lastUpdated": 0, - "createdAt": 1673128565798, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:70", - "title": "ITU Blockchain", - "description": "ITU (Istanbul Technical University) Blockchain is the first university blockchain society in Turkey. We are organizing blockchain events and courses for everyone. We have many students who are ready to improve themselves in this technology.\n\nOur Free Solidity Course is Supported by Ethereum Foundation!!!\n\nWe've been published a free Solidity Course (https://youtube.com/playlist?list=PLby2HXktGwN4Cof_6a8YwlMrboX8-hs73) on our Youtube channel. The total duration of the course is approximately 20+ hours. The voiceover of the course was made in Turkish. As we continue to expand our Solidity course, we would like to announce that this education is supported by the Ethereum Foundation from now on.\n\n--ETH Barcelona--\n\nOur teammates took part in ETH Barcelona both as volunteers and as participants. Our volunteer friends have gained a lot of experience on how to organize an event on a global scale. They shared their experiences with us. With these experiences, we will make future events in Turkey better.\n\n--Cryptist Istanbul Meetup--\n\nWe organized and participated in Cryptist Istanbul, the first zero knowledge-focused community event in Turkey. We took part as a team in the event attended by very important speakers and we found various networking opportunities.\n\n--ETH Prague Hackathon--\n\nWe participated in the Ethereum Prague Hackathon with our project on sustainability. We had the chance to meet and communicate with expert developers in the ecosystem.\n\n--Avalanche Barcelona Summit | Hackathon--\n\nAs ITU Blockchain, we came back as the team that received the most rewards from Avalanche Barcelona Hackathon. We returned to Istanbul with 2 different rewards in total.\n\nLayerZero Best Usecase Reward\n\nCoinbase Best Team Reward\n\n--Avalanche Hacks Istanbul--\n\nWe've completed Hackathon at 2nd place. It was an event where we gained a lot of experience and knowledge.\n\nTwitter: https://twitter.com/itublockchain\nInstagram: https://instagram.com/itublockchain\nLinkedin: https://www.linkedin.com/company/itublockchain\nYoutube: https://www.youtube.com/@ITUBlockchain/", - "website": "https://itublockchain.com", - "bannerImg": "bafybeiflxewjwbpbtutbozfas6bct46mrrcmtwyy3hqyuhy6jww2xdjobm", - "logoImg": "bafybeidsdbrgzvxiql5shhsbv6czjegimiulltoowyg4kwafd7zsvmuuly", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreih4vax7nnbgx4pb5jdauq3da7yje445ddiey3ms64xs3sq7m6at2a" - }, - "userGithub": "ismailemin", - "projectGithub": "itublockchain", - "projectTwitter": "ITUblockchain", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xBEC643BD5b7F5e9190617CA4187ef0455950C51C", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#ITUblockchain", - "hash": "v0.0.0:A76Lefp2oHM/zQrwqhNaS/SriRl6u5g98A0PKALMW/U=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-07T22:06:41.333Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-07T22:06:41.334Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..xgMcgatRZPlC5HRv5q-BZQVN9mU968HpvO0_MrpmdMcf219DG8eYGL3PiL39x4khBQawUtXoA7jTa9RrKO8RBA" - }, - "expirationDate": "2023-04-07T22:06:41.333Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "EELrncxDSbuOhr8P7hG3JEFomTMv/DWJogTC9ptpYMju1XjTDacAp4xKP+UfctTP", - "encryptedSymmetricKey": "3ec0a417f3e6d4c31cf9dd5c1ede7f5fc95f1279ac54d5bee2c95288a25ddcc5a3e650cac7f94d799d118858a83bbc0b889a3936d92ace97f0c18cf7e58f79bbc318ef1e6cf594199c7ecb14b6dcd51171c8335559c50e5ba9ac2e5ef7d3a880fbf0ca98ab7f3d587280fcf9d4c82b852ce5f7e75c7269de82dbd2232315c0780000000000000020df5902a11cd308909a94db90fe048cb5ceafccd5d4c149e81344016f128a6c8dbe990c047c9e586181f88bd630210a8e" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "ITU Blockchain is a public good. Its biggest funding is grants from various blockchain grants. No one in the organization earns any money for it. The organization participates in international hackathons as a team with the grants it receives." - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "50-60" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "I am verified on Twitter but there's an error on Github. So yes for Twitter no for Github." - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/ismailemin and https://github.com/itublockchain " - } - ] - } - } - }, - { - "projectId": "0x4dbc1f9c5c14a5765714e42b9d7384a43eff941394faa6fab4b1dd85dde55052", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0xd29088b25768af58dd20ed3e2f0260d2f51960c7dedebd248083eee7c48d8c0a1e083febb05c7f95fed5020dbb482f2fc1b52503db97b7a0b0033f9916aa77a61b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xF3CF346DB5DAb30d73d272499CBAe6E6C0eE2C60", - "project": { - "lastUpdated": 0, - "createdAt": 1673527912808, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:159", - "title": "Jolocom", - "description": "Some of you already know us from around the \u2018decentralized\u2019 block. Jolocom has been supporting and driving the mission of Self-sovereign Identity since 2014. We are a founding member of DWeb, INATBA, Bundesblock and also long-time supporters and active members of DIF, the IIW and W3C. We joined the Gitcoin-Community in early 2022, together with our friends from DWeb and the Internet Archive. \n\n \n\nJolocom is committed to upholding the principles of SSI and has developed a fully open-source tech stack to that end, consisting of a library, an SDK and Smart Wallet for end users. During the infancy of digital identity, this has brought us to the forefront of development houses in Germany and Europe and also to the attention of regulators and lawmakers. Among other things, we are the chosen tech providers in three quarters of the German government\u2019s Secure Digital Identity showcase projects.\n\nNow, though, we are seeing the mature phase of digital identity approaching: by end of 2023, every EU citizen will be asked to hold an \"identity wallet.\" But will that identity be Self-Sovereign? In other words, will citizens and users finally be in control of their own identity data or will it be under the control of a monopolistic centralized authorities or oligopolistic federated actors?\n\n \n\nFor Jolocom to continue building open source, not-for-profit SSI solutions, as we have for the last eight years, and to further establish EU and global standards for interoperability in decentralized identity, we need to scale at the same speed as the growing market. And here we need your help. \n\n \n\nIn the aforementioned Secure Digital Identity (SDI) Projects of the German government we are building out the Jolocom SmartWallet to integrate different government services, bridge between different services and industry actors via the Jolocom Issuer and Verifier Agent, while also partnering with researchers and experts to prepare a UI/UX design ready for mass adoption. ", - "website": "https://jolocom.io", - "bannerImg": "bafybeifaogjolxoiu3imnx2s5wltv4xcxxqn7coy7ohazdem4y5psko3ci", - "logoImg": "bafkreifojknikq3anxhvhouabaljsn3okgorsmnwgyghvc7vzec2vycvea", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreibkptn2bxkjgy7ykhxhh4blsvbj7uevzq57vlux2c4bn2hy2qz6tm" - }, - "projectGithub": "https://github.com/jolocom", - "projectTwitter": "GETJolocom", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xF3CF346DB5DAb30d73d272499CBAe6E6C0eE2C60", - "hash": "v0.0.0:iwcy99ooDTej1x5A+FVjNLP+N/BZX3DND1IuqHqCGuc=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#GETJolocom" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-12T13:22:00.187Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-12T13:22:00.188Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..842oE5Eq-oA_LZgSqk-JFZQQvANtRW60Huhde17C4xQwpkXvvcOs356Ju-oclFVUqX0wJBU-37saMUuV0VGMAg" - }, - "expirationDate": "2023-04-12T13:22:00.187Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "5SpdinnT/U1wvO7EQ3vxh2WOJASJHIr4/gKmIwqJmM3/zjjYJUyMUO3z7Vv5uEfn", - "encryptedSymmetricKey": "3fce8f003f9adf76d48ac3c4d808ab3ae1da994775ae9bbf2ad47b140d05c439859ab5894dd59f1083e288a470f1f900d0c7972fc814a6c7d933588737982c425e92f92c32fcb541af72e67136ca6e0ca55459c127a4402dad92766d0d0bac8b8b4d9493c5802fd7f566db0f71858fe24362040030993f6008d764563719d3ec000000000000002014dafa2b0a83bcfa70485e55182cd5261356a847af894a88bcbb0db4317cab864a8f104fe42919e16403c2fe073849b0" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "19" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "getjolocom" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "Jolocom GmbH" - } - ] - } - } - }, - { - "projectId": "0x4e11571892e7edbb6aa03c8327aad0325faa2297559fbccc82ac93a369267948", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x9adb4465921daa77fc684b5ec95dc8da016bcf8a1373bd4ed3e2f2d34b91530771cfecfabb64077974be1eff68958aaf3bbb4b9e28287ab80e7d62a1262cb8f21b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x63cd2C691632720Ff2ABDD0b6AABA2466D3Fe468", - "project": { - "lastUpdated": 0, - "createdAt": 1673046799340, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:54", - "title": "Lume Web", - "description": "Lume Web is the web3 hub that aims to bring decentralized technologies to the mainstream. We believe in creating a censorship-free internet that prioritizes privacy, data ownership, and accessibility. As web3 evolves, Lume Web will be at the forefront, providing your gateway and onboarding guide to this next evolution of the web.\n\nLume Web is web3 for the masses. A private, secure, and user-owned internet.", - "website": "https://lumeweb.com", - "bannerImg": "bafkreidde3ktpdv6db43jldh4j65ns2bt33plcxd5k4pnelaclxyrgsiwm", - "logoImg": "bafkreicnovbolipmq3cqicxo4gljieh3slqqck3sr5bylricuogipf6lk4", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiddh7k2f4b2cye4sdo6ykwevgmhmzpferteu7fixrpqigjzix72ri" - }, - "userGithub": "pcfreak30", - "projectGithub": "LumeWeb", - "projectTwitter": "lumeweb3", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "flntISBep0p+LTRsREBl6JanjdkRGpXm6cx8OPOHHLrQKth/MuFt+6y53SZ9PVtp", - "encryptedSymmetricKey": "2122b17e5fbe2853722d5a0917bdfa09d5a81d5d75d0667ca7a364d005555031b40789fc2426331372cb7a2677398213cf48544baac0c4d0becd517480af119fc312343d3062bc9e5ae604c455ed1493a44307ff5931e5e91dc5419bc09fd78f4c1823ec70779b775d97c5efee8f7f624be4a6bb5aad71587b475b729a3db4190000000000000020f1556945db0f7f472b51d8c71c5fd4089aa6ca0468bb20a66efb4637db68b8ce7880b05f834ff6a8572c11042b44dba1" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Community Funding: Donations, Gitcoin, 503c Grant funding. Basically project is completely FOSS funded." - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "1" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://twitter.com/pcfreak30 https://twitter.com/lumeweb3" - } - ] - } - } - }, - { - "projectId": "0x50356583bb0c943b4f40667525a63a2cbf23cf0c2ac3928f12fcbc9dac959016", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x75eda1de48bc5d4a06b38e9e34b845a7dda8e4eeeeccb43f31f2070079e6a0d266e4e64c8bb1344900a2c247cd9d99473d8562fb781422fdeea992ef87359a341c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x74D8967e812de34702eCD3D453a44bf37440b10b", - "project": { - "lastUpdated": 0, - "createdAt": 1673255879702, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:83", - "title": "Vocdoni", - "description": "TL;DR: Vocdoni is an open-source blockchain voting protocol that is scalable, auditable, censorship-resistant & anonymous\n\n---\nVocdoni's vision [1] is to improve democratic health and promote participatory governance using decentralized and open-source technology. To achieve that, we are building the Vocdoni Protocol, a censorship-resistant, secure, anonymous and transparent voting protocol to facilitate decision-making for communities and organizations regardless of whether they are digital natives or traditional organizations.\n\nFor implementing the voting protocol, Vocdoni developed the Vochain [2], a public voting blockchain, as well as a set of tools that facilitate its usage such as an API [3], an SDK [4] and a dApp. Today, this technology serves numerous organizations around the world by providing them with a secure, transparent, easy-to-use and low-cost voting system.\n\nThe main initiatives for the 2023 Roadmap are:\n1. Voting-as-a-service: Commoditize voting\n2. Enhanced Web3 protocol: Anonymous gasless voting with verifiable onchain execution\n3. Increase decentralization: Migrating to Proof-of-Stake blockchain\n\nMore info at:\nhttps://vocdoni.io\nhttps://developer.vocdoni.io\n\n [1] https://aragonorg.notion.site/Mission-Vision-Values-8cbbef15826d4e0889aaf7f35b3a622a\n[2] https://github.com/vocdoni/vocdoni-node\n[3] https://developer.vocdoni.io/category/vocdoni-api\n[4] https://developer.vocdoni.io/sdk", - "website": "https://vocdoni.io", - "bannerImg": "bafkreibgj6f5aon7flfme3cl7e44xvc5u4ipuaxgo5isrspmiskgbcfene", - "logoImg": "bafkreidwmtunbranukh7tlapdehdcxb2sbjiiwn5h73upoibjoop2b4ywm", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreidzvqv5yse7pozr73qeldmsayz5minn5nm5tiir2a4ff4noubi2d4" - }, - "userGithub": "", - "projectGithub": "vocdoni", - "projectTwitter": "vocdoni", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "cJvqztnsj6+3Hr8AWELgPjUzjovo1L/a40s8j9Rl6/U=", - "encryptedSymmetricKey": "b1479b20b1f8b5670fc0a344b98d07df8f857faff6dc52f706a7015da79896489a2bf7e2fd1f0f70a783f2ca1bda6a057ea2b9dd9faf48d4a846a0749c34e5fe1bcac44a58585ca073df8dcd238604f11331d31780a46078b3d2e38fd0ba86b5e2833e03628e1c43c68dd9d08b3b894bdd2e11cfaa90c6e5315be1f06974ea4e0000000000000020f48f6ee76fec714810cbc21eb924caf54dd381a8f05a3bce6a78b3b09a2e4b14aa6392ed9752af840fcb673651217c88" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "For 2023 we'll potentially receive some funding through AragonDAO (vote pending)" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "10" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/vocdoni || https://github.com/ferranrego" - } - ] - } - } - }, - { - "projectId": "0x526dfc66cd504a06e7908438a4041aa473e73677492d91849f69f45fe81e160f", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0xdd43c3cf7fd0af4dbccb40a316ef692b9453f4d2353c6113ad761fcb5b6da2397f5ec849f99d80d9be14a3574904cd92aead96cb7bf951ff1f3b25ceeb3037e400", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x4e260bB2b25EC6F3A59B478fCDe5eD5B8D783B02", - "project": { - "lastUpdated": 0, - "createdAt": 1673091092164, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:65", - "title": "Web3 OSS Libraries by DePay", - "description": "At DePay we strive to open source as much of our creations and internal libraries as possible. We deeply believe in the ethos of open source and want to push the industry as a whole.\n\nWe've already published dozens of Web3 OSS libraries on Github (https://github.com/depayfi), used by dozens of other projects in the space, like Larvalabs (https://github.com/larvalabs/cryptopunksmarket/blob/main/package.json#L12), RNS.id (https://rns.id), Vulkania (https://vulkania.io) etc.\n\nWith supporting this grant, you support our development of maintaining, improving and publishing even more OOS libraries to support Web3 development.\n\nSome Highlights:\n\nhttps://github.com/DePayFi/web3-mock\n\n\ud83e\udd21 JavaScript library to mock web3 responses either by emulating web3 wallets or web3 RPC requests.\n\n-\n\nhttps://github.com/DePayFi/web3-client\n\n\ud83c\udf10 A web3 client to fetch blockchain data just like you are used to with HTTP clients.\n\n-\n\nhttps://github.com/DePayFi/web3-payments\n\n\ud83d\udcb8 JavaScript library to scan crypto wallets for liquefiable assets and perform cost-effective, auto-converted payments on-chain.", - "website": "https://depay.com", - "bannerImg": "bafybeigavc3rpx37fzzldnle5n35rzcicrlb2ucvuvfuaxdi5pkf2bdlhm", - "logoImg": "bafkreih3xsyqvvvlhjylr7nsjigshhkxfjupi2hr57waisg5cpis5mbyvy", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreifesvpp72mzcecdxi7dk2slbn6jsobcrqwdympxscdhgxrqvv3okq" - }, - "userGithub": "10xsebastian", - "projectGithub": "depayfi", - "projectTwitter": "DePay", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x4e260bB2b25EC6F3A59B478fCDe5eD5B8D783B02", - "provider": "ClearTextTwitter#DePay", - "hash": "v0.0.0:9aJQw15+pHSLWpMHl06iuw8G01QP1Nmz2psVBqeF/T0=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-07T11:27:56.821Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-07T11:27:56.821Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..Rt-XBpFmGm_1oGNuMNRx7uC1COt1zPK0SAH2jRlE1WS2PSOspSEGe9Z8PUv2nATu8L-YWvw_XduZBygynpa4DQ" - }, - "expirationDate": "2023-04-07T11:27:56.821Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "oSD23ht1+1Q1l+prLMMMqD87geqQncgkGAXsz2Z4TiE=", - "encryptedSymmetricKey": "2dece67c632f934e6479ab47fc1327ebf73c3379d5ffef149140f928c297c86d16f5b2fd7c3daee6aec347205e336213b73df7b149a9918255a202e7de9f1fdf3f06f11540c3509eaa70b9e5061333e85ed9adb493e35b566ba7ae844cb82e91cb8de08b597cdad655b5f01922458b2eb0716450f78458abd188f2f1946bf32f00000000000000207bfc169fa87dceaebaa100f52dcc84fb5b6d3bc9f921cf022b6573719676d22f29b4000106200c1cf0e7c29468a6d0a1" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Founder funded, Token Sales < $300k" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "3" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes. (Github verification is broken in passport)" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/10xsebastian & https://github.com/depayfi" - } - ] - } - } - }, - { - "projectId": "0x534b17d4d90d3721b24cab299dfe9c93dae7bbea9ca5af2292b4278989d7831a", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0xbc49bf494c57482bb229cafe9fe5ab9feed222ce83aea00afdea10e40da95f80111b37825cc8e689844690489dba71f2bf92f0a233f6729431156e61950dcd081c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x25df6DA2f4e5C178DdFF45038378C0b08E0Bce54", - "project": { - "lastUpdated": 0, - "createdAt": 1673072071731, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:61", - "title": "WTF Academy", - "description": "WTF Academy is a web3 open-source university for developers, aiming to onboard 10,000 developers to web3.", - "website": "https://wtf.academy", - "bannerImg": "bafybeihvpmd5eshmpwd4t4i3t4o2hafbnicoozveldc6nrwcm2y3xdujeu", - "logoImg": "bafkreihkk6kmshladgkdcpq4tpgxfons2bsf5p6qlw5kwzbpyii26kri4e", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreifl5ribugppzawxr6jeqqfad3bnfqayz7ks5tcoty7rydv5dm5ydu" - }, - "userGithub": "AmazingAng", - "projectGithub": "WTFAcademy", - "projectTwitter": "WTFAcademy_", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x3317AD9eDa6942b5a7BE5BA83346C0Ea82C3C26C", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#WTFAcademy_", - "hash": "v0.0.0:7OkBM+VCibFVAVb18/cnKHlrCiIkMHDH2Y8jzG4gn08=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-07T06:12:45.946Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-07T06:12:45.946Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..BNbL9dJ1x0GJXbuYv8706QkGEXAJlQQuwmejDrh5EnW8i15AXH5cWVtkou9e4uKhDHps8tYaqk2nAEh7MzIAAw" - }, - "expirationDate": "2023-04-07T06:12:45.946Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "slk0vGStO267OAUFEn1ldWRcLrkGUE/D9YgAq2XKyy4OfIpAGBogb8Mmfo/E9Nu4", - "encryptedSymmetricKey": "ccc4028ebe5f9a096baf89da758569790431b3ee41081b73377634729cd529004dfde6954c751adb74f43738f77c2f02c2a2ecd1976b721a730b1d2a3bd253a0596e220aeffc8d90d7d3b131650aaf198c7a9dad2709f38348be7de0e2375a92b7aa28d5d77efe728165a8a1a7d01224ccb617526b434a96f19cc40c9973077f000000000000002098a728eed48b66f98060855af0091d7cd0ab7cd4b72b5761c8a92ade599d91edbcd7598d9fbca1d935bde5e9c4fd5ba5" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Donation/Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "10-100" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "User: https://github.com/AmazingAng; Organization: https://github.com/WTFAcademy" - } - ] - } - } - }, - { - "projectId": "0x5b82b9d0cb3d0d14c8fe693502b197cfbc0f55115446632448549da20538c96c", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x8b890d75dab5dcddc7f169c3d18a50d2b6b51acb4e241490d7286ec17c13581b4bfc4f7ec449f8544dcd60da7a7d781c897235e2fa924d761784dfd2351317b01b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x29C40842a76B0aa28865EbF7c916ec820233b7bB", - "project": { - "lastUpdated": 0, - "createdAt": 1673501426873, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:145", - "title": "Bundle: Climate Research Alpha Round", - "description": "Mission Statement:\n\nTime is running out. Climate research today needs to focus immediately on practical solutions. We need research that leads to mass movements and exponentially growing impact. Like the US Advanced Research Projects Agency - Energy (ARPA-E), the Climate Research bundle will be a key engine of climate innovation and climate action. While fixing our sights on the high bar set by ARPA-E is wildly ambitious, we know that blockchain technology can exponentially increase effective and efficient scientific research. Integrated indicators make the research replicable and scalable and allow improved documentation and verification. The ambitious and innovative projects in the Climate Research bundle will architect many systems of the new infrastructure of climate research and scientific collaboration. \n\nThis bundle is comprised of 8 critical and interrelated projects address various challenges of climate research by generating:\n\n\u26a1 Clean, cheap, abundant, and reliable sources of energy and the need to mitigate the negative impacts of climate change on cities and urban areas.\n\n\ud83d\udca8 Increased speed and efficiency of traditional methods for conducting and translating scientific research\n\n\ud83e\udd2f Solutions to the complex set of root causes that contribute to the long time it takes for scientific research to be implemented in real life\n\n\ud83d\udd0d Increased transparency, traceability, and access to funding for scientific research\n\n\ud83e\uddbe Effective mechanisms to protect intellectual property, reduced investor risk in, and increased investor access to the scientific and technological innovation process\n\n\ud83e\udd11 Profitable ways for companies to align with community values related to climate change\n\n\ud83d\udd2c More effective research, and strategies for promoting and supporting scientific innovation that positively impacts the world and its inhabitants\n\n\ud83c\udf31 Developing regenerative data tech, storing digital data in the DNA of plants and trees, to create carbon absorbing data storage\n\nThe projects contributing to this effort are:\n\n\ud83c\udf0e FrontierDAO\n\ud83c\udf0e SCINET\n\ud83c\udf0e Option\n\ud83c\udf0e ScienceFund\n\ud83c\udf0e Internet of Animals\n\ud83c\udf0e Defi Biolabs\n\ud83c\udf0e Circonomy\n\ud83c\udf0e Grow Your Own Cloud DAO (GYOC DAO)\n\nFrontierDAO @FrontierDAO; Collectively incubating scientific and engineering innovations and innovators, using Web3 tooling (linktr.ee/frontierdao).\n\nOne of our key focus areas is \u201cfusion energy as a climate solution.\u201d Fusion energy, while still in its infancy, is the technology that will usher in a new era on this planet - one where cheap, clean, abundant, baseload energy is available for all. \n\nNuclear fusion energy is the energy of the stars and sun. It is the opposite of nuclear fission.. \n\nTo help usher in this new era of transition to clean energy, FrontierDAO has released in BETA an IP NFT on-chain scientific publishing platform called FrontierRegistry. By publishing research on the blockchain, we aim to foster greater collaboration while protecting authors\u2019 IP rights. frontierda.xyz/faqs-projects\n\nFunds raised from GR15 were used to partially underwrite a 12-week Fusion Energy As A Climate Solution weekly workshop series that ran from November to mid-January. Interviews can be found on Youtube.com/@frontierdao. \n\nSCINET, INC @scinet_inc. At SCINET, we are increasing the speed, efficiency, and effectiveness of life sciences research from \u201clab to life\u201d by developing a suite of software applications in a decentralized (\"DeSci\") life sciences ecosystem that addresses the complex set of root causes for why it takes 17 years for life sciences research, including climate solutions, to get into real life (see here for socials, media mentions, website, etc.).\n\nWe help scientists conduct and translate research faster, more accurately, and more efficiently by offering them a unique confluence of decentralized funding, blockchain-protected IP, unique trust mechanisms, and commercialization strategies that reduce investor risk, increase scientific innovation, protect intellectual property, and positively impact the world and its inhabitants.\n\nOption, @option_hq: Option is a prediction market for governance that incentivizes companies to align with community values, including those related to climate change, by making it profitable for them to do so. An example of climate governance using Option could be creating a market where players can make predictions about a company's carbon emissions reduction targets. If the company meets its targets, those who predicted accurately would be rewarded. This would incentivize the company to align with community values and reduce its carbon emissions in order to profit from the market. Furthermore, the funding provided by the market could be used to support research and journalism focused on climate change and carbon emissions reduction.\n\nScience Fund, @sciencefund_io: Fund basic science with donations recorded for posterity on the Ethereum blockchain. \n\nScience Fund is empowering scientists to freely, openly, and rapidly pursue their best scientific ideas. To achieve this, we are reimagining how discovery is funded. No grant applications. Transparent, traceable funding records. Rapid funding cycles that support more ideas early and continue funding what\u2019s working. In this Gitcoin Round, we plan to test some of the mechanisms we thought out. At least 80% of the funds collected in this round will go towards our first Climate Action funding pool, the \u201cUrban Climate Impact Mitigation Pool\u201d. \n\nSpecifically we will support \u201cUPP\u201d - the \u201cUrban Planting Project\u201d incubated at the AKASHA Hub in Barcelona. UPPs mission is to turn every available city space into green islands of chill. By easing heat stress, UPP is helping to mitigate the effects of climate change and promote new sources for local food production in cities. UPP has already formed partnerships with local universities and communities to deploy its \u201cUPP toolbox\u201d and will apply S.M.A.R.T. principles to quantify the project's impact both through technology including real-time tracking, and satellite imagery as well as by documenting the social impact of their project.\n\nDonors to our Gitcoin grant will be recorded in the funding pool through their Ethereum addresses and will receive certificates of the impact that allows them to unlock information and data about the project\u2019s success at regular intervals in the future. \n\nInternet of Animals, @WildlifeMovemnt: Our mission is to create a community of scientists that promotes the design, development, implementation, and improvement of accessibility to software, hardware, and knowledge resources related to wildlife movement ecology. To realize that vision, we formed The Wildlife Movement Institute, a nonprofit organization to be a hub for this community for local, regional, and international collaborations \u2013 whether you are an expert or someone passionate about wildlife and technology. Since the end of GR15 we have established a bank account, set up a business account on CoinBase and are now preparing to invest in web development and getting 501(c)(3) tax status. \n\nDefi Biolabs, @Defibiolabs: Bioengineering algae to reduce greenhouse gas emissions. \nGR15 Grant: https://gitcoin.co/grants/7497/defi-biolabs-is-engineering-cyanobacteria-to-prod\n\nCirconomy, @CirconomyDAO: Recycle & Reuse 2 Earn 2 put the \u201ceco\u201d in \u201ceconomy\u201d (https://www.circon.me). \n\nWe aspire to become a DAO platform to proliferate circular economic projects all over the world. We'll accomplish this by building a dapp which will have a combination of on-chain registration of hardware-based circular economic projects such as Precious Plastic. This will be crowdfunded to ensure common ownership and stakeholdership. This will be supported by on-chain tracking of all recycling activity which will have a recycle-2-eajjrn cryptoeconomics model underpinning it.\n\nWe are currently creating a crypto-back solution for the world of recycling & reusing. We\u2019ll accomplish this by tokenizing existing points-based recycling/reuse-2-earn programs administered by not-for-profit organizations such as Circulr.ca and RedeemClothingRecycling.com. This allows us to better empower end users with an interoperable incentive that would have a unified reward pool amongst all of our partners as well as grant more autonomy to our partners to scale their operations.\n\nThe high-level summary of our tokenomics is as follows - there will be a dual-token system whereby:\nThe token users will earn will be created by coalitions between brands and nonprofits so what we mean by this is - depending on the material in question and/or other factors, we\u2019ll have coalitions of for-profit and nonprofit organizations that will mint a utility token together for earning. As an example - ideally, all clothing-recycling will have one utility token governed by all nonprofits that handle clothing recycling whilst the for-profits will be sustainable fashion brands. Likewise, all plastic-recycling will have one utility token governed by all nonprofits that deal with plastic recycling whilst the for-profits will be sustainable toy/merch companies. In that latter example, there may be multiple coalitions given that the toy industry is a specific/niche market. But regardless, we\u2019re starting with the fashion industry as our MVP.\n\nThis utility token will not be tradable in the exchanges because Circonomy itself will have a token that will be liquid in the exchanges out there. This token will be token-bonded to the utility tokens within Circonomy\u2019s ecosystem and thus in order for users to either obtain other utility tokens or liquidate them, they\u2019ll have to exchange their utility token for the Circonomy token. Each utility token will be exchangeable for rewards such as discounts or exclusive access to brand events that are token-gated or NFT phygital goods. But if they don\u2019t care about those things, they may simply liquidate by way of exchanging for the Circonomy token and then selling their Circonomy token, or they may stake the Circonomy token for gains of course and helping to drive value.\n\nGrow Your Own Cloud, @_GYOC: develops regenerative data technology, storing digital data in the DNA of plants and trees, to create carbon absorbing data storage. \n\nIt works! We\u2019ve just been awarded the science breakthrough of the year from Falling Walls for our functional prototype 'Data Garden'. We\u2019ve also just finished an EU-funded research project that demonstrates how urban scale implementations of GYOC could absorb megatonnes of carbon and store terabytes of data.\n\nNow we\u2019re developing a unique Web3 offering we call \"Non-Fungible Plants\" (NFPs). NFPs are physical plants with data encoded within their DNA. Data like JPEGs and MP3s. They\u2019re the first truly plant-based NFTs ever created. They\u2019re the first step to build data systems that work in harmony with living systems for maximum positive impact.\n\nTo enable our vision, within Web3 we are forming GYOC DAO: an internet-native organization dedicated to accelerating the transition to truly green data storage. Funds raised through this bundle will help the continued growth of an organization which more closely resembles a public good than a traditional tech company. Together we can create a future where server farms could be replaced by data forests. \n\n", - "website": "https://www.notion.so/Climate-Research-Bundle-Project-Description-4254cf8973f14b428feacc157dbc2021", - "bannerImg": "bafybeibpeazvzjn4eewcj2t3p4ylifuxlurgwz3hhkml3vh5ux7ebgdqza", - "logoImg": "bafybeidgeo5rhrpc4lly4e3gpjwim4zyatofeg4wbflpmmbhr26dh23bpy", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiah6du6ip5csrtwedu2qdlaubg5hadxsr536auvrfrjtt6aefk6zq" - }, - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "qo7sJerGy4hhu9eQ3GAKoD33NF5MtcprW1ly+sjiRKajVfYqahaAiEWSdlg+iL9z", - "encryptedSymmetricKey": "dbddbd0b65eb3ee4bb329bed0e2522bbbd9ad1fbe90aa5ffc9f8f3cf631a53730159e422905d89a8e0a584727192a404bb2ee9f6534a3674f27e5f0e44007787796e59e6ea24889274140d3820a2717518fd45300853ae275ddb591403aaf1b29eb2bd7236bfb628905130cd5e4d24fa30cdba82e840ad7b0cc6c45863cce6b600000000000000200f095877c57dfaafee95088ec58fb594541c59266ff1f0122d0420fd4b58fee9b5ef5ea0071561cc2ba73c5259ad9799" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "8" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/SCINETCEO" - } - ] - } - } - }, - { - "projectId": "0x5cabeac8c52fc68df9dc828a716566aef8e34b3d7e95de43ed8ee1e36a795e6f", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x1f07026cb7dc502f691f6a1708bee12d6a5982b34945ef0c8ba7873e7040894d431e7fa954c0efab939bde564183ff2d5f1c375245fdafbc8826b8dc789b76f81c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x4a903f36037da9dc1e1992bc7b8d511170000b07", - "project": { - "lastUpdated": 0, - "createdAt": 1673043434222, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:52", - "title": "ENS DAO Newsletter", - "description": "A bi-weekly summary of the developments and happenings within ENS, ENS DAO, and its working groups.\n\nThe ENS DAO Newsletter started in March 2022 with the objective of providing transparency for ENS through publication of a bi-weekly newsletter -- An easy to read summary of the latest news and discussions designed to reach the widest audience possible.\n\nThe ENS DAO Newsletter editors stay up-to-date with what is happening in ENS every single day, so you don't have to. We crawl the forum, bookmark the important tweets, attend the working group calls, and ask the important questions to provide our readers with the absolute best source of ENS news and information, as it happens.\n\n\n\nWe provide a carefully curated summary of the latest governance proposals, working group discussions, protocol development, calls to action, market news, and other developments within the wider ENS ecosystem.", - "website": "https://ensdaonews.eth.limo", - "bannerImg": "bafybeiekf4ndm4vsmrluqdrxmqa2tbppe4ax4mzuocgqtrbc4bf65cqawm", - "logoImg": "bafkreicsycon5b6tjvmqhfhg4mbdkmk6ycrbfnebklgrxfqkvjfgwozn34", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreifqxlpq2g7svppjdpoau2f37apn3yx75vpqzop6jwuuymxhiyheia" - }, - "userGithub": "daylon-dot-eth", - "projectTwitter": "ensdaonews", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "iCJtPVmlTaa6O/KaRvUEechKgWTbYNdjFBVuv1neKdEkc/BG5SQL4ZiOMMnJf1cM", - "encryptedSymmetricKey": "df2cc4ac72bd96a9f92e668afb2f3920aa35b7df35cc907ba267d57df4ed67b9882f94cc128d4aac6b82b82e63e295084888a9246346c636e19a2acf18a56dc384ee490dd9c3f90508ddd4ece96eb24dd8e2a09c2fee1c4302e21f7a71eda58f01fd9b46bd1b16853c957d60505228736857c35ab0de46a180e56129b2833e9d00000000000000201462348c617cbfd2464595ef14d60eb91d9a1aee49c37e74bce3458bb99d3b554e611f8beb6119bd42b639e1010d0c98" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "ENS DAO, Gitcoin" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "2" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/daylon-dot-eth" - } - ] - } - } - }, - { - "projectId": "0x5d2a5164a098b0c76b6c64824036825cfc2efe26f1285b9f58878294e5596dd4", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x55610863d2072832cd94b1cc64300bf738d1489837fbf51b86b900e8975404d35fa826304ca0abd05e67bec17dfcba7222e37d2988542d4e03d3602382b694c51c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xaf30B0285Bb41bdBB732E4a533874901E4943522", - "project": { - "lastUpdated": 0, - "createdAt": 1673586527203, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:172", - "title": "EthereumCN ", - "description": "ECN functions as an Ethereum community network. The general purpose of ECN is to facilitate the perception and adoption of the Ethereum blockchain, the next-generation social infrastructure. To further involve Chinese speaking community as a part of the Ethereum world and to bridge the wider ecosystem with communities, we\u2019re making fundamental efforts including education, translation, community building, news expression, communication, and event organizing.", - "website": "https://www.ethereum.cn/", - "logoImg": "bafkreihzhk6datkzjkgrb3pkbthchbh5badx7lj6sbs4rgywbqna3nwo4y", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreify5yyl6urvw2rzzbvv2exo6ojq32teluqoyutprfinbyavr77meq" - }, - "userGithub": "EthereumCN", - "projectTwitter": "https://twitter.com/EthereumCN", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "vBtlkxyusOmbZWaq+z+Ok0wru+E2ZvjVACVcrv9ll1s=", - "encryptedSymmetricKey": "76944127ea3c45405d22ab7327bd15e92fe855c292040f7d6530d8efcbea05d34e9196e48932b69878abac96d73daa0da2b1c53a929c70100923fc9bc6a0cc211b5f0bc2aba409b29da2fe50692e537c8fc7ba84735fe659f587dc7bcfbdf1946ae5df175d8ae920ba4b01eb0c2f2983d66c3d051b75a825f64ef2c3e177f32a0000000000000020d4fad469cfe796469dffce4133246357122d1942eb294e05fc0855f07522a567cac3340f06e738dec3644e2c6e049eb4" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Ethereum Foundation, Gitcoin" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "6" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/EthereumCN" - } - ] - } - } - }, - { - "projectId": "0x5f7d0b7bbd1a9ced352c05253be291d2d0e2d66d4744ee6712d67fd35d7c3747", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0xa3a86bce4f7803ea33d2789df5d6cdb49ba853c0a547cb90539ea37b78e031d02756ba4f3a43825f1d0bbeaf794d5123e8f3a3540e2afc387fe2a1d34f5ed6db00", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xB352bB4E2A4f27683435f153A259f1B207218b1b", - "project": { - "lastUpdated": 0, - "createdAt": 1673371881638, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:103", - "title": "eth.limo", - "description": "eth.limo is a privacy-preserving ENS gateway, enabling users to access Ethereum-native dApps and content. LIMO represents a shift in dweb adoption by providing an alternative means of accessing ENS resolvable domains.", - "website": "https://eth.limo", - "bannerImg": "bafkreif635dr3ajnljk43vrm3xeyqgv5mkflab7cdnmuhtapc36djfjfrq", - "logoImg": "bafkreico7g6kvn62eil32momfk7qjrcnrsdmhalvsz6iy4bhncov4i5d64", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreihjmiqrofcyhfrlkfqisglsro2tdpahriapy47bk4j5koeldm57hy" - }, - "userGithub": "eth-limo", - "projectGithub": "ethlimo", - "projectTwitter": "eth_limo", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xB352bB4E2A4f27683435f153A259f1B207218b1b", - "hash": "v0.0.0:bov4zfo5mwbvDqTxnB7dYM6P3BkCCOXpx+Bwm/QeuYE=", - "provider": "ClearTextTwitter#eth_limo", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-11T15:28:16.769Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-11T15:28:16.769Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..Q6WvfyUMdDVrrmV8ssdgIP3oSdJpnaIZ2QqlpuQE3sxy98iO0B5eH8zRSgnOHL-38PeGwSl89CqyomOplP2hDQ" - }, - "expirationDate": "2023-04-11T15:28:16.769Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "uOMYj9wiuOyCO6yNw75Hgu6vogAoApKMXA31e8yqld4=", - "encryptedSymmetricKey": "6c54a2701084e8df8f00526430a5763cdd2dc984781961d89b91662ba88cac468a47379d5f8b32a4baf8e6c8da7b6c0a529e249f3f35b432b7aa7ad1df4f43f1dac7d7663febba6acee7f1d7f09aa52c2358dfeb93e7edd67bd7fcb9cd11388d86ab1cfb61a9888d3e18b9fe93f9a5a467b76b856a4e98acad181238f1f5e6da0000000000000020bc73934d3e6b3578b22abffeac5bbe5bde85ada9ad7a1bf7c52f036c5a302da5131aea4d375fed93475e64be8acddeae" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Ethereum Foundation Grants, ENS DAO Grants, Gitcoin Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "4" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Twitter has been verified but I cannot get our github to verify. I've spent over 3+ hours trying everything to make it work and currently have a support ticket open in the gitcoin discord. My username is SydMead400SuperDriver#0001" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "User Account: https://github.com/eth-limo Organization Account: https://github.com/ethlimo" - } - ] - } - } - }, - { - "projectId": "0x5fd049bf56abc89c3bc9f584eca48182a26e0d18853f160fa1bb1bc9c4112e2d", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x20e1532b23544b9a1df9ccaaaf8b316f1d30130703a565a5908d51bec3154fdc0b911a013583c5541e969fe4f7596d1a50ecaaec8f46c8b6a111751b90600c1d1b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xDF6736104b732CF5d8Fd7f3a8Ef665c1a856649e", - "project": { - "lastUpdated": 0, - "createdAt": 1673724345667, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:205", - "title": "3 Box School", - "description": "3BoxSchool is an online learning platform, using the original online editor technology, users can interactively learn Solidity online, through the built-in online running editor technology, you can view and run the code in real time, users can more intuitive view the interface and content of the code after running.", - "website": "https://school.3box.tech", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreigv7au5fbw2hes5tkfbmub2uc7ipun24yxawf3tsmzcep5pvrfeme" - }, - "userGithub": "https://github.com/nishuzumi", - "projectTwitter": "BoxMrChen", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x6E12A28086548B11dfcc20c75440E0B3c10721f5", - "hash": "v0.0.0:skAaQUpBTIaF6AxL9EwCzN6/szcLaj0jIZHLgA2hHO0=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#BoxMrChen" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-14T19:25:10.589Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-14T19:25:10.589Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..FwPJNKK36l_Bq0sSn-btU7Sm7LWs1O7Sa9ylARA9ZyJ-wQTscjH62TVv8lRlNHSRspEc71pIL0mQfpCN2_HJCQ" - }, - "expirationDate": "2023-04-14T19:25:10.589Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "6fANls/9sS6Kwyb74jIQDE/igDCWqxXMtpB9+8sXLsJVPcYcRqlF38sw+x/jaRFT", - "encryptedSymmetricKey": "8628e2956b0cf5089380a491bef4a1dc7dea6fbf395cfbca66637d90bda7fef66a42ad047dafc7e8fa1ebfb572601516b8cb3e6e5c1ec657314ed9eb07d9facc25e70278e8613b6ad43baff70b7759104582db5456e65e694c855104e3d425acf77e29bd62c31e476c16138cf80d98c4c40396b03bb0b0e856a67007351e70ba00000000000000204b9315214491ff9b587fa08ed43ffc472b791ddf51ca21df840c1e9ab66087877173d12770dfad4dc984eb6a764be3ae" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Self" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "2" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/3BoxSchool" - } - ] - } - } - }, - { - "projectId": "0x60964adb4b2ea1db78bfd5edf4007328c459c1128d4596a6b81a09677b4e98d1", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x845d405b15cf13cc714cee485705f3385274b500677ade4af1a0b78b56a437d058774e45f1c2f80a13d9278335e2b62b4f71341876b4a1629311d335dae3aeef1b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x0406Bf2dAE6A42d567b4e3DbA6ADA99069622fF1", - "project": { - "lastUpdated": 0, - "createdAt": 1673687292945, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:202", - "title": "The Future of Work is Decentralized", - "description": "talentDAO is a community of digital vagabonds, deranged scientists, and renegade internet natives, passionate about DAOs and the future of work. We believe DAOs can provide a path forward where knowledge is decentralized and talent is unlocked for the betterment of society. \n \nThere\u2019s just one problem: The science of DAOs is yet to be known; it must be explored. It must be learned. Traditional scientific settings are largely broken due to outdated institutional norms, obsolete academic infrastructure, and inefficient funding models. So without hesitation, a team of researchers has taken the plunge down the Web3 rabbit hole to find a new solution. \n Our focus is on building coordination software for the future of work, conducting applied research experiments with DAOs, and perpetuating decentralized work culture through art, media, education, and events.\n\nAt talentDAO we are studying layer zero and building human coordination experiments so that we might all benefit. In simplest terms, we are using science to fix DAOs and DAOs to fix science. To do this well will only be possible if science is given an infrastructure and culture upgrade. This is where we come in. \n\nZooming out\n\n \n\nDAOs create opportunities for global impact. Human coordination structures of this scale have never been available to solve challenges in scientific innovation until now. Over the next 20 years entire communities of scientists will organize using DAO structures. A digital nation of scientists operating as a DAO will dramatically improve the probability of achieving important sustainability goals mandated by the United Nations. We focus on four of them. \n\n \n\nGoal 8: Decent Work and Economic Growth\n\nEveryone should have access to decentralized working arrangements. To see that through, we\u2019re building the foundations required for a decentralized work economy starting with the talentDAO community. Our goal is to have the majority of members who wish to be bankless and self-sovereign workers a reality by 2030. Everyone should have the right to decent work, free from affliction and labor exploitation.\n \n\nGoal 9: Build infrastructure and foster innovation\n\nThe traditional academic process has stifled innovation. The scientific record of knowledge is vulnerable to the risks of centralized Web2 storage. TalentDAO is building all of its research on a completely decentralized publication that is censorship resistant, immutable, and safely secured on Arweave. We are fostering innovation by allowing for a bottom up approach to research by creating an open social graph of scientists built on Lens Protocol. \n \n\n \n\n \n\nGoal 10: Reduce Inequality\n\nEnsuring funding and educational resources are provided to all students across the world, not just the weird ones. Contributing to open source research that is accessible to all and with no paywall required. Traditional research publications systematically discriminate against students with less access to education resources. \n \n\nGoal 11: Sustainable cities and communities\n\n \n\nIn the future DAOs will be sovereign digital nations. At talentDAO, we aspire to create a Network State of interdisciplinary educational institutes, providing high quality education and research to all parts of the world, not just the privileged. We cannot go at this alone. That\u2019s why we\u2019ve teamed up with groups such as CityDAO and Sapien Network to scale together.\n\n\nWhat we are building\n\n \n\nWeb3 solutions for scientific peer review, funding, and publication. Making it easy for any education program to launch a journal and sub-DAO.\n\n \n\nOur first solution is a framework for a peer reviewed journal publication and open science social graph with native DAO governance on-chain integrated. We are building research primitives and governance technologies to help onboard the next 1000 web3 enabled research sub-DAOs. \n\nHow we educate and advocate\n\n \n\nProducts take time but our mission can\u2019t wait. That\u2019s why we began creating original applied research from day one. Several emergent research projects have formed that are entirely driven by community participation and championed by a talentDAO researcher. We do our best to provide resources to these groups and onboard more students to help create new ones.\n\n1. DAO Leadership: Sharing leadership is a key tenet of DAOs. Yet distributing leadership across members of a community is easier said than done: there are several instances of centralized leadership within the web3 ecosystem. For this reason we set out to study leadership in the decentralized world of work.\n\nOur researchers are the heart of talentDAO, and in 2022 we saw the Research Guild come to life.\n\nWe are proud to share with you a list of 8 projects that we\u2019ve been working on with our different community-operated teams. This is a summary of our milestones and things we will be working on during 2023, which promises to be an exciting year for the Research Guild. \n\n\n1) Network health survey\nIn decentralized organizations, we have the opportunity to analyze more data than ever before. Governance processes and other on-chain activity is made publicly available thanks to the blockchain and off-chain communication data is accessible through various API services. For example, both Discord and Discourse offer public APIs for data extraction.\n\nBut communication and on-chain activity still do not tell the complete picture of what is happening under the hood. We must also extract data on the psychosocial properties of the organization in order to have a complete understanding of the health of a DAO. To do so, our team has designed a survey that will collect the data necessary to understand the health of organizations so DAO leaders can take action to improve the experience of contributors. Learn more about our process of designing this survey and the theoretical discussion here.\n\nWe will be launching a series of organizational assessment pilot studies in 2023 with DAOs who want to use science-backed tooling to assess their community health. Survey participants will have access to a non-transferable proof of completion NFT made claimable at the end of the survey which will unlock access to future perks and drops. Survey participants will also have the option to opt into our data-sharing program and earn a share of transaction fees generated from our Data NFTs minted on Ocean Marketplace.\n\n2) Project L.I.O.N.\nL.I.O.N: Language Informatics on Organizational Networks\n\nProject LION is a joint DAO effort from talentDAO and LabDAO to build natural language processing systems for analyzing and maintaining community health.\n\nFor DAOs specifically, transaction data can provide insight into on-chain governance operations and degrees of decentralization. However, many DAO operations occur off-chain in the form of relational data. And there is a particular piece of information that is both deeply insightful and stored off-chain: communication.\n\nThis is a software project that will build a tool that will allow us to do research. It is in the development stage and the team is raising funds on Gitcoin. Be sure to check out their grant page if you are as excited about this project as we are. The project roadmap write-up can be found here.\n\n3) Decentralized Leadership\n\u201cDAOs don\u2019t have hierarchies\u201d \u201cYou don\u2019t have a boss\u201d \u201cDaos are leaderless\u201d\n\n-Is that so?\n\nAt talentDAO, we believe that leadership emerges naturally in any human organization. DAOs are no exception to this, so we decided to study how leadership works in a decentralized space. We began with an extensive literature review on organizational leadership where we covered the last 25+ years of academic research.\n\nThen we moved on to interview leaders from all over the world who work in different DAOs. We talked with more than 20 founders, core members, contributors with long experience in the space, and mentors. All that information is currently being qualitatively analyzed by our team, and we will present the results at ETHDenver and in a future publication.\n\nExpect early research results to be communicated in January 2023. A series of educational workshops, leadership coaching tools, and training seminars will be designed based on the findings of our research on Decentralized Leadership.\n\n4) Onboarding\nOne of the main pain points that DAOs suffer is trying to get a smooth onboarding experience that allows them to get and retain new members. Our team is working on a multi-phase study that aims to know more about the different strategies that the DAO ecosystem has to onboard new people, so we can identify best practices and strategies that suit the different kinds of DAOs. During 2022 the team focused on a literature review to examine existing frameworks to evaluate onboarding experiences (or induction processes, as traditional organizations call them). After that, those frameworks were adapted to the requirements of DAOs and now are ready to be tested in 2023.\n\nIn the coming months, phase 1 will be launched with the recruitment of mystery shoppers that will join different DAOs to experience their onboarding process. We will then evaluate this through ethnographic observations and surveys made with the frameworks we discovered through the literature review. Review more of the project deliverables on the team\u2019s Notion page. \n\n5) DAOversity\nThis study is a collaboration with BanklessDAO where we made a survey asking questions about inclusivity and underrepresented groups, so we could know if members felt comfortable in their space. This is a qualitative confidential study and we managed to collect more than 150 surveys. Right now we are preparing to analyze these responses so we can share the results with the broader community. We are eager to discuss these results to keep debating about people feeling included in DAOs and how we can improve their experiences.\n\n6) Discourse Knowledge Graph\nSo many DAO communities rely on Discourse to host their online forum discussions. These forum discussions are often focused on topics related to changes in the DAO\u2019s protocol or improvements in governance. For a data scientist, the Discourse knowledge base is a treasure trove of data. So why not study it to understand the meta-science of DAO governance? This study seeks to do just that. \n\nWhile the study is in its infancy it has quickly garnered interest within the talentDAO research community. Several data scientists have quickly volunteered to develop a proof of concept of a sensing tool that uses NLP to analyze topics.\n\nCheck out the research proposal cross-posted on the Smart Contract Research Forum to learn more about future directions: research forum post\n\nFor the DAO hackers out there the data notebook has been made public to explore the NLP models being used.\n\n7) Compensation\nAt talentDAO, we conducted a survey investigating the relationship between different compensation structures and contributors\u2019 attitudes like motivation, satisfaction, commitment, and fairness perceptions. Using an experimental vignette study we wanted to understand if certain DAO compensation strategies resulted in more favorable perceptions of organizational justice. The four incentive strategies studied were bounties, Coordinape, hourly payment, and salary. Not surprisingly, salary was viewed as the fairest payment method. Study participants vocalized pay stability as an important factor when determining if they perceived a work environment as fair. Very interestingly, as the DAO community size grew bounty systems were progressively viewed as less favorable. We believe these findings will help inform future DAO compensation design in the tooling space.\n\nThis project was a joint effort with BanklessDAO where we collected 166 respondents. Read more about the full study here: DAO Compensation study\n\nIn 2023 the team aims to do more analysis of this data and then present a written document to share with the community. We also plan to have several open working sessions and webinars related to DAO compensation.\n\n8) DAO Structure & Design study\nThe core objective of the DAO Structure & Design project is to create a well-researched body of knowledge about DAO structures and design. It is not an audit project about what exists, but more about how effective and impactful DAO structures should look like. This body of knowledge will be published so the broader community can discuss the results and make use of these insights.\n\nRight now the team is finishing the literature review so they can move on to do structure analysis and interviews with DAO cartographers (those who map the organizational chart of the DAO) in Q1 2023. After that, the project will move on to Stage 2 to do in-depth interviews with builders, community managers, and experts in the DAO ecosystem to ask about organizational structures in web3 and to see what works and what doesn\u2019t from their perspective.\n", - "website": "https://talentdao.io", - "bannerImg": "bafybeietmnwfnfrnxyetclvnncjetanm7x4p62qtrivquxejvuoihund5m", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreihneryzo26ihiycqbl6nrgaeycucnreyjva4axicct6sb5rgggbsi" - }, - "userGithub": "", - "projectGithub": "https://github.com/Talent-DAO", - "projectTwitter": "talentdao_", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "jYF6/aI2crn7zbwYPu/JeYj6bP0Pzxg8f47/aJOeDhJFBSdhH9rOMNEW5ezLnIMz", - "encryptedSymmetricKey": "92aa596d79b581f1af1ac5665a33f5efd82315c1424f58f7e33b9880291c3b02bf0dfa16240ba61703fc36fb0f163e1525354d912f797c2b0f955b93bba98ad4ff3c502a04c63b5ab8a22b402ad761e487129bc642a8c23ba98bd6ccb3bf82a167ac2dd01dce57a0e133c9a3861327a2eaa41c48e16a959458aed981571795990000000000000020ccefab9a7887448c20df657a386db712da970a16dbe449889daaa151292edb33c58f9178bf098de2cd79b3f9b3cfb1aa" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Gitcoin Grants, Ocean Protocol Grants, SCRF, Arweave Grant, bootstrap" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "15" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/Talent-DAO" - } - ] - } - } - }, - { - "projectId": "0x60c037f9dfa5daee0f07bc26fb73393ef924e36c73c41ea6bd58029e1724de36", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x57555ed0d1f3a8ef880432e6be3b788348020c10afbfad62047c0014aacee05e0a063fe4e3d71a811bff0d05aa5e8091026c6eaf7125cfaf4ff923db1f6b61ec1c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x18aa467E40E1deFB1956708830A343c1D01d3D7C", - "project": { - "lastUpdated": 0, - "createdAt": 1673940899264, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:240", - "title": "JediSwap", - "description": "Note: Donations for this grant are for development only. Do not expect anything in return.\n\n\nHighlights:\nThere is not a single person on any kind of contract in JediSwap. Everything is done by the community and 300+ contributors.\n\nJediSwap is one of the first protocols to receive a grant from Starkware. JediSwap is all time #1 project on Gitcoin Grant from the funders count.\n\nArgent-x(biggest wallet on StarkNet) integrated JediSwap to power swap functionality.\n\n\nWhat is JediSwap?\nJediSwap is a fully composable and permissionless AMM that enables users to swap assets and earn yields on their assets instantly with almost 0 gas fees. Builders can build more advanced applications on top of JediSwap without asking anyone's permission. JediSwap is completely open source for anyone else to use in any way they want.\n\nJediSwap is built on StarkNet - a Validity Rollup on Ethereum enabling unlimited scalability to web3 while relying on the security of Ethereum.\n\n\nJediSwap is an entirely community-driven project. Independent open-source contributors do everything, including development, design, and marketing. Anyone can come and start contributing by joining JediSwap Discord.\n\n\n\nWho is behind it?\nThe Mesh Finance community is leading the development of JediSwap, which has been building in DeFi for the last 24 months. Mesh has been deploying and experimenting with multiple blockchains, including Ethereum, Polygon, Arbitrum, and almost all top DeFi protocols.\n\nMesh community is bottom-up; anyone can start contributing and become a leader as they contribute. There is no power concentration. Mesh has developed a system to measure all kinds of contributions, including development, design, community management, growth, etc. Compared to most DAOs, Mesh is not just decentralizing governance but enabling operations and execution in a community-driven way.\n\n\n\nWhat is different?\nThe Mesh community believes that billions of people will come to crypto-only if it is cheap, secure, and easy to use.\n\nCheap - JediSwap will be one of the 1st gasless dapp on StarkNet.\n\nSecure - Thanks to StarkNet, JediSwap leverages the security of Ethereum. Users never rely on multisig bridges to leverage a cheaper and scalable ecosystem.\n\nSimplicity - JediSwap believes in simplicity both for users and builders. Users can swap or earn by adding liquidity in one single click. By keeping the simplicity rule on the smart contracts level, JediSwap also enables devs to build many different kinds of applications, which was impossible on L1s before. There are already 25+ teams building on top of JediSwap. These applications include creating on-chain games, metaverse projects, cross-chain apps, aggregators, and furucombo style dapps.\n\nCommunity - There is not a single employee at JediSwap, and everything is done by the community.\n\n\n\nWhy Validity Rollups (aka ZKRollups) and StarkNet?\nThe next wave of crypto will come for various non-financial applications like gaming. As a result, there will be a 100x number of tokens launching on scalable L2s instead of L1s. These users will prefer the cheapest tx and the most uncomplicated applications that are easy to understand and use. The Mesh community believes StarkNet is a front-runner in the Validity Rollup (also known as ZKRollup) ecosystem. The mesh community has been building on StarkNet since October 2021 and has seen a 20x increase in the number of builders building on StarkNet.\n\n\n\nWhat else is special?\nWhile building JediSwap, the Mesh community is publishing many public goods. Some of the published public goods include\n\nStarkNet React library - it saves hours of work for any builder building a frontend app on StarkNet\n\nBase64 encoding in Cairo - a primitive which can make generative art possible on Starknet\n\nDeFi Pooling(coming soon) - Enabling access to L1 apps by batching txs on StarkNet\n\nDAO tools and frameworks: \n- Ability to give Discord/Twitter contributors tokens/NFTs while preserving the privacy\n- An alert bot for Discord communities and contributors to make coordination easy\n\n\n\nRoadmap:\nCurrent:\nMainnet - JediSwap launched on StarkNet mainnet on 30th Nov 2022, and 10000+ users have used JediSwap since then.\n\nTestnet - JediSwap launched on StarkNet testnet on Jan 2022 and 150,000+ user have used the JediSwap on testnet since then.\n\nNext 3 months:\nIntegrations - focus on building integrations with 50+ dapps\nLaunch DeFi Pooling as a public good\nOnchain contributor profile\nProductionize DAO tools to make them usable by any community\n\n", - "website": "https://jediswap.xyz", - "bannerImg": "bafybeihfw2iiogtgc2vfhgk2zkiaolyh6fhql7s437eblx7ta7vepme6m4", - "logoImg": "bafybeiei72o7yjtpvce5ldpmjcrdcpnbi67jabs77hjveo6xggvfmwc3cm", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiatqdr7zythvghmiol6b3ety2rpzohg53map3lss3ccwwn2wedtti" - }, - "userGithub": "jediswapintern", - "projectGithub": "jediswaplabs", - "projectTwitter": "jediswap", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xeD0087B28b00B92C5c7767B1dDaB3095762150CF", - "hash": "v0.0.0:bc16HDIvUWUoewNWo93POqSRmvLZzpNVdF8qZ7tV+DY=", - "provider": "ClearTextTwitter#JediSwap", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-17T07:34:00.171Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-17T07:34:00.172Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..yJgRfGfWIoMISk79jejXpip-DmfNdJxX_BVmHT-0g57cz-HJ50c8MiNjPUZwMy_J2clpxcxz4oNYAdQBYJjoDg" - }, - "expirationDate": "2023-04-17T07:34:00.171Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "iadZgFAWDgF0gy/ipDaLfuQ6mit9dKWMuo3ov2d5N+COgXus2IR2A/njmOLsav1/", - "encryptedSymmetricKey": "484abcabc18aac19b9883b3fda61969610b58cb1e80fc36cbc37d2e2c89c4d4c8fadf06f38cd2bb0deb569ea30e1e21790106fac06899d418427a0dea465915ee542fb6bedfaa03d27c0074043339f4a2faadaddcb2600710928d1424c0cf7901d007181c4acd75b58752846722ca9c1c4e302bc2b62f04c663a7180f593762c0000000000000020cd0f44238bd265e481073a76d13977bd81ed8915d51eb737ee8ff93798729bfe033ebacae5f6c38fcedc9599f7caaab0" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Gitcoin grant mainly. No external funding. Mesh Finance started it which raised a very small round in 2021." - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "300+ contributors (dev + non dev)" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/jediswapintern, https://github.com/jediswaplabs" - } - ] - } - } - }, - { - "projectId": "0x6579377403e6dedd052e60ec6281d9505db7e6119cc7669d04f17913245fab11", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x36745b99ee5f8bcc5909e47f342b3dee9c586279436e1a72434d3445253d89ef7ac7c3929daf50bc616c1e19b0b15ab1638e2f4b124243855f50441fc1d9a4ce1b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xd525fF26F45f3B7D20cfEf170E2cb9E601A0b4dA", - "project": { - "lastUpdated": 0, - "createdAt": 1673631409551, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:191", - "title": "CirclesUBI", - "description": "CirclesUBI is an unconditional basic income system for communities. With Circles, people can collectively self-organise their own wealth and give each other a basic income, without waiting for the state. \n\nSince launching in October 2020 the Circles community has grown, now 200k+ accounts deployed around the globe via the circles.garden interface (on Gnosis Chain).\n\n Since then, we have been busy improving our infrastructure, nurturing the Circles ecosystem and creating strong local connections with the Berlin Open UBI Pilot. Watch a video of how the ecological circular economy in Berlin works, powered by Circles: https://vimeo.com/769402776 \n\nUniversal basic income means that we are being valued just because we exist and that we do not have to pay rent for having been born on Earth. \nCircles leverages pioneering Web 3 technology to bring forth a more ecological and fair world into being. By funding Circles via this Gitcoin Grant, you help create a distributed, community-first basic income around the world. The funds you give us will go into improving our Circles-core infrastructure in order to give people a better experience when using Circles to pay and buy the things that they need to live, community building & lastly to our ongoing research pilot which combines novel network science with anthropological methods.\n\nSupport us!\n\n\nRead our white paper https://github.com/CirclesUBI/whitepaper\n\nOur code is open source https://github.com/CirclesUBI/\n\nGet more information https://joincircles.net/\n\nCircles Coop website (mainteners and developers of circles.garden) https://circles.coop/\n\nChat with us! https://t.me/CirclesUBIGeneralChat\n\nDeveloper chat: http://chat.joincircles.net/ ", - "website": "https://joincircles.net", - "bannerImg": "bafybeiatgbdr2xc6hlsuhn5zcqsdqfli2r2fjqg254gvf5gonnrgkeca3i", - "logoImg": "bafkreiduhdohmihcykyvhmn75gjawkggmte3m67tfmjzspp5fy4xdihw3m", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreihmwp4xfmohadv755dxs4j4ny3w3rqy77czypgdknamvzvb4fnzce" - }, - "projectGithub": "https://github.com/CirclesUBI", - "projectTwitter": "twitter.com/circlesubi", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "27MQKjTpwWfa1CJmqySJD6XRp6LfWCoZbi1RE5GSJrOHschvn64sPH+8rTNwAZO0", - "encryptedSymmetricKey": "b7f0c600cb57208a5d02688039341effdcc805b2bea4c9c844f23e3554c9ebfdbeadcb1ef60b6a86ac497d63a8ed6503554c46b60b2e57391c0f162338d0650893efe3ba6ec2e10f08805a3c5c3941e3e96e34a1b339d059b57c690402c3dcb5a4993b365d70015f7962bb9e6e0a7161cf8fb9933f0543a0b3b4272b73694800000000000000002020171c3c02903faa157ea1e38f69f8dc721ed13766a2102062693189c31a6b18696952d99c99968e3be95c1bf8e1e28f" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Donations and Grants." - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "15 people" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "not yet" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/CirclesUBI " - } - ] - } - } - }, - { - "projectId": "0x6645c813734620e96c3915bc39abefefb682bbe6058353db8b99ce7235920804", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x4c7ee1ab412ed179c154f183e82bd8fea43d53a15c686c581c45468e39b2c4d878cb52dd7e65ae8b2d15756ab77f8ec5a50d2cc53fc521a4927e4dd1b7e7ad631c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x65a0Af703047dfDd270361659d02f4f0E8547202", - "project": { - "lastUpdated": 0, - "createdAt": 1673192492535, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:77", - "title": "word block", - "description": "Wordblock is a block based note-taking tool with ownership control.\n\n-Wordblock extension\n\nYou can clip any text from any website, add tags, comments, and save the location (URL) as metadata.\n\nYou can write block-based memos, add tags and extra information(e.g. the real location: \ud83d\udccd\ud83d\udeb6\u200d\u2640\ufe0f38W,4S). For example, when you pick up a book in an antique bookstore, and you want to \"steal\" some words from it before you take it home.\n\nThe text is generated under the user's own DID signature, while data is stored on a distributed content storage network--IPFS to enable public search.\n\n- Wordblock.xyz - a global text block search engine\n\nAll the word blocks created will be pooled in one place for public search, or later public reference.\n\nFor example, you can process public block searches via tags, keywords, or user DID\n\nCompared with local storage note-taking tools like obsidian or central storage Roamresearch, the difference is in data storage in order to achieve public block search.\n\n- Use cases\n\n1) A social graph\nAfter collecting those text blocks, it is easy to form P2P social relations*(e.g. walletChat)* via tag matching.\n\n2) A decentralized multi-lingual literature library\nThe inspiration is when I visited an ancient Malatestiana library (the 1st public library in human history) in Cesena, Italy.\n\nEach codex is tied to the desk with a root ironed chain, so that precise objects could not be stolen, it is now a symbol of the arts of literature, copies include 20 years italian, french and german s copy by using humane scripture called \"literature antiqua\", text includes classical latin authors, churchenergy , greek\u2026\n\nIt's like a warm salute from afar history that tells how humans keep words and knowledge. In the context of today, we stand a chance to \"chain text\" differently and interestingly with technology.\n\nToday, we care less about \"preventing books from being stolen\" but about \"HOW things are connected\", so the desire to build a distributed literature dictionary(library) where people from anywhere in the world could contribute their input even in different languages.\n\nFor example, after I read the Chinese version of\u300aMr.Gywn\u300b, I para-read the original Italian version, then build the connections in between. It is one of the very fun techniques for acquiring a second language through intertextuality, while also a way to let the machine know how people from different linguistic computing systems tell the SAME story.\n\nRead more: https://mirror.xyz/0x65a0Af703047dfDd270361659d02f4f0E8547202/YmbixVzwGJ0l46X6PDtVBbYY64Jd-SfRSD8usBZUzno\n\n3) A data graph\nwe are in the early stage of defining data as an asset with maturing infrastructure like IPFS, Ceramic network, dataverseOS etc, the excitement of web3 is the data as streams that can be visualized and later used by individuals. We could first collect those fragmented attentions \ud83d\udc40 with ease, and then browse/ the data, or re-organize(reference) with personal signature.\n\n- Tech\n\n1) Ceramic Streams\nWordblock uses Ceramic Stream to store the JSON metadata of a block. Metadata includes BlockID, Creation Date, Source URL, Author, Tags, Type, and Content. The DID of the user submitting the block to the Ceramic network is also bound to the metadata. The Wordblock data model can be shared between anplications on the Ceramic network.\n\n2) web3.storage\nWordblock uses web3.storage for data backup and permanent storage. Our backend API can get all the blocks created by the given user DID to implement a global search on the wordblock.xyz page.\n\n- Reference\n[1] wordblock github\nhttps://github.com/fat-garage/wordblock\n\n[2]wordblock gitcoin\nhttps://gitcoin.co/grants/2445/fat-garage-the-word-block\n[3]wordblock on IPFS grant\nhttps://github.com/ipfs/devgrants/issues/278", - "website": "https://wordblock.xyz/", - "bannerImg": "bafybeifz44z5wsrxi4h4lej6ucvkgjcnm3p6uxregtikhz62vigzrb7rnu", - "logoImg": "bafkreih62ihcmrs2vsipas5e4sbwfa4vbjcasqq5yjralc6axgdfjrbn7m", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreih2ciwavh76srhukotslq6jcgewklr2xbctvv5wafobpwz63vaham" - }, - "userGithub": "https://github.com/fat-garage/wordblock", - "projectTwitter": "https://twitter.com/JESSCATE93", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "u6Gz8O7acUI9FKTtDqH6S2cFO5uXki56r+3DgiaYsF3ZTvXVbZ3HTCrGtSfFT6Aj", - "encryptedSymmetricKey": "1dabe3841295dc9b1bf8c31ca53c64e67d662af4ba6e7943e60d9ea710b7dac33e718a1ab08bd5d658b975b31e26ab08952372e95ecc7656ece91ab4a15b29e886f12fea8e352a86badb670c2552592fefe2a130f0175766ea865d2e4bbdbb9314ade4bd6b65ef2d0b2621f911ed3185869ceb3c68436cbd9ae33bb96c8676690000000000000020469a3def484a731552f90c9d9dcb5165d6bb4dbba639459b7fdb4e8889815b4d06765ab46dd16be1210b00a1b9af31a6" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "donation/grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "5" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/fat-garage/wordblock" - } - ] - } - } - }, - { - "projectId": "0x67583b52562147ffe4d7b9c4422c6109d0d18a596c25355eea583e13e146224b", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x5ad31dd5653ae32db44627519aa63c8ba67e5bbb3f76ebd1dd54f66bc139ce56240b75440daf25665eb6dc16e48753a85b6c4eb7de720c9b2a0c43768c02c6f41b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x9D100F017095e53b24d81296BcA1D26742f1800F", - "project": { - "lastUpdated": 0, - "createdAt": 1673071937173, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:60", - "title": "StarkDeFi", - "description": "StarkDeFi is a suite of decentralized financial products (DeFi) that leverages the Zero-Knowledge (ZK) Rollup capabilities offered by StarkNet.\n\nWe aim to facilitate and simplify the onboarding process for the \"Next Generation User\" in the blockchain space.\n\nOur Products\n\n\u26a1\ufe0f Synergy Pool (Variable Rewards Mechanism) \n\n\u26a1\ufe0f AMM\n\n\u26a1\ufe0f Farm\n\n\u26a1\ufe0f Liq Locker \n\n\u26a1\ufe0f Launchpad \n\n\u26a1\ufe0f Mint (NFT/Token)\n\n\u26a1\ufe0f Staking Pool \n\nUtilizing StarkNet\u2019s scaling solution that will reduce gas fees and improve reliability, StarkDeFi is building a suite of financial products that will bridge the gap for the next wave of DeFi and crypto enthusiasts. With StarkDeFi's solutions, crypto enthusiasts, as well as technical users, will be able to access the benefits of StarkNet, the leading decentralized ZK-Rollup on Ethereum.\n\nStarkDeFi is ensuring that Starknet will be available to everyone. By creating a simple UI, with AI assistance we have our users at the forefront of what we are building and for projects wanting to launch on Starknet, we aim to tackle the issue of learning 'Cairo' by enabling projects to mint, lock liquidity and use our launchpad without the need to learn a new programming language, essentially bridging the gap between Ethereum and Starknet. \n\n", - "website": "https://www.starkdefi.com", - "bannerImg": "bafybeifwy3s674emjqvwual47neuhpl3fnhdop65blyn347avtdz237veu", - "logoImg": "bafkreiewtap6xhtqj24xzv2gdperl5lwf7dpgdklgzghm2b5wazfrx2zti", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiapanjrmod2sn4wbnwplqeoteg5frvel2kjqkwurups3gjqeoxsmu" - }, - "userGithub": "https://github.com/Starkdefi/StarkDefi-contracts", - "projectTwitter": "StarkDefi", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x9D100F017095e53b24d81296BcA1D26742f1800F", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#StarkDefi", - "hash": "v0.0.0:lPs8h5uhxZwb+01TVKFeGxQB1hDDlhFea3MmUVDgau8=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-07T06:10:01.247Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-07T06:10:01.247Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..9pTfxIqMdMwN3tftL1gFfwzk_WjtEo7xG4hRaSYQRoGh75dGoZqds-4uu9b39s_dBLSs07unz4X_MBcfAFeQDA" - }, - "expirationDate": "2023-04-07T06:10:01.247Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "rRhaXm5XZ0CghVQNc16iKwR3z6SAgrl0lqewFcLNdr4bJVPgng5kiavWpac1FUOR", - "encryptedSymmetricKey": "5bdb6d1b0446ec0d1806db3477eb6509e0d9a86958e8068ba732f59ac942b604b7e19f329135dae1522b42ae5d696d00f4d93ecc492772d6169e7a0fd58e76e80db0e49608986df2e333fe6eff0ce92c50c9080e181e8ce57e82fa85ac4604a7f42ef55efddb39c774c02ef81613d97c74782e66cdd1e15fbfae82288058e63100000000000000205d56d083118de30acd871c2732bfed01941e597891a36c70c21255ac9fb184e47dbd006cb129bc5ecc0c2e9f08e61781" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "GR15" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "4" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "YES" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/Starkdefi/StarkDefi-contracts" - } - ] - } - } - }, - { - "projectId": "0x6853d9b86fb7e544d688ff111e1b4dd95636716635e58243bc883a17d4783c8d", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0xb5201b8e79f820f8985c5a1c14db1eead6d75726dbf0fc23f1b48f143e9c681c34113097b73b8fbac673cb9a552bb575579583f206e5af6d4e68ec565c7cc00d1c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xA3c2e3d65206deE0456416F8189de7CF4fccbB22", - "project": { - "lastUpdated": 0, - "createdAt": 1673702733262, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:203", - "title": "Malicious Contract Detector", - "description": "The Malicious Contract Detector project aims to use advanced machine learning techniques to analyze the code of new contracts and identify potential issues or vulnerabilities. The project is divided into two main parts: research and development.\n\nIn the research phase, a variety of algorithms and feature sets will be analyzed, including function signature hashes, abstract syntax trees, opcodes, and even approximate source code, to determine the optimal approach for identifying malicious contracts. The goal is to create a finished machine learning model that can accurately classify contracts as safe or potentially harmful.\n\nIn the development phase, the bot will be created and the process of transforming contract code into a feature set for analysis will be optimized. The focus will be on ensuring that the bot can handle high volumes of incoming contracts in real-time, while maintaining a high level of accuracy and precision.\n\nThe project is currently in the alpha testing stage, with initial results indicating that the BERT transformer model has shown promising results in classifying malicious contracts. A set of bots using different models will be created in order to further improve the accuracy and reliability of the Forta bot.", - "website": "https://github.com/venglov/Malicious-Contract-Detector", - "bannerImg": "bafybeigu4slwqzynbetk6bt5fistsbodv2ijdcsfhw76valmvdxl72wi4e", - "logoImg": "bafybeidn4aldo5j5xozmnteoysgzyv7ia4jfnc2iwwbedjhwe262d2c7qy", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreibvloosr2b6mdhjtclyqkssqozmsgs4ogwan4uqyeed3juruh7d4e" - }, - "userGithub": "venglov", - "projectTwitter": "vvlovsky", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xA3c2e3d65206deE0456416F8189de7CF4fccbB22", - "hash": "v0.0.0:59x9wqkj2j+lxp2gvTqtR81hQOkM1ZN8o5iC4uxshGY=", - "provider": "ClearTextTwitter#vvlovsky", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-14T13:24:48.655Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-14T13:24:48.655Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..Yl2A0lVBHqMOlaBdItbyoAV3I-GBe_2ZHE7EECIo5bNOoUVJm5EgmToh_lBAO7mQg6e5Gfm4ryZksohqQTipAw" - }, - "expirationDate": "2023-04-14T13:24:48.655Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "XyQkpIvb+tBbKXRXgLRv1HYDT0ZmrZMvoEj91TDoiyVacC6H55qv0ExI9FV+ObbQ", - "encryptedSymmetricKey": "b659a24c5f013475ffc1a1340788a42a9d6042c616e4fac3cc558a5f3b10d99fb7cf965eea049a11346cf3dd95465300b40a8e6f74968768914a9e4e64cbbffa8724419926d2fe66720fbc39a6ea783c0cd848955b069a2a50349ad901877195dcd06d5cbd669df662076a3553d9697cae85fae5ca88725ed97fcd78a6b0479f0000000000000020a6c3202fbf4f339d9fbbc4faf722cb7bb1e49204a5b665f781c86433b0ef37d8fca331cb1a3363395ce96786dbeb01ab" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "GitCoin" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "1" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/venglov" - } - ] - } - } - }, - { - "projectId": "0x68a7e0b8472089e4c4db7167b630f0df2303784635126bb3fc82f02e9032055f", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0xe5610881d6d50f7cefa0ba562113ea7c81cdf8168c2dd6acdda435075390e3fb2dbd8669bce19997aa8eb91b62998bdce84849cd1280c1894653165cfd45c5e21c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x7b736FE138775D1fCD2CFE4E1D6158BfF3a2F28e", - "project": { - "lastUpdated": 0, - "createdAt": 1673822109044, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:214", - "title": "ENS Spoofing Bot", - "description": "ENS Spoofing Bot detects attacks in which someone registers a name visually similar to an existing one. Every ENS user can receive a notification if it happened to their name. \n\n\nThe problem\n\nNames in the Ethereum Name Service are unique, but there are no restrictions on registering look-alike names that are visually very difficult to distinguish from genuine ones. For example, having a name vitalik.eth, an attacker can register a similar name by replacing the symbol lowercase L with uppercase i: vitaIik.eth. The name is visually similar, but it is treated by the protocol as a completely different name, with its own hash, as well as an address bound to it. \n\nThis type of attack is called a homograph attack. Regarding the ENS protocol, it can be performed in the following ways:\n- Substitution of character pairs i/I, i/j, O/0, w/vv, m/rn, etc., which depending on the typeface, may be difficult or impossible to distinguish;\n- Replacing ASCII characters with visually similar ones from Unicode; for example, \u201cfa\u0441eboo\u0441k.eth\u201d uses the letters o and \u0441 from Cyrillic;\n- Use of invisible Unicode symbols; \n- Spoofing using uppercase letters; for example, bitcoin.eth may be spoofed as Bitcoin.eth. \n\nENS fights this attack pretty hard by normalizing names before they are registered, as well as warning against using non-ascii characters on its site. However, to save gas, such checks have been implemented off-chain, on the frontend side. Any user can register a name bypassing the official site by calling the protocol contract directly.\n\n\nThe solution\n\nDevelop a Forta bot that monitors on-chain contract events responsible for registering \".eth\" names. As soon as the bot detects a new registered name, it tries to normalize it and checks if a similar name has already been registered. If so, the bot fires an alert specifying the registered name, the existing normalized name, and the addresses of the accounts to which these names are bound.\n\nForta Protocol allows each user to subscribe to alerts involving their addresses, so if their name is spoofed, they will immediately receive a notification in one of the convenient ways: Email, Telegram, Discord, Slack or Webhook.\n\nIn addition, when combined with bots that detect subsequent stages of suspicious activity, we will have enough evidence to claim a scam attack. For example, the next follow-up checks could be obtaining tokens, selling them, and laundering funds through services like Tornado Cash. \n\nAs a result, the Forta ENS Spoofing Bot will play an important role in detecting scam attacks, maximizing the chances of their detection.\n\n\nAbout the Author\n\nI'm a Ukrainian developer, who has been developing bots for Forta Protocol since the beginning of the project. You may have seen me as a frequent contest winner as well as an active member of the community. At the moment I developed 19 bots, some of them are in the Forta Threat Detection Kit.", - "website": "https://github.com/kovart/forta-ens-spoofing", - "bannerImg": "bafybeibicei4a233miqwcqxezfgh463pm4hrs4mmqxq4efcx2z6uydshem", - "logoImg": "bafkreig2qp4nfb7tf2pjugznszykzpbk4eacrquglpxvooncwc252tungm", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreictuhm4dede2zghiehivfifiiyijygi5apz6pi24zet7venwqleky" - }, - "userGithub": "kovart", - "projectTwitter": "kovart_dev", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x7b736FE138775D1fCD2CFE4E1D6158BfF3a2F28e", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "hash": "v0.0.0:It9lxqJk6UVkZ40xHR1g6QuLkkg+24NZle9CVuvu3/k=", - "provider": "ClearTextTwitter#kovart_dev" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-15T21:55:08.055Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-15T21:55:08.055Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..CTRGHoXifusm-HZS_FP18gelC1wtguU1JwxrP2AFL3VkVIrmWVvAGdi0XJ5ln0ZPpGvmkLVKLELq19KNxbgpDA" - }, - "expirationDate": "2023-04-15T21:55:08.055Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "MHOitpSgBkabpY1JgiVF/De7uatJqPPZNjHz3YSG+DhQBDUPLEU7pBN3ti0aPKl1", - "encryptedSymmetricKey": "0b659967a870fe033d82a127e8f50bbd0be073addb781eaff1c4ea48f0213402ce5d4140a7ffab014fc37c1d6b852e0edb41dd732a710141ce22f95ab5c16b4ebaebf1db20680e2a6ea9ed68ae1b3712b7cf540c7cd2aa664280f144382476ad4ae500a34a56b0cf43df8f1227f05ef6cf7f2ec0fce76774ec15bce9dfe1571a0000000000000020f2cbf0e40cbb63b2200a074d2100d7ad4786412001104e9982def25e23f904463e068cfb7fdd58dd6e916780d85a5cb4" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "GR15; none at this time." - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "1" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/kovart" - } - ] - } - } - }, - { - "projectId": "0x68d7168d2ed92300f3c30b1b6c7d2c822ea71c24ec55e18d8777eb47ae998905", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x9381d225e300ea8a59816daab4f683756405788df2b3d31fdccdcd491d79e78e7b5dae7830202829bbb11339f474c766fa5fec445e62835bdd7f3c217af123d31c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xd6eeF6A4ceB9270776d6b388cFaBA62f5Bc3357f", - "project": { - "lastUpdated": 0, - "createdAt": 1673043814767, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:53", - "title": "Krebit", - "description": "Krebit uses Web3 verifiable reputation and escrow payments to build a fairer Web2 marketplace and help people Earn more.", - "website": "https://krebit.id", - "bannerImg": "bafybeiaoouxmuuknvho2jq5eynsrb5vx3gvcsyt6qy5kntfu367sbikkui", - "logoImg": "bafkreid465nrgxz4ygg7q7lvzdn6qxyccpftbfmxykwrnwluwptvwl7jd4", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreidjjgoct3nn2xghao2zqn2ioxotyxbxz436iaowmlwckap47fndyy" - }, - "userGithub": "krebit", - "projectGithub": "KrebitDAO", - "projectTwitter": "KrebitID", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xD9D96fb150136798861363d8Ad9Fe4033cfC32b3", - "provider": "ClearTextTwitter#KrebitID", - "hash": "v0.0.0:GpSgPE+wbhH6W8dTK3Wf9tTOEs9uWVqIDSLf4z3eG9c=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-06T22:22:11.416Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-06T22:22:11.416Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..PPqyC5Rb5aIphCvwyPDzJ3v2q-DBgkSy9cGvvx_CegFCjBh3qmBFqYgDGpPn9r27PyWe63aCsGi-TVAO0dBVAg" - }, - "expirationDate": "2023-04-06T22:22:11.416Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "6ih/5/Tla1mDGJlmKAcW6yEk2YBZcwLc8r0eeh7Jugmb/BXQ+oARaNlDTi2UHk3d", - "encryptedSymmetricKey": "605d86fc4532e9f65f9f1e8a60a141d36496bab80354be0c1247988bf059bdcf530c6b6d0611868e01e734b2bb316110c428e4b2398c150d1f4a4a34a8c7e7f08d8b17b6e21ed6675a7a0e2d131d0df368cda2997bc3a2da09d70101c7b0fea34c6b7df31e202854ac42eb2504d7f842bb9d94f154a31e706e45ce9e260c2abc0000000000000020c151e3f713d8498e01aff34ba5a7a41cedf20f5ccaef25e99843440aee896c1e02fd97fcbe30e448e7298d6e782ece84" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Gitcoin GR12-14" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "2" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/KrebitDAO" - } - ] - } - } - }, - { - "projectId": "0x7083c3a699944ea48bd0204eb74dfeac1414e90443a7e8efbafbcfffd3f01133", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x30ba10cc269c59efed6ca72d79f32a579dfb71ac0455ac0067941abe9cbddeb311f1cc7b85d20442dfcd351a630a702c4d5bc507d92594a3a33a14a6d19703471b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x70B20209c83ec8D01e3c7F2ec77BDe7c40cDF2F6", - "project": { - "lastUpdated": 0, - "createdAt": 1673430905870, - "id": "10:0x8e1bD5Da87C14dd8e08F7ecc2aBf9D1d558ea174:45", - "title": "W3.work", - "description": "W3.work - Events and Collabs in Metaverse\n\n[RESHAPING THE SOCIAL EXPERIENCES IN WEB3]\n\nWHAT IS W3.WORK?\nW3.work is a fully decentralized social Metaverse built on decentralized social protocols for Web3.0 professionals, which significantly improves the efficiency of social events, business networking, and remote working for Web3.0 teams.\n\nProblems\nLack of IRL connections, especially when online events are becoming more common during the post-pandemic era.\nLack of security and privacy, Web3 professionals are stuck with Web2 tools and social media.\nLack of credibility and trust, especially regarding business networking and collaboration.\n\nW3.work Provides:\nA Gamified Metaverse for events and social networking - connecting Web3.0 organizations, teams, VCs, and creators\nA trustful collaboration tool of Web3 - empowering innovation and creativity.\n\nW3.work is a business social Metaverse.\nW3.work is a business ecosystem.\nW3.work is your Web3 network.\nNot just online meetings...\n\nStart a W3.Events anywhere, anytime.\nW3.Events ensure the quality of online events, while also promising the best and the most immersive experience for both event organizers and attendees.\n\nA typical event day at W3.work consists of much more than yawning in countless Zoom meetings and twitter spaces in front of your laptop.\n\nWandering through the W3.work Metaverse, greeting your friends with GM to begin a lovely day.\nWith conferences, business development, remote collaboration, parties, and other engaging Web3 activities, one day at W3.work couldn't get any more fun and productive.\n\nW3.work is looking for massive adoption in the near future, with the hope of bringing Metaverse and social styles together for people to connect and collaborate in the Web3.0 economy.\n\nConsider a small donation to help us keep building this beautiful Metaverse!\nAll early funders will be Whitelisted to the latest features and be granted W3.work Early Supporter SBT(SoulBound Token)!\n\nAlpha Version\nOur alpha version is out! Welcome to try it out today at: https://alpha.w3.work/", - "website": "https://alpha.w3.work", - "bannerImg": "bafybeiagsodjpcwdo7mraqe7pjxxmitvswr2oiskpeyw7fztfwnnou6lsm", - "logoImg": "bafkreihm4xrpmxrmd6kzw3sljpkibvzl4kgnvole4bkw7zbctiadvqbnqa", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreigrglwdp3swclvrqmv3ya5inrt7w6glldhqgnlesdqub2gbyho5my" - }, - "userGithub": "laborigin", - "projectGithub": "laborigin", - "projectTwitter": "w3_work", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x70B20209c83ec8D01e3c7F2ec77BDe7c40cDF2F6", - "provider": "ClearTextTwitter#w3_work", - "hash": "v0.0.0:29Wm0UpM7Qfbl2Rzc43mvWzazh75z3jVeCP0iCZ+/c4=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-12T00:25:52.571Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-12T00:25:52.571Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..s6oDkfprqsfZi_y-n2QvM5d7v1G7N4GC96hJlYzE3f4RGuxZQdHHmaEU0j-NvDfsGhjRJY8Utt3F022U7BVKCQ" - }, - "expirationDate": "2023-04-12T00:25:52.571Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "sC40KMx10/BEIqjBaqv816+bRukc4qKZieIw7l/UN0efHxQMUc7V/YlMl7MzqjC/", - "encryptedSymmetricKey": "414ea8b2d7ee5641577501edafc63ae11f5c1ec115d3ad3d9068a9b669a05e4829c5eebf72badc64ae3ab1f3c7ceec07c8d5ccfcfc9b97bba6982559737baaeb30b9ba5edf85e7b925fe04ea116f00d1972b5c8788b8ad4664c523cbe20505a9e2d09e630b8c9e121041c82c7d0b6762eb61d203596111f57d4475b4e17503910000000000000020e8a33d5a55bbd0e872fd6dab9701176e7712bf84007f7bacc2409b934c9b0b7a1a946bf76ce623051f4654becb8205aa" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "not funded yet" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "9" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/laborigin" - } - ] - } - } - }, - { - "projectId": "0x718ead66c1598336d76118607afea7d152b63b087e52f5b9c1f81398e4c06235", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x778be0bdfc096795a77809e8dc9cc2ec2394116aa23b8ac756badae078a29a147638d3feb848d6d9faea97c831c442640b6b6f5b712429212ccc48890aeb4bbb1b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x71c7252Cc1AfC181704ff7fDED27486f5cCd9205", - "project": { - "lastUpdated": 0, - "createdAt": 1673769530012, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:209", - "title": "Esteroids - a community .eth websites search engine", - "description": "Esteroids (esteroids.eth) is a community search engine for .eth websites! \n\nWhile the .eth web previously offered a variety of innovative .eth websites, it lacked the tools to collect, explore and showcase these websites to the community.\n\nWe, therefore, launched esteroids.eth in April 2021 in order to give .eth websites a dedicated search engine. \n\nWe see the .eth web as a fundamental piece of future Ethereum, and a community search engine as a fundamental infrastructure for this web.\n", - "website": "https://esteroids.eth.limo", - "bannerImg": "bafybeigkznh4rc7q2mbpffvo4ihvvkysirnbn7jkwvh5iieysskhwqvrta", - "logoImg": "bafkreiamvzdazyvxo7srsiit3x4zxsfog5suso633sonmwliaplh5ng5va", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreicmzgzzfhrgwmvdnthyn56khgymtpxr2kmgdel4beswgo76vzmw5a" - }, - "userGithub": "eyalron33", - "projectGithub": "esteroids", - "projectTwitter": "e_steroids", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "Cp62+6YSS0yjr/ROi3q1dueglhvdritDEN23u5UAJRZ7XWpRYd7207xpyPbJREq5", - "encryptedSymmetricKey": "6a8cf29ac0cde3ef5ea37a14e3fc6430c70f0e0804d432194e964c51d1d1e15027f4f60ed51babb0a12106554656551216c02c65299255fcc51adcca42ef5a5f22d76e12bfb62b49cd97bb1a5b542fb93215115e836c8d8fc7e6dcdfdcee9882ee9e0a01c89af886a36839f1713775c676e06e2969f873d4b66755a9ccf77e4500000000000000203364f4b3343a4cee24ce7290c3d17d3559ac32ce45e531de57f62e94a55b6d2ccc19f9decaa9e00613a27593b54bbb8d" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "None" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "2" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "I did on Gitcoin, I don't find where to do that on the Grants Hub" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/eyalron33/ https://github.com/Esteroids/" - } - ] - } - } - }, - { - "projectId": "0x723cafc421d4af9ade756bbc34dce5be178cd1262f716c2f0e9b155cd62fbb7f", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x639e482ebd3d370e1cb1c27a71a42dca664d54f7da864d9a666dae69b670857650b04669884d0b320dd75cb1c96d02a7ee543b61fe702c4cd7570b5cd4028f921c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xD9A52b6506743cF5fAFf14C875cB443da9660e00", - "project": { - "lastUpdated": 0, - "createdAt": 1673561866497, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:170", - "title": "Surge Women", - "description": "Surge is an organization focused on educating, on-boarding, and securing women's place in Web3. Our mission is to bring more women to Web3 and ensure they help build the future of the internet.\n\nThe Challenge\nLess than 5% of crypto entrepreneurs are women. We are here to change that through education, empowerment and job opportunities. \n\nOur Solutions\nWe develop educational solutions for women, newcomers, and organizations, providing them with the knowledge and skills to unlock Web3\u2019s potential and drive innovation.\n\n1. Surge Web3 Content Hub\nThe Surge Web3 Content Hub is an open-sourced space for easily digestible Web3 educational content, focusing on simplifying the technical and social impacts of blockchain. \n\nWe have over 45 articles on blockchain basics, investment best practices, NFTs, cryptocurrencies, articles for devs, and others. Additionally, we\u2019ve gamified our content with interactive quizzes, a fun crypto dictionary, and several articles translated to Spanish for our Hispanic community.\n\n2. Surge Weekly Newsletter\nWe deliver a free weekly newsletter breaking down complex topics, cutting through the noise, and delivering summarized crypto news for our users to stay up-to-date. \n\n3. Surge Passport NFT\nWith the mission of onboarding women into the Web3 industry, we launched the Surge Passport NFT: a golden ticket into the crypto space, offering opportunities, early access, and discounts to token-holders through a one-time purchase.\n\nSold out in less than a week, the Surge Passport is a collection of 5,000 hand-drawn NFTs generated through our custom-built generative art algorithm. Since launch, we have built a community of over 2.5K unique owners who have claimed thousands of dollars in value through their Surge Passport NFT.\n\nAdditionally, because we experienced the difficulties of building and launching an NFT project ourselves, we have spent the last year publishing resources to making the process a lot friendlier. We have created articles describing NFT smart contract development, how to build generative art algorithms, how to market in the web3 space, how to build community, among others.\n\n4. A Web3 Infrastructure Course\nAfter researching our community, we realized many are craving a deeper understanding of how blockchain technology works under the hood. That is why we created the \u201cWeb3 Stack - Crypto Infrastructure Behind the Scenes\u201d course. \n\nThis course is specially designed for people working in non-technical Web3 roles, as well as Web2 engineers looking to understand the Web3 infrastructure deeper to make the leap. Students walk away with a firm grasp of blockchain technology so they can excel in their Web3 career. \n\n5. Surge Jobs Board\nOur Web3 Jobs Board pairs 250+ vetted female talent with some of the industry\u2019s top organizations looking to diversify their teams. This is a key part of our vision in securing women\u2019s place within Web3, as we provide organizations with hiring opportunities directly from the talent we\u2019re seeing rise in our community.\n\n6. A vibrant and supportive Discord community\nConnecting women and non-binary individuals in real-time, our 8k+ Discord community is filled with newcomers and experts who support one another through our crypto learning journey. Strategically built to be a friendly, welcoming and inclusive environment, this is the digital home for the Surge community to run initiatives, share insights, and collaborate synchronously.\n\nThe Future of Surge\nWe\u2019re laser-focused on bringing more community initiatives to life and providing even more value to those who have trusted us with this mission.\n\nAlongside our many initiatives - like ecosystem research, Twitter Spaces, articles, investments, and community projects - we will now be heavily invested in developing open-source educational content for individuals and organizations to learn and scale up their Web3 capabilities. We invite anyone who shares our mission, including our male allies, to join us in making this possible.\n\nProviding free, easy-to-understand educational content is a huge challenge to solve, but we are confident that with the right resources and like-minded individuals, there\u2019s a lot more we can do to solve this imbalance!\n\n**Support us and help us secure women's place in Web3. Your donations will be used to pay our contributors, purchase tooling, and continue to fund our educational, research, and community initiatives.**\n\nFollow us on Twitter (@surge_woman) and join our vibrant community!", - "website": "https://surgewomen.io", - "bannerImg": "bafybeiek6bxyrsnsze36mosh7zp46zt2llzaynm6phcp77ufnw3i5nypwe", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreic44ahyal5nt5jl4zdxg4dw4twpo2k4tyr4kosofr6sa2txdyfzru" - }, - "projectTwitter": "surge_women", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "zs0pNLTjpCgYI1OCW6dSYX3ucHC/K4MD8o+y1GR5+6U78ZhhFRcb9QmCbCzqA9qX", - "encryptedSymmetricKey": "1a6d9361b171d6daddcbb985c9e2660d6300bd5a0928f27ecdc8cb57dba386fe12c0e1e6988aefee051711b97ac4230368b7389e19042c1e8169db7dcb1d6ed22e1326df471358d4b49693105040569e2bcf107fe9b7a24bf8ce5fb6826cc6b75450463970fc7926e054d6ca3ed70f658bc271a6964040fa61d2d1c9c4e1702a0000000000000020530d855f91d6cafc82be590f130b98be34cb4f49d4623784e5fcf537175b4ad94befd75233ea4e283b0659e90b747e85" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Gitcoin Rounds, NFT sale, profits from course sale, ads in newsletter, and other grants." - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "5" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/juliettech13, https://github.com/Surge-DAO" - } - ] - } - } - }, - { - "projectId": "0x76667ee469d4e3b8dcbca33d612ebd437cceb3ffc8aab8908a0e0f5fd94248c3", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x917e594fd0af8a5db8c71c48877858088b745aa787a8d15b083d04ad55ceaaf17007477eee3f4335d88130254c28a065e4e4a03c4391ee95c146eae6662c75ad1b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x4aF147188bfE1c02D18D752eD5E473d8394F2300", - "project": { - "lastUpdated": 0, - "createdAt": 1673429798627, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:119", - "title": "Fileverse - file sharing & collaboration between addresses", - "description": "Your tool for file sharing and collaboration between addresses. Private, easy-to-use, and on-chain.\n\nFileverse.io gives you a taste of the non-financial, stress-free side of crypto. It\u2019s a simple on-ramp to experience the full extent of the web3 tech stack; all from the comfort of your wallet.\n\n\ud83d\udc7e Use Fileverse to:\n- Store, encrypt, and share multimedia files \n- Create encrypted chat rooms with your on-chain friends\n- Token-gate your files or chat rooms using your tokens or NFTs\n- Create & airdrop unique access-tokens (NFTs) with custom metadata (name, image, etc.) to any address(es) to token-gate your file(s) or chat room(s) \n- All for free thanks to Gnosis Chain and Polygon, while you and your friends can stay on Ethereum!\n\n\ud83d\udc7e Fileverse Solo \u2013 Experience the social web as sovereign individuals https://beta.fileverse.io/\n\n\ud83d\udd11 \u26e9\ufe0f Fileverse Portal \u2013 The new dApp is ready! Time to challenge Google Workspace and Microsoft Office together! Send us a DM or email to beta test it \ud83d\udc40\n\nAll this was possible thanks to your support during GR15-4-3. Thank you for making us one of the most successful Gitcoin grants!\n\n\ud83d\ude4f You can also help us in other ways.\n\n\u2735 Star our Github repo: https://github.com/fileverse\n\ud80c\udda3 Use our app and tell people about it: https://beta.fileverse.io/\n\ud80c\udd8f Become a contributor on Fileverse Github. Build your own Web3 portfolio by supporting public goods!\n\ud80c\udd5b Follow us on Twitter and Lens: https://twitter.com/Fileverse /\n\ud80c\udcd5 Donate to Fileverse: 0x4aF147188bfE1c02D18D752eD5E473d8394F2300\n\nIf you have any questions or want to say gm, feel free to follow us or contact us \u2013 https://twitter.com/Fileverse or hello@fileverse.io\n", - "website": "https://fileverse.io", - "bannerImg": "bafkreia255oe2ajuok7cep3sf5rw2ibpxwzcee54nemn5ur47mp3mjzija", - "logoImg": "bafkreigt3qmgeveme5vc4rnengowys7chc7mt5gw4boczj4evcglyuvinq", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiejmq76xzhqkan5eznal3dvcto6leqabfdxs2uobpuhe7snhmij54" - }, - "userGithub": "vijaykrishnavanshi", - "projectGithub": "Fileverse", - "projectTwitter": "fileverse", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "VOb2qVntURJNKZ3VxkuYSI6VgezQb1++QXQ1dOeaphHlHSfymtR7p+2dH1Kjw2c3", - "encryptedSymmetricKey": "5345095bbaec1d7816eeb98d8c2647b6bb9a70777a88a83900e0907e7d4ef52a44b339c1ae415a78a1bc9410b8611205e7d9b1242219c07eec1e31ca27b71ed3c0749bc5b4a1b7803a06ed81aa006a84be7ccc251d5d4650fb8dfe72eac4c2a6342b4935e6efde8a7231216bfa2684da31dcdbba1e57355f09d25f234edfd47d00000000000000204f9823ce8458513203869080e4f7ce86200486908270b6078438eefbbbb989cebee340a60b13c3b1c036017eebf04c96" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Donations and grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "4" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Twitter yes. Github I get an error message (emailed you about it)" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/vijaykrishnavanshi and https://github.com/fileverse" - } - ] - } - } - }, - { - "projectId": "0x797ce348134caaa5a5605ebea6ad5396d287397f1be9b899812b10edc7707b20", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x10de921ffcf77ef9f1c011cd9be8ae355528584c48f0e417e0bb48dd28fcb6c20564e981c25ce3dbcf017dd984ec6fc26123f682b9f25012f127ee58899d9e0f1c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x629e715dB365FdBac0a61330cbF256237dcCDcB9", - "project": { - "lastUpdated": 0, - "createdAt": 1673040982980, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:50", - "title": "Share", - "description": "Share is a decentralized Web3 publishing platform where authors can publish articles as NFT and readers can interact with their favorite authors !\n\n\n\nBuilt with Lens Protocol \ud83c\udf31 and Polygon Network \ud83c\udf10", - "website": "https://theshr.xyz", - "logoImg": "bafkreibuuhckcc7mkhw45ru4tvpcohppzu3s6yrvz43xvbrk5tlgupt3ka", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreidk5k6ekzi73kyirx7f75orh4kiidrahyzsam6nsrz7fgz4rz2l6q" - }, - "projectTwitter": "share_offic", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x629e715dB365FdBac0a61330cbF256237dcCDcB9", - "provider": "ClearTextTwitter#share_offic", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "hash": "v0.0.0:n/+iZaRum8JWZ2LS/c3Fxt7bhGScn6AyRSSdhm4zD3g=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-06T21:36:07.528Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-06T21:36:07.528Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..fFYr5NT4hIzEj2nv4qTbVTquD7UAtxhHDfflO0NNJPpuKDo7MMHiPIt_7GU6L3r1XjbrxfulKk9jNiu2N0fYBw" - }, - "expirationDate": "2023-04-06T21:36:07.528Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "4xDwGSputthnEowWk6drfMWNw5boeFtE9LxxCiZm8cee03OnIvrRKBOfYbbGTu6D", - "encryptedSymmetricKey": "1bae5bd9755150bf118edfff0a0df4ac7c568e05e182bca5a01cf872fcbc41aeb70ca01da3d178b7f376a4b7294d941445d7bae5ac4565fbaadca45eb392313bfda77199f31d3f7edf0cf49b8c53865fe5a11cd17df4e03f043be9a220dd5da4860a57e74de7b3e85a280faaf7fb9fdde95b8ee7271bfedb0e73737a657be97500000000000000205841478a8195c48ac44c2579dd283acda6708df3b906f68ebae32c453aec5a1c5f20d2421a369b2ed4220590fff36084" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants and pre-seed (10k)" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "2" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/BellangerSebastien" - } - ] - } - } - }, - { - "projectId": "0x79b218176d10d2bfacebaaaa267078d4f1b4e6865716863619a0ab257456fe47", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x22015992a2f785cb5b75d5b1e8bdef146e9d13909e07d6070e705dc433f289552c02c92e8ca18cd54e049246749735f38b0c0ad4a67a5681992b264abcc7c9f21c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xA8A4912938549d50EF3E7c698C890E18D73408Ee", - "project": { - "lastUpdated": 0, - "createdAt": 1673895709276, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:228", - "title": "The MoonMath Manual to zk-SNARKs", - "description": "Most explanations struggle to clarify how and why they work, so zk-SNARKs remain somewhat \u201cmagical\u201d and elusive, deterring developers from exploring or utilizing them in projects. Resources are scattered across blog posts and GitHub libraries. This results in a high barrier to entry, thereby slowing the widespread adoption of zk-SNARKs and associated privacy-enhancing technologies. Even worse, implementing zk-SNARKs without understanding the fundamentals of how they work increases the potential for security issues.\n\nWe want to change that with our MoonMath Manual to zk-SNARKs, designed for an audience with only minimal experience in cryptography and programming.\n\nWhat is particularly unique about the MoonMath Manual is that it is designed to enable users to construct zk-SNARKs using simple pen-and-paper computations. Throughout the manual, users are encouraged to complete exercises that ensure they engage with the foundational building blocks of zk-SNARKs. While doing that, readers build the smallest possible \u2014 but fully functional \u2014 cryptographic stack to compute zk-SNARK internals without the need of a computer.\n\nAs users go through the manual, they will grasp mathematical concepts that are not only used in SNARKs, but also in other zero-knowledge proofs and cryptography more generally.", - "website": "https://leastauthority.com/community-matters/moonmath-manual/", - "bannerImg": "bafybeift25qgrwazy7vkobmsm3n2bwlswtcivtoadvfojcceluxobqwskm", - "logoImg": "bafkreifj2gcizc2756enj22latephx2wo7p5go4wzxonnvzrzwp6eb5tcy", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiaa5wks5hpq4ywkfx6464pghtaf7zxsdhdxi4j2ubxxudlu5rp5ei" - }, - "userGithub": "Liz315", - "projectGithub": "LeastAuthority", - "projectTwitter": "LeastAuthority", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "Mmlt9Wa+TIupepReLGIeIM5NF8FMcUC33h2dhX9+yFxoAWoN24KUb4I5/DqKkb01", - "encryptedSymmetricKey": "37a024df4434219a8897a1db9cf72b14555ce222853aa9bded3f80f73d67f628952c3ad1a4c68b2a094ce39ce5b78111b567f2c141a9af7d45d8e17b99569b3cd03447866b7fa3ec446043ca956107c7280eb0e0c09fa81f4eaffff5213864b8e5f0de262a92e2ba0e241e520c81ca21cb6c0dde9182bf65c89c0ebcbb896aad0000000000000020a1627f42b0c3ab2b661769cdce8b421d1a7059730234449f92e1d8cf605347c3c780d11fa110d6fdaa5076d1c41d838f" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Least Authority TFA GmbH, Gitcoin" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "5" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "No and No" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/Liz315, https://github.com/LeastAuthority" - } - ] - } - } - }, - { - "projectId": "0x79f3e178005bfbe0a3defff8693009bb12e58102763501e52995162820ae3560", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0xd310934f58c0f87da7251b9b43bacf59e304118a482f044fd0845e04117f15db4473be9d53161926314ff1d580d61729d9755f0c80021630fb4297091565a0731b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x7b736FE138775D1fCD2CFE4E1D6158BfF3a2F28e", - "project": { - "lastUpdated": 0, - "createdAt": 1673815725545, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:213", - "title": "Forta Bots: Funding & Money Laundering Through Aztec Protocol", - "description": "Most attacks begin and end with the use of private services that allow funding or withdrawals without revealing the sender and recipient. \n\nThe most popular service among attackers of DeFi projects was the Tornado Cash mixer. However, after it was blocked by The US Department of Treasury, other projects will likely take over this niche. Aztec Protocol, which is a privacy-first zk-rollup on Ethereum, could be a potential such project. \n\nProject goal\n\nTo improve attack detection in the Forta Protocol ecosystem, develop two separate bots to cover both the account funding stage before an attack and the money laundering stage that occurs after the attack is performed.\n\nFunded Account Interaction Bot\n\nThis bot detects when an account that was funded by Aztec Connect interacts with a contract.\n\nThe severity of these findings is low, as they do not indicate malicious activity. However, in the presence of other suspicious activity, they greatly increase the accuracy of attack detection.\n\nMoney Laundering Bot\n\nThis bot detects when numerous large transfers are made to Aztec Connect, potentially indicating post-hacking money laundering activity. All user transfers are summed up within a specified time and checked for exceeding the threshold. The severity of such findings is high.\n\nThese bots will work similarly to existing bots for Tornado Cash, and I'm sure they will be able to increase the accuracy as well as the number of detected attacks. \n\nAbout the Author\n\nI'm a Ukrainian developer, who has been developing bots for Forta Protocol since the beginning of the project. You may have seen me as a frequent contest winner as well as an active member of the community. At the moment I developed 19 bots, some of them are in the Forta Threat Detection Kit.", - "website": "https://github.com/kovart/forta-aztec-money", - "bannerImg": "bafybeieomrts36o3p7oihtlbqup2zdlugmf77ewxg7eix3gpunymm2q6iq", - "logoImg": "bafkreig2qp4nfb7tf2pjugznszykzpbk4eacrquglpxvooncwc252tungm", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreie5f5r45o3iipwclp2z5sn3b32repids3vv7cpppxbg4m6aaf5zk4" - }, - "userGithub": "https://github.com/kovart", - "projectTwitter": "kovart_dev", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x7b736FE138775D1fCD2CFE4E1D6158BfF3a2F28e", - "hash": "v0.0.0:It9lxqJk6UVkZ40xHR1g6QuLkkg+24NZle9CVuvu3/k=", - "provider": "ClearTextTwitter#kovart_dev", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-15T20:32:27.042Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-15T20:32:27.043Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..PxpMIAXcWtcE_hbtdYpqPDu8XRNV66QtLWFqkNAI5a4udy5zF-G_pGjoQflEWmy21FrW4-A5N08S0kcw2sVkAw" - }, - "expirationDate": "2023-04-15T20:32:27.042Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "LKw4gdo8fERRCM3q6+sDRG2KgPUcH+Aht3eBK7iBAUlX7u7oc0rmAtvjngLfO2iW", - "encryptedSymmetricKey": "f3f76b81f5dcb326f8413298ffea7adf5f5c9629188cdbd42e20f1da450037a952282a9728fae32062de9edcd4dbb6164ad2f08f9ec5e51291afb864567c5da981fe53b59f4c5dffaa6bacc33138ed69c05aa8a9241717d3fec249c3230a8295f3acb08682341e3c0cff0abc087d3fcaeea39514215e83dbdb156ed05eaf078500000000000000203e4f1b6c5ec15c9b350ae90fdadc267e33cc1a0c48aecdba57ca12a43654120c30cc24fd64840ac99570744f6699cf8d" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "GR15; none at this time." - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "1" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/kovart" - } - ] - } - } - }, - { - "projectId": "0x7bb77e89022db7997754ef378a7e6f0270cba4eebaaa23d29cc00cc8510c8593", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x1372c15f2c4d548083612625d66e353bc2199e9e9e87ce6cf3aed2b16d840d6635e8ab33704957402adbf300823b1e3323cf75c453459c9f9de8c2e79b5d44e01b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xf7FeA1722F9b27B0666919A5664BaB486a4b18D3", - "project": { - "lastUpdated": 0, - "createdAt": 1673603579051, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:177", - "title": "Rings Network", - "description": "Rings Network is a peer-to-peer private communication network, enabling users to interact among Web3 and Web2 applications.\n\n\n\nRings Network is based on distributed storage and aims to establish the basic ad-hoc & end-to-end network infrastructure for the next generation of Internet and Blockchain.\n\n\n\nWe want to reduce the cost of Internet communication, enhance the privacy of human connection, provide an excellent environment for the development of personality, pave the way for the transmission of knowledge, return to the origin of the Internet spirit, to deliver freedom, equality, and love.", - "website": "https://ringsnetwork.io", - "bannerImg": "bafybeicphsos4i4bzbqfns4mmrurkfzfjcq2ujetrv46gqj3w7fcaah7ga", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreicxb64n5dfht6pxoprcbbf34nuweuocvsy6f2lvlhrantyt7ksks4" - }, - "userGithub": "croath", - "projectGithub": "RingsNetwork", - "projectTwitter": "https://twitter.com/RingsNetworkio", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "USFeOcyOZVYTXB13+i2bcuXYkd3FayIRVvQKb/p2VHxOfO0iv9LUFxTj4AWQu7TN", - "encryptedSymmetricKey": "38838bf050f33546b256e6ced21fe6a77937bc13cebbff8cbb6a993d78e9ca7e49cac989fac7da24a658b84f501c2815cee05927c426654d8f2a4d56d849a059e6d7bcc90c0b4f48688c71e7caab997bd9ddf7b532c8700aa12c17e09aa55b977fdeba044838936fcef518ed5e33f2e4811f3e1414fa97e3e52ddf47d883abf40000000000000020be68a9469422c5d8e3d915ab7243b97661e85a9ca3f791a511fd2519849ff1f8f5a354b5369622d32868c751fbf4a6b4" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "No funding" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "~10" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/croath https://github.com/RingsNetwork" - } - ] - } - } - }, - { - "projectId": "0x8029c7cda58d70a6cd81ac56a6a678e8ccfb560f153eb86b1f5b5c3ca4566e82", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x5567c121f1abed311dc2918d5b938d5ce2d1b64255b3f6d6b1ba49fe03c7fb151000f563c263984332096fc8d3d611b8a8da2018808fd8ec6c937598a9ff51d01c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xFe97E32a873AA2f926FBfc560AbEEf01f753C128", - "project": { - "lastUpdated": 0, - "createdAt": 1673644026138, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:195", - "title": "Soul Wallet", - "description": "Next-gen Ethereum wallet for everyone.", - "website": "https://soulwallets.me", - "bannerImg": "bafybeig7ymr6ef2f5blnio4tay4euia5njey2axs55t7hw64qqxldmuzdq", - "logoImg": "bafkreigftrbzy3iqvzjz7folx5jfxirftwrfabtw5qmzb5cnoipolfcffq", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreif2p6j64xwecqzbkostgqbsioecerox5ew4z65zz5am6csoxrx5s4" - }, - "userGithub": "https://github.com/proofofsoulprotocol/soul-wallet-contract/blob/main/contracts/SmartWallet.sol", - "projectTwitter": "https://twitter.com/soulwallet_eth", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "9CnpJz4dJWZ3KP2WAg+maoVILprEck7jfWrYzLfpKiJ5hkFP7xdUTwWPqp78IYmg", - "encryptedSymmetricKey": "5a849432d5663ee11bb75325894a873ea79f4ba50e306776e91a9c274ca483d10a2ed5976394f34e43a1bc5f559f840cea04f6136f62602b1cc7d6b8c4e5a20cfb1ce8c09c1ef8f79e1b0e757e72441b4c6143f531b1ec9d788d90312dc759a1b19fe7e580d7a23b88a290537d7dc1b00414804b637af8d877dc0e8f825881c30000000000000020926399fdc4c56942cb6ab1a13f58afc2334eea068dd573759ab545ce56b327efe4e66aec146e4ca041148da7c1f11288" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Ethereum community and VCs" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "10" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/proofofsoulprotocol/soul-wallet-contract" - } - ] - } - } - }, - { - "projectId": "0x816250172a2aef95d8221d37ea7cb8a7691112478e3e8ebf1a87934a8c419df4", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0xd3eb2a6a141456d4a350d3cd59673876316b6c7d132f5569577671fd070f654d198bdd79c3b2254a75da540d07427f4b20d573cf7c829cd812162bc18b8151371c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x3EcB9640ea6cC9bd9D5040713F854634Fd0FCf8a", - "project": { - "lastUpdated": 0, - "createdAt": 1673923097627, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:236", - "title": "The Science Commons Initiative", - "description": "The Science Commons Initiative is a non-profit collaboration aimed at increasing the public's access to and participation in the scientific process. We find, spotlight, and fund technological and other strategic infrastructure to help scientists and researchers solve some of the world's most pressing problems, with an emphasis on engaging the public. We seek to make long-lasting changes to the way science is produced and communicated so that it is more open, more democratic, and more optimized to benefit the public.", - "website": "https://thesciencecommons.org", - "bannerImg": "bafkreiczzgxijlvy7jsplqvis3xf5xgv24moojckpls76nap6lxkx32nxe", - "logoImg": "bafybeigmqyg33ksksjvmxde5rf5rkpolrn2ve2nqk2mkpcny4vzui6kiay", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiarhlgpruiqsga4vhrojefjxk3mljrl7r5ceiious6zluwfyowtlq" - }, - "userGithub": "makeasnek", - "projectGithub": "TheSCInitiative", - "projectTwitter": "TheSCInitiative", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x844374927E7cE7E3F645cEC2226F8BCb1227B2B5", - "hash": "v0.0.0:zmwqMw3mgDAYZnYg3I7MMQeAcjDMHI7926pUDvOJqIs=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#TheSCInitiative" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-17T02:37:36.406Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-17T02:37:36.407Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..HH7dXzfe3iQLqvGxA43hSt7cmb6wXWmuGinSE1LkmhI_4oPGkzxLjogun-SfOoed-xCMij4q3dQkqhqr9Dn1AQ" - }, - "expirationDate": "2023-04-17T02:37:36.406Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "2OODBiKwYJ31Nk3x4n8/cTUF0SHC5IP2fjBsEyZkxc/eh8E/qTfFJfFGmxQ2TCXP", - "encryptedSymmetricKey": "28acf4b14b17f0e292d5b9ff66f1d2df2004efc85e2650132edd2ffe07320061b51cafaa44df7e4002b5413ee4ba5f0b7ad50c5d6b7c97e20327d6342ac5873ef46ec9518f23946def002fd7113313231e6236a0b6357bf972fda10cd128d389b30e908cb5a4b1971ace677c3abe1c20eee5992dab5b2779bf55c8c5fb3acb4c0000000000000020155d3ae96ca8ec54df6b0e74d5f094da8c276df703620a8c23c35e742a418bcd4b96612f784678c44b4e6a564ddee78c" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "User donations, previous Gitcoin round" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "8" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "User: https://github.com/makeasnek Org: https://github.com/TheSCInitiative" - } - ] - } - } - }, - { - "projectId": "0x897a0fdeaad82a291d4b6e3d8f408cbdfd8661d8f6f3783caac13f249d5a4544", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0xdfe5535d571ec56becd8642c9cece11974b75f99a25fa6b7afc60c368c24cf324009a9db746d6e128150977e84b6bb12e8e3c92aad426e85653ffb6bdeb605c61b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xC99C2204297b15cdDE4B0A08b62bEcF4f10DC6dD", - "project": { - "lastUpdated": 0, - "createdAt": 1673047718765, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:55", - "title": "GalaxChat", - "description": "A protocol for creating social tokens based on Ethereum addresses, enabling group chat and anonymous peer-to-peer chat\n\nOfficial website : upcoming\n\nGithub : https://github.com/GalaxChat\n\n\n\nGalaxChat will be structured to develop into a fully decentralized protocol\n\n\n\nIntroduction : https://docs.galaxchat.xyz\n\n\n\n", - "website": "https://galaxchat.xyz", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreibbsgno3fk2rwx63yviigcucbceud23nggimiged23svg35uw5dre" - }, - "userGithub": "TraderGalax", - "projectGithub": "GalaxChat", - "projectTwitter": "galaxchat", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xC99C2204297b15cdDE4B0A08b62bEcF4f10DC6dD", - "hash": "v0.0.0:mzgmqmUgKRHGAdjfgrEFJ3MWoeM0CCsQxHLx4vNGKaw=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#GalaxChat" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-06T23:28:29.964Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-06T23:28:29.965Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..ooXzl9hLDcOiflem-0ctxxJVMvVUukaW4ID-MrVN_UxWVLcJtcduvMSSol5Vrho1ELcBXhXsCAHxv5DIpenPCg" - }, - "expirationDate": "2023-04-06T23:28:29.964Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "5neka4RJgPZ5EJJIAqHph0zo5THJKUz67CUNRJIgVClTJBMqjfeoSKz98EcDfOMl", - "encryptedSymmetricKey": "612ae56d36bb623750654f7e6f0c2c6c6bbfbe4cfd197637cc45274b3b8df8d1db6d9930fae5d3decb02028638ea3419a44577049735d3bc74fd40e53b5d2a28343aaa9ad745b948c2dee100373a75a8fe17c28c0d681a7731e8f58d0d2b728f6518557e591b0eccc98f40105f3e82537638e9bcc5e4ca3445d216601b4484140000000000000020e86c3a39b8add903ab4d58b1a25408db1c234f8697c95eb2853c7fcffa3b8f73ba8e8514f3322500f2cd449760c4a5ae" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "none" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "3 person" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "yeah" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "confirmed" - } - ] - } - } - }, - { - "projectId": "0x89a0a4ae11c70d1fdb328d25d16c56c49949d679ae17c22b3858a4bfdf9712f7", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0xa003cb81e9af357c8e1b42985fe1af8451e70f4dcaacd590ebeaff5119c5215442f801677fe41d9f080abbc55050e498405f39e1a97c3f72fca15968f2e5ed851c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xBC0b437C95c7165F7d1F7C966cb2227DA52a27d7", - "project": { - "lastUpdated": 0, - "createdAt": 1673519122561, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:155", - "title": "Kredeum NFTs Factory", - "description": "Kredeum NFTs Factory : Mint it right !\n\nThe easiest way to create you own Collections and mint your NFTs\nWith innovative features like AutoMarket NFT and SoulBound Multichain NFT\n\nA powerful factory composed of 3 different tools :\n\u2192 the Kredeum Dapp, a NFT Wallet giving you access to all your NFTs\n\u2192 the Kredeum Plugin for WordPress, in order to easily sell your NFTs directly on your website, just with the help of WordPress shortcodes\n\u2192 the Kredeum Smarcontracts, with it's smarcontract templates, using the new OpenNFTs component library, to create various NFT collections\n\nAvailable on multiple blockchains: Ethereum mainnet, Arbitrum, Optimism, Polygon, Avalanche, xDai, Fantom and Bsc\n\n\n\nHOW WILL WE USE THE FUNDS RECEIVED IN THIS ROUND ?\nWith the funds received in this round we will expand Kredeum NFT plugin, to enable the creation of your dedicated NFT marketplace on your WordPress website.\nTo allow you to sell autonomously your web content \u2014 images, photos, blog articles \u2026 \u2014 as NFTs, without the need of any global centralized marketplace.\nYou will be able to control your sells, with the options to define and enforce royalties\n", - "website": "https://www.kredeum.com", - "bannerImg": "bafybeiamr566f5gx3wxom6ah3rpbmyffxggros56abxmdqnqhcaay34ujy", - "logoImg": "bafkreigeogscmsbmcey4mu7xl4tuu3gnnrryhbohyyfywoo6xvdrherqne", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiag4jmq3mwudfzuijwheqtd2qia4mtkbfjtpcctuya57cwze6dgey" - }, - "userGithub": "zapaz", - "projectGithub": "kredeum", - "projectTwitter": "kredeum", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "e1FRsdvSChz62O7lNpVWO+dICAwlrdeyhTP5TpRJt194uVBCsh3HL+fpJP/bRGEU", - "encryptedSymmetricKey": "4e272841a3a548e84bda09af99dbb61cfb321d42733b22045d5138509470186f559fd3f75501a21c628ca07ef199b0190c952567d9821255a01797227a00ac486ff888489c41390e9493f291abe6b5d5fe95969b211a334b0cf50efb4e07dc8443de831323ba6084a0f5b0f1d7cce8109729eb06b2eff4d8437840e9c0ae914500000000000000204fd2cea11cb0cb10c0fb3f9cb1ad18a4fa036e992556f7c5a3cfbd06425eb14588ceae3635a42dcb7116ab740aca858c" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "5" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/Kredeum https://github.com/zapaz" - } - ] - } - } - }, - { - "projectId": "0x8b4c72d7b905fe5f514970024119ae06c4d97a5b1a1a31bfa3dc73b222aa370b", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x5b4bec8c2f2855c63c9f8885319ff2d16f437ba0df33d57dc4ed95710734b11b2dcb81c775d53bc5e771c39c5153328af79c314b93a0a7337e93d69134f48e201b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x79A9c3aEE79793c2873E6686C22EBf2311778C19", - "project": { - "lastUpdated": 0, - "createdAt": 1673601188109, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:176", - "title": "Scam Sniffer", - "description": "\nHow to protect Web3 individual users from malicious websites is always a massive challenge due to blockchain\u2019s native nature of anonymity and immutability.\n\nScam Sniffer provides two solutions for the community:\n\n### Chrome extension\n\nProvide real-time protection through the browser extension for individual users. It covers many tricks used on many malicious sites, such as:\n- Fake wallet for stealing seed phrase\n- EIP-712-based malicious signature request (NFT Listing, EIP-2612)\n- Honeypot NFT detection\n\n### Scam Database\n\nWe have open-sourced a blacklist since a few months ago, this blacklist contains the most-updated malicious domains detected by us, It can help products like wallets block these sites proactively!\n\nIn only a few months, this blacklist has now grown to 17000+ domains.", - "website": "https://scamsniffer.io", - "bannerImg": "bafybeihe2ybkbnq7e2fag6k7ky72mq5tgmx7vvdsh2uvefytjomlicusii", - "logoImg": "bafkreiff67w2l7zqset63dnynx2extns5lslacclk7avxscxwcqcae5jvm", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreia6xwo5yjf632bwje2tuwcycawqaclpeseyzs6iyawxi2xnkhsj4a" - }, - "projectTwitter": "realScamSniffer", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xEf0D8F546880d1D41e7F35c5BA06a43C7F42FF2f", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "hash": "v0.0.0:iuCNPXm6Yh2Ee2CBcUMDgeyBJ+U3ssaY930F12WWkJ0=", - "provider": "ClearTextTwitter#realScamSniffer" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-13T09:02:08.682Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-13T09:02:08.682Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9.._f-c-HUz6uMhXr-Ctm45bZLPhfPr1XkCuyDm_XOow8fQ-ppFtGXKXmB5MUCvYL39iEubh47pY8nPG6sN9fNqDQ" - }, - "expirationDate": "2023-04-13T09:02:08.682Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "2fia9wh/Cw3tPzAp+oMZeSBMbktyJeeNFjeC/f2AfrwwCLCvvkQy6OHE9ueF0biM", - "encryptedSymmetricKey": "c76d4ffc4c9de4a06deab48ffe7dea0ef07c8cfe1babd5a00d29be443b022077d4e99d2c9e55475c6ffdfd0270bc55134b88c7b72b9ab5463feabffc8e2e379e28d2be6355fb07d8d95a87cfdf5df325d0fcb6f392c7324756c67eee9f3f6480263d9edd0f749870cb76ed61d86b4d7880114d1a27031b8021e19a806003c88a000000000000002013a9f1694dac234a7581053005d9977e3458e77c8dc8f9626c3fa3aff9954f6a3a58dad4df121fd81f3b375d44f15da1" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Donation / Grants " - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "5" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/scamsniffer" - } - ] - } - } - }, - { - "projectId": "0x8bfbc23e9c7e4fcd27ce3941ec7fa3e43c1bbb6b0856dbb6baa08a1347349624", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0xb30d40c1636632fbddac7d59b0c3b27d00a9b396d313b1ce413f8fc75c93df49232b966bc27c245f5965ffed3c965aacda5419a81a91d92c5ea1ca14a70d2bc51b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xa053473DDa59994682F8e96990ffc36aa982782b", - "project": { - "lastUpdated": 0, - "createdAt": 1673037406834, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:44", - "title": "zkApe - Newsletter about zero knowledge technology", - "description": "Staying up-to-date on all things related to zero knowledge technology in the crypto world, zkApe is the place for you. From project updates and developments to interesting publications and podcasts, we've got you covered. Plus, our goal is to make this information as accessible as possible by offering content in multiple contents. Stay in the know with zkApe!\"", - "website": "https://zkape.substack.com", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiaeu5r76edcbrvmlgbi7c6todktjrrz24k5mz535dy7drmadpryky" - }, - "userGithub": "0xarmagan", - "projectTwitter": "0xzkape", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xa053473DDa59994682F8e96990ffc36aa982782b", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#0xzkape", - "hash": "v0.0.0:qdvbEU4EAmK50S5ZoBE02eRkQ1wAzqQVqPjKkqtOW6g=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-06T20:36:15.334Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-06T20:36:15.334Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..YzzXH1vSPJw8O66ffF94l16EeURanNLHl5q9mmo9GYUtYfFisotxF5HtBmHgapxk_v1k182dNy0Bn95fF5yzAA" - }, - "expirationDate": "2023-04-06T20:36:15.334Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "VPrEhvT3xr7SG5C3lGq93wu7dTr8WkICLtia1PNTMuE=", - "encryptedSymmetricKey": "074baf2692458bca499a99c4764513dda54597ce1f298202ba31188b8dad372b328b65dbd455ecee60b7e8d3c9efd115fa15b98a3c12cd89ecdf40f323b58a2177a719868e6ad529d74bab5ee1ea4ecea78c2a5594e4e7caa726316b03b012a0e9fee53bb54e3fbb45881ccefd69b99bc178cf993f545fb1645c330f779c937a000000000000002016494232c98ffcc7dfa5a6a9d175767051d516140d759e37413b4c69f14251aba474db217534cde11d1d58d2b14edea6" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Gitcoin" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "1" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/0xarmagan" - } - ] - } - } - }, - { - "projectId": "0x8c30a64d3fecb12fbe7fc16681bdb8cb7cb2495051e06bee07388bbde6848149", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x402d06120d3fd89355338af9eb7121cffe2afef4d5aed7c9e86b334599553f9d710fe679e163480215eb9667aa02aaff0463554cba139f8b8a9594521507e8101c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xB25C5E8fA1E53eEb9bE3421C59F6A66B786ED77A", - "project": { - "lastUpdated": 0, - "createdAt": 1673511421211, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:153", - "title": "Crypto OpSec SelfGuard RoadMap", - "description": "Here we collect and discuss the best DeFi, Blockchain and crypto-related OpSec researches and data terminals - contributions are welcome!", - "website": "https://github.com/OffcierCia/Crypto-OpSec-SelfGuard-RoadMap", - "bannerImg": "bafybeicllle2323hyi4c4ohjxi6uz4k7jcrttie3gyn7g2qjpygr2lssya", - "logoImg": "bafybeihc55k7ujadwvdbdnpikx7wdxpjbjrnh4ejtj76u7x43w6c4noruu", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreigns6ae3fdhvksvncsprylh4b7vlmfrazs54fjetfdppltxzkswzi" - }, - "userGithub": "OffcierCia", - "projectTwitter": "officer_cia", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "hd1RPqQr3jRSPjEccS7dKzkyIPtp1cQhA6+XsvLS+FFMYSti3QHQUxhhwJ7gd9pb", - "encryptedSymmetricKey": "1fca8638a4048c21e3b43414f3a8fb076d0e6eb33fbc55f676fc571d89e86c8a22395a29d2f39c1dd356925a174cba0da322f153c673e8aae756aaca307f544540b21a84ebe4f91f7213870e3614fa63e23a6733f5e55d8effeb958f637ea2b58a6a3326ccfb4bef61689029eb2875fd1397291175fb45f2ce4409747c7e6c6e00000000000000202c67a08c7e93560867dcc49b6afefaa64956e90366c4b285a63a9c93661de5b04bac545f8fbfebe1915e7eb745a09eb1" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Gitcoin, Pessimistic.io " - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "1" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/OffcierCia/Crypto-OpSec-SelfGuard-RoadMap" - } - ] - } - } - }, - { - "projectId": "0x91db8779fa1b15d75761e358fe57683892c68d5cad11a4f9d19c468876d3c402", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x085dc5ac741fad055eb6db5d216074b8dc0e4c74e0fbed79fe5757f40eb0b4d97d1e7591d11e591c40e4e5c643bf1f5a06169bb083103308096db90469307ca41c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x2AF4125c8fE208a349ef78d3cb980308ab1Ed34f", - "project": { - "lastUpdated": 0, - "createdAt": 1673891936388, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:226", - "title": "Proof of Humanity", - "description": "Sybil-resistant registry of Humans using social verification on Ethereum. Streaming $UBI \ud83d\udca7 & building a decentralized democracy! ", - "website": "https://proofofhumanity.eth.limo", - "bannerImg": "bafybeidbfxda6zrrggrhvlaf5aq6gvulnuvoxtsqz4tddk7yg5ak4645b4", - "logoImg": "bafkreih7wlfag6alcuhe223gelth2y4ktaj2hmrbxm2nsmh7vw6eysqh54", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreibfa6auicrhrgd5pvmuzwjkamyzznocptm4tlklagq63boiknoex4" - }, - "userGithub": "santisiri", - "projectGithub": "OpenProofOfHumanity", - "projectTwitter": "pohdao", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "E6nyV0L0VLHdB1ULBnnIS9zM3e61rkDlwYW+MAjK5MfJLi4cnbC95LLOaA3+nvnZ", - "encryptedSymmetricKey": "8635a35196ff72adaf954d6718d50c65a2b54338d7d74e331af5184c5948be32f930d11d9b2b9c150a77fbe3a98e0e0db281587f593956d926b903759716ca55e3f7ba87d6a688c2f2370c3fce99b1ce32349a532709b12dc62ac0f65a7b5f93e2df222eee0443e5215f994afa2060bc444ef28bf394cb23e979d215f7e7030600000000000000209c2c94ceda04662c067c53feade2688d67cf32c2ec2f90727412ca9903ac0f578c3715da12d98d1535eeaeac5c852db6" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Non profits" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "10" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Didnt work" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "Democracy Earth Foundation" - } - ] - } - } - }, - { - "projectId": "0x91f5d2625c52d408bc5b73ec3dc43aa7c5836d96844acaa3f3128cc2fd39df9e", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0xde60f31b79ad5052d32836a56cddea56c0938342610b29f380bbbbad2d1cb6cf309f1bcd7361ecb80112b9f89a56f4467fc3f67045fcc2847807943ab81b38221b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x3e331a358421Ebe3Dc2fEf05449Ec89667E430B9", - "project": { - "lastUpdated": 0, - "createdAt": 1673608433724, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:178", - "title": "VestLab - analytics service that is a collection of information about tokenomics, metrics, timing of upcoming listing and vesting crypto tokens", - "description": " Vestlab.io - allows you to get information about the tokenomics of various cryptocurrency market projects and expect token unlock schedule after tokenseals (sales of cryptocurrencies to first buyers).\n\n\n\n Early investors buy new cryptocurrencies at the lowest price. In this way, they finance the first steps of the team, their promotion and entry into the cryptocurrency market. However, it is worth noting that not every team manages to go through all the stages of project formation and success. Possible technical and organizational moments that happen or become impossible for the further development of the project. Nevertheless, early investors still purchase tokens for new projects.\n\n\n\n Participation in tokenseals has become quite popular in recent years. This is due to the fact that consumers expect to sell the acquired crypto-assets worthy of attention after they are released on exchanges. This is one of the options for getting \"X's\" in cryptocurrency.\n\n\n\n The tokenomics of a cryptoproject should be studied before deciding to invest in a particular project. It can help determine how balanced the current economic model is, and understand if the investment data will be profitable. In addition to this, there are several other things to consider:\n\nExperienced investors always carefully and thoroughly disclose the tokenomics of a project before investing.\nIn order to avoid early sale of project tokens by early investors, the project's tokenomics includes a blocking token to classify contagion cases.\nEach consumption category has its own token unlocking schedule (vesting), which gives when and in what state an investor receives tokens and sells them.\nFor development, the token unlocking schedule helps predict token selling pressure and find reasonable entry points into the project (when token unlocking is due, selling pressure, which causes the token price to drop).\n\n\nThe project was created with full enthusiasm. We want our site to benefit the crypto community. We need your support to further develop and improve the service, Thank you!\n", - "website": "https://vestlab.io/", - "bannerImg": "bafkreiezzg4ukhtw545erqesko5usunmvea4qjnlnvw433eht2gwshthye", - "logoImg": "bafkreigwve2wvyaziljpkneo6hivynzqwlk4ym3lzeva2ohwem5b6uttbi", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreif5bpimuahrk5oogtdai43x7ycnkx43dlu6obffvoffl7eigth5tq" - }, - "projectTwitter": "https://twitter.com/vestlab", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "0UjspHbEJC0Yibe17N/uuZ0U4IegZD5BsVbN2FFbRp5R2X0V5lrGsHkYnhM29ANa", - "encryptedSymmetricKey": "b49ddccdff32add28a396e82fbc7af8f111b07f50c3a666531fba910adbb965f94648e978cc73995d18b1e11893411132873c0cab77a4dea70051369741486dccd2ae2e9388b9f88bdc1ed70d4921cf2e29a1c81f7991ef50413782a8c3d4e965e5b8637adfa37b13871a089f05e4bf25bab5a55b3fcd0c45918eeb1adffd18f0000000000000020068601ee50f046a8ef8f0e5a35d7752b4d818bb3829ae7a6da8c0dd2e3d3c511c396adef595a70b951afbe015bc120ad" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "personal funds" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "5" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "no" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/azarovnavi" - } - ] - } - } - }, - { - "projectId": "0x92abc70736a869d913735481b1dfacc6e53939dfed81d8d89590619878f9ee30", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x44d814c6f289c3c9c54c685a16470c3b0a4bdf322403f0adb27b02846b54cb141b8ebb427d6f4cbf98cc0275ba245d49e98abd193ad5fdaf3dec05ce681d5d5a1b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x29b1d432a40f40F5418DA2d4ABf740e5E491629B", - "project": { - "lastUpdated": 0, - "createdAt": 1673947561674, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:242", - "title": "Lighthouse", - "description": "Perpetual storage protocol allowing users to pay for storage forever with one-time fee", - "website": "https://www.lighthouse.storage/", - "logoImg": "bafybeig7yx3cm7ljn2jcrufznx2l3qsnguwoveifqv6msa3nec6jp76p6y", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreihpwhdiyp2etsm4ycqyewlqltngtaheoowuxvrsw5zlfvvbuxv53i" - }, - "userGithub": "nandit123", - "projectGithub": "lighthouse-web3", - "projectTwitter": "LighthouseWeb3", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x29b1d432a40f40F5418DA2d4ABf740e5E491629B", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#LighthouseWeb3", - "hash": "v0.0.0:NkutBFfiCaW3L3kpKieeZAFI0mBapL0oc2duAN0x2+s=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-17T09:25:22.254Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-17T09:25:22.254Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..aVqFeYwrmX-lo6EpcCR5EJqaU-fV9Gnny2AHxu9SqZCgBfJLwuNscMzNrE_hD4JPQDF2gTL0hUFzvemC2OMhBA" - }, - "expirationDate": "2023-04-17T09:25:22.254Z" - }, - "github": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x29b1d432a40f40F5418DA2d4ABf740e5E491629B", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextGithubOrg#lighthouse-web3#19206670", - "hash": "v0.0.0:HX4n6kHUdtSgvZq+eQbAuTWJZBoG3gXKtZUY/0jxIzE=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-17T09:25:45.734Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-17T09:25:45.734Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..tp9RUjoKuG7o81Ffa8Gpuvi8yD5ZdOUh8TdM_YOurJXZk8qW6eQ6if5K6l6TT9gvBvO23Aaj1j3Jk9MtEmaHAg" - }, - "expirationDate": "2023-04-17T09:25:45.734Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "3zJHUAiO147miPEg7FXEvGylicPrL7IzMLm5xB50hG/38oFouuZBYyPW/jE0XgYz", - "encryptedSymmetricKey": "258672c043ea5564cc434ff1a13647d39a879d35c45b64fd9d1fc7b961b757943841a1e6ede24a5151b72d9681d97b01df1e244e3a34c631be2d79f57375384300fe627fa9ee5287f50070691edc7012126e3726efe3a9ea7663c379ff0c5b96301fceba5543a42baa6203bcdda3d9bade19ec155b52ed84b2132d0e133d860000000000000000208b1d04ce3185f23c1ab1d2903d7e1d477e52b644ab5358fad95b3614c966fe35040972a056030490dda45f4e5b621880" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Filecoin frontier accelerator, Pre-seed investors" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "8" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/nandit123, https://github.com/lighthouse-web3/" - } - ] - } - } - }, - { - "projectId": "0x9541c370bee7cb672947dbb5733d2504a1d79e92c55695aca7acc477fe2956c5", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x97d3eab601c1c33750c17437f8323e80708848601be31e242e64ae8d515465cb3b162a7d377c67e34659da126b093a0ff98103acbdcd8f833ac3598b929cc7bb1c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x7F2436d628137A1a4f07631b1E09e37455f4aDAe", - "project": { - "lastUpdated": 0, - "createdAt": 1673496811754, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:143", - "title": "Forta Agent: Money Laundering Detector for Umbra Protocol.", - "description": "## What is Forta\n\nForta is a decentralized monitoring network to detect threats and anomalies on DeFi, NFT, governance, bridges and other Web3 systems in real-time.\n\nUnderlying Forta is a decentralized network of independent node operators that scan all transactions and block-by-block state changes for outlier transactions and threats. When an issue is detected, node operators send alerts to subscribers of potential risks, which enables them to take action.\n\n\n\n## What is this agent\n\nAfter the sanction of Tornado Cash, many attackers move to other services to launder their money. Umbra Protocol is a stealth address protocol for Ethereum, meaning it allows a payer to send funds to a fresh address, which is controlled by the intended receiver, but only the payer and the receiver know that. Although technically speaking Umbra Protocol is not a mixer, its privacy protection feature makes it seem to be an alternative to Tornado Cash. Consequently, this agent will be built to monitor transfers related to Umbra Protocol, and hopefully, we can link the sender and receiver accurately based on its working principle.", - "website": "https://github.com/Soptq/forta-bot-umbra", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreigi67b3fvxv6fcfvi7qsasqh7did6uv4jovdezvfkfbpgkpbqhizq" - }, - "userGithub": "Soptq", - "projectTwitter": "realsoptq", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "DZrXmGthpyDIi/5rOZSd+NX6LIZGbzElZGngfAk34he6DKUTKukFz1xSpKjAArxw", - "encryptedSymmetricKey": "5e47ff2ca4a6bedc6838d129fc32613b98e6315f742a49755435a94b9773cc51e7666dd2e76e458c7d05d9b08ce89e0e4c0bf4ee47065cbea3b0e655f6900e00b20aac7efff84175794a6ad35fc7c5be0cdde71c84e64170de4ba9bca6f0a6a4132e963a6265b24168fb10f790cfa0c7690c07c509e11faa889cfedf77523f3100000000000000203fd90532a8df470aff4236c88f4c49790f93a41b4f992be6a03a5aa66a33a294e76ab5cc492957e56b0c7be3ea873aaa" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Donations and grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "1" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/Soptq" - } - ] - } - } - }, - { - "projectId": "0x958a27cbbf604752b32e4593aa7d3801d5de011248d5732360bccac67024ca85", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x567efeb3cb0e21a04014bf9bb7ab1117a5a82a9decc433ce0ddbc010fc863e6849b0b068671d5af6a7211702bd7a1ea56461d15563c0629203197f2b3197830c1b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x5B3920527cfe207100312f4685E048ee032Fa391", - "project": { - "lastUpdated": 0, - "createdAt": 1673611716780, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:180", - "title": "zkREPL", - "description": "zkREPL is an online playground for zero knowledge circuits", - "website": "https://zkrepl.dev", - "bannerImg": "bafybeihkqu6xsy4tpuroqzt6g5y6cgjvfrcxewkfxeoztux2glop2osqzq", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreid2ybwvs4kgk4x6jz6yd5eygawtw2d5easrhcj6wen7jipqiajl7a" - }, - "userGithub": "", - "projectGithub": "0xPARC", - "projectTwitter": "zkrepl", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x5B3920527cfe207100312f4685E048ee032Fa391", - "hash": "v0.0.0:Jixo4zYBAi6rvj6ao9hvJP07eBQ+7A8NRqWlN4AT+yI=", - "provider": "ClearTextTwitter#zkREPL", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-13T12:05:40.224Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-13T12:05:40.224Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..AYxHhsB2-Do4EvviI-6eYLTu3XGx_twQ7DrBy6yZsFlEoq3lgoVhsdJsbvfyWmFWtVg_IAEvCHHcgYfmwQB8DQ" - }, - "expirationDate": "2023-04-13T12:05:40.224Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "Uf1jlDHVmIamq1Y9Wpdu/WaZbU+pyt4kMBITA8kYhrjsdwstrx7erQXDEEpI4L6M", - "encryptedSymmetricKey": "42615036bfc4a124d6e438f141b72e86314cb719c795ebbbe3e050b72626491ed66021047568aed7c3484ecf840cc702d899c91b8be3b7fd1871b3a90513bd6a9b6e6be1e0e74c996a3bfd153e433f691e640479d2b84f49e3ad5267519e6aa21408feea8f6749c3140712cc9885136b62e2bddaa20f14ad7b7c6bb7b22555050000000000000020ab42c3ce8c7289c445bfec3be98b516e54bf51aa820e90b6de09bf349d5ac10e668f78ef7784868ea1f4c75e46f2bcb8" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Gitcoin, 0xPARC" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "1" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes, but it had an error when I tried verifying Github" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/antimatter15 " - } - ] - } - } - }, - { - "projectId": "0x97d1779d1e478d5f58246af8c595cbf8f00aae86706524fc21b051bb20c002a9", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0xd70c2a1231f48e00d3ddb0a5b9b27bdf1a3e58e26d87ab449894c40be61fe91327eafddf7cd3485c23e70f7ba759f6c51f4b3f5ae44b037e520c0a75baee00841b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x35C6d9117F66943C881E8354138434b8a0727988", - "project": { - "lastUpdated": 0, - "createdAt": 1673425428424, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:115", - "title": "Dapp-Learning", - "description": "Definitive Guide for Decentralized-app(Dapp) Development on Blockchain", - "website": "https://github.com/Dapp-Learning-DAO/Dapp-Learning", - "logoImg": "bafkreic5qg2p5gfvg5xms43clyxfpknwqrylh2ojzkwc3vguqmfnnhjyxu", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreibqe3snuvoxz32cj5olyh3bnskl4e64p6w6kkwqff44v3y3yqyfqe" - }, - "userGithub": "yanyanho", - "projectGithub": "https://github.com/Dapp-Learning-DAO", - "projectTwitter": "Dapp_Learning", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "EomWaVtAufGHRO07/opbpukvcKX0Tot1EHL9fY/90raYYJ+Al/jV1XNtjDy4dD4d", - "encryptedSymmetricKey": "1a3d7c97fe6ec8110d33297d5402ac7e6769d01ce0438b5eb192a0f2a26111b18a0ae796da7df04cd1ec91ab5bce780254522cc73fdef431e27ba304e6a559ff6526c5e7cc60e27b5387c012fcfa47a4582f3f4fc8433f9b7a87ffc7342a88a1d8c3cfcd15d668088849adb52848adbc958ac5372e3f7ef27aff77baddb6c6c900000000000000209f95e37740f882ed94da585098a87e6c97b72d1c67dc30c4fcd799782bf3593875ddc6221224d6f96d3284c154c4a795" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "ESP " - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "10" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/Dapp-Learning-DAO/" - } - ] - } - } - }, - { - "projectId": "0x9b5419814f45cb2091991b0d2379f7db9d8ea17cecb6bc2117b26c6acfd6ce15", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0xc6fcf33ec89cdd7c8f64bbf280ef41b200e4e92b03e9f26dbfbf1f7aeb4d96be017df57fe433b7a2756588a4133462f0d76de9f9af41f58c822cbeb1b5a953ef1c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xA126F99e0DEFc3bFa963064314c4b1D54c872DCc", - "project": { - "lastUpdated": 0, - "createdAt": 1673890603476, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:225", - "title": "Web3MQ", - "description": "Web3MQ is currently the fastest social layer1 and trustless messaging network in Web3. Web3MQ offers the highest throughput (QPS), lowest message latency, and best scalability compared to other communication protocols. Web3MQ is also extremely simple to integrate through open-sourced component libraries. Web3 projects ranging from DAOs, Gamefi games, data providers, and decentralized social media, can build decentralized social and user engagement solutions using Web3MQ today.", - "website": "https://www.web3mq.com", - "logoImg": "bafkreigwwge6w3m4roqtkmj6qwf6nqezqklz62q563ulac6jzvdhd4mibe", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreifgrhpzjjne2l3f2vo3cw6bsjvtpw6wbfbfkjxulp4y6kjojvgm6e" - }, - "projectTwitter": "https://twitter.com/Web3MQ", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "G0VsGtGdbAJoFhLa9suP0IGblfS76KBwdPRDZgWxGQyMHV4AIiywQcVE6nhpZTJa", - "encryptedSymmetricKey": "25437d68c6736963537d1baa74194299a8ff5ad465fa83bcb12611ac3dd9cc8ea359d8ff7810e4ebc450018277888517056193bd9e50e4ab50fb12e6c91d703e2accecccd35bd8bf27c4c9755bbdbac4ff3a1ebc07d4bebe16e990c41b6f61b7bcddacad8411ebd586d2efdcb6df2da1b6dd421ab958d0df3f07211197a5eac9000000000000002094c1e49d0cce233371d846cc79b767d43a73793b406f9390350e005a88c8b890d230fdcb0788942f3a158c7e210379a0" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Community" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "10" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Not yet" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/Generative-Labs" - } - ] - } - } - }, - { - "projectId": "0x9ca823959474851a1e54a315cd1e78637c114d5f4dcf7db7ba0daacc263ad785", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x3080faa874300ad64c0ca6791fcbe2008d1ef61ce547f50926fa7483c0e6051d6eca0c3530bfcdb02b1b43bb78cf90e23001c4974d10665462d526722c9381a71c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x5514f4a2BC7194664B12A48E238876Aa53140350", - "project": { - "lastUpdated": 0, - "createdAt": 1673491071937, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:141", - "title": "Voting Contracts", - "description": "We propose a framework for on-chain voting that can be grown by a community into a vast landscape of voting contracts. This would be beneficial to the Ethereum ecosystem as a whole. If there was a system of voting contracts covering a wide range of possible voting types from token-weighted voting via quadratic voting to delegation, then DAOs could simply plug in rather than hard-coding yet another, say, token-weighted voting into their contracts. Plugging in would be as simple as pointing to a deployed voting contract. One can also plug out or exchange the reference from one voting contract to another.\n\nWe have deployed a registry contract to polygon and mainnet (https://etherscan.io/address/0xC535389b5a26efEbc27811915B6d78f6C95433f7) and opened a topic on the Ethereum magicians forum to discuss the EIP draft: https://ethereum-magicians.org/t/eip-draft-configurable-voting-contract/10736 \n\nI am currently developing a dapp that lets people interact with a playground, where one can plug in and out of voting contracts and get a feeling for the framework. This site is hosted on ipfs and served through ens: https://votingcontracts.eth.limo/. The development of this app and the deployment of the underlying playground and pluggable voting contracts to ethereum mainnet are the next steps. Feedback is very welcome. Please do reach out with feature requests and ideas. There is also a node package: @leomarlo/voting-registry-contracts, though I am considering migrating that at some point. There are two repositories for this project: https://github.com/leomarlo/voting-contracts-frontend and https://github.com/leomarlo/voting-registry-contracts . \n\n**Updates will appear here!**", - "website": "https://votingcontracts.eth.limo/", - "bannerImg": "bafkreihkytdnkbkpr5sbxkyshv4d3f45j3kz5fj52iyprw5vicqjvwjc6m", - "logoImg": "bafkreiacds5hssbudog4s6dvpcvhal42qo5zltwtleswiq3yi7vscxyfoy", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreidufw7rcqna5nyrtii2q6d4qkpmn5s2aqbfzlxk4jcnxcs6lau5hi" - }, - "userGithub": "leomarlo", - "projectGithub": "leomarlo", - "projectTwitter": "https://twitter.com/VotingContracts", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "BJ7RcbC8/wy+ftKQDqdQwnwPNqF3MxJn08h/waqmq90xfUHsHe1PCKAXagQwAG4m", - "encryptedSymmetricKey": "5371ae71114c1192cb4ff614bb5c80c42a70bb2f890b3bf5ddda36553da5e735e115cf197a8d8dc400f4a9cd48813d1803aa040037f68724521f9612b6b437b90391022ebc4a003c9a8411eee84d7c5aa2c995d046dcad7374c19788cb0aac8202b4103f817c211e767945688eaad5f55a4bda6829f9120e66e49e5a54f958e10000000000000020e48b5853dd18644966a37adc9d22b58f3c9b17fec601ee2f6fc35e317ff3edb088d42b1b2b885732509ba5a7be5e12ae" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "private" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "2" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/leomarlo" - } - ] - } - } - }, - { - "projectId": "0x9e659b60cc9a7658c25b161d535ae6b1a66c309130962e5b95110c2f1c4f4746", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x38a70b2200b9ff0a37c270782b902d62e68d11b1d1a0b4ec9ed36260ccfacac50390223a40cffab1f2e6560b503638eb6b5540163efabadfd6ed2dc64949304900", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x5c34386552091744717b1c0154b9d48d35f5f435", - "project": { - "lastUpdated": 0, - "createdAt": 1673707080502, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:204", - "title": "Seedle", - "description": "Seedle is an open-source tool that helps you to manage and track the performance of their Uniswap v3 positions.", - "website": "https://seedle.finance", - "bannerImg": "bafkreian5mfja4ydwlgkgxwmzgxi63blbyc4syzpdlfvcx7u7gyntqd7ei", - "logoImg": "bafkreidk4xvmwjvwrbposoaspy4ecy2kk6lrqkfl25wdnqbeyyfvrfudzy", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreibtnnvojbscn2jqtqms2q32dsawljsanz3ar4qij63q5yxamefave" - }, - "userGithub": "seedlefinance", - "projectGithub": "", - "projectTwitter": "SeedleFinance", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x1f9F5a2511C4Ca5B768dadD067bC19916dd59d88", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#SeedleFinance", - "hash": "v0.0.0:j8HvNNEneahMMy/JR+KO6V4gse8k2T48PFSHuwSZfQE=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-14T14:36:45.682Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-14T14:36:45.682Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..6Ia61K7q0hS-sXM65Xl-LEZ17tFuT_boR9WJ3niDxnGaZBdl9bCLpeHVNCiSsgCYt99Lr_AWuOere4xvMmenAw" - }, - "expirationDate": "2023-04-14T14:36:45.682Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "3IRyF6YwBBkszGeVsP3uL7+qer5BeAiP1WUUsPxhFmU5NaCywDywQZywNBahwYfX", - "encryptedSymmetricKey": "176b007731652ede2fad599daf17e40bd01cd49a969866e72dd692aa4c26d198cc96549dfa46408dc9008afae654b112fdb4e269e3f930cccd8f5a03d93eba8b94eaa6d48f82605fe5489e2b17e1a246e0a142f78760ccb2f27bd74636d06791293c3553eba0ece4b33546eb53acba52cec87af47b23b1e803ff788bc987e53a0000000000000020916e8b2c223a0c20065cd26013af85924e71bbdf043c231db517725f9521618048b57d3cd076911f7b8d513bde6e7386" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "Less than 5" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes, on Twitter" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https:://github.com/seedlefinance" - } - ] - } - } - }, - { - "projectId": "0x9fb5b0d0698dc64cbd3a01c5205ebc5ef609e7d20c21ce20ee2c73905a8309a0", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x53516e5e5d59eaae9a67325bcabffd8a33c0a498902a8c3a40249649315853930281b78914d90149707f2f6976962b03ee99b680809448e009ec2cb3d0d0de2d1c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x57EA12A3A8E441f5FE7B1F3Af1121097b7d3B6A8", - "project": { - "lastUpdated": 0, - "createdAt": 1673549726599, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:165", - "title": "Umbra", - "description": "Umbra is a protocol that lets you get paid privately on Ethereum and Layer 2 networks. \n\n----About Umbra----\n\nAs a protocol, Umbra defines a simple set of standards, coupled with a singleton smart contract instance, to enable stealth addresses on Ethereum. With a stealth address, a payer can send Ether or ERC20 tokens to an address controlled by the receiver, but no one except the two parties know who that receiver is. \n\nOn chain, the transaction looks like a simple transfer to an otherwise unused address on the Ethereum network. Off chain, the sender has used a public key published by the receiver to generate the new address. By encrypting the data used to generate the address, and announcing it via the Umbra smart contract, the sender can let the receiver know they\u2019ve sent them a payment to a new stealth address. Only the receiver can generate the private key needed to withdraw the funds.\n\nBy leveraging meta-transactions Umbra enables withdrawers to pay relayers for gas using the tokens they\u2019ve received. This avoids the need to fund stealth addresses with Ether before withdrawing.\n\n----Project Status----\n\nThe Umbra MVP went live in June 2021. You can visit https://app.umbra.cash to send and receive stealth payments using Umbra.\n\nSince our launch, we've made many iterative improvements based on user feedback. These included better mobile responsiveness, a simpler key registry system, faster scanning when searching for received funds, and other UX enhancements. We've also launched Umbra on Polygon, Optimism, and Umbra, and made huge improvements to our relay system to make token withdrawals faster and cheaper.\n\nSince launch, Umbra has processed nearly 100,000 payments across all networks, transacting more than $50 Million in value in the process. More than 52,000 accounts have registered stealth keys to enable privacy preserving payments through Umbra. Despite this growth, Umbra remains a grant funded public good project made possible by the community.\n\n---- What's Next----\n\nWe are grateful to our many supporters who have enabled us to get this far. There's still lot's more work to do!\n\nWe believe there is so much more we can do to make Umbra an even more powerful privacy tool in the Ethereum ecosystem. In the year ahead, we're focused on continuing to improve Umbra through withdrawal integrations, new network deployments, performance improvements, and host of small UX improvements and features. We're also working with researchers to develop a Stealth Address EIP, so that Umbra can remain an open, public goods protocol.", - "website": "https://app.umbra.cash", - "bannerImg": "bafybeibkqio6ktgkqfvdwz3jbtcnhotwpvbxnhni4s5kouzr4jqxzl52kq", - "logoImg": "bafkreiem7q3g3b7knibjbskir74rdptd3rg6llsf327pcrtfaec4xoq564", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreig74rvfyshs6ospwiuze4anrmepnd357zej6rgyvb7tby5aukihhy" - }, - "userGithub": "apbendi", - "projectGithub": "ScopeLift", - "projectTwitter": "umbracash", - "credentials": { - "github": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x8f5906963Ae276E1631EFA8Ff1a9CaE6499EC5E3", - "provider": "ClearTextGithubOrg#ScopeLift#1479802", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "hash": "v0.0.0:jAyRQrkWla8O5iFE5WPlhEHRXSJ8VnpoPk4FoJxnrLc=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-12T18:54:04.410Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-12T18:54:04.411Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..IY2Bc6-FiMWMApURch1o41-F21E8XIuWTs1yZALRpPgwBp8hWBiZhL_NNmtTj1zY2NY2xxCk6kUsADgGNiYqBg" - }, - "expirationDate": "2023-04-12T18:54:04.410Z" - }, - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x8f5906963Ae276E1631EFA8Ff1a9CaE6499EC5E3", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#UmbraCash", - "hash": "v0.0.0:e8iebnG/xkSGedA/gGGf5F1exORzhO0HZZ/4TZFEvD8=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-12T18:53:53.828Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-12T18:53:53.828Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..YqTCDZZBY-Ohx8UO4hIh1hFy-YVMhhvDkoEb_u0fPoTae74Oa-O9HYpgVjxJikZ7Xmb1_tfqZyODvjGp56uUCg" - }, - "expirationDate": "2023-04-12T18:53:53.828Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "lo4lOzW2sfXt3WeEjCuOJ9QOysraxrsN0A9zITOVmImW85ccBQvTlxZGR5N+Lqu8", - "encryptedSymmetricKey": "28e58c92a099de488706e1ebdfca5195edbaaf1320c3ef9dac9e84de7d8b429955d28fa3eba4b3456806772fe5858900179a908b719357830b774d1e8b0d156a37f02fd50428b1b221041fd4d39f12ea7a83bed0edb2ef2553825e3225f1f98e4becde04f7169453c01b3bb5c1cc8809c7f6f000e05d2e9c6d77412d281ff190000000000000002056126ab0471e37bc6dad3b5eb2be67f555ad669557bdbe195d3e97787394cbf2bf3a93ead3ee9494b6ec289f532f62ae" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "6" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/apbendi, https://github.com/ScopeLift" - } - ] - } - } - }, - { - "projectId": "0xa78a0c71a020745ba9199556d142f6878fe27638346977fe060a16927d250e3e", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x9dcff519af3293f86351ca4e08489d779231bfd4cfa5aa3807e47cb6b8e56e7869843793ce820ee2a27be6f152b125e8ac8027757c3d8b54ab73ed23f3c831eb1c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xC876bEC4e02EACc92df0F7b6EEee90c2aD794E50", - "project": { - "lastUpdated": 0, - "createdAt": 1673625856928, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:189", - "title": "Friends of Pooly", - "description": "Friends of Pooly is on a mission to defend decentralized finance; and to secure an Open Web3 through the power of Community.", - "website": "https://www.friendsofpooly.com", - "bannerImg": "bafybeibwqzq7s6kkhwvba2arxgj2nwnkf7zagvodjn3tjjra3r6o466rda", - "logoImg": "bafkreibbefbbkfuugs64inbdxsb44algpq7ndrg3beebca5nd7kjxlwu3e", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreicxznwhchpgm25nrx5mluroq44rib4awnenm2zctgw6mk7id3tbkm" - }, - "userGithub": "https://github.com/kamescg", - "projectGithub": "https://github.com/orgs/friends-of-pooly", - "projectTwitter": "https://twitter.com/FriendsofPooly", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "ZjSV25DnAHkxa4eZBFwY/Vq7DEpInE0Krat5aaueH/iH5YOVsJighfmTokK1I4Sa", - "encryptedSymmetricKey": "5ad470fefb1eaf52179d7ca3d6e211199871cd908c3750e999c3fa85da5d8e62f102417b573046dc99b1c1458b7f4504bb4005e48d6bb365f8dc4aa52f720940315380af0ff1614ddfdf21fa473adbe9d7c24c64c25966b22f484ebdb7091085f471e0a0edb64f7760eebea25b2eb11bf78d0297946667845a76b10d062bef330000000000000020d0f37b4ae45e54f391c5f1500006ea13024b82ba550d162d16ef064ca1faf7a6be4332bb942ca173f15c48cfc9b7be97" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "We are funded fully through Grants from Gitcoin and Celo" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "3" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "No... I can't verify using my wallet browser :(" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/friends-of-pooly and https://github.com/kamescg" - } - ] - } - } - }, - { - "projectId": "0xa9956ceed5830e7f1c9e820c38453edc222265ff98e8592d25544464570266a1", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0xbcae366dea9fe1dae9157777d5a7ab3609c0ce16e903f92b4642b015d4c4ca2147c44d3f40fa181eb87757219604f4d720ce6e59d354b14aa9014698d0d814951c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x7A0857D314f62d383341b4ED8FE380e7C98Fb978", - "project": { - "lastUpdated": 0, - "createdAt": 1673164714741, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:73", - "title": "Starksheet", - "description": "Starksheet is a general-purpose high-level interface to everything on-chain.\nRead, write, execute, all on-chain, using data from every single piece of information available, right from a familiar interface.\n\nLiterally everything. Each cell is indeed any contract call that you could do in, for example, a block explorer.\nBut starksheet is not a block explorer.\n\nAs you can expect from a spreadsheet, you can use the result of one cell in the definition of another.\n\nA1=BAYC.ownerOf(9999)\nB1=USDC.balanceOf(A1)\n\nYou\u2019ve just created a tracker of the wealth of the owner of a given token. But starksheet is not an analytics tool.\n\nNot only can you view on-chain but also can you use write functions\n\nA1=uniswapAddress\nA2=myAddress\nB1=USDC.approve(A1.A2)\nC1=A1.swap(\u2026)\n\nBecause starksheet is 100% on-chain, you create indeed a bundle of several transactions into a single one. But starksheet is not a transaction builder.\n\nBecause the logic you create is stored as a (non so) standard ERC721 it\u2019s directly available from any wallet, dApp, etc. just by calling tokenURI\n\nYou\u2019ve just transformed your wallet into a dynamic dashboard + full of custom plug-ins\n\nBut starksheet is not a plug-in builder\n\nIt\u2019s just whatever you can think about with the chain, on chain, directly available anywhere else in any dapp of the ecosystem. From the chain to the chain.\n\nYou can right now make Dexes, flashlaons, airdrops, etc.\n\nAnd you, what would you build?", - "website": "https://starksheet.xyz", - "bannerImg": "bafybeihdmjhq2ccib6egpnyyizz3ehbgajpos7gg3wxul6c3nt7qomgk7m", - "logoImg": "bafkreidbh6d3o4h5dzxltkji6gfcundf3ajtydc6uzy562325cbbuusdo4", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreifelg3xfkopgbjzdq3gv5u73tb6lgkng3blj6lajbfenaayxzmjyq" - }, - "userGithub": "ClementWalter", - "projectGithub": "the-candy-shop", - "projectTwitter": "starksheet", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "eHgJhDbiKtfO8TvC7fBkgZ7iySxsuQfH4pD6yjep65DuQa1F5r5f8K1FljtnmxUh", - "encryptedSymmetricKey": "a9dd6915355ecbc7d1d9d929ed8f634a775b74a2a5445cb9c955d53f673da939feaa3c2f2c3c2b19936a6754540594158f91451c14768d6a7078267d59cb3ed92d7d3e537edcc9dca69bd294eeb2090ea534ae8ae788453ee86867c3a33e03889b03663e84695b82150316b15aaea07bf3b23f16b9f01ce4f5b09354d168b9c80000000000000020a42a054699c603992b19fff175c8d16ed9d812689db78b733754e417ce269aa1099d9b26540beb18b77a6aaa77456b81" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "gitcoin and starkware" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "3" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/the-candy-shop https://github.com/clementwalter" - } - ] - } - } - }, - { - "projectId": "0xaa48be1f472efc5f5ee4d7f4fc1f2be1fbbc3507acd813dffdd322d9a4e8e6d5", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x3cd1d36c3518b4cd64a9c64358d9a863b192eb3d4bbaed717e3bc87f63975cd60a3579bae13bdd01714f1cf70bdba5a30c221c56b6c7b54c640cddccca627d961b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x8EFEF51d19EF3844C00076ab9d02847B9C70f94A", - "project": { - "lastUpdated": 0, - "createdAt": 1673947897061, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:243", - "title": "minipent by pentacle", - "description": "For web3 orgs / DAOs\n\nMinipent is an opensource version of the Pentacle knowledgebase, for you to fill with your own content.\n\nWritten in nextjs with a strapi-powered cms, orgs / DAOs can self-host internal information without being tied to web2 saas platforms.\n\n\ud83e\udd0d Your projects, sites and resources all accessible from a single page\n\ud83e\udd0d Easily onboard, collaborate and share knowledge with contributors\n\ud83e\udd0d No more hunting through various platforms to find your news and articles\n\ud83e\udd0d A self-hosted environment where you own your data\n\nMinipent instances completed in Q4 2022 include: Opyn, Redacted, Euler and Canto.\n\n---\n\nFor data collectors / content curators\n\nData collectors currently use a mix of notion, google docs, github and hackmd to collect up their crypto research. Much of which is duplicated across these various platforms multiple times by multiple researchers. \n\nMinipent gives data collectors and researchers a platform to organise and showcase their research and data collections with access to Pentacle's extensive database of projects and people. ", - "website": "https://minipent.xyz", - "bannerImg": "bafybeibulxwenvycbjpaz566illro6tuxybybafmmiaxmwpmxih6d7i5ky", - "logoImg": "bafkreicepfbibdenjd232az2absxe6a5cyeqfen6dqblehbph3vcexrpli", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreigbjdlfwtyrap7nemcee6ajysmelbig4sjl6caj7zwaay42ngsy64" - }, - "userGithub": "pentcle", - "projectGithub": "pentaclexyz", - "projectTwitter": "pentaclexyz", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x84EEb7dB3f93feb5A8A98F56Dabb970A6797c187", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#pentaclexyz", - "hash": "v0.0.0:DdC2TfTvBk7FBBojNpP9d7x+F/vAEwJmwDjy9jtikZM=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-16T21:11:32.878Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-16T21:11:32.878Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..8tQDnAFwAEZ11G_HIFueRg-D5rQpLJvmd1islVEunNXEW3epL0zUpwx4B-rAw1dOIDBxQu74uhM6dhGl2NjPDA" - }, - "expirationDate": "2023-04-16T21:11:32.878Z" - }, - "github": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x84EEb7dB3f93feb5A8A98F56Dabb970A6797c187", - "provider": "ClearTextGithubOrg#pentaclexyz#80323528", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "hash": "v0.0.0:pPpnUSruNxrWPSJv62LIgkTt/o2c0KI47wJyKVvHtA8=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-16T21:12:09.923Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-16T21:12:09.923Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..Z_NRxc2aJKu-f9yzAHZ5-1O5nEvf18lDUEMkwK8-xKi10EgYgPlxmsBX1bSXw7QS_uMjACWObKqOZWX-yNZnDQ" - }, - "expirationDate": "2023-04-16T21:12:09.923Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "eFEpIbCXgOoasshmt6E8IW03QBrzju7BQBjFVY51z8gHB6417RnAQhQIIaJwySR3", - "encryptedSymmetricKey": "588d6974d86f7250e9ba96ec6980e43da9d593a15acc4925ae2103d89d2187ff4f25c78d077c565044605a85d8277b1924154434b510f84bdea5d4b431dac267edbd8f9eb3b63985d42e2c68eae3f3828464aaf9eed2e7f759db9d75f9d7f88b95548955a5df55602b9f08a74d1a26d2bef998a9d5cf25483156cd93186924b3000000000000002074e7efd310874f4cbc5b4f7c4bb8f5d3c4ea05b421742dbdab735308ce4c3dbf9f00ba2bcb881b2d5e3088f97080d394" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "donations, angel" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "5" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/pentcle, https://github.com/pentaclexyz" - } - ] - } - } - }, - { - "projectId": "0xaba145666b462b3a6ee691074f5407078e198604d17a0024becbc86b259b7b10", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x0ec510dc48c542dc98131ee16e9abd9d0b9e64fa36b95d00efc8417d86ef763f4fc049fa7732e8b8546af6e550acf80245e23bf9f717add24f743c18849e3e271b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xCD9165FF26Ac50ec9bc3207B9d53Bc70998C6b64", - "project": { - "lastUpdated": 0, - "createdAt": 1673880270110, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:222", - "title": "Orgassign", - "description": "Overview\n\n\nOrgassign is a contribution platform and all-in-one workspace that makes it easy for remote teams to work together, taking some of the best parts of Discord, Github and Notion while ironing out many of the major pain points.\n\n\n\nMost DAO contributors today have to keep up with Discord + Notion + Google Docs + Github in order to figure out what they should be working on. Orgassign designed an all-in-one tool that fixed these pain points. It doesn\u2019t bombard you with notifications like Discord, its token-gated permissions are simpler than both Notion and Google Docs, and unlike Github, it\u2019s also designed for non-technical contributors. \u200d\n\n\n\nOrgassign helps contributors increase their efficiency by tracking tasks and goals while also providing a lasting, single point-of-reference so everyone knows what\u2019s being worked on(and why). It manages to do all this with a tidy,intuitive interface.\n\n\n\nOrgassign is a shared contribution space with different sections:\n\n\n\nRoadmap - with goals, projects and tasks showing how everything fits together. Contributors are able to see a clear line between the organization\u2019s overall goal, their team\u2019s efforts, and their individual assignments.\n\n\nWiki - is where important information that has more permanence lives. Notes can be added to the wiki using hashtags as you are working on projects, so knowledge management is not a separate task but part of the workflow.\n\n\nGroups and roles - manages what individuals can see and contribute to, which can be done through token-gating.\n\n\nconclusion\n\n\nUltimately, Orgassign is designed to help you work in quite a specific way, making sure plans and tasks add up into an overarching vision(OKR style), and integrating documentation with task management. This is well-suited for DAOs because it retains historical knowledge that would otherwise be lost if individual contributors moved on, a common occurrence in the space.\n\n", - "website": "https://www.orgassign.site/", - "bannerImg": "bafybeihqghvvlmgns3gcyixna3tx5wd5n4mkvdm4llqaxueyzibkmk3gay", - "logoImg": "bafkreicd4egs5fblfqg4p7al6dqtibbis5vdzej2xg2wwqsdllajd5glpy", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiem2pwahvhojcpislde7fyk3x2pdw7l3snjg6i3hnafrljbhfh3i4" - }, - "userGithub": "Orgassign", - "projectTwitter": "Orgassign", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xCD9165FF26Ac50ec9bc3207B9d53Bc70998C6b64", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#Orgassign", - "hash": "v0.0.0:52yt/2dAzosJ2n/jCJLCVM1EPwbR1n3wvtZSYBdZMmA=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-16T14:44:04.156Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-16T14:44:04.157Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..2gjDu4Lr3vcbzclu2kZK-eOF6T5n5NbdIuOJfOijCHnT4Q_M1N2v8YdDRZV19FTu4TbfT1ZddqJtEoGSBnxiDA" - }, - "expirationDate": "2023-04-16T14:44:04.156Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "wG1LnnkN5YJuveS5Wg0SwhWeS4iPbVk7TQNfnFP7AOE=", - "encryptedSymmetricKey": "e75ac82068f6ffe630c186473a8b098f5cebe2311fd513c409c14773bde81a5e57bf35e73c945c052a86fb1380304d002e14aa3358813fea1a983abe843aed2c5a23f67722c99af7f05a2bfd43ba67e6823448f07208434ad7ea686785a1828ab209a3cb51c5dc4d3531425887ec0a38d31f43a8243e24785998b621cf22f131000000000000002019f73fce98506571f199e275d4c778b0c9edd1212c6ddc8aa31e14bd505aaad679f4fb56b81e5e8077652c1a0ec4f597" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Self-funded by the team" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "5" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/Orgassign" - } - ] - } - } - }, - { - "projectId": "0xad3348a8338210c5d7eca4187a0267507d9dd8683fe02d253c4a17a952c5ef3c", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x55fcba81ca26244c823da604dc434c479162dce2ab410feb125a5c3fa7f79d7f7f49e5f6e36e3589ab8310455fa2306d3cb8731585383ede1115f552a24c2a1e1b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xEb439EED5642641968f9D8b52F2788e0F19B443B", - "project": { - "lastUpdated": 0, - "createdAt": 1673367821569, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:101", - "title": "Rouge Ticket", - "description": "Web3 app to create events & sell NFT tickets", - "website": "https://rouge.network/", - "bannerImg": "bafybeif2kztn5a2pvv4aisi4aezg4vmscvmagsk2lckotywmtcyyyf6c5m", - "logoImg": "bafkreih73q5xy446dwm5mwglhicak5ipzn2jhqseuax2xuhslv3zjuojcm", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreif27j7ilyupev43g6r6eefxpkhuowjkmq6xzq2cxw5hqpemx4yzwa" - }, - "userGithub": "clbrge", - "projectGithub": "TheRougeProject", - "projectTwitter": "rougetoken", - "credentials": { - "github": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xEb439EED5642641968f9D8b52F2788e0F19B443B", - "provider": "ClearTextGithubOrg#TheRougeProject#37261430", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "hash": "v0.0.0:3CcszUh0yHvK25XQGRJHoB2SdVpKL+pu0aIzbGS3zCc=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-12T10:47:13.340Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-12T10:47:13.341Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..UehL4E6UTJdJuhfeSgjARfi1SOTZ7F3bYcvBKRXCU8BvwTClgu20YJ5Jo44rtTN7kOGG9Ekv52uzHlTb-NU4Aw" - }, - "expirationDate": "2023-04-12T10:47:13.341Z" - }, - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xEb439EED5642641968f9D8b52F2788e0F19B443B", - "provider": "ClearTextTwitter#rougetoken", - "hash": "v0.0.0:fPTulsVlkAWjHgb4epDI5+TwjEQgVAdoFfCc0j5nx2E=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-12T10:47:04.956Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-12T10:47:04.956Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..kq3sQCxwa8hoITrLn9ZkeGeFNOZ2fD9jlUtzE14UxZn1OyiID20gSGrwPw4OpQpDTgGBpbIA-rArz1POarjOAw" - }, - "expirationDate": "2023-04-12T10:47:04.956Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "HbaXHrjC6ESbjbz0d/115vxN8kF88Up2sNmFz3nuZk55i2JsSQCtuCVOdp68jHIY", - "encryptedSymmetricKey": "e615dffa381d0abb53f70c8a39a8bab489710e9e1a3546eefc59f10f08c1702bb7633c328cefbdba7f4453c18ac506026daac8d22c4064d9468e42a259571e2b85da9b54adebebdc004be6f21484be8dffe3f9181a4a16e71abb46664a4b508af915d563c4c7d8f2c4b914652d8129b9ba09f62c6b8977a9c4ff65a2f1c0795a000000000000002033fb2176647c979dead14d21fb6282e8fc57d811751e7c95a280fc46cca6e15e86e3ce697ccdcfa27096c8c5fdce6ca9" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Gitcoin" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "4" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/TheRougeProject" - } - ] - } - } - }, - { - "projectId": "0xad56d803c2be49755c3e74705f1dbc6c03197fe10df1698bde59822fc89dea03", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x548b7d8df5b640579854f76f98c1b0d54f55aa99786401d3943dd71c890e752a6a483d6c15e7146d17a5ba58192ed1e0b46a962ebe64933aa1470d8683acbf611b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x1B8C7f06F537711A7CAf6770051A43B4F3E69A7e", - "project": { - "lastUpdated": 0, - "createdAt": 1673378444183, - "id": "10:0x8e1bD5Da87C14dd8e08F7ecc2aBf9D1d558ea174:42", - "title": "1Hive Gardens", - "description": "\ud83c\udf31\ufeff Gardens is a 1Hive initiative to create a template for public communities to coordinate shared resources from the bottom-up, taking the best lessons learned from the 1Hive community and allowing any DAO to implement them in a plug-and-play fashion. \n\nWith Gardens, anyone can set up a DAO in minutes, leveraging Conviction Voting, a Community Covenant, and the Celeste arbitration protocol, while also getting the network effects of joining a community of quickly blooming Gardens DAOs.", - "website": "https://gardensdao.eth.limo", - "bannerImg": "bafkreidnihaigw6fgqodgehhcins73jcefs2oa6nqferwthbq5l6tl25pq", - "logoImg": "bafkreidydrdodxzfdalfgtm3nolemn2hlfiio3j2xerjbjaqjrexeeofhu", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiao6cjmqnjyv6c3zrjszvsw2s2667ghfqdjv4tcpjpg5igjdsi6e4" - }, - "userGithub": "@pglavin2", - "projectGithub": "1hive", - "projectTwitter": "gardensdao", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x809C9f8dd8CA93A41c3adca4972Fa234C28F7714", - "provider": "ClearTextTwitter#gardensdao", - "hash": "v0.0.0:eZaZN6DYitoW4hd7RoXYyOYKvI5EJE584L2OD0SHyVo=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-10T19:17:17.797Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-10T19:17:17.798Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..GZRteGyK61kMOZ99CCgdu6j15E_NDZXzEEGMecPu49X-sdlpWEZP9Wf_L026gV2v60g9QZPGjlbWj8RQIJXrAw" - }, - "expirationDate": "2023-04-10T19:17:17.797Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "GExsk9ljekHZ1muMwihDcUDAeIDoc2StAgTOCNW1+brUqBolI2L7iOfX5OsS3q5S", - "encryptedSymmetricKey": "735aa2922e4680e1c021e2bd7cc282bf6aa5ae8406c32c6a39412666e9e2f11e278d3789924b7c71f542d8339ca4021714173570e0bc348d9a8520959ded89a63f1a09564601b37ff1266e93447e9ca23eade734dee62f182186e9efac5cea862d399c6b3916741dd2b632b14b351d5c6cfd7a4c3d75e04008fed9031cb4f66500000000000000202175c8b480d505bb85e104a4b139236fb71c3870c0bbc7ac6d1c8c127f40b6fd036990db8985e6b923e12e98986d0794" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "1Hive, Gitcoin, Giveth, Polygon" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "6" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/1Hive" - } - ] - } - } - }, - { - "projectId": "0xadbe153724eec36bc07d2979e7cd3c3927b13d6a6706dd1f54fdd8ea894b5874", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x2c9b1ff734488045320bc7b75d29be9d44598ed11bf31d7cb3037607819d9f883afc55295aeaf558a9d52ea78c3d279744b7147c195675bed863d339750b5f611b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x2D9d84F4D8a4254ea23Fe18825193Cbd1b21b749", - "project": { - "lastUpdated": 0, - "createdAt": 1673624060258, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:186", - "title": "L2 Planet", - "description": "L2 Planet is a project which works for public goods. The main goal is to accelerate Layer-2 adaptation and educate the community about it.", - "website": "https://l2planet.xyz", - "bannerImg": "bafybeid2kjcpge2d3khsver4yttohdckab6hasezk2voj236o5maq5hjcu", - "logoImg": "bafkreifb35onxsf7bv7rsazuiwilv7dhtmpd2ll63peiaehiurtdrogwfu", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreigolqy6ya6urdqwytu36zrst7xvovvz2nwjst5eaodd5w4ugqcu6q" - }, - "userGithub": "babalangolama", - "projectGithub": "l2planet", - "projectTwitter": "layer2planet", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x2D9d84F4D8a4254ea23Fe18825193Cbd1b21b749", - "hash": "v0.0.0:ji4xBfuyLIE7aknMjBAYzdXcMr2euCCOqKAZsRlQn3E=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#layer2planet" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-13T15:29:19.470Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-13T15:29:19.470Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..AN1VTSzuK-W14V5vMhIeYzEsmdlWyOEwr0tuJPrLdtimuMfJ24wvKI5Yr_fdCgQsutFPiffE89glz0oQ92a1CA" - }, - "expirationDate": "2023-04-13T15:29:19.470Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "LkTlh7nDaVeTVJkyT2m16hn1zKrjLBuSunt/CG1MjjOPgprdJcqHdXOeZHAJMvah", - "encryptedSymmetricKey": "927c8a94908e7f728f1900cd3fb72c6fa7f91bc79b7165e882704f5af0baa2bdf7753a69a0d8e1166525ff18f51f2913dc952a90700113b69b376d4395b733dffc394bfe644ecfb2b6f5c10a2b9ea639ea1ca5d3b8db833d5494812384c226b2adb4a7538ea4b20ace5c53e238eae7a684c106313f1cc89593ad736d94964c1700000000000000201092efa4cc51b182fe894fc452f34f13bd7155ad5d3d3ecfd5605e7cc07b4245e1c4e9745c68810ad00b559399419485" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Our primary funding source is Gitcoin donates. We running L2 Planet as volunteers." - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "10" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/babalangolama, https://github.com/l2planet" - } - ] - } - } - }, - { - "projectId": "0xae97e83e49806ee023655c5ce84bb7837c7ad4fab73129d6ac089a3d48bfe268", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0xc0f7c9e726d6b57d8584356ea53201924654b4674f7725101b493e01aa0690942d4f1da664eb7cd0de1a24095f951a263d371b47ee011ba19fdf67471c96de7f00", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x12e838f846ffdade34b2e006f84117a370d71687", - "project": { - "lastUpdated": 0, - "createdAt": 1673272603585, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:84", - "title": "Punk Domains - Modular Web3 Names Protocol", - "description": "Punk Domains is a web3 domain/name protocol. What sets it apart from others (like ENS or UD) is that it can issue multiple domain extensions and allows for various types of names (single-purchase domains, renewable domains, soulbound domains etc.). It has a modular architecture that can cover any use case.\n\nAny DAO or web3 community can get their own domain extension via the Punk Domains protocol. KlimaDAO (.klima), PoolTogether (.pool), Smol Brains NFT community (.smol) and many others have already gotten their own respective domain extensions via Punk Domains.\n\nThe Punk Domains protocol is completely open source (all code is on GitHub) and permissionless - once you own your domain name no one can take it away from you.\n\nWeb3 domains are the essential part of the upcoming Web3 Social where they will be used as usernames and digital identity. Our mission is to help build this future.\n", - "website": "https://punk.domains", - "bannerImg": "bafybeicqanjg63u4uv7eubt3kvweb4rabjrjiuchzungki55ioel6v3hmm", - "logoImg": "bafkreifo3yv3sscm3vfsfvaluoz5aaewegrunbbwskqeft652cltr7syyy", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreibwbxlvhkrk44dviw3z3cd4rjobbo34gjv2nhuzbnlmd3sfesmfbm" - }, - "userGithub": "tempe-techie", - "projectGithub": "punk-domains", - "projectTwitter": "PunkDomains", - "credentials": { - "github": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x12e838F846FFDAdE34B2E006F84117A370d71687", - "provider": "ClearTextGithubOrg#punk-domains#95053628", - "hash": "v0.0.0:95wE0BA2PLYAN36V7i2RJ3r3fvi5M3i7maore1AjHYA=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-09T13:56:04.865Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-09T13:56:04.865Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..1vWlF7DygIpwqOJVL-jZRvdB4jcLRSONQgQA2-kWgrNFNa7MF3iem6mRJnockkIpupegabprCweq85jCyGVmBA" - }, - "expirationDate": "2023-04-09T13:56:04.865Z" - }, - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x12e838F846FFDAdE34B2E006F84117A370d71687", - "provider": "ClearTextTwitter#PunkDomains", - "hash": "v0.0.0:aIk3MqBjyMreF03Qxyd3h5Ky9QRBWK8CD/utvjLYV1Q=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-09T13:55:15.684Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-09T13:55:15.685Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..lp9JIlGnC_OfdwDigWM9tVqRmE1gTsrxe2cu_-EyE5u2WWWHaWkTLxL8CiD2gBA9ZRKrl8M2GkvhU-Nvc3DfAA" - }, - "expirationDate": "2023-04-09T13:55:15.684Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "uZwdPUzYnfwNkbmd0OKbir9l4ZMYguSUI/0Byti/vnE=", - "encryptedSymmetricKey": "1b3728ae44b6d23d9713080ce2fc0966234784c9e38f535c73936d9162b685a45478f95ab3083dff93ef80a1e630d516f6de6aef3b31d987c961b7bde003e90ff8dac74aeab46f945f86e2818f0ff88a6cc872581612e771e4d1a76328ff8293c2e0903176836e00c5ba8de59abd92f1ea6f65c9f2f4203c353d354b1a2de2160000000000000020a0964ed2cbf7c11b5281f9d49a40e16bb7280a732d493ecef4a7625c872b054f9b1ff5384cb4c854f318cc2ed6d48aab" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "No external funding (such as VC etc.). Only Gitcoin grants." - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "2" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/tempe-techie; https://github.com/punk-domains" - } - ] - } - } - }, - { - "projectId": "0xaedbc3eaef477409f3c3b5113f9674940e1dd80d4a783736607fdd9ab750c966", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x515bed1e5db1ed06440f67194636b7ea054f20db9f9b92d65c8c29b8781add7d186feb944b02a959e54cda4aeb112e5921ac4a2c7c01184499f485209eadc6ba1b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xD0AeA65bb96b823cb30724ee0a6B7588c77dE486", - "project": { - "lastUpdated": 0, - "createdAt": 1673827964530, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:216", - "title": "ETH Leaderboard", - "description": "ETH Leaderboard is a website that tracks Twitter accounts with .eth names.", - "website": "https://ethleaderboard.xyz", - "bannerImg": "bafybeihmn4eijzmxaxumu2lqqhrx5aywvenwyu4paapsy2lc6mpqwkgnbm", - "logoImg": "bafkreigmqaicmew42d2icvig7ynlljgt3ehd3zwizoncjxfznv3qz7fm2y", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreihu5ojvvp3fhhjqmdvu5foxt3knueue4pl7zdanhgi3xxhlwj5t64" - }, - "userGithub": "gskril", - "projectTwitter": "ethleaderboard", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "klXMa8kqnDWnzZCxSWRb7k/6HVN4DICZmi1K2jpItE8=", - "encryptedSymmetricKey": "926a4e0da45529c098d17badaf57da53e017eb9950a2a0e025b229809a1ccaab16d4e55ea23d0c418675611c31187014b79de969fa7047894377f1ad4bb73eb6e0ef19c5eb284ed4d45ccf0875bc86308539a80fb2132a84f3f6073ffa8cc7b7251b9cf46a8852c9538268dddb62082bb441c0d95dae52b8eab4912c5147727b0000000000000020e3ebecee8e1803839a5914c4d305408e40aff1f61b5b28dfef0cf4086f4790ae0a0115bf16c847fc730e64ed866c5c8f" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Donations" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "1" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/gskril" - } - ] - } - } - }, - { - "projectId": "0xaf455647fcbc71f77390600d31dfe88e9c347634916d9f740197ac09e6ebe820", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x140f205608b461ffc6be7fab879b6b350cf5e9ed47963ea4c719a4427cc3ce5b20baf685b4d3c4680a85160ab28b4d0daf65eff6888655f1fe7639ce59f9f11f1c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xDE798cD9C53F4806B9Cc7dD27aDf7c641540167c", - "project": { - "lastUpdated": 0, - "createdAt": 1673048153294, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:56", - "title": "Geo Web", - "description": "SUPPORT THE OPEN METAVERSE\n-\nGeo Web is a set of open protocols & fair property rights for anchoring digital media to physical locations.\n\nIt creates decentralized consensus for an augmented, shared reality layer covering Earth guided by public good values rather than corporate profits. \n\nThe Geo Web will bring digital media, gaming, data, commerce, and NFTs into the physical world as shared experiences rather than siloed applications. \n-\nWhy the Geo Web?\n -\nLarge portions of our lives are shaped by our smart devices. This will only compound with the adoption of augmented reality smart glasses and other always-on wearables/embeddables. The foundations of our lived reality shouldn\u2019t be defined by arbitrary app store rules and the subversive, never-ending drive for corporate profit growth.\n\nWe\u2019re building the Geo Web because we think the metaverse should be based on permissionless, public internet infrastructure. It should be an extension of the ethos/design of the internet, the early web, and Ethereum.\n\nThe Geo Web is divided into digital land parcel NFTs which map 1:1 to the physical world. The market for digital land is administered under a partial common ownership (aka Harberger tax) system. Digital content can be anchored to the land utilizing our p2p content layer (Ceramic, IPFS, & Filecoin).\n\nThe Geo Web is a fair, efficient, and legitimate way to bootstrap and scale the metaverse across our shared planet. \n\nBy reinvesting 100% of land market proceeds into rewarding open-source developers, creatives, advocates, users, and public goods, we can create compounding network utility and value. The Geo Web is a choice for positive-sum coordination over fixed-mindset tradition.\n\nIf the Geo Web is successful, we can help spur the adoption of partial common ownership systems beyond our network and help redefine global property rights systems to be fairer and more efficient.\n-\nUpdate Since GR15\n- \nThe Geo Web launched on Optimism with a fair launch auction on December 15th, 2022! You can claim a parcel at your home, business, or favorite public place now at https://geoweb.land/. \n\nThis project has been a labor of love for over two years. We couldn't be more excited to be live and thankful for the support of all the Gitcoin contributors that empowered us to make it here.\n-\nPlans for Alpha Round Funding\n-\nWith the Geo Web platform/economic system live, the core team is shifting focus to building and supporting use cases with partners, builders, and creators. \n\nFunds received from this QF round will primarily be distributed to core team members and open source contributors through Coordinape Circles and/or Govrn's DAO contributor platform as we maintain that use case focus. We may allocate some of the funds to bounties on Dework and incidental costs of development/tooling/hosting use cases as well.\n\nThese funds will help bridge the core team until the Geo Web digital land market produces enough revenue to fund its own QF rounds (https://docs.geoweb.network/community-and-governance/network-funds-allocation). \n-\nLinks\n-\nDiscord - https://discord.gg/sbqWRGhb\nCadastre - https://geoweb.land/\nSpatial Browser - https://geoweb.app/\nWebsite - https://geoweb.network/\nGithub - https://github.com/Geo-Web-Project\nDework Bounties - https://app.dework.xyz/geo-web\nForum - https://forum.geoweb.network/\nDocs - https://docs.geoweb.network/\nTwitter - @thegeoweb\nNewsletter Signup - https://bit.ly/geowebsignup\nBlog - https://geoweb.network/blog\n", - "website": "https://geoweb.land/", - "bannerImg": "bafkreib6vcpfk6ri26t6h7gbixq4kw5hx7zzwrh7ne2cc3wmkrchgcmwgq", - "logoImg": "bafkreifl3ynwvpodxcxoj2duwqcxjawgmsryxsz3kpe4cme3i5xqgwv4jq", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiblyg45yvfp7eeyzyo34qvetcxbca6o67alsunvngyupozomxht4a" - }, - "userGithub": "gravenp", - "projectGithub": "Geo-Web-Project", - "projectTwitter": "thegeoweb", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "49Qtlkp6AFYugCivxmo1sHJPp6tHC7ntIgxMGxxO/u/jJB/bNYeOWABMhquVHHiV", - "encryptedSymmetricKey": "8f378f322ee0caa76cab219a5ecc2f71081968816752f0e28c1e3bc7bdc6281deee737de9677da31a85b3fce511a830b3b2488af39a77552c9ccd89d8ab5784c37d3d6d672ea872ed481946d088749c98af5edb9f49287e12d50e7ab94c4f2b9d0b8fb1a94f2a35c1b31f877c65ef71f5dccd1f38ecfcd4103f974c7677808e40000000000000020bbdd8f6d833fff95bf87841fa190920ec9e71577d4e1bffceb58a2220f146f1c157843d52932a2295c533ecc89ab9582" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Open source grants, Gitcoin grants (no VC)" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "3" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/gravenp, https://github.com/Geo-Web-Project" - } - ] - } - } - }, - { - "projectId": "0xaf7e0ce22feb1fa64e405a2d29ad3b0ac9092730b0312bf587ba3a20953b9373", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x5e20fc49441be4deb453aec1aad7801a18554ab5ec15d95570e72c987a7b460519e1e52da86adb0afcb935f4488b6c3ed776fabbb415fbcfee69624239d9329c1c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xD3b90AfCAcCF0A6913f47761894b2b03f212Fb6a", - "project": { - "lastUpdated": 0, - "createdAt": 1673165617127, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:74", - "title": "Impersonator", - "description": "Impersonator allows you to Log-in to dapps as ANY Ethereum Address via WalletConnect, iFrame or Browser Extension.\n\n - No private keys are required\n- Connect address to DApps in \"watch-only\" mode\n- Works with all major EVM chains like Ethereum, Arbitrum, Optimism, Polygon, BSC, and various testnets as well.\n- Easily input addresses via ENS\n- Dynamically switch connected address and network, after being connected to a dapp.\n- Transaction calldata generated from dapps is now visible on the UI\n- Tenderly can be used to simulate transactions from the impersonated address. Just need to get the fork id and set it into the config.\n\nThis opens up a huge variety of use cases, which are not possible with current wallets like Metamask:\n- Easily check dapp dashboards for your address on any device, without needing to import your private keys. Even handier for hardware wallet users.\n- Check out how your favorite Whales are using the dapps like Aave, Uniswap, etc. by logging in as them and viewing all the useful information like the amount borrowed, liquidity provision between which range, and more!", - "website": "https://impersonator.xyz", - "bannerImg": "bafkreidk5rrjh6sqsu54my47cexhzix5qlliaa2m4cgp6l4hqsnn4zvfoy", - "logoImg": "bafkreia452tjq7szpqbw6num254ly3gzo3bqycwzjz6eqimxskgynpxqlq", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiavbxf43ciw532ngk4eib4zis6pnuh7ahv3jfyfnuskhnob2hcuuq" - }, - "userGithub": "apoorvlathey", - "projectTwitter": "", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "cctc05E07IR0VlFabU8gRPP2PCMV8xcMINUdXUuyn3NGKLGivJ8B7Ay6GksO5Q3I", - "encryptedSymmetricKey": "945d345f2f3642ef17a8f221c4681fc47f732195677dbba75e05999201de5d17634877b12868b41c3324ff62d033a8103f7349417cfdfcfd78a9ac79f33419134569f55a00685a0e4f886b7b681ac3cbe3b8d6601d03a3500995eb80f55be58056580f5b9da76ef32057a3d26c0cbc91dbea3fc5ce09956f6dd3aff07cb7b3960000000000000020a8a49593e8bb3564d4927443b3be771e0ef701de3d4fdf41d7f8b68c2375be0a54114914f802929db49ac7550d3906b5" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "1" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "NA" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/apoorvlathey" - } - ] - } - } - }, - { - "projectId": "0xafb022ea11846bceb90516c35155defd6404e4948697cbfca25f5d34cf5321fb", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0xe8f1b5362a17938c17bee8b3d08a0cffbd639b76a6bf6a6f8b20e12f10786e0355b1d30e484c6075c7ee42d0d683c97c6fc03aec232e7cc9355c429631fa80fa1b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x99b36fDbC582D113aF36A21EBa06BFEAb7b9bE12", - "project": { - "lastUpdated": 0, - "createdAt": 1673634341875, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:193", - "title": "Tally Ho! - Open Source and Community Owned Wallet", - "description": "Help fund the development of the first open source and community owned decentralized Web3 wallet! All funds raised by this grant will flow to the community multisig wallet, which you can verify on Gnosis.\n\nIf you haven't tried the wallet yet, what are you waiting for? Download the extension at tallyh.org\n\nAre you a dev or an open source enthusiast? Come over to our Github repo and help us make the magic happen!\n\nFind out more about what we're building on our blog, and make sure to join the community on Discord!", - "website": "https://tallyho.org", - "bannerImg": "bafybeif32ux4gpeii4ryfa5y6mdwv6cfipmr23arhuqgy2btu52jfuidfi", - "logoImg": "bafkreihw53elvfa3oyjwbyivlkcxcdbrkfj3fnl564faktiirw5pduopjy", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiey2d24dqbncxwugvzt254jo44tp2z3x2otn7p5l776wn2dqyncry" - }, - "projectGithub": "tallyhowallet", - "projectTwitter": "TallyHoOfficial", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xf0eE42AA7A347A2D1e9DBDF5cfc42B66843aB33D", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "hash": "v0.0.0:LTDqh+m9ra7TXfjTbNgGmFt8yybNzuWaMzKACGljIRA=", - "provider": "ClearTextTwitter#TallyHoOfficial" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-13T18:20:21.600Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-13T18:20:21.600Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..Xv2UGvKUb3PigF6zkX6HUKnoQWsg5JU7dIG7iJ9MrYwWskxtjpOGzmegBYrtg7QHQVShTmuBP7FCixItkLGHCw" - }, - "expirationDate": "2023-04-13T18:20:21.600Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "ZdWeFPl/lXAGQXUjjV8S0SorjT5/06utVZEerCqTSzM=", - "encryptedSymmetricKey": "7b557d208e8cb05fd45b3e0493886113ca7bbcf5bd25980df8b281bd25e1a39da198a0c41189460ebd4ffe4277e3c5091c1073821286e1a4b7bbf5c4562e00bbdbb608942bf9c527924a4fac05f267ae724c3306a86b206b1732411b5797dba4d0b9e05e3580392049d28f6486288c1577b8d005bf47552eb9d6d8aa424e02e20000000000000020387ed0a77a301b4d71869513faa324abb49c5e656ea5debaa987b2adfc7d762ed3795ec8470f78d893a5677c1649fdae" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Thesis is funding the development currently" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "15" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/tallyhowallet" - } - ] - } - } - }, - { - "projectId": "0xb2f0898173acdeb52f3ddb6645d1dfd863d3159ea99491c75d0bcc61173041cd", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x5ea9c901ac7e081030c3a1425b456ca8312beeae97493afdb9d6be3d62784f9f6bdc1f3474505dfad576187631053c6982d7ee2eeb578c308c1f6596ff7e8b571c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xbe7A9D0ee2F1c7F6e44Ea922e52603e921566778", - "project": { - "lastUpdated": 0, - "createdAt": 1673474198547, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:129", - "title": "CounterAgent Art", - "description": "Our mission is to create a powerful healing process using art for domestic violence victims to process trauma and practice self-sovereignty, self-determination, and increase their sense of self-efficacy.\nParticipants will work through a series of abstract expressionist art exercises focused on increasing their sense of unique and individual identity, boundaries, and self-esteem. \nReadings or discussions paired with the exercises and either in-person or online support, will give participants opportunities to practice and gain a deeper understanding of the rights they have as a person to make their own decisions, to try new things, to learn new and valuable skills, to increase the confidence they have in themselves, to process trauma, to heal, and to bring beauty into the world. \nIt is our intention to create an open sourced web3 platform (dApp) to enable these workshops, the creation of NFT representations of the physical art they will be creating and to introduce the participants to the world of web3 in general. From de-fi to privacy protection, web3 is a place where workshop participants can find the tools they need to further practice self-sovereignty, self-determination and self-efficacy.\nThere are domestic violence resources to leave. There are escape plans. There are advocates who will guide you through the court process. These resources are stretched thin as paper and require call after call to access them. You know who can\u2019t make call after call and get return calls? Women who are living under the thumb of a domestic terrorist. \nGetting away is a mother fucker. It is dangerous. It is TERRIFYING. I know because I\u2019ve done it. \nMy ex-husband tried to kill me by pushing me down a flight of stairs to a concrete floor in front of our 4 year old son. \nMy daughter\u2019s father, a different man, dragged me out of bed by my hair, broke my finger, choked me, and squeezed my jaw so hard that I could barely open my mouth for 4 days. While I was pregnant. When I finally got him out of my house and had a restraining order, I woke up to him standing over me as I slept after breaking into my house. He was not arrested, despite the restraining order.\nTherapeutic art has been one of the most powerful tools in our recovery.\nThere are countless recovery programs for abusers that are paid for by the government and usually court mandated. There are endless free (and paid) recovery/rehab programs for addiction to alcohol, drugs, sex, gambling, and eating disorders. There are many 12-step meetings daily, all across the US for these issues. \nFor people who have experienced abuse, recovery programs are few, not well structured, and underfunded. You often find people with good intentions running a circle of stories centered around the abuser (codependent behavior) that often turns into the suffering Olympics, rather than focusing on the woman, her progress, and her well-being. \nTo be clear - abusers are 100% responsible for the abuse they dole out. There is no BLAME to the person who is abused. \nThat being said, getting and staying in an abusive relationship is the result of not having a clear sense of self and strong boundaries. The red flags that typically occur long before abusers take things physical would end the relationship for people with healthy boundaries. The problem with never having had any agency over yourself is that you don\u2019t understand that LEAVING is the correct response to abusive behavior or that you even have that as an option. While ending the relationship and respecting yourself are exactly the right answer, no person alive can do those things if they don\u2019t know, really know, deep down, that they CAN and that they have an intrinsic power over their own life. If you were raised, like I was, with zero autonomy, you simply have no idea about personal boundaries, let alone how they apply to you, and that someone that will hurt you will never just change their mind and stop hurting you. \nThere is a glaring lack of help that teaches people how to move forward and into an identity away and apart from the negative pattern of abuse that is likely all they have ever known, either to work their way up to getting out of an abusive situation or to rebuild themselves after they have left.\nThis is the space we aim to fill.\n\nFunding will go toward:\nCurriculum development\nIn-person workshops for women and their children\nSpace and material costs for workshops\nFilming demos for online use\nCreating a web3 platform for managing the workshops and onboarding participants to web3 by helping them understand web3 better, get a digital wallet if they don\u2019t have one, helping them create an online collection of their work in the metaverse (using Unlock Protocol on Polygon) that is a representation of their progress throughout the workshop. They will ultimately end up with a history of their process from start to finish, a story of their healing.\n\nFuture Goals:\nAdditional curriculum material from a diverse group of artists - ongoing\nGain widespread adoption of the curriculum for use by domestic violence services and individuals nationwide\nCreate a variation of the curriculum to be used with kids as a DETERRENT to domestic violence\nBroaden the potential use to people who speak a wide range of languages beyond English\nAdditional goals will be added as they become clearer\n\nFounder Personal History\nI have been painting since 1995. I am a self-taught artist, gathering information and skills from a few college classes, a handful of online classes, YouTube tutorials, extensive reading and art evaluation, and just DOING it. Painting has been many things to me, but what is most relevant to this is that it has been therapy and life. I believe that art in all its forms is one of the most powerful means of personal transformation and restoration that exists. While my current art practice is primarily about bringing beauty and joy into a world that can be very harsh, I have used art to process grief, to build my sense of self, and to exorcise traumatic events and their memories.\nI started in oils and worked sporadically in that, aerosol, and other mediums as a means of self- expression until 2010. At that time, I began to use art to process trauma, specifically domestic violence and rape. The art therapy techniques my son was taught at age 4, after witnessing his father try to kill me, were essential to his recovery, and led me down this path. I began working in acrylics/mixed media and found a magic I had previously only known through making music. I have also worked in watercolors, primarily in 2011 and again in 2019, when we were in Morocco, during which time I created an entire body of work - 30+ pieces - over a 5 month period, and solidified my desire to move toward being a full-time artist. \nIn the curriculum we are outlining, the most important thing is developing a sense of self and the absolute value of each individual\u2019s perspective, expression, taste, and message, all of which happens in the inner world.. Neil Gaiman said \u201cThe one thing that you have that nobody else has is you. Your voice, your mind, your story, your vision.\u201d In my opinion, sparking the imagination of the inner world of an individual and repeatedly affirming the value of their voice is one of the most revolutionary things you can do, especially for someone who is being, or has been oppressed. What happens inside of us belongs only to us. \nIn my opinion, abstract and emotional expressionist art are a deeply impactful form of visual communication that allows both creator and viewer to be moved in profound ways. My degree is in Mass Communication and Journalism with a minor in Psychology which deeply informs my understanding of visual communication. I have studied brain and behavior correlation and taken a deep dive into PTSD, trauma, and recovery from it. \nMy current work is an exploration of vibrant color, texture, shape, movement, and telling stories by imbuing the canvas with energy and emotion.\nThe largest history and all of my past and current work can be viewed on my Facebook page https://www.facebook.com/iMaakeArt\nI am an expert in connecting seemingly divergent groups of people through art and music with a proven track record.. My career as a financial planner speaks to my ability to communicate complex ideas in an easily understandable way, to manage numerous relationships simultaneously, to network broadly, and to steward resources responsibly. I am accustomed to floating between groups of vastly differing socio-economic and cultural situations with consideration for all and an eye to my own internalized biases. I have taken several courses in Group Therapy and believe what I learned about group dynamics will be an asset.\nCurrently I am the owner of Sunshine Alchemists & Soap Co and Night Sun Candle Company in addition to being an artist. We employ women coming out of domestic violence and give them flexibility and support to maintain financial solvency while continuing to be present for their children. Receiving funding for this project will enable me to shift further into community healing and art and free up finances to hire more people at the shop. \n I have lived a great deal of life, which has given me a tremendous amount of compassion. My parents were Christian fundamentalist pastors with a church and school in Montana. Our family lived in the abandoned forest service building that also housed the church and school. We showered at the Y across the street. There was no real kitchen. Our power was turned off regularly. I know what it is to live out of a gym bag and rely on the kindness of others for food. I had my first job at 12, out of necessity, touching up frames in a factory. Thankfully, my path also led me to live in the Bay area, New York, here in New Mexico, and to spend time in New Orleans and Miami, with people from all over the world. \n I learned that how I was raised and what I thought was normal was far from it and that unlearning is an intentional process which is ongoing. I have lived through\u2026 way too many violent incidents of varying natures, and as Lin-Manuel Miranda says, \u201cWrote my way out.\u201d \nCo-founder Personal History\nAs a woman who has had a long career in tech I\u2019m excited to be involved with a project that I feel will have a significant impact on bringing more DEI to the space. More importantly, it will have an impact on reducing the suffering caused by domestic violence and hopefully reduce the numbers by ending what can sometimes be generational patterns. \nI started my career more than 20 years ago when I graduated with a degree in computer science. Since then I have worked as a full-stack developer, architect, consultant, engineering lead at a successful startup and founder. I have the skills necessary to help bring organization and coordination to this project to ensure the funding received is used as efficiently as possible and to guide development on the web3 platform in a way that will see real results. \nI\u2019ve been involved in the web3 space since 2018, currently work for a web3 protocol, belong to many DAOs including several with a focus on DEI and serve on the board of advisors for multiple web3 companies. \nDEI Round\nYou can find the statistics in our grant or on Google but it is widely known that historically disenfranchised groups of people, women, children, BIPOC and LGBTQA+ communities with fewer resources are disproportionately affected by domestic violence. That is the community we will be serving with this program and that is the community we will be helping onboard to web3, thereby increasing diversity in the space. Additionally the current team, although small, is all female.\n\nEcosystem Round Tags\nUnlock\nAs part of the tools which will be built to enable the management of these workshops we will be building an open sourced art workshop platform (dApp). The platform itself will include the ability to create collections (Locks), mint NFTs (keys) on top of Unlock Protocol.\nPolygon\nAs part of the tools which will be built to enable management of these workshops we will be building an open sourced MATIC native art workshop platform (dApp) that will allow users to deploy smart contracts on the Polygon network and mint NFTs from those contracts. \nWeb3Social\nAs part of the tools which will be built to enable the management of these workshops we will be building an open sourced completely web3 native art workshop platform. Additionally as part of encouraging self-sovereignty, self-determination, & self-efficacy we will be introducing participants to the world of web3, onboarding them with wallets, showing them how to use Mask to protect their privacy and giving them some skills to increase their financial literacy and self determination outside of the traditional finance world.\n\n", - "website": "https://enddomesticviolence.art", - "bannerImg": "bafkreifvzr6wqelgnnkgys7667xw7ii4q5wmroqv6jz54n2ousfgco5vxu", - "logoImg": "bafkreiagy66j7vhu3qmob3znpknvu5vvm35ot24lmv62mqopmtpmsfwv2q", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreib6kmzg6wuvm4p5lg73c5tzq7fnc6ae6d5ysq2xvu2khgp6k3lgyu" - }, - "userGithub": "ArtAndMagic", - "projectTwitter": "glamguerilla", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xbe7A9D0ee2F1c7F6e44Ea922e52603e921566778", - "provider": "ClearTextTwitter#GLAMGuerilla", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "hash": "v0.0.0:h0yxaweE43Wm1ox2bV49mZFMoqcOFwL2UxGMvHLSrWY=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-11T21:55:21.769Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-11T21:55:21.769Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..GVNM4ReDYJ1yk3Yv9NlK5nJNmg9NRLZdOneSoNGVjQ4D7iV7Bik9zSjaxylU5aH9fhZbTA0L0hbstB2pc5_EBA" - }, - "expirationDate": "2023-04-11T21:55:21.769Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "WChW+4GSuWiAglFoeTtUUIslQD559LnsiV576cyiNE46xSAYJ5f+vBS7hJnRPYU1", - "encryptedSymmetricKey": "d00fa0788a86cc589e2f7e12fcc889a9b8f1434be9b3c43232ab51cd12c39d79eb20d3060f3c3e98c4b9ff437b7b7c04fe975e029a70a24babe605fde983cf412655bfd115121dd391bb6d9808384657de271d3d68c03031dbd515d3013ac0a5c345ee83211197c398adc08c1634ecb64075ee414de04bde220459972a970e220000000000000020162873743a8fbaf875ce9ff7ce8d632cd1542d711d85e80becbce5200b3e908c9d7cd5cd12b526f447371577fcd46291" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "GitCoin" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "2" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/ArtAndMagic" - } - ] - } - } - }, - { - "projectId": "0xb6a332decc38c703130a537ce7fcfe5a24bd85e52e0769994bc752d04e182cca", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x8c66da75035fc4b8360f24ffa512f44a6c27bdd05228f9645618b02a2ac6603a2b6f0b9b8580ce241dcce5b62a242725f9116e53d9660b774f10f37d77d62d5f1c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x531Eb60b2dDE9a841BA358EE033533AAF90D1feA", - "project": { - "lastUpdated": 0, - "createdAt": 1673663730285, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:200", - "title": "IDriss - A more usable web3 for everyone \ud83d\udc9a", - "description": "\n\ud83d\udcd7 ABOUT\n\nEvery human on Earth deserves frictionless access to crypto and the benefits coming from using it: cheap and instant transactions, improved security & privacy, and investment opportunities.\n\nIDriss.xyz is on a mission to help provide that by building a suite of tools making web3 more usable for everyone.\n\nWe are strong supporters and defenders of community ownership, open source software development, and access to crypto for all. Join our community of 4000 members on Discord, and let's build a more usable web3 together \ud83e\udd1d\n\n\ud83c\udf4f HARVEST TIME\n\nThe last Gitcoin round (GR15) was extremely successful for IDriss. 3453 contributors helped raise over $20k! \n\nToday, we are introducing our next tool and the fruit of your donations - IDriss Send, a mass web3 onboarding protocol.\n\nIDriss Send allows individuals and dApps to send crypto & NFTs to anyone on Earth, using emails, phone numbers, and Twitter usernames - no wallet required.\n\nTry it out: https://www.idriss.xyz/send \u2728\n\n\ud83d\uddfa\ufe0f ROADMAP\n\nDonations to this grant will help fund further development of IDriss Send and IDriss Creators - solution for online creators on Twitch, YouTube, and other platforms to seamlessly receive tips in crypto \ud83d\udcb8 ", - "website": "https://IDriss.xyz", - "bannerImg": "bafybeihm26acxbaplooj5ya7mxa3npd3nkd4tgnkssbin2zfqffvn3mbge", - "logoImg": "bafkreihj356qt35o5g4aftaylzdzn26arhy7igxlnocfdyb7h6v7twce7e", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreigpkl6yqxkseqmikaa74elsd3oung4i6vzxnymfchruqzrttzjiqa" - }, - "userGithub": "", - "projectGithub": "idriss-crypto", - "projectTwitter": "IDriss_xyz", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x88d7709ce401e4E7b5068156423ECB4f60A99F75", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "hash": "v0.0.0:yiaH3WtIUFnYDfc55Xj4dQrVFyQamAPv7DFHK1PCvEI=", - "provider": "ClearTextTwitter#IDriss_xyz" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-14T02:30:52.384Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-14T02:30:52.385Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..rLmuYpMsAr8aiGAywPlctx2-rCj94kG1ynSWvI3yNeLv4FlZ41S3syilybkFfq0qHuuGQbklAt0Ch3puoN_5AQ" - }, - "expirationDate": "2023-04-14T02:30:52.384Z" - }, - "github": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x88d7709ce401e4E7b5068156423ECB4f60A99F75", - "hash": "v0.0.0:W37MgjbKJ111YYRO3t3WhsZHgRqtsuPYJbosL/USO6E=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextGithubOrg#idriss-crypto#92825012" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-14T02:31:38.658Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-14T02:31:38.659Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..NfWsxCTBaspDDEkaoiOtVby_UdFu6icLKaQDE9NmO_CY5YZeAbGRIWvbNM1Bq9CN9dhyQGWYwaxsDyzhAuR3CQ" - }, - "expirationDate": "2023-04-14T02:31:38.658Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "C/fXa0gW/8oBFBRppEHHBsdH18Vnx6hg0hq7JiZME0mVg8eC463Buj7MBt572Gmc", - "encryptedSymmetricKey": "9d6961961afca05f54274e1236471407e229c83e9296edcdd37d0e2ba371afc4a6dc0917f89cacefb9749e573a07ae15c40c7be012966fa5ba6b9cbd065edcdf005f4b68cd6fa7d070c2921cf9c72250c174f3326ab1204d3686252c71456c8ee99cbe03009244884e1662fea63693a960e00ca023ac17086189247ae7cdb7460000000000000020f56ba33872bbe48fbc21980305fe834455efbea4e670ea5961dcd6aa3fafbc01b0a4b6efdf5ef4dfd5c8560d7a8423b5" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "CultDAO (13 ETH), GR15" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "2" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/idriss-crypto" - } - ] - } - } - }, - { - "projectId": "0xb6c349a5461b888f265c039d0081fdff98cab0bd51a31458437acdacc117b237", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0xd7183736c2d659c0a553ddb49cafa323da0587897c0093d61fbb19454dd27db23f6b59c42373f31a6e730f5880991be0ab162b3b391fe8881ba8a379e0ff10001c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xB25C5E8fA1E53eEb9bE3421C59F6A66B786ED77A", - "project": { - "lastUpdated": 0, - "createdAt": 1673511085722, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:152", - "title": "DeFi & Web3 Developer Roadmap", - "description": "I present to you the most comprehensive knowledge base for developers from A to Z.\n\nAll information is checked by the repository author. New tools and researches are added regularly. I check the database daily and tweet out updates and new materials I've found.\n\nFeel free to submit a pull request, with anything from small fixes to translations, docs or tools you'd like to add! Here you can track all my activities in one place!", - "website": "https://github.com/OffcierCia/DeFi-Developer-Road-Map", - "bannerImg": "bafybeid3bdh55q5ifqovvoid5d2zilpwplerfoii3k6cacrvmhgxorrvfe", - "logoImg": "bafybeie5be662iz7mxtb7qofwm7o2arqhbvae5jsbrxktlw7nbwyj2jyje", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiffppxltw3bzeqoamtowkbdl26noxtzmvphbp6in27w4pll6e3nhm" - }, - "userGithub": "OffcierCia", - "projectTwitter": "officer_cia", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xB25C5E8fA1E53eEb9bE3421C59F6A66B786ED77A", - "provider": "ClearTextTwitter#officer_cia", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "hash": "v0.0.0:oddE0E1apapaEIk5c3Uqs19GbgBWH3EL0TdRxwuQfSE=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-12T10:14:06.246Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-12T10:14:06.246Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..-G1WCEPO_AjSrAnmwxfdNAiJfVdvOEV7h9AOj9UosAprqwb64l3oBTVngu8UyaWYte7XbRkcSQuVEDoMuLIJCg" - }, - "expirationDate": "2023-04-12T10:14:06.246Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "oJse+tYs/ohzxbBWG0m/QQgq4FOG7bwZZLixmFvMJLPgTR0YN03wyUvodZkiQtIV", - "encryptedSymmetricKey": "7c0330f47d2d0e6e8354086897fa9c313c97d1578f2c1e94448390fc6e6fa6038f5c8bd15e1adc96f738240b722ce21190100199b9fb1b1b249b8189871a29a321a595ae71124e4ca312e17f02b98e3c7ef78bf59c8e0f71cfaa985f9379538a72192036a3e9859934bd8524952332695a82542b31ec7b6030c844fb8011a9c00000000000000020912e411bf45626cbd6fe6e3936e52f1389bd871c7cdd6776db23fe94a6ecfb14b99e1c59a3fe4966bb9033005eb78882" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Gitcoin, Pessimistic.io, Lego.Lido.Fi" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "1" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/OffcierCia/DeFi-Developer-Road-Map" - } - ] - } - } - }, - { - "projectId": "0xb701f16a30a2ed49d7820ad83352ee1c048b2bff81a1d9734cdd7a27708c72c6", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x272a4f012c8209b980cb75ce90805a53b489a0ef95d8fe3cb507e3677dd38adf1b6e02b1b93cd65a5a486c48f8a6508939639e25d39ba81589a6438c80c5a7ab1c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x55B23ed53Fe13060183b92979c737A8eF9A73b73", - "project": { - "lastUpdated": 0, - "createdAt": 1673280122409, - "id": "10:0x8e1bD5Da87C14dd8e08F7ecc2aBf9D1d558ea174:40", - "title": "Spect", - "description": "Spect helps crypto native organizations centralize context and decentralize decision making at the same time.\n\n**Problem Statement**\n\nAs DAOs scale to larger number of contributors, it is naturally becoming harder and harder to maintain a shared sense of context among all contributors. This has led to the formation of sub-DAOs and guilds. However, most of the current tooling to manage grants, bounties and tasks, distribute rewards and make decisions are built for monolithic DAOs instead of modular ones. Moreover, these tools are point solution which means each tool serves a specific purpose. Therefore, with every addition of a new tool for a new use case, there is a loss of context among contributors.\n\n**About Spect**\n\nAt Spect, our goal is to centralize context while at the same time decentralize decision making. To do this, we have built a tool for DAOs to form circles (or sub-DAOs) that manage grants, bounties and tasks. A tool that can also be used by contributors to fund each other and build history of contributions with soulbound tokens and verifiable credentials.\n\n**What can Spect be used for today?**\n\n1. Forming organizations that can scale N levels deep\n2. Run Ecosystem Grants Program\n3. Run Onboarding Program\n4. Run Surveys\n5. Manage Tasks and Contacts as a community\n\nHere are docs on how these can be implemented in an organization -\nhttps://docs.spect.network/\n\n**Features**\n\n1. Fully customizable tables, kanbans, lists and gantts which can be used to setup workflows\n3. Web3 enabled, sybil protected forms with ability to analyze and export responses\n3. Extensive Automations to automate chores\n4. Credentialing using soulbound tokens and verifiable credentials\n5. Payment on Ethereum, Polygon, Optimism, Arbitrum, Gnosis Chain, BNB Chain and Avalanche with any token using personal wallets or gnosis multi-sigs.\n\n**Integrations**\n\n1. Discord to map roles and automatically assign roles, send messages and create channels using automations.\n2. Guild.xyz to map roles and give granular permissions\n3. Gitcoin Passport for creating sybil protected forms\n4. Mintkudos to distribute soulbound tokens to contributors\n5. Snapshot to run voting periods on form responses and other data\n\n**What is upcoming?**\n\n1. Templated Use cases - Organizations will be able to setup advanced workflows within seconds with templates\n2. Complete Composability - Spect will be made composable on various different levels. Both developers and non-developers will be able to build their own applications with Spect. We already have an early version of our API docs that developers can use. In the near future, tables, lists, boards and forms will be made embeddable such that non-developers can build their own experiences using these.\n3. Make it possible for anyone to build custom widgets and bots on Spect.\n\n**How we will use the funding?**\n\nThe funding will be used to pay for infrastructure costs and contributor salaries.\n\n**What can you do?**\n\n1. Fill up the early adopter form and claim a soulbound token -\nhttps://circles.spect.network/r/074c06d9-120f-4b99-87a9-c0f6e415c9a3\n\n2. Create your first circle on\nhttps://circles.spect.network/\n\n3. Follow us on Twitter -\nhttps://twitter.com/JoinSpect\n\n4. Come say gm on\nhttps://discord.gg/AxWkJVfN\n\n5. Read and collect our manifesto -\nhttps://mirror.xyz/chaks.eth/us5rOm1jSsvmvqBOmef_SZSP6zzbNeo7ay-_DkacC64\n", - "website": "https://spect.network", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreia2uexuhzmvy3a5a7k3a5yj4ar3q5nccpgpmbhqfyhanykbwkxbqq" - }, - "userGithub": "adityachakra16", - "projectGithub": "spect-ai", - "projectTwitter": "JoinSpect", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x55B23ed53Fe13060183b92979c737A8eF9A73b73", - "provider": "ClearTextTwitter#JoinSpect", - "hash": "v0.0.0:ssfMb0kd3NvkT2cXfRsQycHTFwOVDl5E79vY2/KdBmE=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-09T16:01:41.148Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-09T16:01:41.148Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..XYkCBkhhi_VlUBMMUvR4rD8oxNy2o2xxDKhnoq3cE6lnbih6t_23xiHqyS8Tmex74ydD7iRQEFD6eNQQXz40BQ" - }, - "expirationDate": "2023-04-09T16:01:41.148Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "QL9gUI+6YmF+AYJu3S5698Xr+QlZWEb/lF1MNWLhEaXof9f6CLX658nEk5+PXQyq", - "encryptedSymmetricKey": "a91a7ee0c045caf2210b7260a6ea3b52524ef7ef3fca7b67a3e5a15ea57053bb9ff41af2c0fbf43558253ccb780ce91893869ceabd5a8ed94d95dd8ae49083c8540eb340488186f48c490a38023946e391fdb8adf37050cbc4ed60fbd0cf3ca17431f47329f6f57ea6c17978d96166884077ab1d0a7419b7ff7c06cf98ccad0b00000000000000208f88b60ebea45001d0ed9c8fe66a32356f7c00477b95bd216dd536ffad22a6c7d07b54b058b2c5b1e63d9fb0866e0aa1" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "3" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/adityachakra16 , https://github.com/spect-ai" - } - ] - } - } - }, - { - "projectId": "0xb746c0f648f9b930ea4568cf8741067a7fc7eb3928ac13cced8076212cf3cf37", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x5de8c56ba3f76ee858c419acae9791db99c5c45defb49023d167a374e09146053d00f27a4ccad3340ab8d8d0f431457881d17d30cb11ede6351db50a703a99a71c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x4D9339dd97db55e3B9bCBE65dE39fF9c04d1C2cd", - "project": { - "lastUpdated": 0, - "createdAt": 1673886037208, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:224", - "title": "Giveth", - "description": "We\u2019ve been making HUGE progress! Giveth is Building the Future of Giving and we are hitting our milestones. We launched GIVpower and now are setting our eyes on NFTs, Quadratic Funding & DAOifying nonprofits.\n \nGiveth.io is a radically open source, user-friendly donation platform that allows anyone to open crypto funding portals by creating projects for positive impact, with zero added fees and no intermediaries. Donors are also rewarded for giving to a wide range of projects that cover the field of for-good ventures including feeding the homeless, funding community currency projects, and saving the environment. Want to support public goods? It's all on Giveth.io! Projects can be created in minutes; donors can make contributions in seconds. Currently Giveth.io is live on both Ethereum Mainnet and Gnosis Chain.\n\n100% of every donation goes directly to the intended project, and we reward donors to verified projects with GIV. Learn more about our GIVbacks program here: https://medium.com/giveth/what-if-giving-gave-back-using-web3-to-evolve-philanthropy-a8500b7636ce\n\nNow at the start of 2023, we are delighted to announce some significant updates and future plans.\n\n\nMAJOR UPDATES THIS QUARTER\n\n- We launched GIVpower: A tool for supporting and curating your favorite projects on Giveth.io while earning rewards. It uses web3 incentives to rally support for, and drive more donations to, public goods projects. Learn all about it in this post and start boosting: https://medium.com/giveth/givpower-boosting-public-goods-to-the-next-level-bd335f92ecd3\n\n- We upgraded the verification process for streamlined onboarding of impact projects.\n\n- We integrated the Praise system to reward individual contributions. More info: https://givepraise.xyz/\n\n- A new Giveth Analytics Dashboard is live in alpha. More info: https://analytics-dashboard-blue.vercel.app/\n\n- And a lot more! Check out our end of year recap to see the other big milestones achieved this year: https://medium.com/giveth/building-the-future-of-giving-highlights-of-2022-26727ef11391\n\n\nGOALS FOR 2023\n\nThe following is a list of new products, partnerships and features that we have already begun to build for 2023. Our ability to execute on these goals is dependent on fundraising and the success of our economy, so if you want to support the Future of Giving, please add us to your cart and donate!\n\n\nIN PROGRESS\n\n- Integrate fiat donations\n\n- Partner with Gitcoin to bring Quadratic Funding to Giveth\n\n- Partner with Chainvine to create referral links and reward fundraisers with GIVbacks\n\n- Translate our products and documentation into Spanish and other languages to better integrate our global community\n\n- Launch a Giveth PFP collection to dip our toes in the NFT market\n\n\nUNDER RESEARCH\n\n- Partner with other L1s and L2s to bring more chains to Giveth\n\n- Create \u201cGIVdowments\u201d so interest earned on DeFi can easily be donated\n\n- Find an NFT launchpad to partner with to enable our projects to fundraise with NFTs\n\n- Build a better project ranking system, integrating impact and project owners assessment\n\n- Support projects in launching their own reputation systems to govern their donations as DAOs\n\n\nThank you for helping us Build the Future of Giving. We appreciate your support. We\u2019re all in this together!\n\n\nLEARN MORE\n\nSite: https://giveth.io/\nDiscord: https://discord.giveth.io\nNewsletter: https://paragraph.xyz/@giveth\n", - "website": "https://giveth.io/", - "bannerImg": "bafybeihndmwk6vxjrcxkd5a4dtsvcxauy3yhynji6jmnjh2e5owua5ruce", - "logoImg": "bafkreiczgblqaa53byteenslgvjskag4cd47kq5bgmepp3uepprnuwsa3i", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreih2fryiso5xpkjyhr2tjg3b2edobd2oyosp7ptxywenm6dl2sstqa" - }, - "userGithub": "laurenluz", - "projectGithub": "Giveth", - "projectTwitter": "Givethio", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xC46c67Bb7E84490D7EbdD0b8ecDaca68Cf3823F4", - "hash": "v0.0.0:SKiWQUIiBFalnFwTpE1jlatkX4/+usZeDD84eSUWIno=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#Givethio" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-16T16:08:38.519Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-16T16:08:38.520Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..c7b2KAqmBn0rlVg5i6SSniV53KZLXogv8OfMlreqO6sIs2_UPEWSel19h7oAUinwVrSr0j02XqNIrsIB1BR_Cw" - }, - "expirationDate": "2023-04-16T16:08:38.519Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "c3ADFaTTh1fjR8Zu+0K28V0FCgy7/D3k+KFXcA7jYwvA/ymVy7up2Y1LvT/BFjqu", - "encryptedSymmetricKey": "3e0c8e3e9e2a7de76d294f1e07dfd0c555ad7b8e148681eafe320d6c8ac3f005a772293b255e1001da96007c0ce97c187b8cf0bbdab361c2016e675c3bac83b1c6e6b50f524837fb9a597a215bfad4c92b844c1a48a8b9d822417ec7ee6a44af79ab7b8cc5a7047cc7161f299ff6f41378c96b52e1bd27ae4e20b2ae5632435e0000000000000020f14536d928bbe7d9e0a18efd6d4a02b05c1e094fa7f9d4150a9e0fe327b0f6baf207caf372e790e366da61ca733b9993" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Mainly donations!" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "42" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Twitter is verified, but I kept getting a \"Try again\" error when trying to verify github, despite connecting my github and being an owner of the Giveth organization, and having that stamp on my gitcoin passport." - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "User account: https://github.com/laurenluz Organization: https://github.com/Giveth/" - } - ] - } - } - }, - { - "projectId": "0xb8a2970cb5c24a12cd631f757560b2c765a32bc1d48b010d8cd1f23cc645ea68", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x39d4fee499c599371d75851457160af23e4f8f371944e70c69e2c8d36777d2ee64cc7f516ddc035a0756f75da75eb13b99e8cb6943f2c483134eb6b96020f5381c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xA64f2228cceC96076c82abb903021C33859082F8", - "project": { - "lastUpdated": 0, - "createdAt": 1670848603039, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:25", - "title": "LunCo: accelerating Lunar Colonization with opensource", - "description": "Our mission is to accelerate Lunar Colonisation by providing open source engineering software to benefit humanity\n\nWe believe that permanent presence on another celestial body would help humanity to understand how small and fragile our planet is!\n\nImpact\n\n - Lowering the cost of space missions\n - Faster engineering, faster knowledge sharing\n - Decentralized and distributed space missions", - "website": "https://lunco.space", - "bannerImg": "bafybeihoc7rxlnbwp32e7d2h2pavhrv4rbblg2oz6f6fo4fmrayioocbvu", - "logoImg": "bafkreigggvubpdcmpznt6dg5oyjsgw55xg5ju5cc76brhysxcvkbjgzbuy", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiemvkz2rkfniywu3kqeudhb7ow2wcuaebujkwuweborlhkf3jlbsa" - }, - "userGithub": "Difint", - "projectGithub": "LunCoSim", - "projectTwitter": "LunCoSim", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "wPxlwzp+u81/vxlkd4h3JSa6bmYNhKS3LFZnELElH3TFAUPd0yjHIuZMgbZ0MygU", - "encryptedSymmetricKey": "f5aed2660f3d988f7538cecc8db0add7ccb746ac1ef8c36ef233a92cff8e7a8fbb16416fcbf7d3a35b90e69d06dff413c97da84a21300b7e4daffa4533f814f20df82841dbd10291c6c0b626e91c611cb9b2b53bcffcdde95bd06c735460b59320d4d4fb5074d7d198f6a26ad7a11ec95635e5410bbedefa86a291018cc4d8b20000000000000020c2fb0a26da909602395dc898ef708b3af520f8ffafeea54ae29a356f665971791c3f57eca8e164f4b3b39d9383a955b2" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "gitcoin, giveth" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "6" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "yes, Twittter. I'm getting an error while verifying github" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "Organization: https://github.com/LunCoSim, Personal: https://github.com/Difint" - } - ] - } - } - }, - { - "projectId": "0xbab9b95ccf5784b8ba2a96627e10a71190820d2fee3c5034157c79e5945b77ab", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x48e2b3dc0b91ce15611371dc608afdd76d83415372e42d1303321ae78a73ef4001014ac1657f4ef03c4d9bfeb406bd3f3a61d14d4f3784ecf8906c6b54b04a251c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x0E4d2ec48f03a9eD9068EeA2926dE34b6AB8646b", - "project": { - "lastUpdated": 0, - "createdAt": 1673480904429, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:136", - "title": "Blaine Bublitz - ETH/ZK Infrastructure & Ecosystem developer", - "description": "Blaine Bublitz builds infrastructure for ETH/ZK application development. He also collaborates closely with the Dark Forest team and other 0xPARC-adjacent projects.\n\nBlaine is a developer who is excited about web tech, open source, the future of decentralized virtual worlds, and ZK applications. He got hooked during the first public round of Dark Forest and has been building in the ZK application ecosystem ever since. Some of his work includes:\n\n** ZK Tooling and hardhat-circom **\n\nIn collaboration with Jacob Rosenthal, Blaine helped to rewrite Dark Forest's zkSNARK build processes. This work was generalized into the hardhat-circom plugin, a configurable hardhat plugin which provides developers with a set of ZK circuit build tasks, and provides TypeScript declarations for snarkjs.\n\n** Contributions to circom & snarkjs **\n\nBlaine contributes to circom and snarkjs on a regular basis. He\u2019s provided patches to reduce the bundle build by 50% and enabled WebWorker support.\n\n** Hardhat plugins **\n\nBlaine created and maintains a series of hardhat plugins, such as hardhat-diamond-abi and hardhat-settings, which make large-scale projects easier to manage. All of these plugins were made possible through funding raised on Gitcoin and will continue to be maintained as long as they are useful to people!\n\n** Project Sophon **\n\nAs one half of Project Sophon, Blaine open sources many experiments related to Dark Forest or other ZK ecosystem projects, such as darkforest-local, Broadcast market, and DF plugin-dev-server.\n\nGitcoin contributions will support Blaine's ongoing open-source work on ZK infrastructure, crypto-native gaming, and developer tools.", - "website": "https://github.com/phated", - "logoImg": "bafybeieqe5enwqcudxekje4auxvxk5oauxfu24cc2s6td3ywudh4ewto6u", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreicm3r3wu2f4pl7qpxnskn74rj4rfht7qgjaznn6rkgqejoafedtly" - }, - "userGithub": "https://github.com/phated", - "projectGithub": "https://github.com/projectsophon", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "C4jdQzH9MZo/U/ovMdQCc5u0O0RHK+0lLH0j0c5//RKFZfRo7hkGjix7skjpITuj", - "encryptedSymmetricKey": "e767483296bc60cd29dc20a5d4e5636731e2cd1616004f9ae3b94b5ec26bc0659b400f9fb029fc899543226c4c679212df323dd571e26193b060d50d1391e3e10fe9eb41801f139b8de3ec26218dc61ae016e965518b52d9d0514cdebf081aa680006230f00920c6d7812439118e0a002a7234c863bd5d6f2639497789e3370d0000000000000020b2865635d56637e201154f2a6acda188210147d29f4a52e52b6dcab4766edc1fcfd2656d83e1e3b8375dd60ef8e81db9" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Gitcoin, 0xPARC Grants, GitHub Sponsors" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "1" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "GitHub" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/phated & https//github.com/projectsophon" - } - ] - } - } - }, - { - "projectId": "0xbb32c228edfe6261e885bca6e9fde72472ea1dce414a49b008148aabfa7fd427", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x886cf60e3cedd0f188cac7eda43e1a75da34f89f4fba64ce23365fee4a740ea41f1ed44470ea79d8a58c19dbf618c3b8eed7750052a784da4ef1c8de707b8d201c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x715aCC4a912f979279b9B3d3a46A3cF1e006C033", - "project": { - "lastUpdated": 0, - "createdAt": 1673511480607, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:154", - "title": "Contracts bots gang", - "description": "A collection of Forta detection bots to automatically analyze, inspect, and detect bugs on newly deployed contracts. The entire design is meant to be in three layers:\n\nDeconstruct bots: \nBots that scan newly deployed contracts, run inspections on the bytecode and spit out organized info to be processed later (function signatures, events, etc..). The bot uses 4byte.directory database as a lookup table.\n\nDetector bots: \nBots that use deconstructor bots (above) result to run automatic detection of the type of contract, interfaces supported or patterns used.\n\nHunter bots: \nBots that will be using output from detectors and deconstructors (the two above) to run simulations in a mainnet fork of potential attacks and vulnerabilities exploit. If positive results are obtained, alerts will be raised.", - "website": "https://github.com/OpenZeppelin/contract-bots-gang", - "bannerImg": "bafkreidsbq7ejm6lt3t6ldks2ttsojymzq4teolozsvfrbietp5jc3mevy", - "logoImg": "bafkreifyseamululrj4mgoe3lcrwd6my726vfrkxbjzvcruqovjqm2ache", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreibzpctvdfdk76dituvc4ca7blgauxh7sba5lbmwqbrycr7hu6rlmm" - }, - "userGithub": "xaler5", - "projectGithub": "OpenZeppelin", - "projectTwitter": "", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "qAA0HGascwT2GGmRgYPEPVFIw50rtYSqqhR5lm9Na+pUb7yisnAsNV4nB+e6W11u", - "encryptedSymmetricKey": "b0b2c3d2384ae57693e15a65aca8a9e6cfcf3582d9e796e6fbdde757cf166fb9d4ef18c917143cbc16d07b479a2fa50efaf95d306033ff79adfda294406e1c1bcff649370ed52ea9634aeabaf2e4e3c0886db1be765a2f7ac793f086a5d5e7ab0b103ffce9acc58a4c21bd240beb47ad1dd0b18a352494e2ebbfbc958d0cff81000000000000002005f7c40895180a712e082ac76c945191eed44589aff127cf9cc59bba11b0e6c7b5f020f80840032c0bf0f9d621e9b7b1" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "what is this ? what should I put here" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": ">50" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/xaler5" - } - ] - } - } - }, - { - "projectId": "0xbbe67a3d581624ace15b9c0e593fe548dc9f2df0d838df85a4a569d24601cadc", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x74efc621f410ce59bc87dfa4495f768b5f01ed1a8d4d70459b26562772b6ce2f6e6dde1a1c89d58d2be0902e201d1872194f9382b43875e2b2002a20d2fcd3031b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xFBE7a5a6B823B514aE952D51820940D286EB3Ef1", - "project": { - "lastUpdated": 0, - "createdAt": 1673510807620, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:151", - "title": "Open Source AI Podcast", - "description": "This is just the beginning... we will produce a multi-part podcast series about the miracle of Open Source AI.", - "website": "https://lootpodcast.xyz/open-ai-podcast", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreigz62degjttrrtdfr23d2qmcw76v532yqkk7ykrcbjju5whxza2eu" - }, - "projectTwitter": "https://twitter.com/xyzpodcasts", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "pgKFiSNKfi/CB59WpLpCYvZCncj1xOh1hJPg49J7bv/GC0TKvZpISJJG3zrwp1ag", - "encryptedSymmetricKey": "d68774e6627b6e12a60f3284b5bb88142fda7e4d3215a6ff72065124c5f4e74b402c2c56f43400056935f4520e2c8514febd1f3c5540f8a61e2068306f9a7863f34acb904d032ebe42aa6d41948ef5dbc8043eb34a02d9f542261ea0852c62acbf4bb193d6e0e2a3646d5cc2ee5ff616305bbd3f7232882d42d509c25e73a557000000000000002071b4f9b2d443b6b43cdb33a9459c2e44d7c040a715b156e69e14dec6105a9044a5b56e06937e813bb074e1296c0aa8a4" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "The public" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "3" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "No" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://gitcoin.co/paulmcnally1982" - } - ] - } - } - }, - { - "projectId": "0xbccb2617f0d5ddaf2d8d010d682575f679e73545ad74048dd8e20374ee3ff37a", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x8444d51c6aaa855d1bb683fb30e45df545263b152f7a14fa383ac6ebfe187aba30eab7e0345f10944ec0e5197c1bafdcbe735d59d4f3eaf7876c129502e9609e1c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x70CCBE10F980d80b7eBaab7D2E3A73e87D67B775", - "project": { - "lastUpdated": 0, - "createdAt": 1673280720472, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:86", - "title": "Vyper Smart Contract Language", - "description": "Pythonic Smart Contract Language for the EVM", - "website": "https://vyperlang.org", - "logoImg": "bafkreif5ydmrjv4z3i7xg4xpye6guql5ljtw3x3oj7gkdkgmxt7wcuibo4", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreidgmkzkearat7wji2pqb6qxif453y5fnkcmvkg6afsvthwu33sshq" - }, - "userGithub": "fubuloubu", - "projectGithub": "vyperlang", - "projectTwitter": "vyperlang", - "credentials": { - "github": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x1C277bD41A276F87D3E92bccD50c7364aa2FFc69", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextGithubOrg#vyperlang#3859395", - "hash": "v0.0.0:3Dti1NOfEUTsOraKccEd8S/n3Ns6b4V8aRyRzzP0ges=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-09T16:11:52.346Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-09T16:11:52.346Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..nArV95WLe1Ehra1aQ8RvD8XSvRsz_f4g-xUaAkrdFcyHX5aBtKEsFlw20ceNW0D0IfSivpHcyZ8jWLmt5yIfAg" - }, - "expirationDate": "2023-04-09T16:11:52.346Z" - }, - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x1C277bD41A276F87D3E92bccD50c7364aa2FFc69", - "hash": "v0.0.0:l7yVyXKFJpvIRhpIX2g+wzqrxwTP9VHcAUT7vc/IXrg=", - "provider": "ClearTextTwitter#vyperlang", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-09T16:11:41.343Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-09T16:11:41.344Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..OE2KgVZNEmrIGpuUS9Sj_dqttAB8vDWEG4bVTyfQFS33NpMBwLm_m5ci6aVFj_SugcprVKo2Bnvo9mXzcx_kDQ" - }, - "expirationDate": "2023-04-09T16:11:41.343Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "M1t/Gy2iEBrUQqXPog6mXSpO3vXlC4et0m1Si5rrNB2mnguHTNXnT5rhj/qaGjrc", - "encryptedSymmetricKey": "34f50febae6d5b5d2f3e33b78ba650831a046d3644141a422b37be66a331193d386b7becd46e9659dca402be2fa8e412bc708d2db2cb9e33a619ade0f2737f46ff245833485c335d08fb8449fb6367c670c283902afc1e91928399c9e3208ca39180280688c1ac4c6c06f940c6655ed00677502a99bf1e5bab65009bc0bc763c00000000000000206fecdeb3ee58d36c9ccf3caa93e633533a43df71bbe27a7195fc1c00f1bbb733ba4cd7b55fee9ab6db8d00ca996bc595" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "2" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "github.com/fubuloubu; github.com/vyperlang" - } - ] - } - } - }, - { - "projectId": "0xbe519f8c8f7ff2acb359dd757c5d2bf25b05d9fd29b8684885aa27f1fa487fcf", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x1bc159c3500555813662262a336c070a942468e82f2e6cd7d345b03ce0c653cd2d3bf342834346b287bf6b6be57001592bd45604c4941708096e6c868ae1c42a1c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x3A5bd1E37b099aE3386D13947b6a90d97675e5e3", - "project": { - "lastUpdated": 0, - "createdAt": 1673075122792, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:63", - "title": "Lenster", - "description": "Lenster is a decentralized and permissionless social media app built with Lens Protocol \ud83c\udf3f", - "website": "https://lenster.xyz", - "bannerImg": "bafybeiaz5llt67iscxakrvqlvvrlqphk2qhwypagnxztk4il3ssyqbyrli", - "logoImg": "bafkreiaaabeober6ur2xf3pjxufodzq443l4i5c5lbiyeipsl2jpd2vm5y", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreianoyidjpiir45oj2zadw53lxi5yjywlrgdrq42sbum2ow5o5yqnu" - }, - "userGithub": "bigint", - "projectGithub": "lensterxyz", - "projectTwitter": "lensterxyz", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "5648RSxsI7FCetIV8ZWnugH/RC+tld1VLK3oqUgsqOg=", - "encryptedSymmetricKey": "7be877d326574f1fea015e42b0866552c62b46854f3330c9e1eaa8c27a2c076858221302c8b57877b6f4f71a24b09318aa9c9035433b56f5c9b4f302234cfd2c86a0e847f773a702b01161d51ecb7ba1881d1337c2f766e0f9a93df1eddb4f876030fa772f6d845ed4019a366fdb283800bd3186209ce76b182a627b20987fc5000000000000002067ce831933dd705604ae3e8891f548195743ddedcdb922fa0b4230ce7d4af8b62e763b3c1ef7c05d5fd285f9464b7f8f" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Ethereum, Polygon, zkSync" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "1" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/bigint, https://github.com/lensterxyz" - } - ] - } - } - }, - { - "projectId": "0xbe908c53999e5b19bd7988611573109daaca67a24688a2bb6ebf27c9fc47dc5b", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x92a9e0c248446d6705a7170b58fdf4af0fd8cea4215648cab0f3e19f48d9ce8e3d4dbda7225b40760eb473bf0522ba1adec0bff727d255c8c1b31fa39c6f271b1b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x0414189c6eb456b4d62f8CC69bC7Ebdc93C94f0E", - "project": { - "lastUpdated": 0, - "createdAt": 1673913454999, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:234", - "title": "SheFi", - "description": "SheFi empowers women to unlock financial freedom through crypto education, experimentation, investing and a global community. SheFi has onboarded 1000+ women and non-binary folks to web 3 through our crypto bootcamp, experimentation first learning model, and community programming, including guest speakers and investment discussions. \nSheFi has 60 hours of content, 18 courses ranging from blockchain fundamentals, to DeFi, NFT\u2019s, layer 2\u2019s, web3 social, DAOs, staking, etc. We\u2019ve onboarded 7 total cohorts and hosted classes for large organizations such as Google, United Talent Agency, Opera Browser, Oxford University, and Aave.\nSheFi plans to onboard millions of women and is at a critical point, where it needs to scale beyond its current model to serve the number of women that want to participate.\nWe have plans to add new protocols, platforms and exchanges to the curriculum and want to provide scholarships to sponsor members at hackathons.\n", - "website": "https://www.shefi.org", - "bannerImg": "bafkreiclcoju2bovk3fwfv5d6eg53uivzcxkkx4qvy72xx3zvxdb4jzu5y", - "logoImg": "bafkreih37uuynrfvyypjfqj74b6qhbdqwsye6ipekuonewldjpkscgevje", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiaftyfbtgstkto3ggkdeleu4iljupj4wb3nwk5kbeuf4euwcxa3su" - }, - "projectTwitter": "https://twitter.com/She__Fi", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "JTnxIvhhrFiRClTj2nAu96a+DeC8KTkdcG8Nn38IPUsipMSEEz2oQ7xYAwYbkLvN", - "encryptedSymmetricKey": "c888926969f2c4b29fde73eecd0a2c8520618748bc50dedb135b8ce9299bf370fdabe8ac3e6325873bac7596399eea15a05e1c2c172c28d1d75f56a84f1a120b9ae1b4b6a2ecd3484256a8d976a2717213f98fc4b009457107622073b42ae78df173bf79e1d9ad3b5881368214379c5c87a5dbadaccfea0475c719eabf42bf2c0000000000000020ec8029fa6874ab46117b1076b70c86bd7eec9ddd524d5f1b09c3d7086c1e8b6a6e339c372c4466d40fd9f1045433028e" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants and membership payments" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "7" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "No" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/melove07" - } - ] - } - } - }, - { - "projectId": "0xc11f49e0d04bfd2eb724cf01aeab92bf2329568859d21fe3e3d72741be73d4b4", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0xd2f5178f2d73b551ac906602890d0b1a6fcfc2491a56685531d4e8d33012465065e4c29bd0e6ec0ed1df5fc472bc163c18601f46f8bcb0d72ed429daa609dcd01c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x8917418aBe36E6E788068E96EF5A47d7484C06b1", - "project": { - "lastUpdated": 0, - "createdAt": 1673633365797, - "id": "10:0x8e1bD5Da87C14dd8e08F7ecc2aBf9D1d558ea174:49", - "title": "IDENA", - "description": "Idena is the first blockchain that utilizes a unique consensus mechanism called Proof-Of-Person, which prioritizes people over tokens. Unlike other systems that rely on money-based governance, Idena operates on the principle of \"one person, one vote,\" ensuring that power is distributed equally among all participants. This prevents a small group from gaining too much control. \n\nIdena offers a puppet-resistant crypto-identity primitive, which is used for democratic voting, Quadratic Funding, fair airdrops and decentralized governance.\n\nIdena is accessible to anyone. It does not require any personal information and allows participants to join the network without any investments. Users play an active role in mutual verification by challenging each other with AI-resistant FLIP-tests. This process is done in a synchronous ceremony, which ensures that individuals cannot spoof multiple accounts.\n\nThe network is protected from Sybil attacks through regular validations and Quadratic Staking. Quadratic Staking is a mechanism that prevents large stake holders from dominating the network and encourages small individuals to secure their identities with stakes ensuring democratic staking rewards distribution.\n ", - "website": "https://idena.io", - "bannerImg": "bafkreiboedudas4c3kygrhr6dpc6peqaar5ctbyq7627mp3velzxvemkem", - "logoImg": "bafkreihb6aoxbqzup5g6nmktqyiryrkax4k4o3rhqpncnuszhei7dneamm", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiedd66w33irrqxfhywdgf5ddrznswdek77w562kjvgh5czsdnowma" - }, - "userGithub": "midenaio", - "projectGithub": "idena-network", - "projectTwitter": "idenanetwork", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x8917418aBe36E6E788068E96EF5A47d7484C06b1", - "hash": "v0.0.0:Wt7bknsJYM3zR2ZyCpQ8rR/PIgNCLU38kufQQtF1ueA=", - "provider": "ClearTextTwitter#IdenaNetwork", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-13T18:17:47.522Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-13T18:17:47.522Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..z-VAthLdpG6wM4bts2sLOyK_hkt_Z0BX0Do_4FhFu86WveYexJyBemQqkRkBT_hOOPYAu5E4dcJyVB5Vu2OPAA" - }, - "expirationDate": "2023-04-13T18:17:47.522Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "nZFm5IUqoa9AVQKTVAiCWYTODZ7MYB+pDzU4l4TBNvI=", - "encryptedSymmetricKey": "8427954d68f5b98f53590f1d27583a13267bd82138c81c6bf35c41576372f5c31ac4527a3d758ef6ab890de678c083130384017a27ea5159529096052e235da8a61fd7169342de42ba634d8bac62121bc8ccf1dc2f867d3fd92a6355ab685b8d6e798e883392eead27fb7c8e0880d2bef4fbfeda500bf0903c965b0c66d7e102000000000000002002a305f5cfeb9e87a0d39d54f77c583a340942ee48101a7e6d6974809753b05356e879a6dc2b8137d97ba69c014f118e" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Private investments" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "7" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/midenaio https://github.com/idena-network" - } - ] - } - } - }, - { - "projectId": "0xc290dd8e51ac35480d9872ce4484aac23bb812c47c0567bfd4beb9113726ed11", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x7f48c45d56b95fdbf57ef18df292479b9e7b904d33c4669477ac865a7de5a5fe5b6cccf0f385bcf4af6dde7726328930a068ecf4017ccd572fb62d62196a4f4101", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x947F8A49640B4770A8c7fE3C1E69FfC974295448", - "project": { - "lastUpdated": 0, - "createdAt": 1673637345495, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:194", - "title": "ZeroPool", - "description": "ZeroPool is blockchain agnostic privacy engine. Our solution is build on zkSNARKs. We research and create privacy technologies under fully opensource license and you can use it in your products.\n\nEVM, Substrate, NEAR implementations are available and live on testnet, and WAVES implementation is coming soon.\n\nWhat is under the hood:\n\n* Fawkes-crypto / Circom / Groth16 / Poseidon / * Solidity / Typescript / Angular / NestJs / RxJS\n\nFuture Plans:\n* Switch to Plonk Q1 2023\n* Implementation of newest polynomial constructions, providing lightweight proofs and TPS speedup Q1 2023\n* ZkZkRollup Q2 2023\n\n\nhttps://goerli.testnet.frontend.v2.zeropool.network/\n\nhttps://near.testnet.frontend.v2.zeropool.network/\n\nhttps://substrate.testnet.frontend.v2.zeropool.network/\n\n", - "website": "https://zeropool.network", - "bannerImg": "bafkreictcgcrwq5ps772mcjljgidwkjqpg7ftyhggkht3mw5r4gpsedcia", - "logoImg": "bafkreiau5536yiuxdzsr5qy7h5fi2qidjnojzn6bgjlxop7al5svwjsla4", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreig6jx5dnxuc3nyb3f5agyvzkkvskuvt24qfjk6farbjhyzacf44ny" - }, - "userGithub": "snjax", - "projectGithub": "zeropoolnetwork", - "projectTwitter": "zeropoolnetwork", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x947F8A49640B4770A8c7fE3C1E69FfC974295448", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "hash": "v0.0.0:qhTP2VRVwpXS2M6w8wK1mKTBdc5BYg5CKKAXBasBfWs=", - "provider": "ClearTextTwitter#ZeroPoolNetwork" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-13T19:14:40.023Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-13T19:14:40.024Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..pNuyL6MRMBHnm86rQJNqAoQ2KhRvXmtFyDYY32VIkJzRCOWh98jhBKnEuUK7aHx-DsCT65-j63ihaCozTxhxBA" - }, - "expirationDate": "2023-04-13T19:14:40.023Z" - }, - "github": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x947F8A49640B4770A8c7fE3C1E69FfC974295448", - "provider": "ClearTextGithubOrg#zeropoolnetwork#1750575", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "hash": "v0.0.0:Imi/ytZh3RRHlaFjbFQaaZ6xRtYwD+z6Z5NT7bOosE8=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-13T19:15:09.106Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-13T19:15:09.108Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..4ztbDRXiMpSOwmMuiPGOyVnHHNuv8Dfv7ri9y8NrKGck9t_JlHY_imVHfd3IDi22I2sYbTDSzpD2YmNA9qCsDg" - }, - "expirationDate": "2023-04-13T19:15:09.106Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "YI7qMgxe2qilO3PMOAhffZQIUCtISlG64NigTb/r7etZG4IAWnJjHJxhJirIRZxx", - "encryptedSymmetricKey": "9ba86851ce4e30de29c38539d150d80c08967e72227b422b8d6127192e05d9e6cd84779be7ac58f584f68fadeb9d240008107c6d1039729d150ec989e83e0384525f60506d699621e5a370033880459e2ebd46abadac76f11c924751e3b9c8848597a5375d9788afe1f3e17e4434a8ed98837936f681337dd6c25b940a64075a000000000000002099ae50d073310fba5b7d587857512a267e11e9119c5ba52c69098b5f2b98a97e9198a7efebf97f911a0008521031db99" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "6" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "snjax zeropoolnetwork" - } - ] - } - } - }, - { - "projectId": "0xc32580816d64d790814f8fb7d50f45da730a4bd68c504fca200c052d3ad383fc", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x6ca19e74a05f9422c7b71e7b54174813fcfeecb322b96c9ce2470ecb603955b42fa26bdc10bd97f52a78eaa458783d0e823ef7023a29d8974fc00a1513b5d6dd1c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x895F63111B97c7Ad0D620f8610Dd360a9c567F31", - "project": { - "lastUpdated": 0, - "createdAt": 1673158790244, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:75", - "title": "Dark Sea marketplace in Dark Forest", - "description": "Dark Forest is a fully decentralized and persistent RTS (real-time strategy) game. It is the first on-chain game to incorporate incomplete information (known as \"fog of war\"), thanks to zero knowledge proofs. Dark Forest recent community round 1 organized by GuildW-MarrowDAO demonstrated the interoperable nature of Dark Forest by modifying the original Solidity contracts to add dynamic gameplay. \n\n \n\nDark Sea is a NFT marketplace for Dark Forest, which allow players trade artifacts (the origin NFT in Dark Forest) in game. It's the first and largest marketplace for Dark Forest.", - "website": "https://darksea.market", - "bannerImg": "bafybeicdglc27dk6m52ilvqs3wi3afomv3w3x3yahfcl6bmtlimxcw5psa", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiehsj6lrunx2ijl5socgg7a4undvgaqkhjkuxgyuafq43tilkez7y" - }, - "userGithub": "snowtigersoft", - "projectTwitter": "snowtigersoft", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x895F63111B97c7Ad0D620f8610Dd360a9c567F31", - "hash": "v0.0.0:w8yV//dKF/t7+XmZAO0MBTvByc9WzOLGj6mxZ1+t0UY=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#snowtigersoft" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-08T06:19:27.092Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-08T06:19:27.093Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..TV1sgB9JG-A_-VZiLICqfhYtQaTYpHsj4ssEGYESkr8qrVDFFPuKqjWDzwO6TzvHkvoiB0U8FwqClZFxi7kNAg" - }, - "expirationDate": "2023-04-08T06:19:27.092Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "46iH+7QloynY/RWN9K9x+6c/R1jqIkp0RPYuSyenRtvv5mSXB8iUGo4k6tEe7vYf", - "encryptedSymmetricKey": "a9b3123e78b4e3d088c9caaf3efe3ea4ef93a7e58cb7b7c1639952f48045ef487c2e2db71b9380992f4915c39d6280041912c29aeb70c94c6ede63b4c4585c36ede1a09eb70924bf5831d498009da0b1c273df80ed052cc16372b154b67377924a445347b0b6ddae0b4983f950fb26a18cabedcba49236b31296c28f8791b3fe000000000000002079b01ef26633819ac1c5f950a477b016d6f591f685deea0189c13584b18e95f95b725bc7ff503aea56fc396c5b3594a2" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "No" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "1" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/snowtigersoft" - } - ] - } - } - }, - { - "projectId": "0xc5b3ff259773efe69ed973d346afa656a1a6195bc7156098d2e7fc3ede11cf44", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x1d7b9f8dc2dc1af65a70e8e18169870c47c62ee07e8af228324bf41a58e6049b4c7c25ac107e5d6a32a05c9fcb1fe4d975d17428d4d6cc2f8c0dc773312e828b1c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xeF0Ca09fbf9a5f61E657Fb208b46b8685c1d4766", - "project": { - "lastUpdated": 0, - "createdAt": 1673323376102, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:91", - "title": "vfat.tools", - "description": "vfat.tools is a suite of calculators for yield farming. It is a fork of yieldfarming.info, expanded to include many different types of projects, while maintaining the minimal aesthetic of the original. \n\n\n\nKey offerings:\n\nMore information than is typically shown in a project's own rich graphical interface\nConcise presentation, so you can view all of your positions in one page\nAlternative interface for interacting with a farm's smart contracts\n\n\nAll listings on the site are and always will be free, and the site will always be free of ads and tracking cookies and so forth.\n\n\n\nFuture plans include:\n\nMore lovely farm projects\nAn API with information about each farm\nAdvanced features like adding single-sided liquidity or claiming from multiple pools simultaneously\n\n\nAny grants will go towards maintaining the current modest server costs, and investing into a full node setup which will lessen the site's reliance on MetaMask.\n\n\n\nIf you have a farm or feature you would like to suggest, please get in touch!\n\n\n\nAddendum: vfat.tools v2 development is on-going at full speed, awill include features such as:\n\n-Portfolio view\n\n-Farm comparison/search\n\n-Farm-assistant contracts (compound, claim all in 1 click, and more)", - "website": "https://vfat.tools", - "logoImg": "bafkreih6qz52obxuuo3omjsxfzsneuof7ynpiewmkk4labvcdjbwd6otrm", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiecf26ntgdku4wo3iyf6nvel5wtzcekjtjonjbevo6pumjzgpc3wq" - }, - "userGithub": "vfat0", - "projectGithub": "vfat-tools", - "projectTwitter": "vfat0", - "credentials": { - "github": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xeF0Ca09fbf9a5f61E657Fb208b46b8685c1d4766", - "hash": "v0.0.0:aFNZqSqo0chGo98r+REvXnbVuPTwCkW8R+4SOjNFumM=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextGithubOrg#vfat-tools#1417365" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-11T16:16:35.887Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-11T16:16:35.887Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..3K7f_fYKV1eKL0uA-wFMgthx2KtzgEX2OrBAp1t7qgVIy9smTXzUq05hBxfL0_VzejuP7k6-ahlHDFr_ECe7CA" - }, - "expirationDate": "2023-04-11T16:16:35.887Z" - }, - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xeF0Ca09fbf9a5f61E657Fb208b46b8685c1d4766", - "hash": "v0.0.0:MUh0exnX5wH2Ji0C/yNS8Ttq0UEivBdw3vTHZfdyQGM=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#vfat0" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-11T16:16:26.084Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-11T16:16:26.084Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..7xAxYCEU2kg1Zu20jeTiVGRijN1-I4AadiSNQUu3XIqndU4vZ8dAtwJRsYYhO_RuV8JGXPMVsGFk7n75p9OnDQ" - }, - "expirationDate": "2023-04-11T16:16:26.084Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "2iiLyt/xRpcguwITxVcE2t8OCJ8Nvv2XN2xY4fYgivc=", - "encryptedSymmetricKey": "4d04d026683db83e1f6318616e2bd2be656d572cf83f275813ce07323d3ef67c8440627154c94eb26206c73cb64223167d0f31ffdb153d8c2eb95118e77dbd4767ef5845ed11412e4d535b9ef0c321b72a3500e3bba9ab5388e3ecac8a6179ad9dc2075f39aa43365321c598287c809ff82dcafc15f623fdb68c40f225a3ef1800000000000000204cdadb2f3f3c8d2d4ed1cc1f942bdd50509606670cbc76d24b95e9b25de7e946bcd65452040d011c875243a7fc04e68e" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Self-funded" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "2" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/vfat0 and https://github.com/vfat-tools" - } - ] - } - } - }, - { - "projectId": "0xc5e03df33fe4fb742d9db975d52414e41adce21d16d47692f266eac5b33c5c77", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0xce58235c5274d3120e580af7556139af04fb13029b09b1635faca990d52360452edfefefb930526f83cb77fbb370587a1e9b236e0171ce63c5cc1ebe8940f2411b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x55B23ed53Fe13060183b92979c737A8eF9A73b73", - "project": { - "lastUpdated": 0, - "createdAt": 1673485682532, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:139", - "title": "Spect", - "description": "Spect helps DAOs create advanced workflows to run successful grant programs, onboarding and projects.\n\nWe're live. You can try Spect here.\nhttps://circles.spect.network/\n\n**Problem Statement**\n\nIt is hard to operate a DAO successfully without the right processes & tools in place. For example, \n1. A grant program could lead to a high number of churn among grantees if grantees are not supported well or are not provided with enough companionship to help them succeed. \n2. Onboarding new members to a DAO may lead to a cultural & experiential decay for existing members if the right members are not onboarded and if new members are not educated about the culture & processes within the DAO. \n3. It is hard to have a shared sense of context among contributors if context is spread across various platforms and resources. \n4. Incentivized surveys, more often than not, attract sybil attackers looking to make a quick buck and in the process destroying the integrity of the survey.\n\nSpect exists to solve such problems & in the process help DAOs succeed.\n\n\n**About Spect**\n\nAt Spect, our goal is to centralize context while at the same time decentralize decision making. To do this, we have built a tool for DAOs to manage grants, onboarding and projects all on Spect and make decisions about grant applications & who to onboard in a decentralized way. A tool that can also be used by contributors to fund each other and build history of contributions with soulbound tokens and verifiable credentials.\n\n\n**What can Spect be used for today?**\n\n1. Ecosystem Grants Program\n2. Onboarding Program\n3. Surveys\n4. Task and Contact management\n5. Forming workstreams that help in scaling an organization\n\nHere are docs on how these can be implemented in an organization -\nhttps://docs.spect.network/\n\n\n**Features**\n\n1. Fully customizable tables, kanbans, lists and gantts which can be used to setup workflows\n3. Web3 enabled, sybil protected forms with ability to analyze and export responses\n3. Extensive Automations to automate recurring chores\n4. Credentialing using soulbound tokens and verifiable credentials\n5. Payment on Ethereum, Polygon, Optimism, Arbitrum, Gnosis Chain, BNB Chain and Avalanche with any token using personal wallets or gnosis multi-sigs.\n6. Templates that help you get started with an advanced workflow in seconds.\n\n\n**Integrations**\n\n1. Discord to map roles and automatically assign roles, send messages and create channels using automations.\n2. Guild.xyz to map roles and give granular permissions\n3. Gitcoin Passport for creating sybil protected forms\n4. Mintkudos to distribute soulbound tokens to contributors\n5. Snapshot to run voting periods on form responses and other data\n6. Gnosis Safe to distribute payments from multi-sig\n\n\n**What is upcoming?**\n\n1. Complete Composability - Spect will be made composable on various different levels. Both developers and non-developers will be able to build their own applications with Spect. We already have an early version of our API docs that developers can use. In the near future, tables, lists, boards and forms will be made embeddable such that non-developers can build their own experiences using these.\n2. Make it possible for anyone to build custom widgets and bots on Spect.\n\n\n**How we will use the funding?**\n\nThe funding will be used to pay for infrastructure costs and contributor salaries. \n\n\n**What can you do?**\n\n1. Fill up the early adopter form and claim a soulbound token.\nhttps://circles.spect.network/r/074c06d9-120f-4b99-87a9-c0f6e415c9a3\n\n2. Create your organization on Spect.\nhttps://circles.spect.network/\n\n3. Follow us on Twitter.\nhttps://twitter.com/JoinSpect\n\n4. Come say gm on Discord.\nhttps://discord.gg/AF2qRMMpZ9\n\n5. Read and collect our manifesto -\nhttps://mirror.xyz/chaks.eth/us5rOm1jSsvmvqBOmef_SZSP6zzbNeo7ay-_DkacC64", - "website": "https://spect.network", - "bannerImg": "bafkreiajmn7ymjtqfiq3u6mo3no3tcj2syxpe65egyhl77rjbkyfxiwoy4", - "logoImg": "bafkreidbyl2eyfrp7mga5cmcqvjmdl4oqtv6sfyuoooln6cmo2aixwf3bu", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreibg35bl52zlse3avd24r6gpeuvnwmiiadyhpg3emk5nzs4x4sndqe" - }, - "userGithub": "adityachakra16", - "projectGithub": "spect-ai", - "projectTwitter": "JoinSpect", - "credentials": { - "github": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x55B23ed53Fe13060183b92979c737A8eF9A73b73", - "provider": "ClearTextGithubOrg#spect-ai#31283807", - "hash": "v0.0.0:rOSToCRC62fLfZ2L6dld0dKmzWolaxZPCvsdbvlqS+I=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-12T01:07:43.133Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-12T01:07:43.133Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..REF4VnadVjGPvRbZNFjT9OgZ5QIo5w8B5i6FO8SiHfTafo89KOt1qCtcmAULHofFhusWFIwXXNJEgAWMo6YjCw" - }, - "expirationDate": "2023-04-12T01:07:43.133Z" - }, - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x55B23ed53Fe13060183b92979c737A8eF9A73b73", - "hash": "v0.0.0:ssfMb0kd3NvkT2cXfRsQycHTFwOVDl5E79vY2/KdBmE=", - "provider": "ClearTextTwitter#JoinSpect", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-12T01:07:28.929Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-12T01:07:28.929Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..Xcj_9TIGjhOm9OLFAlVVKlDERRKTgEm1f-z-KyKr-iPNWMpUA_F1JysPUvoa7tYzGXgDCt2s_Vf5BqKPsSpJDA" - }, - "expirationDate": "2023-04-12T01:07:28.929Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "TaHGLI+/iMP2+iR/4PX3vBdlD9SGEDE/gGtMOsuQ9pdlBiNLyK7xtGJcEQrtbPgN", - "encryptedSymmetricKey": "8a0f4ae157b4c6ffeffb067279645bfc1892a05cbc59ef39229340ca8565170c8c1f221196789d8c1b68cb261e47e218a9c68ca9a411edc1cb070b452f4531a5cad2ea0aa24743a6eb863f7dc527f3e1bedf71c52b58b62aab1ff49cf16ce28d4f39bedc6ee601fba9b3780f9d7ccc82615519d494f84fcf02749a2d9121f46a0000000000000020cb9f966d8c2574b86a110b50fe1b5533b510e62ce8001c995ea3a06787c30d0650b9a2331d7aa9a2891f08bd69d500b9" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "3" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/adityachakra16, https://github.com/spect-ai" - } - ] - } - } - }, - { - "projectId": "0xc87ab7d2537f30cbf929f26a9ac8d760411a56f129fb9c6e2cbd3529f136a010", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x4d385f39f0a8588eec6d4363ab8eaccb9c479ba8da979ac040f3af48c4864a76453bc12f7d46c84f68861bf36f05f2903bc2ca5aea79da93bdc4354ad19004db1b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xf26d1Bb347a59F6C283C53156519cC1B1ABacA51", - "project": { - "lastUpdated": 0, - "createdAt": 1673251648522, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:82", - "title": "BanklessDAO Projects", - "description": "THE BANKLESSDAO MISSION...\nBanklessDAO is a decentralised community coordinating and propagating bankless media, culture, and education. BanklessDAO launched on May 4, 2021, and its goal is to drive adoption and awareness of truly bankless money systems like Ethereum, DeFi, and Bitcoin.\nTogether, the BanklessDAO community collaborates to create user-friendly onramps for people to discover decentralised financial technologies through education, media and culture.\nThe BanklessDAO community runs a variety of projects; for the scope of this grant we are focusing on the ones which truly provide goods and services for the entire world such as BANKLESS ACADEMY, BANKLESS AFRICA, and INTERNATIONAL MEDIA NODES. \nThe projects listed below have had contributors working on them for many months and although some of the project contributors earn governance tokens, the work being done far outstrips the existing remuneration. Second, and perhaps more important, is that all these projects aim to help the wider crypto ecosystem and not just the Bankless community \u2014 and hence are public goods.\nBANKLESS ACADEMY\n\ud83d\ude80 Brief\nBankless Academy is a leading web3 \"knowledge on-ramp\" - a practical & engaging education experience with infrastructure preparing to be scaled across the blockchain multiverse.\nWe're helping the world adopt the permissionless tools they need to go Bankless.\n\ud83d\udd25 Vision\nWe are building a web3 world where:\n\ud83d\udcda Information is frictionless and free.\n\ud83d\udc4a Communities are high impact creators.\n\ud83c\udf10 Education is permissionless (no central body dictates what you can/can't see).\n\ud83d\uddfa\ufe0f Trajectory\nCurrent focuses:\nEstablish a Bankless-native syllabus/user journey to move users from Centralised Exchanges to Ethereum Layer2 self-custody.\nPursue collaboration with popular dApps to educate users on trusted tools available to them.\nBuild theory lessons with expert guests from the Bankless 'Hall of Fame'.\nForm frontier partnerships so that the Academy dApp continues to support interoperability and cutting-edge use cases.\nContinue research, development, and onboarding for our whitelabel platform to scale our efforts into other web3 ecosystems.\nBuild a framework for contributor content creation to empower talented community educators.\n\ud83d\udcc0 Try the dApp:\nhttps://app.banklessacademy.com/\nMultiple wallets supported\nMobile friendly\nNo download\nhttps://giveth.mypinata.cloud/ipfs/QmPkVpSqhUr1bUALLHL2ErzytqM5wHh2RmkCF82GApe8Lv\n\ud83c\udf0f Let's scale permissionless education together!\nBANKLESS AFRICA\nOur community is focused on promoting the bDAO mission. We leverage crypto-based creations like Bitcoin, Defi, NFTs etc. to tackle problems faced by Africans.\nAchievement/Growth:\n*Our podcast highlights projects and people making impact in the African crypto/Web3 ecosystem.\n*Our Newsletter provides well curated information on Bitcoin, DeFi, crypto regulations, projects and Web3 funding in the crypto/Web3 space in Africa.\n*Our website helps Africans access educational courses. It includes a link to Bankless Academy where lots of Web3 courses are available. Eventually this website will become a native-educational platform for Africans.\nWebsite v1 here: https://banklessafrica.com/\n*We onboard and train contributors with various Web3 ethos, teaching them how to contribute in various DAOs and potentially bootstrap project ideas they have.\nSome links to get into our community: https://linktr.ee/banklessafrica.\n\ud83c\udf0f INTERNATIONAL MEDIA NODES (IMN)\nOnly 5% of the world\u2019s population are native English speakers and roughly 15% speak English on some level. The initial goal of the IMN project is to reach the remaining 80% by translating and distributing content about blockchain technology, DeFi, the Metaverse and Web3. All links: https://www.banklessimn.xyz/\nThe International Media Nodes project believes in the liberating effect of going Bankless and what it can do for improving financial wellbeing and stability throughout the world. Creating and maintaining communities of people who do not speak English and educating them/opening the door for them to onboard to Web3 is one of the most crucial pieces of infrastructure if we want Web3 to be any different from Web2.\nThe story so far\u2026\nIn Q1 2022, the total audience grew by 52% as compared to the previous quarter and our total reach is over 40,000 audience members in over 20 languages. We have more than 100 active contributors speaking 20 different languages from all parts of the world. We have worked with prominent DAOs in Web3 such as Polygon, Tribe and Yearn.\nOver the next months and years, as we continue to produce content we will also start developing local language communities which will develop Web3 talent in local languages as well as organising events in different geographical locations to onboard more people.\n\nOur Ask to the Crypto Community ...\nAt the highest level, the Web3 education provided by BanklessDAO stands to empower humanity with the informed decision-making required in our digital future. We firmly believe that we align with the vision of the Gitcoin Community, and that together we can work to slay Moloch.\nWe seriously can\u2019t wait to show you what we have to offer this space.\nLet\u2019s Impact Together!\nBanklessDAO believes in the liberating effects of going Bankless and the impact our ideal can have on improving the financial stability and wellbeing of our world, both in learning and translation. With the help of the Gitcoin Community, we will accelerate the spread of an ungated Web3 education for everyone.\nLet\u2019s help the world go Bankless!", - "website": "https://www.bankless.community/", - "bannerImg": "bafybeigxjivwgcz4njxfdky5yw7kzysfghusf6j72srucr3adn4msgryde", - "logoImg": "bafkreifhgemr6res2dsvkqy26vc4eveaf2g6qmjdqg3rnjal6cy4lmorwq", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreibmdnyarqimo5v32o5phq7haoop4u5lc2zo3lan4nbh6di4caaoga" - }, - "userGithub": "https://github.com/BanklessDAO", - "projectTwitter": "https://twitter.com/banklessDAO", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "2DbNmI3QQKSWAnSb/QXkQXoTQUDijdfNZUvvgDqL4BcXxNjTTtGd9qjXW0W9vkgl", - "encryptedSymmetricKey": "ad9876029f108238d87bc45d4282faf9cc740aa01dd7dbde4d605668563dea5c162c80b043cd171889ca0624ae6d6403ea7e9363f56459c040efc24dbd74259b39e16bf34a3e9453f54f40ecfdf534233c407696a5a6dc39db57c7a7d3efa5b9756f1c2a4c208bfa396441ba31192148b5cc0ef126fed64e584edaf49d834a560000000000000020efd610a6bd2e8fddbc774fdeae2cea72b6c03be199e769fca4bfa4ff3e680ddefffd2d9385339fb9e2d3e254359c5188" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "token" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "Variable - DAO" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "No because different people in the DAO own different responsibilities. We are happy to send you DM from the twitter linked" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/BanklessDAO" - } - ] - } - } - }, - { - "projectId": "0xc8fca067d1ecb57b625e640263d153190fe1258c34e8a4ae85396fe502fd6164", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x32930eeb22093cca0cb429002f089ec1b2669d4aef352d7076ed00d9ae67ddb9360e70bb9731da9e6137969241e446a12dcab9e023c39fa3513a7149bbe2eaf31b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xB614B1464c561EB2fD0d7d3475feB52B5a34dEc0", - "project": { - "lastUpdated": 0, - "id": "250:0x8e1bD5Da87C14dd8e08F7ecc2aBf9D1d558ea174:16", - "title": "Pepemon: Degen Battleground", - "description": "Pepemon it's a DAO owned by the players building open gaming goods in web3.\n\nDegen Battleground is the first Pepemon game. A play and earn trading card game, it's powered by DeFi, using NFTs as in-game assets, and governed decentralized by the players. An easy to learn, difficult to master Trading Card Game where users will duel each other on blockchain in their journey to become the very best.\n\n\nPepemon started in 2020 as one of the new decentralized economies with a 99.86% airdrop of the tokens to the community members that helped spreading the word on our mission: build a blockchain game that it's owned by the players.\n\n\nSince inception we launched different dapps in our economy including:\n\n- Our staking platform with ~80% of PPBLZ token in staking or ~$3mil TVL.\n\n- A NFT Store that sold more than $1mil of digital cards.\n\n- A way for Pepetrainers to stake and evolve their existing NFTs in NFT Staking Events.\n\n- A Unity game app pending launching on Android, iOS and web.", - "website": "https://pepemon.world/", - "bannerImg": "bafybeib6gr5cvr57woddflh5qs77vupapsoheullv5smcoujlhhcjzneeq", - "logoImg": "bafkreigc3btspx23qle7f2tfmixxtpuuy24kczhwl6hyan5xmtgl5x4zga", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreidtz57hru3iqgofifs5u5wjsw2mwcohesweg6q7ud663mnatowdhe" - }, - "projectTwitter": "pepemonfinance", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xE71FbB197BC8fD11090FA657C100d52Dbb407662", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#pepemonfinance", - "hash": "v0.0.0:kM8EyXEdE8NX41KZt4c+8MCVdaFft8gnQeBkovBWzqQ=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2022-11-14T21:12:49.197Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2022-11-14T21:12:49.197Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..KA8_DA7OIJ2aUhzOKR8UawoNGtRFOedIBoWhurkaRUluNheFCm9WulsRzHq7IjtudNUDup80yHQtk8OAqvSOBw" - }, - "expirationDate": "2023-02-12T21:12:49.197Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "DumrAPQVT9SHpP3ywJWyNCokbjRE4AMgug/1Tx+wPF6gkaEiWlol/MDTHDQP90bs", - "encryptedSymmetricKey": "5424d757e85d15c5baa03e507a9ff86982fabaaf410dde79fd08a52e9398cdf90387c91034fe2c32cc06c8686a698f0ef323fd3164589ac1a7001e62fc54019c71a7433a6ed2d1914ce6e671f8b2f80dbccb0187e0ac22618b0777fb997d0ab239ac59f79818ed5cf0bb8c66bb2c0e72a89574eda483e23868e94caf4a7e37db0000000000000020810faf65d1aad1d9b98102ab2163dcddee3a74f62568c8744716f0bcfdb07bd27682ee36ea7237781aa9638f79764da4" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants and boostrapping" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "5" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/pepemon-dao" - } - ] - } - } - }, - { - "projectId": "0xc99a1b5395a53118fcd4be537cb89c6f4ed5e98d6e00211cf7c31fbb14b882e2", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x057b63c8fc3ba8934ca95d2660e95b272ad43c3b48f4a22b728ae7f921932cf864abeef4684d7e6bdb886f9c138b05b400b4eaf516f3a9c1ea0fba004a2d1c101c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x69aa21403244889832609963B0028e337a834953", - "project": { - "lastUpdated": 0, - "createdAt": 1673100137217, - "id": "10:0x8e1bD5Da87C14dd8e08F7ecc2aBf9D1d558ea174:38", - "title": "CryptoStats", - "description": "CryptoStats is an open project with the following mission:\n\nOne neutral source of truth for crypto metrics. Used by everyone, managed by the community.\n\nCryptoStats provides open, trustworthy data metrics for the whole crypto ecosystem. It also operates a number of popular websites, such as CryptoFees.info.", - "website": "https://cryptostats.community", - "bannerImg": "bafybeicyy7gvzypsz2atjy7d4bv33styfmiprrksfit7gtxgej54cdmo54", - "logoImg": "bafkreigywlryh7vgflfy4gmxtny7jsla4thfzjin4cjzai7v24homy2duy", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreibwqem5vu3dnzewkft6p662z5yr7o7ys3tgmwe4m7yrppeoccvb7q" - }, - "userGithub": "dmihal", - "projectGithub": "crypto-stats", - "projectTwitter": "cryptostats_", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "vQvwl4f2UQfwbkGUG/oeCxa89fpCo3+YELKQjH/GlTUBrrg5jLD5nFQHDIenExQT", - "encryptedSymmetricKey": "f9f5368d084bf842003c6ff8e94ddc64334c08a806b2f5e3d4eecef8a752102aeed36679862ce15b43ecd7c67b066a1077239da6c8f4e4dfade523113e9814ffdcab649218f0c8a52a1de25cc5f719fc45f4effcae6a9053e2c894456164bc8b6aef0ba923bc6596c0d8d13ad044c0e23dc7ee25ccf50b9dc99d520fea516354000000000000002016848bbdbbae41593087360eb15d17fd811434394f595acd764ea3c281f2004b64f1d5159978eb0df8ec71318ebcd7b4" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "4" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Not yet" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/crypto-stats, @cryptostats_" - } - ] - } - } - }, - { - "projectId": "0xcc6d33fe291d0fafb19cf8b833dc27d2f469fac52e3cc1f050ca4a0d83d66c74", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0xf5b961a67fd82919067d73854e7cecc6649debb599afd075105bf2b2978d22dd2955498898073ec3f3acfe10098b99db909fc8b95128d664b6a028812efec3e41b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x5Afc7720b161788f9D833555b7EbC3274FD98Da1", - "project": { - "lastUpdated": 0, - "createdAt": 1673101101606, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:67", - "title": "POAPin", - "description": "POAPin is a series of tools built on the POAP ecosystem. \n\n\nCurrently, POAPin has apps for Android, iOS, macOS, and a web-based POAP explorer. The basic function is to finely organize and share POAP. The web version also has the function of creating custom topics and grouping POAPs together. There is also pin.poap.in to create code to embed POAPs in web pages. ", - "website": "https://poap.in", - "bannerImg": "bafybeibuojh3uquz6cr2ujcrbpfa7rzqtsiq36hnc3uuxgyglnsvctx4oq", - "logoImg": "bafkreibw5gkdmtk73dx3vmx3kcu63niqaewdlhltniqjnu66sonjvcuyxq", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreicrdnqx4tbv7bukb3ypojvv2yheokykkuf65xk3xdoslrtilzkmby" - }, - "userGithub": "RockerFlower", - "projectGithub": "glorylab", - "projectTwitter": "glorylaboratory", - "credentials": { - "github": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x5Afc7720b161788f9D833555b7EbC3274FD98Da1", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "hash": "v0.0.0:AnGVGbsigX3VG9yuMsgkeWDscmO6ewzOy1rTVt/h9cs=", - "provider": "ClearTextGithubOrg#glorylab#5019152" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-07T14:17:44.297Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-07T14:17:44.298Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..NaT_iMb28TzYmTYv9y2CdjSD5kLA79MMPtX4YfjAOCXetWvsS9yN1ixqR5P6l4fvbK_7gY7TyRn4walrv0r2Dg" - }, - "expirationDate": "2023-04-07T14:17:44.297Z" - }, - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x5Afc7720b161788f9D833555b7EbC3274FD98Da1", - "hash": "v0.0.0:RsUdvPt/6ZSgyVRxjurSJGdJYJZptqmkEZSDCCVLIdQ=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#glorylaboratory" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-07T14:16:30.999Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-07T14:16:30.999Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..aWo9WUWtuUeZinSpZf9U0E6plyelENv6ZQLuuoJj3J313shu-MWTXcWpBNxWOWx6_mxAB__0kPZEIc535YF_Dw" - }, - "expirationDate": "2023-04-07T14:16:30.999Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "mrbTRywta458dqw0QJI1v2KO7c+OV5wHfYpct/Q05D4=", - "encryptedSymmetricKey": "23178723c3f79167644ff8236c6e98ca5c56da9ad2acf1891c5d49b62af57928f96224e0ee579a0d7d774a93b42bab05334c9a9a29af57c71ce714f477b62b68cda477213c0ca4b3dd4a26cbcdc9f5c55225726ce4ac3835ec42acfe017c06886cb5e082e00f25303804a29c9ddb919e7b374301368a8a6e39806af69911aee10000000000000020e348a83850aadee019289c9ffbb6e7fdfe78907eca89d9623a51281fe2761164a51c373b7edd5e7a237d12505acc78a4" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Gitcoin Grant" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "1" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "- https://github.com/RockerFlower - https://github.com/glorylab" - } - ] - } - } - }, - { - "projectId": "0xd1b13c5816a63928dfce0aa47bdc3262a1bdf2eec24800b465b1fd3ddee2f2af", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x741d3803a04dc6b0d1b248d22697179cba56329abfb774c0bf3becb9a4378f5e066b1c4bd82939e711cac420ba7919c648d83be2b4a5108d3bd6a6ad35963cc71b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x0cb27e883E207905AD2A94F9B6eF0C7A99223C37", - "project": { - "lastUpdated": 0, - "createdAt": 1673490505429, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:140", - "title": "Relay", - "description": "Relay has two open-source products: \n1) A directory of quality ImpactDAO, Regen, and ReFi projects\u2014along with their verified ENS or Lens \n2) An open-source wallet messenger that allows users to encrypted chat with the Impact projects or each other, decentralized on the XMTP off-chain message network. \n\nGrants would go directly to Relay's development roadmap, for features including: improving the messenger filters to detect spam and token holdings, adding many more Regen projects, adding web3 profiles with Gitcoin Passport, and training a chatGPT bot to support and onboard users onto ImpactDAO projects, via documentation embedding. \nThank you for reading and enjoy using relay.cc!\n\ud83c\udf3f\ud83c\udfc5", - "website": "https://relay.cc", - "bannerImg": "bafybeidflp6uxivcc7cn7irfjxuexf7frwloyvafd3dqe7vimtaht2b5s4", - "logoImg": "bafkreihyqkmlwjlbaqtku2wef4tckfyvawwcqpqtqyaqih3c7arzx3pdfq", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreigyqrrd2x5xzyg3dwooawzdhpjegf6g5qbnfaoiq2vcduawcxlwja" - }, - "userGithub": "seanrelay", - "projectGithub": "relaycc", - "projectTwitter": "relay_eth", - "credentials": { - "github": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x0cb27e883E207905AD2A94F9B6eF0C7A99223C37", - "hash": "v0.0.0:P/SxKSDDCEYTI9dvPaeAyE3HcoMeooyn08o/ih0KmcY=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextGithubOrg#relaycc#102389629" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-12T02:27:38.037Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-12T02:27:38.037Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..CBiSwZmVFS2sishuBRKRWmggZI2GEvIbW6Q3Xln2PUf8zl57NJb2ODNppd7AJOXRC7OK5cQEAQ80afjafz86Cg" - }, - "expirationDate": "2023-04-12T02:27:38.037Z" - }, - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x0cb27e883E207905AD2A94F9B6eF0C7A99223C37", - "provider": "ClearTextTwitter#relay_eth", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "hash": "v0.0.0:vGFo1W87UZJKNc4fGBemNPMj5uuRGb+DOsuMNkXM9K0=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-12T02:25:24.673Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-12T02:25:24.674Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..EFCsyAn71LFS3Ji1gyuex70s12wMjut1nNDpMaP6_veLAxzxzxKfXvbXh75egsA5XQ0RQT-zfmra7pPG80VvCw" - }, - "expirationDate": "2023-04-12T02:25:24.673Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "/VhcYABpAdh66SEWieNxP9PgIfuGHqmKSMg172OLSro=", - "encryptedSymmetricKey": "14eb26cf49e6329052edb5d816f14919a0de51907a607435e64964575c895c6862e335e93cff6161b72f63d979ad43139c9c9d0ec21a50401f9750c83a5a57a73de95368ee980ac4e16363d844e2144e372e1a6ced0f6e6091a570ba11ecc984f3e405c6a6234274062ca48451f170a9c38229c07099494aae6dc51110ed23f9000000000000002013cc6a7b659832271dc7dde4c3ad1127987f78c72087e411ae509daf4396916f5f7dbc9e46404c55717dc742861654b2" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants Round (small), Palm Tree Crypto (large)" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "6" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "User: https://github.com/seanrelay and org: github.com/relaycc" - } - ] - } - } - }, - { - "projectId": "0xd3bd2111f80027d538cc252a13afacad8eb0b1565a58d0655eda3b718b88e767", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0xb65ead5f31706b2a3a7ea0d367e3cebde1a5c91744beaf1f0aba826112a2f0793d8ccbbf704b4ef34458c298d6526336dc5a587849c02dc36d82d137a7b1df2b1c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x521aacB43d89E1b8FFD64d9eF76B0a1074dEdaF8", - "project": { - "lastUpdated": 0, - "createdAt": 1673058524855, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:58", - "title": "Gitcoin China Ecosystem Development", - "description": "\u52a0\u5165\u4e2d\u6587TG\u7fa4\u7ec4\nWelcome to join us -> https://t.me/gitcoincn\n\n\n\nUpdate 2022.09.02\nGitcoin\u4e2d\u6587\u5468\u62a5\uff1a\u8ba2\u9605\u5165\u53e3 - http://news.gitcoinchina.com/\n\n\u5173\u6ce8\u5fae\u4fe1\u516c\u4f17\u53f7\uff1aGitcoinChina\n\n\n\nUpdate 2022.05.27\nWe are going to have more people to join the AMA sharing session, for more info, please click\n\nhttps://www.gitcoinchina.com\n\n\n\nUpdate 2022.2.25\nWe made decision to have Gitcoin Chinese AMA on Discord server\n\nJoin us by blick https://discord.gg/gitcoin\n\nmove to #\u4e2d\u6587AMA-\u6bcf\u5468\u4e9421:00\n\n\u6bcf\u5468AMA\u5305\u542b\uff1a\n\n\u6bcf\u5468Gitcoin\u66f4\u65b0\nGrant\u4ecb\u7ecd\nAMA\u73af\u8282\nUpdate 2021.11\nWe have published new website: http://gitcoinchina.com/\n\nWe have Chinese AMA each Friday, record here.\n\nWelcome to join us -> https://t.me/gitcoincn\n\n\n\nFDD User Support\nBob leads FDD User Support workstream, if you would like to contribute to GitcoinDAO, please goto \n\nhttp://gitcoindao.com/\n\nAnd then fill in the contributor form.\n\nLooking forward to work with you, grow Gitcoin together ;)\n\n\n\nWe have website: https://gitcoinchina.com/\n\nChinese AMA each Friday, please find info on our homepage.\n\n\n\nWhat has been done?\nCommunity support\n\nforum moderation (discord discussion)\ntelegram group & wechat group\nContent (sharing)\n\nGTC&Gitcoin sharing https://www.bilibili.com/video/BV1h44y167ra\nGitcoin articles I translated before (on my blog, 5 posts there)\ntranslation introducing GTC (https://gitcoin.co/blog/introducing-gtc-gitcoins-governance-token/) https://mp.weixin.qq.com/s/0HFZFdg8TWoHRa0i0H9IBg \nGitcoin and GTC sharing on Bihu\nWhat support is needed?\nRegular sync with Gitcoin team\nFunding support (for Bounties)\nTranslation materials (platform) - crowdin\nOnline meetup (speaker support)\nWhat are in future?\nGitcoin product support in China\nContinual community support like:\nForum moderation (and Discord discussion)\nTelegram group & Wechat group moderation\nProject connection\nGrant support\nGTC (and governance) support and other product support\nMeetups\nOrganize online/offline Gitcoin meetups in China\nAttend/support other conference with Gitcoin introduction (like EDCON)\nContent\nTranslation \nBlog & website (about/mission/support)\nKnowledge base and API document\nNewsletter (WeChat publication)\nCreate new China focused content\nOnline and offline meetup (slides)\nChannel\nCreate wechat official channel with dedicated Chinese contents\nEmpower community to moderate wechat group - staff it and manage the community moderation etc\nModerate Chinese language Telegram group\n", - "website": "https://bobjiang.notion.site/bobjiang/Gitcoin-China-3f84469c07d7482e9c1f5eeae58a2dd3", - "bannerImg": "bafybeieznp2yh6qsdpwmijyuur2ct2gj3h2maqtu6gdk43qu7cxjv6bfbu", - "logoImg": "bafybeiffhsmsanue5phm5ljkjznnfxyrvhukd3ryqn5okw6cxrp2dgm7xu", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiflarwv5ogmrbgdffrj7ign5i5v7zm43lgghyuiq25madwtngndae" - }, - "projectTwitter": "https://twitter.com/GitcoinCN", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "PX/nFvsjp0ESRFTHzj/bKnOXK5ayK4DDksrTW0bwt3RZuS0UK0J0KhdvZw0Ab8iy", - "encryptedSymmetricKey": "69822a7b63f5e9293fa2f9feb932591d7e32fba104e3d50d7330da16a1ff9bed2950077c88ccb0d24cf094d10d1ad6160225a6e87e45b313d44fab7734ed52a242072da20b9316a81927af22480f2b1c7a085cd4061e975c4e1419819022148a79ceae55b4a8e9ec3e6703b6e972fcfc5fc0eae966946cc88d9a1c8abef699550000000000000020ec9afc7c37e93c749c04cb110c5a625de9622e0c7a054132b742c0935e72a8dee6d7b1a0b9f1bd47128c0c8281300689" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "n/a" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "5" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "n/a" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/bobjiang" - } - ] - } - } - }, - { - "projectId": "0xd58acf63d9a2800eca8752855dd9da3214f67a4321a3a40a6355f5ea3ca2f2a6", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0xa64ffa7b7cb8992ffc09d1f565ff0ef91dfbdf64bb3a45cda002f2e418785f710b1313996c406b8dc4cf7c08a208078631dbd3b2ad6203b59ca895ac6d4db34d1c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xC9C022FCFebE730710aE93CA9247c5Ec9d9236d0", - "project": { - "lastUpdated": 0, - "createdAt": 1673502520905, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:146", - "title": "Faster API for resolving ENS names and avatars for web3 projects", - "description": "I've integrated ENS resolving into several projects now (both my own and as a contributor/collaborator), but found the standard approach of querying ENS contracts directly to be quite slow for most use cases, and can quickly eat up Alchemy/Infura node resources if you're not careful.\n\nTo help with this, I built an incredibly fast API (thanks to Cloudflare's edge caching) for resolving and reverse-resolving ENS names and addresses and avatars (30-50ms with a warm cache).\n\nAPI docs are here: https://ensideas.com/about\n\nAnd open source code here: https://github.com/holic/ens-ideas", - "website": "https://ensideas.com/about", - "logoImg": "bafkreibgiznmys6i7gtmtea7yasjmvty6fwf2ofc6twuwx76jarald3y5m", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreihq5r4fvlmizb26dxe4ggakn4z3aqcfku3ygcgfrhnqk3vqnekiwq" - }, - "userGithub": "holic", - "projectTwitter": "frolic", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "wUgiqSvXxcAjLEWSHi4FQgH+9mgxuak3OyKuNi4Ad4JZiSQ9zm8rP3rtD9G7h8jo", - "encryptedSymmetricKey": "bfeb4d3153ec910a77a9ddaaf0694a2f545fda3b7beef10f4da5dcff3c99cef1b7683ad4f1e6373d2654baaebe808a03af69c51b22d5c542d7862507a9b63208a6921bf2a1186e00655d314fb277493afb95de42a3fc5e855050f91f5999f2833984cfa48030c6835b20b5056e84d25341531fe6c72b39a29b91a8c8db67cbb000000000000000205d1c2713a34b3ad35e90db66f73b32264f302e0f0722c41130c34b8c9e0e07b1f744e1fba9dab511b7bf2f0fe76892b3" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "??" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "1" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/holic" - } - ] - } - } - }, - { - "projectId": "0xd5ff5b8e5f94fa830f2acfb717fa777a0b836156a50171c2b8c597d70c474bdd", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x9fdf542d6bbcd75e42664b357a145729908be3ab75c739aadc504f58436b98354ff16fa803631a37f15e4e015b6f637cc57d12470cfd9130d94c6928ca68a0601b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xaE72f891Fc9914b13a90cbED799ee73359077bee", - "project": { - "lastUpdated": 0, - "createdAt": 1673475214411, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:130", - "title": "Uncloak Cryptography", - "description": "Uncloak is a grant-supported open education initiative, aiming to increase the accessibility of cryptography for developers, researchers, and everyone else. \n\nUncloak runs free weekly courses in topics in cryptography, including the ongoing course on Rust-based cryptography engineering. We're building a new public wiki on cryptography engineering and zero-knowledge at https://uncloak.org.\n\nOur Discord at https://discord.gg/TYwr4pMS2h is a good place to ask questions and connect with the project.", - "website": "https://uncloak.org", - "bannerImg": "bafkreidgb5rziwcp3zphrkmv4yppoukrjbmwnmufu7ab4j3xkwtybpewqm", - "logoImg": "bafkreie3mifvmovukf6f5djbviwkjtfptzbqc224nh6s3d4r6d3iblhzva", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreibwpu4gb6lutmocw4tkwhjcsb6lqyed5go7hedtwkafj42hakxtfq" - }, - "userGithub": "thor314", - "projectTwitter": "uncloakcrypto", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xaE72f891Fc9914b13a90cbED799ee73359077bee", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#uncloakcrypto", - "hash": "v0.0.0:KWaGAnOu4KvTqtHE4EzaQkyniCV7qE2h6L7u6lKmuyA=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-11T22:13:17.427Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-11T22:13:17.427Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..Gq9Fko2mqWL1-7OWBJB6YaIl3mo2qE2Fe8ohBqQB3eMnXSPryw21IdhR2RSd7y8g_Uz--_ViYS3_5pCGBhKMDw" - }, - "expirationDate": "2023-04-11T22:13:17.427Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "A5pSkJ6ztNyRMJv4JCu6OiJsvM2vAW90IHRdUfKuBFQ=", - "encryptedSymmetricKey": "889b29557591e5447f2ec3def89bf3abbfa17c9833932a7eb396140e240653fc69cfe8b386157129e611c6971eac97025809b776902cb1df05899725dbab541cbf3a8fb7ae370e10f3c4405df87d255f7b5c918663da508ffa280d3b9f72238e3b6373e4c6b3e058a4541445bdc1a633d340f3984caa6782eb28d5ce56b4fb500000000000000020feaa62d393f72973f7469d7b439b361e17cab50901745374e680b9cbebe31ea27bf164c0dbe880b08496107709c7baa2" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "1" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/thor314" - } - ] - } - } - }, - { - "projectId": "0xd8e0de535ba58db6a7226c577a7f8f51afaa8461a026bfe7ab9ba3a32e83e344", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x5b55113d2978c938102b70f58ca36454714e8d011e8b25edfab1cc7dcd3685d51e6f4161b0e4852c2a44ad30e04f41c3d6442872517dfc0ae4e3a15d6d4f61121b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x0D538d6253Eb5CeBaEf94a873a7d3DF22D6F936c", - "project": { - "lastUpdated": 0, - "createdAt": 1673059770220, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:59", - "title": "ETHRank - The open source achievement system for every Ethereum address", - "description": "ETHRank is an open-source, merit-based ranking system for every Ethereum address.\n\nSeason 3 features over 80 projects from the Ethereum ecosystem, including Gitcoin.\n\nThis season focuses on these four categories:\n\n1. DeFi\n\nOwning different tokens, swapping tokens, lending/borrowing, joining DAOs, and gas spending all contribute to this category.\n\n2. Reputation\n\nPerforming bounties, web3 gaming, interacting with many wallets, earning merit badges all contribute to this category.\n\nIn Season 3, we've aggregated all the top web3 reputation protocols.\n\n3. NFTs\n\nOwning NFTs, using NFT platforms, collecting web3 domains, generative art, CC0 collections, all contribute to this category.\n\n4. Staking\n\nRunning a validator and participating in various ETH2 staking protocols contribute to this category.\n\nETHRank's community includes some of Ethereum's most active users and contributors.\n\nCheck your score today at ethrank.io.", - "website": "https://ethrank.io", - "bannerImg": "bafybeiflmdef57dof2eugussdzdtlvdycmb5jq6baf4rdvjq2xkvmckjq4", - "logoImg": "bafkreih7ygujpbxdac5h5z6iamyrkboh6dde2loh75h4mxu3zvvwuve3da", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreih7davr6yb3l62kkrcwjpvrr5hdpr72lxyzwic3m4ybapv2eqpbze" - }, - "projectGithub": "", - "projectTwitter": "eth_rank", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "yqByiunPkKhrEE6FmiDVXLqHrdDMV33z8+bl7IgCo5I=", - "encryptedSymmetricKey": "a69ce9b852ea15319247115cb753e7c80122587e4d5ddc315a4f27fa191096fcf88bc565560e78b8da93d8ab9c1d6e02596ab0c1f5e25b8587f219a21672fa8ab69641641b6b5cc62f5c32e1957b3429848a9acbd263b7ea68c21437a72d49a2009373aec687de1f62e822da7b2fb83592c502970e3c300f3162d2cbdef375b8000000000000002098ced41d5bbacb8e2aa4c2cb07fa2d0bd58d3bca4f739168e234adb7b5468d121199d445a141e1188cc378da9f8ed0b9" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Community" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "< 10" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/Examp-LLC/ethrank/" - } - ] - } - } - }, - { - "projectId": "0xdbcfdc1e2ba83ed0c8d392a3abcd107bdff361f345e011e052366a7be05b37a3", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x5b77500b5e95b9bee4c6b28a07c3a2f370b00f1715031e5659aa313fb99f6e8110c79e19528b80c9061964f477d1025989876ffb85b15facf59e7e09fa828a051b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x10666d9c6295E838d3b8B84ffcC97d62EF7e6120", - "project": { - "lastUpdated": 0, - "createdAt": 1673904512003, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:233", - "title": "Inverter Network - Fund and build in web 3 with ease", - "description": "About \nInverter Network is here to help you build and fund on web3 with ease. As a team, we pride ourselves on the diversity of our backgrounds and experiences, enabling us to see challenges from multiple angles and develop innovative solutions. Our team includes individuals with expertise in web3, web2, multinational companies, international organizations, and community builders from 6 different countries. Together, we offer a unique perspective on strategy and execution.\n\nProject TLDR;\nInverter is an \u2018Operations Portal\u2019 for organizations to manage their grants programs, funding operations, and treasuries. It is a one-stop-shop for contributors to apply for funds, manage funds and maintain feedback loops with funders and community stakeholders. It is a milestone-based funding mechanism that enables due diligence primitives such as KYC verifications, entity establishment, automated invoicing, and on-chain equity activation to open pathways to loan financing. \n\nProject Overview \n\nInverter dApp is inspired by the Operations Portals that are being used to fund over 1.2 trillion USD for development projects across the globe by organizations like United Nations, World Bank, and European Union. Our aim is to interconnect the novel technologies of web3 to the grounded funding infrastructures of traditional organizations to improve access to funding and inspire distributed ownership for builders and funders of the next generation of the internet regardless of their backgrounds. \nSimply said Inverter is an \u2018Operations Portal\u2019 for organizations to manage their grants programs, funding operations, and treasuries. It is a one-stop shop for contributors to apply for funds, manage funds, and maintain feedback loops with funders and community stakeholders.\nInverter Product MAIN Features TL DR \n(2022)Initial Release:\nMilestone-based Long term project/workstream funding and joint funding with reduced overhead\nTransparency around funded projects for communities\nOrganizations can manage and track their incoming proposals and funded proposals from one organizational page \nTeams can have one common proposal that can be used for applying to, streaming funding from, maintaining accountability with, and receiving continuous feedback from many organizations. \nAbility to withdraw funding from a project\n(2023) Funder Treasury accounts that can run yield earning and diversification strategies with continuous payment abilities\n(2023) On-chain milestone-based investment based on KPIs and Due Diligence\n(2023) Multi-token funding with fluid funding governance\n(2023) Tax-deductible donations\n(2023) On-chain organization(DAO, Association, etc.) establishment \n(2023) Community Conviction Signaling \n", - "website": "https://www.inverter.network", - "bannerImg": "bafybeich5abdm2hddpkapb7zm7wtr4jptbylmkswobxyufslc56in6s4di", - "logoImg": "bafkreig2jbttucuxtm5u34dolj7hu2xfxxkbi62daibjceletxvxyobwvm", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreichbvgc66djhu4t6lrwr35vdlkp5f7hmnlcctkoaqfgpd2544ut4m" - }, - "userGithub": "", - "projectGithub": "InverterNetwork", - "projectTwitter": "inverternetwork", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x9690a9E92edadd9a4ff64da25eb6AD60791C37ff", - "provider": "ClearTextTwitter#inverternetwork", - "hash": "v0.0.0:nTcfRPAXtjTHsJPvna+e+0ssDjglM+n3WkuG0NIoY04=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-16T21:27:20.442Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-16T21:27:20.442Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..QbPW4-AYnp3nSg_lPJq26FE8_Gp5nCC1I5Ryqx5ldxjbVe6MGWodfCzE-fDAnH2KXVXh4DBtbkyFXo6plXxHAg" - }, - "expirationDate": "2023-04-16T21:27:20.442Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "uyZu+omvPKwvzZe5WWoKOp59w0yZ+ndKZqJUenAUYNYRlpc6ZsmAWUpMzhfWbp1S", - "encryptedSymmetricKey": "908538662a16de94968d9f41a52fdb4a7a214c131292d8733d83416953789beac1108ef4abc583da76151a4c13e27d0337a58d58168fdb03229d5840c1c0f1715269ed0b33e136cbb12987fa7d7aa39488bba3c86a5ffa7ea1e1b0e8bfb2b0b6d7117ce49b16d6dd1fba65287f5b871d31fb406cb896aa19a328b25c40d9a8de0000000000000020a975ef7f28f2960d14af651e6ae8a8b3f572a1910ca3deb897b5d2dfa839bca900b8b00fb15a9c9bb0bb999e1b3a96b4" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "15" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/Mertozdal https://github.com/InverterNetwork" - } - ] - } - } - }, - { - "projectId": "0xdce910ac23823b6f29196e90eda26ad6fb42e7726a49a7affe24b4780eaf6c80", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x4fbf7844fe203db7598701ee0df7450d979cb00e7ad15e31aeeeb5b8abac96513ed1e31ab695cbee464a5c3b001b7cba80da0f8388fcacf63a005427ea82340f00", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x0b0E6486648FBBb8E9ab33e3ae9D0B44B6faa701", - "project": { - "lastUpdated": 0, - "createdAt": 1673180784542, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:76", - "title": "Zero Knowledge Podcast", - "description": "Zero Knowledge is a podcast which goes deep into the tech that will power the emerging decentralized web and the community that is building it. Covering the latest in zero knowledge research and applications, the open web as well as future technologies and paradigms that promise to change the way we interact \u2014 and transact \u2014 with one another online. \n\n\n\nZero Knowledge is hosted by Anna Rose.\n\n\n\nThis funding helps us to pay the staff working on the show, transcripts on our episodes, some upcoming Zero Knowledge 101 content, the next zkSummit event (happening March 30 2023 !), a ZK merch line and more! ", - "website": "https://zeroknowledge.fm", - "bannerImg": "bafybeigpscgybprvbcl7m2csawgtimnczsbbmgt7rtvvvfigugxp5tlxl4", - "logoImg": "bafkreigm3v2fjmrfq6ho3vasmaiexs7gbnwxhaui6jh27kyipbq4gnv5dm", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreicb7bwzwmd3j6uxhwvry7rmdsw4ujhpfkm3bzcajpfdolhltsiuoq" - }, - "projectTwitter": "zeroknowledgefm", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x0b0E6486648FBBb8E9ab33e3ae9D0B44B6faa701", - "hash": "v0.0.0:Nb2MBrTR+5DwkgLeKjdB4lq182o4XYwk/n2GkDiBU2o=", - "provider": "ClearTextTwitter#zeroknowledgefm", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-08T12:34:30.126Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-08T12:34:30.126Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..jGqXanuU9JmIBe0R-eEOu3nQZQo2pncrOBAu-Fj8bBfpGlyl_Kwr2oifOekKuDKFu4uCMjETOaz9HZcoNu9fBQ" - }, - "expirationDate": "2023-04-08T12:34:30.126Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "/ZTWHGWYis9QC0QVQHX/9tnP7en1AZp5KcosvG9WRs05bXFCJHu0gsWorJkW5C3S", - "encryptedSymmetricKey": "969ce3bdcf6d487f446a889816b8a91efc9611af07e86e57eff336df87ffe169359e34fb87ac568180161b3c8e82440129e34f8a41d3418a5b15d620991029032cc5fe1567bd28407dfd5e8ec4fe81331fecb77ea5288e42ff3673d2d898a491d174167a81ca0ce8886ca940ed4f58f6264c8f35a084ef7c274e68b6c641f3d50000000000000020547bea2e7eb9969fb67b1cdbae40ae81b23539a43c42f6d828309f457ed88032f74a6ab86c2cbd1652586079ea3787b7" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Sponsorship & Donations" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "4" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "zeroknowledgefm" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/ZeroKnowledgefm" - } - ] - } - } - }, - { - "projectId": "0xdeffc2d190ddec88d06ba86e1eb09abe5a9ccb49ab1dc1a6005ebd7afae0489f", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x1db1ac790ac4c4ed8b227e0bf0af5b25e1c608a1ff9fdd32194b68d6e8e3423064ca6624f9f6009793452509d8377ae3bc6413dc8bd533f930273985c2fcf3f91b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x690315449eFad5f8B06a356f16eecFC41F475F70", - "project": { - "lastUpdated": 0, - "createdAt": 1673597616715, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:174", - "title": "datalatte", - "description": "Datalatte is a two-sided dApp that enables people to anonymize, tokenize, and monetize their data, while providing researchers and organizations with survey-based insights to develop and improve their products.\n\nDatalatte aims at transforming market research towards ethical practices with a focus on the ownership and privacy of data. This leads to bridging the economic gap by enabling people to monetize their digital footprint on a secure and fair decentralized application. Currently, traditional apps often harvest user data and sell it to other companies without the user's knowledge or consent, and users receive no compensation for their data. This has led to the rise of large corporations that hold a monopoly on data and influence our daily lives. At the same time, researchers and small and medium-sized companies struggle to obtain data to build predictive models for various purposes, such as finding jobs, providing healthcare, and educating children.\n\nSince the implementation of the General Data Protection Regulation (GDPR) in 2018, internet users have the right to access their personal data on each platform. However, many people are unaware of this right and the value of their data. Datalatte aims to address this issue by leveraging decentralized technologies such as cryptocurrency, decentralized applications, and exchanges to empower people to gain control over their data and its use.\n\nTo achieve data democracy, Datalatte plans to store tokenized data in users' wallets using protocols like IPFS and Filecoin for decentralized storage and Ocean protocol's Data NFTs for compliant and self-sovereign data licensing and monetization. However, the current table-structured data model is not easily understandable and requires significant resources to extract insights. Datalatte aims to address this issue by using a graph-structured data model based on small Knowledge Graphs (KGs), which allow for easy access and utilization of data through the use of Natural Language Processing (NLP) and offer higher computational efficiency through privacy-preserving data pipelines.\n\nThe goals of Datalatte include empowering internet users to monetize their data, providing data scientists with access to affordable data, enabling full control and ownership of personal data for internet users, and creating a data-backed income through personal data monetization. To achieve these objectives, Datalatte will develop a decentralized data store that allows users to sell their data rather than having it sold by large corporations.\n\nOverall, Datalatte aims to create a more equitable and transparent system for data monetization by empowering individuals and providing researchers and small businesses with access to valuable data.", - "website": "https://datalatte.com", - "bannerImg": "bafybeidwuri3nzqcow3cy36cy4o6oj4oqd7fghqsuizgzycivwwpzvxmfi", - "logoImg": "bafkreigbqulls7vuoxiyz2u2nrqm35jvw6mwldza5dnx7xezevrjqmyydu", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiaosvcrva4s6y4edtjklvr7br7i75tygnm7s4vtbw6eyv72gjqlrq" - }, - "userGithub": "amirmabhout", - "projectGithub": "datalatte-ai", - "projectTwitter": "datalatte_", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xB17b3e7910AF9d232Cb683C083eF73c34521FC8A", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#datalatte_", - "hash": "v0.0.0:K5wGghLGGGM1HvJ0Bkl3T4N257tWWSmJB3ZKmXkvpLQ=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-13T08:12:03.464Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-13T08:12:03.464Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..RcmgaeRXxFyOzVa9PY-MtaD-0reZbY4EIWWuXJdG-k_ucfjw0co6XZnwkqH_uEDE5xjvgBlIIRu7STgx2gI3AA" - }, - "expirationDate": "2023-04-13T08:12:03.464Z" - }, - "github": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xB17b3e7910AF9d232Cb683C083eF73c34521FC8A", - "provider": "ClearTextGithubOrg#datalatte-ai#90555973", - "hash": "v0.0.0:8/ii1lQxgy9/Dlk8MqHNNzoGhu6HeAvgA8HmTZso8+k=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-13T08:12:23.363Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-13T08:12:23.363Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..OSMGFbNhNi6UCqZ4SivdympiVkNE26d90mMe8rNwuXdK7c_LtBUU84OdAP8uBAGvvpZwUQMlE1e5K83iNtMlCw" - }, - "expirationDate": "2023-04-13T08:12:23.363Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "C4aXP9JSem7kq+MfHs+dnZh4Sn5Cb/9UdMEol74Jxz2U/nxMI1MoCYEcl8F1tmig", - "encryptedSymmetricKey": "6ccf81a533afff4b9e4f50c183834350dae5b117fe180a214ced356ac5af2653f71d515079b8277dc4f9a90d30b0db1418032b5d3e3f1f7309c2c58068f693eed5c7d0efe8b4da03147e6dd1f70e287def26761c4d164e8cf8788b940ddbcca5a70a329199bce53601c3b1cd317b8905c88136e18c809c3818ea1d076c7b67b200000000000000207146341a51357b29e0342c978f8baf3356e28744d0fefb72cbaef989ab4143ce3a5a4b3d789112fcb3adb0caa86140a0" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "OceanDAO & Gitcoin Gtants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "8" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/datalatte-ai https://github.com/amirmabhout" - } - ] - } - } - }, - { - "projectId": "0xe1ae0696ac9550ffde401be8421f3ed3fc89d8c2a672797263be1d32dfe5eb43", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x91a8bc269a8f3a34ca4dcf1ea8c743d0039c6fe08ef8ce1477ff4420fba96d4d06db35307b65c7da908340d26e0d71a203d8a7167d2618ca4be6067a5161b6491b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x640C28441f9e73537C63576A0D6f44643a577E32", - "project": { - "lastUpdated": 0, - "createdAt": 1673554483626, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:169", - "title": "Electronic Frontier Foundation", - "description": "For over 30 years, EFF has been the leading nonprofit advocate for the privacy and free speech rights of technology creators and ordinary users. Our team achieves success through impact litigation, policy analysis and education, grassroots activism, technology development, and support from the public. EFF's mission is to ensure that technology supports freedom, justice, and innovation for all people of the world.\n\nCOMMUNITY ADVOCACY\n\nFrom the early days of the web, EFF understood that we must protect access to technology in order to advance freedom for all. In the years that followed, EFF used its fiercely independent voice to clear the way for open source software, encryption, security research, file sharing tools, and a world of emerging technologies. EFF\u2019s work in the growing movement for web decentralization and the public interest internet is no different.\n\nIn order to combat the ever-consolidating power of corporate giants (and end the gatekeeping, surveillance, and censorship that often accompany them), many have looked toward blockchain-based technology and cryptocurrency for remedies. EFF is optimistic about the ability of digital currency to support independent community projects, route around financial censorship, and support independent journalists around the world.\n\nWhile there are still many problems to solve in the blockchain ecosystem, the world needs thoughtful, user-focused advocates like EFF to help uncover the opportunities for public good. This is why EFF fought a poorly-defined cryptocurrency provision in the Biden Administration\u2019s infrastructure bill that could create onerous requirements affecting user privacy, and EFF also introduced bright-line rules that Congress should adopt when developing cryptocurrency regulations; we\u2019ve written extensively about the ways financial intermediaries censor legal speech; we submitted comments to FinCEN opposing the agency\u2019s proposal for new privacy-invasive regulations of cryptocurrency transactions; and we\u2019ve called for blockchain intermediaries to issue transparency reports and protect the rights of their users. During the Tornado Cash controversy, EFF spoke out for the speech protections on software code and represented Johns Hopkins Professor Matthew Green, who made a fork of the code and posted the replica so it would be available for study. EFF also reached out to The U.S. Office of Foreign Assets Control (OFAC) to seek more clarity on their interpretation of the sanctions listing. \n\nOPEN SOURCE SOFTWARE PROJECTS\n\nWhile EFF is proud to be a leading voice in online rights debates, we also develop gratis and open source tools to enhance everyone\u2019s freedom online. Your donations provide critical support for EFF\u2019s wide-ranging work, which includes projects such as:\n\n- Atlas of Surveillance: This project launched in collaboration with hundreds of EFF members and university students. With over 10,000 data points and counting, the Atlas is the largest searchable database of U.S. law enforcement\u2019s surveillance technologies.\n\n- Certbot: This software tool allows you to automatically deploy Let's Encrypt certificates to enable HTTPS on your website. EFF even helped develop Let\u2019s Encrypt which has in turn enabled free and easy encryption across the web!\n\n- Cover Your Tracks: This successor to EFF\u2019s Panopticlick demonstrates how well your browser and add-ons protect you from tracking and fingerprinting.\n\n- HTTPS Everywhere: This tool automatically connects users to the encrypted version of many major sites. Just over a decade after its launch, EFF declared success and announced the planned deprecation of our HTTPS Everywhere plugin because the functionality had been incorporated into all of the major web browsers, making it unnecessary.\n\n- Privacy Badger: With millions of active installs, this browser add-on was the first to specifically focus on blocking tracking in advertisements, instead of just the ads themselves. EFF\u2019s open-source technology has also inspired other widely used privacy tools, including the Brave browser and Safari\u2019s tracker blocking.\n\nThe world relies on the internet to stay connected and informed more than ever before, and that gives you a pivotal opportunity to stand up for technology users everywhere. Your support for EFF ensures that we always have a vocal advocate wherever tech and civil liberties meet.", - "website": "https://eff.org", - "bannerImg": "bafkreie5wkhybbs5oomyaq4aufqcoeo76lbv3jhokmy4tcb3pzdfpvxa7q", - "logoImg": "bafkreicnljmaur4op2irvuflb3utpt62qivsjumfy3mm6nky6wrankruna", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreih3oabewrss4mdyb2tfdq6qivgdsthu2yqztnybd2c2wb5f2sqcb4" - }, - "projectTwitter": "eff", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "isinceR+YZoKC/tkIdXoyLL2VGnrgAgziX4JDtP9E2NkLp2p1+GOH+afTP1nUsTO", - "encryptedSymmetricKey": "127f4d103190f050030bb905498eb67e906f8a69dcd5fe65a60f1e103a60a292ce35a09e8bfb554699478f8b149d5b18007a5d8416731ccc7b6be9f009cb69f702048e416861c288f947add643533acf44497e10974fd5e00eb53a6c894bb5a675954ec78210f40c5af1411ac7c02f3ae1b1af5a663969f227fdde355e941feb00000000000000208c930ffe3f5171d991187d0d704a571aa4f8c796f998c9b7662010af48f6d971f9473542da0159b1c5736dc882bdc5af" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Public donations and grants." - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "94" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/EFForg" - } - ] - } - } - }, - { - "projectId": "0xe2f4ea6f46ef9d67818f71b8c40403b8528768af11f7fe0c2d10cd2afe21de62", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0xd5cb8b088693e98c7a1b27ce0da47b9157e0c255960b14b5744b23950c54d239102f83dec045d0416d8cfe7fb6c5856bd03303681e9380fb736f8c067c821be11c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xdE81d67Af572EC0F22841da702C1EdC25608dBBB", - "project": { - "lastUpdated": 0, - "createdAt": 1673036680083, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:43", - "title": "Nimi.eth", - "description": "Nimi allows users to effortlessly host on their ENS domain, making web3 websites easy. Use Nimi as your link-in-bio, display your favourite POAPs, share your social links - and collect all the Nimi themes!", - "website": "https://nimi.io", - "bannerImg": "bafybeia7q7gvddjyxwvxgtucwurbt47dn3bimp5cb3nty7tfb5za3yhpye", - "logoImg": "bafybeiar7p2rzc5dmgxnjagqcks6dsp56gzyw66tkspyfwv7tntewlrruq", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreic7jjdvvt62leus65r4uxtzzbyznihpae6lgctjnfstdbxphteydi" - }, - "projectGithub": "nimi-app", - "projectTwitter": "0xNimi", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xe4701b3c489Bd1De2C8ffBDFE9801092859afCcc", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "hash": "v0.0.0:KPz/cH42I16gmam0ud60sAvDTJZIUfDYkusSRi5QAQA=", - "provider": "ClearTextTwitter#0xNimi" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-06T20:23:49.026Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-06T20:23:49.026Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..fpdoJX1MhrilRUZWXcT6rg8PrGmc8FKrc50We1PLooWkK9UpFDeUUbzlVuScBIITqfWJBIQLJtts-c-rbgLqBw" - }, - "expirationDate": "2023-04-06T20:23:49.026Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "SRWvGUbTpZVzg1W5ua/Y0IMTcBSSmuvnFx/G+jmdxF4=", - "encryptedSymmetricKey": "4a67810ca21c2414a1f0d0228e9f4c90ea06da4d95077af935964a796a87c112ffc160e165366d5eb075229fd397c30661741417d4c54d8a176ba853c50cd76136c972449c4b18efd8795999e83a2cc9b9713bb975a71d9da6f8c7c5e3dedc86fa79ce72b85b7716e4279dac33cebd9bb391ada707f84b0fe0112e682200cf430000000000000020d2b204c81982ad91ab137f9794a16f9bb3c8073a58ead8ebc3b34e4d023a7ff53e1e8a8441b01ee7bed7218212dc81af" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants from DXdao, ENS and Gitcoin" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "6" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes :)" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/nimi-app" - } - ] - } - } - }, - { - "projectId": "0xe619c469f518291bc793096e0416512755edaee8cd66ce0c65ef286d73c6291f", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x6779d4770d53cd8120c4db598d3f34fc036fd40c07faabdaf29d341e946b5905435f672fda9ffe2e8e70e173471a273f59682a5c00f61e5519e4238f137cc6bd1b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x187089b65520D2208aB93FB471C4970c29eAf929", - "project": { - "lastUpdated": 0, - "createdAt": 1673279733974, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:85", - "title": "Ape Framework", - "description": "Ape is a smart contract development tool for Pythonistas, Data Scientists, and Security Professionals working on Ethereum and other EVM and non-EVM blockchain ecosystems.", - "website": "https://apeworx.io", - "bannerImg": "bafybeicsnnqj6p2o6nvb4q7kjl5tav7nbuhmiogbs7ryehlhybpcaqc2ii", - "logoImg": "bafkreigkj3mtsaxx2xtruqaeip724dgu34cynv2otbic3ovhwggjjs6674", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreicgndahtmloq4zhyx7vnlxo3bqxr5wdaspus5bhyfiathvs74xo74" - }, - "userGithub": "fubuloubu", - "projectGithub": "ApeWorX", - "projectTwitter": "ApeFramework", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "x0a2tls8ieksoD2UbRAx/b47ygpGO14EU5FpvyWgRwdQzEVIoTdQtP1AYisXx8rQ", - "encryptedSymmetricKey": "265cb19d14b035005ec414c026181115174c49555efa2db79747154674fb76f62f546e92d3f932169abe7e4dcd1d700792276b9f536c023d3f6e3c1538afbc3f448b224fb2ef61a4e25fff4d26d9558b511599e35494784e6a13359d48c752b795a0f02b1f6af4d456d16c18b27006c35cd650b638cfc452293aa44d13e58b17000000000000002082fbf5b5b1c17c8e7dc363cb50e738583b2cb75e60ede8ba76adc2acb0c31f483e5bce10980ff89480aee40da001e097" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Venture Capital; Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "12" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "github.com/fubuloubu; github.com/ApeWorX" - } - ] - } - } - }, - { - "projectId": "0xe6424ab2ed95b21ba758a64a72e3a4583a01cad6b12419420ae7286c70ecae83", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0xf386c92b5f7cf4c49a230d537c1e48a3f0c8c0345aef169fa2534201e9c47e2a5dbcc154ead65916697cf082bf48364ed067f8bfb9f2f233edabdcca8ee3f5c01b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x8110d1D04ac316fdCACe8f24fD60C86b810AB15A", - "project": { - "lastUpdated": 0, - "createdAt": 1673833666188, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:218", - "title": "Commons Stack", - "description": "We build tools and protocols that enable impact-driven communities to deploy their own token economy to advance their mission through regenerative funding, commons governance and community building. The Token Engineering Commons was the first successful launch using our Commons design patterns. We plan to support on-the-ground ReFi communities next and open source our protocols to allow other purpose or public good-focused communities to deploy their own Commons. \n\nPlease also consider supporting our joint venture with ReFi DAO to build a ReFi Commons Incubator: https://grantshub.gitcoin.co/#/chains/1/registry/0x03506eD3f57892C85DB20C36846e9c808aFe9ef4/projects/179\n\nDonate to Refi Commons as well here!\n\n\nWHAT IS COMMONS STACK?\n\nCommons Stack started as a think-tank primarily focused on crypto-economic primitives to underpin a design framework for a Commons, a tokenized community with a mission benefitting a public good. We aspired to scale commons as a way to realign incentives with public goods. To achieve this, we needed to elaborate cultural designs that reinforce commoning principles and create novel tools such as the Augmented Bonding Curve (ABC), Conviction Voting (CV) and the Praise reward and reputation system. \n\nOur Commons design patterns are made up of a suite of cultural frameworks and a curated library of tools for governance, funding, proposal, analytics and initialization of a Commons. Some have come straight out of our research collaborations - such as the ABC, CV and Praise. We also use Collaborative Economics, a methodology for enabling the community to collectively propose iterate and finalize the parameters of their Commons\u2019 economy.\n\nWe see the work of Elinor Ostrom as our North Star and set out to weave her principles of governing commons into the cultural fabric of a Commons. Our Cultural Build defines practices for clear boundaries, conflict resolution, monitoring, participatory decision-making, and others principles. \n\nOther things we have done are supporting BlockScience in open-sourcing cadCAD, developing the edutainment program Commons Simulator, launching the Trusted Seed, developing a collaborative economics method, deploying the Token Engineering Commons (TEC) - the first field test for our Commons design patterns, launching the Commons Prize and doing a discovery of the needs of Grassroots Economics, the winner of the prize.\n\nWhile we have already had some success, we have only just begun. Our research continues. The lessons learned from a first field test, the Token Engineering Commons (TEC), are being rolled into new deployment protocols and our curated commons library of tools and processes continues to evolve. \n\nWe did not get this far alone. We have collaborated with BlockScience, Blossom Labs, Metagov, Curve Labs, PrimeDAO, Giveth, 1Hive, Aragon, Token Engineering Academy, Token Engineering Commons, and many others.\n\nMuch of our Github activity (https://github.com/commons-stack) is collaborative. We work hand in hand with General Magic, Token Engineering Commons and Praise, specifically:\nhttps://github.com/givepraise/\nhttps://github.com/commonsbuild\nhttps://github.com/GeneralMagicio/\n\n\nPLANS FOR ALPHA ROUND FUNDING\n\nFor this round, we will focus on one deliverable - donations to this grant will contribute to the costs of open-sourcing our Commons deployment protocols. Our intention in doing so is to allow any community to deploy its own commons-inspired economy, i.e, the intentionally ground-up launch of an economy to support a purpose or public good.\n\nWe are in process of building the guidelines for initializing and deploying a Commons. Funding will enable our team to continue our work on the open-source documentation of our deployment protocols that will help Commons facilitate the communal management of public goods through a regenerative economic system. \n\nThe documentation covers the four phases of the Commons deployment: Engage, Incubate, Hatch and Launch. In every phase, we outline the processes, tools and different concepts that will bring about the creation of a sustainable and scalable Commons.\n\n \nUPDATES SINCE GR15\n \nDonations from the Gitcoin GR15 helped our team accomplish the following in the last quarter:\n \n- We worked with our pilot Commons to grant over $400,000 to various Token Engineering initiatives, via the economic system we collectively designed.\n\n- The Token Engineering Commons has proved out the value of the Augmented Bonding Curve and Trusted Seed approach, as participating in the Hatch has been one of the better investments in crypto (beating the price of ETH by over 2x)\n\n- Co-developed Praise and spun it out to be its own independent project, focused on becoming a reputation system and rewards distribution tool. We open-sourced the deployment and supported several communities in using it.\n\n - Worked on-the-ground in Kenya with Grassroots Economics to understand the needs for their complex economic model and jointly explore possible solutions.\n\n- Initiated the \u201cLaunch a Commons\u201d campaign to engage purpose-driven web3 communities in becoming tokenized communities that will create and steward public goods.\n\nThank you for your generosity! \ud83d\ude4f", - "website": "https://commonsstack.org/", - "bannerImg": "bafkreick5f3lez5vbbnwevsk3wgdp5fg4n6z4ts5uz7iyaafriy5jwgtfe", - "logoImg": "bafkreiajbf7swocekdtnevjir67videhgxjtjk3vnwumubazvdejli7h5a", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreidmmmcadruklypnxgymioizky7hngcebwwm4yhxh5xsejglfxjtou" - }, - "userGithub": "", - "projectGithub": "", - "projectTwitter": "commonsstack", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xC5A756D63C5fe67b438acBE468aA62a52093fDEf", - "hash": "v0.0.0:OEaixMWgiQIGJn8KM8LxY56CsQJUJTr717abSJCuerE=", - "provider": "ClearTextTwitter#commonsstack", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-16T00:57:18.019Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-16T00:57:18.019Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..QzY0sTtu_taxc0WVsFUFvEayB50d7wav2Anr2u6_raC0dQMhENb9TSSW5Mfu8hpO_-rznWcwECOV5F6px1ExDg" - }, - "expirationDate": "2023-04-16T00:57:18.019Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "zm2uOXxwT48GsgJa/GJuvXfrDlxJHz5fKv0agEj33tF/YUpEL2dMQ6PDVR6WmcMl", - "encryptedSymmetricKey": "c514c81d7da0970daca5da903fdc0d4e29bb0ec42f14863ca42dae76aca9ddf04c87c1f48af1fe3c3902056c7cca0104aa2ab59af35b9b978c7854b7c83741c45c09af12982c2bc3ec6110714c08fd8f5f4efa2b80861a0ff8580de4bf08a0a18d82c94e524a21829c2f53398ee08af1f7ce5039d386cffe57534d8d4c5c260600000000000000207cd9796665f6750baf0cb97bfde135cc8ba4a3c33017a55f7073df1184359b9c388177a46e2fe833c7c26b25024d43a9" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Donations on Giveth and Gitcoin" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "7" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/iviangita, https://github.com/commons-stack" - } - ] - } - } - }, - { - "projectId": "0xe797fdf65ab6db40d29cb7144e8715799a91c9a2f8a7dffc6697750089f07dbf", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0xa18d6b7158670c16d9b5f58c958cd3cd5365d9e16c9fb9c52c932312bf33f06733c4d3fa4cdc2f1fe80d114b0387e6ce34cc2b2c021f6b6454f1cb9e5263af5b1b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x1208a26FAa0F4AC65B42098419EB4dAA5e580AC6", - "project": { - "lastUpdated": 0, - "createdAt": 1673354257691, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:98", - "title": "MintBot | Polygon NFT Minter + ENS SubDomains (no gas)", - "description": "Mintbot started out as a service that allows ENS Domain holders to create collections for free and mint NFTs directly from their Telegram account.\n\nThe NFTs are minted on Polygon (an Ethereum layer 2 network) and the bot covers the gas costs.\n\nOn successful minting, your NFTs are visible and tradeable on marketplaces (which support Polygon) such as Opensea. All users mint NFTs under their own contract/collection (tied to their telegram username)\n\nThe service has since expanded to provide free & gas-less ENS subdomains via Twitter. Gas-less registrations are achieved through EIP-3668: (CCIP Read: Secure offchain data retrieval) - the same technology utilized by Coinbase with their free cb.id subdomains. The names can be resolved via rainbow wallet, Coinbase wallet, trust wallet & Metamask.\n\nLinks:\n\nMinting Example on Twitter - https://twitter.com/stevegachau/status/1569311214945316865\n\nSubdomain Example on Rainbow Wallet - https://rainbow.me/free.-id.eth\n\nNFT minting example via Telegram - https://camo.githubusercontent.com/8241d222dfe9cb45a77b3aae2edd1aef35cdbcb9bc711df1b8ca29f88519f4b2/68747470733a2f2f692e6962622e636f2f464435436456562f6d696e74626f742e706e67", - "website": "https://mintbot.io", - "bannerImg": "bafybeifhctl4fgk5pejrasv7qfz37bwfgwrusyunl7cat5pancrbgzpd6m", - "logoImg": "bafkreicxjg4iab4ilxg6s67d54ltk6pffrqoswu2u6xz2cjirrri5zkhhq", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiggxhojo4cphrs4xsug56wy6p4dhc66fi7txvrvsd5qfprrtytrqa" - }, - "userGithub": "stevegachau", - "projectTwitter": "mintbot_io", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x1208a26FAa0F4AC65B42098419EB4dAA5e580AC6", - "hash": "v0.0.0:RHBZmCaEQchGLCTmyEslO4W9JXfVqGzc6RDvnEf+JoA=", - "provider": "ClearTextTwitter#mintbot_io", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-10T12:37:32.322Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-10T12:37:32.322Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..0MAgOb8QBlUNKBRnlOifKgjOYp4mP1mDhbsYPnm_7vP15ypACpatvSPQOscSJQlTjGDRMwl61OIh_-wMF8eTDQ" - }, - "expirationDate": "2023-04-10T12:37:32.322Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "faxXNeDZV+ArzBwmFN1x9kHz1SdyhV7GjI+W3UD+GSM=", - "encryptedSymmetricKey": "af94e4637b63d4c13ecf457bab8a0e1ec39fcb33e6f6fd93b39c136ad0f7706a618c554de4e49424daec0da23b608404ed898b513d7edb8a7c90accae83f3743a74860a09141204c82131dc7c578ce4fa5bffd2410fde42297a6e7e11d292db0dd19b42fb874f4c99cf7a8db8106dedfeb374e70d7d43daa5ae3c5faec26823e0000000000000020cd9ef410ce19c3d576b431d0d6e7c3343de1ebece84265db75d1bc129d78fdf38b9e7087564e9206222eb88cbc0c6e8d" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Gitcoin Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "2" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/stevegachau" - } - ] - } - } - }, - { - "projectId": "0xe9dfc4da2e9fbcf33042b9c978322967e52985162659fa8a0627bc8573cbbb59", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x3c0ea932038d71a26915ff9a48313da99f7790de9bdf05415d14b7dec17b180c77a80c8c326e92d6836f8c6a1395079282749805f1cd0182028118caf28158001b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x4B8810b079eb22ecF2D1f75E08E0AbbD6fD87dbF", - "project": { - "lastUpdated": 0, - "createdAt": 1673647810414, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:196", - "title": "BrightID \ud83d\udd06 Universal Proof of Uniqueness", - "description": "BrightID \u2013 an open source Sybil-resistant identity lego.\n\nWe are thrilled to be working with Gitcoin to reduce the impact of Sybil accounts. With your help, we added over 63,000 verified BrightID users. Thank you for the amazing support so far! Let's keep the momentum going!\n\nGet 50% bonus matching for all your Gitcoin grants by joining BrightID and connecting it to your Gitcoin Passport . After completing your passport, come back and link it to the trust bonus screen in your Gitcoin profile page.\n\nIf you are not already verified, please come to one of our many daily online meetings.\nVisit meet.brightid.org/\n\n\ud83d\udd06 What has BrightID core team been up to?\n\nSince the last Gitcoin Grants round, BrightID core has added the following features:\n* Support for multiple devices and improved account recovery\n* Aura scoring integration\n* Wifi sharing for large data transfers\n* Improvement to and first large scale use of Blind Signatures for improved privacy\n* Powering free crypto gas distributions at unitap.app\n\nThere are more details in our monthly update posts at brightid.mirror.xyz\n\nSome amazing projects are already integrating with BrightID. \nCheck them out at apps.brightid.org\nWill your project be next?\n\n\ud83d\udd06 What is BrightID?\nBrightID is building an identity lego that allows users to prove to applications that they only exist once in any given system.\n\nWhat if you could always prove you were a real unique user?\nIt\u2019s easy in the real world to ensure you\u2019re dealing with a unique or a specific person, but imagine how many systems could be improved or made possible if every user or account could prove they only exist once as we transition to the digital era?\n\n* Digital voting and governance - including quadratic voting, liquid democracy, and signaling\n* Truly universal income or airdrop distributions payable to literally everyone\n* Public-goods funding allocation - trust minimized and collusion resistant thanks to MACI\n* Social media without millions of bots polluting the discourse\n* Credit systems for under-collateralized DeFi\n* And so much more...\n\n\ud83d\udd06 How does it work?\nBrightID is creating a giant pseudonymous social graph of people all around the world. Users can make private, cryptographically secure connections to people they know, using a smartphone app. This pseudonymous connection data is shared among a decentralized group of computer nodes that store and analyze the public social graph. The nodes of the network determine and verify the likely uniqueness of each account, based on its interconnectivity with other accounts. The user can then use their BrightID verification to prove to any integrated system that they have one and only one account. The potential integrations are endless.\n\n\ud83d\udd06 Where will my contributions go?\nBrightID Main DAO is a LAO (a DAO with a legal wrapper) that stewards centralized pieces until they can be decentralized, such as the app registry, website, and app store entries. It also has stewardship over grant and sponsorship income, and functions as a non-profit. It has been committed to BrightID\u2019s core mission and funded the core team since its inception in Feb 2020.\n100% of contributed funds will go to BMAIN DAO.\n\n\ud83d\udd06 Bright DAO!\nBright DAO pulls in many contributors from the community to grow BrightID at a faster pace. Using the gardens DAO format pioneered by 1Hive, contributors can create their own proposals and receive their own funding in $BRIGHT community governance tokens.\n\nCome help us build a brighter world.\n\n", - "website": "https://www.brightid.org", - "bannerImg": "bafkreiggaqod3axjmtujagb4tcbxojb2gxtqsdfrcdeockxr7fn6j7b7ua", - "logoImg": "bafkreiadate4cocvimh422fmc3kcwpcbftawuexl3mnmvs3kwtbrcc4km4", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreifwkf34fk3jbkyzcfylbha4u64hh64j5bfzgiwubpipgzz647iihm" - }, - "projectGithub": "BrightID", - "projectTwitter": "BrightIDProject", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x4B8810b079eb22ecF2D1f75E08E0AbbD6fD87dbF", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#BrightIDProject", - "hash": "v0.0.0:xSd9MoP8Z4HXIn9sE6eJMf9ZRmDaV5q8GvChb6CZAzo=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-13T22:08:47.064Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-13T22:08:47.064Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..O3-626GVI-bnRbhZKZcjdFkGcKJr_c2kHiAB_V1m8SnvpC2orqakvoSOZ5FjzVUlv9LlWhFKubs-UxWhbEHUCg" - }, - "expirationDate": "2023-04-13T22:08:47.064Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "R9T9cLWaJIY8YWSYzjugUSHXc65L1ofILLPFTNP1Rw9XpSaOfl7ysDJ1huUuO0e9", - "encryptedSymmetricKey": "f7a0e649cb0871a29208be3c81f68e408ee179ee6b82fddffc6878a02b9a41139efadd4cce47089cc7758121d2c6e710a381dab681226502c54ed65ddaea60b009cdbe9be7a67042bdf2f023194f945a0e317ea73a41aff43949d37d7048de936aa4de2fc0ae1d916459dff35867146b5c97ab91467a2a8cb21ab0020328849f0000000000000020c90e11d636a17af0aec8b87fbe51478baa00ae727ea81931587ca2f6b850c55d0ef9432241866cbb44c0b351cbf8e492" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants, Subs/SP sales" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "~10" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Twitter verified, Github org not" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/BrightID, https://github.com/UBIpromoter" - } - ] - } - } - }, - { - "projectId": "0xf05829c76e3da92a8942378240ab4dc70c8c509f558eca9b0621c61054e9342c", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x87ae84325ece607b85efe8b246160b41a41507a8ce4f3e08e6c8d4c9decbe3067031685d2da44cceea534bb0a3b5db17defc73abba65befbe4954c5a352e9d7e1b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0xe126b3E5d052f1F575828f61fEBA4f4f2603652a", - "project": { - "lastUpdated": 0, - "createdAt": 1673381678118, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:105", - "title": "Revoke.cash - Helping you stay safe in web3", - "description": "Hey all, we're building free and open source tools to help you stay safe in web3! \ud83d\udc4b\n\nTo use tokens in decentralised applications such as Uniswap you have to grant the application permission to spend tokens on your behalf - known as an allowance. Allowances are an important part of using these apps, but can be dangerous if left unchecked.\n\nBugs can exists and exploits can happen even in established projects, and by approving token allowances you are potentially exposing your wallet to these exploits. To keep yourself safe from allowance exploits it is a good practice to regularly inspect and revoke your allowances.\n\nRevoke.cash comes in as a preventative tool to manage your token allowances and practice proper wallet hygiene. By regularly revoking active allowances you reduce the chances of becoming the victim of allowance exploits.\n\nIn many cases, phishing websites try to make you sign an allowance while they pretend to be an NFT mint or other legitimate use cases. When these phishing scams happen, it is recommended to use Revoke.cash to mitigate the damage, but it is even better to prevent the scam in the first place.\n\nThis is where the Revoke.cash Browser Extension comes in. The extension pops up whenever you are about to sign an allowance and will inform you of the allowance details. This can help you prevent signing malicious allowances.", - "website": "https://revoke.cash", - "bannerImg": "bafkreigh4n4cg4xidzk3dwrtvynsoyti3aau3zmoq5xjp5jicrxwbaj5ae", - "logoImg": "bafkreihvbycub5glpe5a27qwx2dtsbafu7c5ven4xqwgnmhaemzgqxthey", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreigafckidvncudcilu4zkl3epcpcxtnkpfjyp2avfpl6gxvjvzqh64" - }, - "userGithub": "rkalis", - "projectGithub": "RevokeCash", - "projectTwitter": "RevokeCash", - "credentials": { - "github": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xe126b3E5d052f1F575828f61fEBA4f4f2603652a", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextGithubOrg#RevokeCash#9142187", - "hash": "v0.0.0:1ExxlZEC0tJHld3XmyxXDiMgFbeE5tmnsj7dGMp2HuY=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-10T20:14:25.497Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-10T20:14:25.497Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..DeEftyDn7L-mZw6A5jgp1N8myeniCwBp0obd5axKckNXczLwphqEkQzrShSHZ768cBxsFvDLD04oqZhy1U7IDQ" - }, - "expirationDate": "2023-04-10T20:14:25.497Z" - }, - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xe126b3E5d052f1F575828f61fEBA4f4f2603652a", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#RevokeCash", - "hash": "v0.0.0:YHu4fP2e5KKqoGKw3k9xwdUcn/+syg23uj8B4OTSRq8=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-10T20:14:12.839Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-10T20:14:12.839Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..E6MnkuNZoRD82N-wxQMnVOmgNLx7NpBb3rYFVySAcLdqtgLIoS25lkDOXZJ0qOF3qMbvrsmvwsMfSViwl7sVCQ" - }, - "expirationDate": "2023-04-10T20:14:12.839Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "p+P0WLqXeqGF8TLwlTAxOocgKQp4H2dWnq44XeOQkErCSpjJiRRTVL+EOpG6HFd7", - "encryptedSymmetricKey": "50e61a244a39bcfd69a543012624902bdef9e0a748e9a9e9f55d91dfa7dbc674f5e26df936ea6d90d8a24f844635e8189590475471104e2d73fa5981afb534c234c2de198746593c4a1797b3170031963f3e49c386893346026efbddc50e25a28ce9e06d0f2e8390872db5e0da5569e06308dd2a54df0237c2e526977945048b0000000000000020e48a4ceffc33dae4a3ecb2ff71557cbbd5b06ac0c13d1dd165e10df066198132e258d507985828870e2f1658d185e7b2" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Gitcoin Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "1" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/rkalis, https://github.com/RevokeCash" - } - ] - } - } - }, - { - "projectId": "0xf0f5616e7551fe646ca26f0745d17583299cafb0848c232f33563e68a19d8de0", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x9e70df9a0e514a590b5ccc487065dc25e70db1a90f3c3752f2d39621b08406c060d1200ab0c8efad64114057195869cf080fb212e18a9d4a68ea67a6ad87d9f81c", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x3927E0642C432A934a4EAA64C79bC8a1D8ac5Fb7", - "project": { - "lastUpdated": 0, - "createdAt": 1673285189977, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:88", - "title": "PoolTogether", - "description": "PoolTogether is a prize savings protocol. The no loss, on-ramp to DeFi rewarding savers with millions of dollars in prizes!\n\nNote, all contributions to this grant will go to the company PoolTogether Inc to fund development and other activities around the ecosystem. ", - "website": "https://pooltogether.com", - "bannerImg": "bafybeifmskeh6sjqyf5fo6dp6maiidbe77tlnoq3tlbitbklep7ratv2cy", - "logoImg": "bafkreicx47xnmerpj2c5l3ofnru5dxkqcywyfifysbbmm6qv2s3xqsph74", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreihuvbdej6lpl7fb5otmsf5faml7vgxk32e23hyjzehrjozwlrpqty" - }, - "projectGithub": "https://github.com/pooltogether", - "projectTwitter": "PoolTogether_", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x0a09cd09B0107Bb98a83f211704F036ECa94B92e", - "hash": "v0.0.0:V1ESBo8zxKy5V9EMRDBLWRXBOKoStKwi7WPQKAZRFTg=", - "provider": "ClearTextTwitter#PoolTogether_", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-09T17:31:39.181Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-09T17:31:39.181Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..J1uKatiba6KKLdy8nNjNWTHbn2i8bTxQ30foaRN6er8wy9dLIbV8DMUK8ukD8wax-45P_YWgx4sjrTQ3cKrnBw" - }, - "expirationDate": "2023-04-09T17:31:39.181Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "DNM/BNcfHYr/SuJjT5qXHUJBLWhwxyhjfa1Jbbv7lN4zZR/KQfrdRZhkK0SLzfxg", - "encryptedSymmetricKey": "b329b78a92f1cc89fe29fa2bc3924d664c9c3eb5c7e424f417e269846bbb0f11d8c47a75a22019e977bff7d9f96ab20956b8b83c87170d3aa0f7ac339d2316d51392f7e73999230017d8b83d4f1d67625a15d9ea952c6ea02ddef214788935807bb46dd63a4e1f0342e977bc76176cf6612926c8181197cd803299763cf8c13b0000000000000020a3ac00497bab72f69b4d9c7b39ac36c44b946212b922e7f39e96846677fff477714a9caed80733f762715ee53118b3ac" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "PoolTogether Inc has been funding by paid development, NFT sales, venture funding (total of ~$2.5 million over ~4 years) " - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "5" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/pooltogether https://github.com/PoolTogether-Team" - } - ] - } - } - }, - { - "projectId": "0xf22becdb87631f44c3cf5839e471811ed21c4200324cc9e5e16771703d03e819", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x35c38532db1fd5ceea9443888a51144b7e5a902c99ac54ce5d2dfc5b1e008129199758659c11d952311ee0e7b0dec19514c01d701fd63e178c01f57e18b36ede1b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x3806a85D9b8E017d2714B5a240f3e7737279a3Ba", - "project": { - "lastUpdated": 0, - "createdAt": 1673151631874, - "id": "10:0x8e1bD5Da87C14dd8e08F7ecc2aBf9D1d558ea174:39", - "title": "MetaMail", - "description": "MetaMail is the web3 email provider. With MetaMail users use wallet/ENS as email address (e.g. suneal.eth@mmail.ink), and sign/encrypt to ensure the security. MetaMail is compatible with other mail like Gmail. All those features are totally free, no gas fee.\n\nMetaMail just won Gold Prize in EthShanghai22 Hackathon! We need you help to keep MetaMail free and neutral. We have open-sourced our frontend code at Github. In the future, we plan to open source the MetaMail email protocol and help users to host their own MetaMail service.", - "website": "https://metamail.ink", - "bannerImg": "bafybeigaq7bdinqnxhu7mqs5qk7cqn2qbedelzfww3ecsnikiljeioom5e", - "logoImg": "bafybeihl2sgajv6wyt6u3d3kiq53rdyyudwswqwn3d7boq7ofqqxjgwbva", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreifkm3mlmdvhtwcjriwdpaecc46xifji6ofegyv6aadmeuqlvavjly" - }, - "userGithub": "Gooong", - "projectGithub": "MetaMail", - "projectTwitter": "MetaMailInk", - "credentials": { - "github": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x045ff23cF3413f6A355F0ACc6eC6cB2721B95D99", - "provider": "ClearTextGithubOrg#MetaMail#24506085", - "hash": "v0.0.0:D38XGTkcFLnVPaUat/SBYd2X1CB0KvaeQ+7Z2Ys8S6U=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-08T04:17:57.867Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-08T04:17:57.867Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..q3jqKRTEiP3jIBYRtc5CrEke8uTBA9nTyaitrpZuyZWovHyooZPpcoLO5CHp10k5ruB9MGs9pFiZvBegXH_6Aw" - }, - "expirationDate": "2023-04-08T04:17:57.867Z" - }, - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x045ff23cF3413f6A355F0ACc6eC6cB2721B95D99", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#MetaMailInk", - "hash": "v0.0.0:4H/jMh2+wWG7u2T/J40U8I/Abm1GjILQnDW1RY6Mk74=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-08T04:16:29.044Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-08T04:16:29.044Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..pp1XQwpHEAky100yKEl81ch9-AMXN3ge_y8D73PaxTG_557epgiXcNjlgzqDdg5zbKosHRWtu6repKcQotm5Bg" - }, - "expirationDate": "2023-04-08T04:16:29.044Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "oM3cDcLM0B15rQLS74l70HgaArIrTasOlogXg2ex4b4JfZXYD2IQgENWVaYSQ7vz", - "encryptedSymmetricKey": "ab5ea80a534714ebafa9ae97e4baecf0cb59a5368bb643c71a6fbf125141d4eb3d2105c2a44f65734714d0fbc0ef220eb3c3316f8f6f10ff949c98457306490c913eb183aee36016fb00289fd2d5becc2a58a0aa735707b67c9119860e9dc682c419175e179280e0056990aba2828d3e9054c11dcba608300f10eea3bb5badc0000000000000002056e25b8efa807770f5637d873fc5b6581d7e4f9bfca5d5808f7b7124de4f4fcda8f79ce430b02e67dcd3244b61e62580" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Gitcoin" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "3" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/Gooong https://github.com/MetaMail" - } - ] - } - } - }, - { - "projectId": "0xf315ffb4e59dd53cdd1d0d14e03e756a7d9f6abbec449b1d577993c1cbb2277a", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x21ccbbe6e97b16fdb9267d60242e0530b5d5ae14f2d7e4a406e878c6a9affd8f2a92c64da8517f9e386b42d5ab708a125d9dc35b6db122813b4519adf752814100", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x33359285F30E7B3386dE70ca500F4fe27853765B", - "project": { - "lastUpdated": 0, - "createdAt": 1673393430712, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:112", - "title": "OpSci Society: The Open Science DAO", - "description": "OpSci builds open source tooling for web-native identity, reputation, funding, and reproducible science. \n\nThe OpSci ecosystem is composed of three services: \n\n1) Commons - a decentralized data commons that offers free archival for large reproducible neuroimaging datasets.\n\n2) Verse - a DeSci Society registry that links verifiable impact with funding streams on-chain.\n\n3) Fellowship - a permission-less grant program that provides a stipend for researchers at all levels performing work at the intersection of Web3 and DeSci.", - "website": "https://opsci.io", - "bannerImg": "bafybeiegmfnfzvzhagmyjnn3djubzbhajcd4eeka5sbkhh7dency2dbmay", - "logoImg": "bafkreic3mwzm5hkjrto7jt3hbstra3owkwi2olc7iv2g7wfgxydombjn6m", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreictutsocfr6n34bazaazob5kwnmiv3ergmkhkfatikwfgl34jb4yu" - }, - "userGithub": "seldamat", - "projectGithub": "opscientia", - "projectTwitter": "opscientia", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x33359285F30E7B3386dE70ca500F4fe27853765B", - "provider": "ClearTextTwitter#opscientia", - "hash": "v0.0.0:qxw9f188K/lX2UauBd6sEkhrNkpZPui5w6ZR+SAMOB4=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-11T22:09:10.676Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-11T22:09:10.676Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..YOWhoXJaLABUCm3igWCC28DBvlr5zo4hle34L00oDZXrXZ31QcRjclwsu85wDiQR8kGiwCyCbW4p67u1s_oDBw" - }, - "expirationDate": "2023-04-11T22:09:10.676Z" - }, - "github": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x33359285F30E7B3386dE70ca500F4fe27853765B", - "provider": "ClearTextGithubOrg#opscientia#1558845", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "hash": "v0.0.0:FmgnQFflRq2hvYz/Sx0p/r7vTi+qhmGLp06+tzEzP+E=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-14T01:36:24.114Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-14T01:36:24.114Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..mJBWgAg6A9A5tnThT0OSChUBK0l41RqTC0g6KJ41xWf0VmNZAPsfcf92eI5lGGQkgXHieQl7wXByluKqqfexDQ" - }, - "expirationDate": "2023-04-14T01:36:24.114Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "DrwmcJPMhV9f9N2pHttsj6gdOoBTQJ+3ehLuzbm2DlydohwjrR2rvNveeQ9EiMHO", - "encryptedSymmetricKey": "10263b4ae600cd263a479962f4baad67c16e970a2540b300dde9bbce442dcb5bde994c68fda70aae499cafd31e3032194799fedada8b9d29c3444bcdf5c2ea9c889b4d878ba4ddbf657186d176f3ef17205044da5d81a2c6660c5b1b008a3288bd41583846519fd0021f8c041ca7602c266d99471fcd8160486cbd5f96c2b1780000000000000020b10539145523451beb8526270457fa959fff8ce7e3933bbd312e450485934589fdbc78647a0406775a894cbe6bbf1db3" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants, donations" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "8" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "Yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/seldamat, https://github.com/opscientia" - } - ] - } - } - }, - { - "projectId": "0xf84c0ab44e4012f6f20be3e08fe0a775835df0c091fdf0fa9e0a20ca6e0de53f", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0x91f58c12e203829e6837c891c4e1d261c0b884b91a096003a4fe999117a419ca748ea3eedae97ccdf49ffafcba0c7876537df71303d87296e08ce3ddd91a64501b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x0230c6dD5DB1d3F871386A3CE1A5a836b2590044", - "project": { - "lastUpdated": 0, - "createdAt": 1673353150826, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:96", - "title": "Upala \ud83e\udd16 Price-of-forgery digital identity", - "description": "Proof of person-hood system that provides human uniqueness score to DApps and beyond.\n\nUpala account score represents how much it would cost to forge the account and valued in dollars.", - "website": "https://docs.upala.id/en/latest/", - "logoImg": "bafybeie7fhpesqgyf4ycf6xg63qjwfy5glxmcgaabj33g6kdwja6amwara", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreicmmju22yphpcm3qu5tzsvlfesu2bvgq3sijdiaq5c7sqp65or4ee" - }, - "userGithub": "porobov", - "projectGithub": "upala-digital-identity", - "projectTwitter": "TheUpala", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x0230c6dD5DB1d3F871386A3CE1A5a836b2590044", - "hash": "v0.0.0:YkjwKKV+YuWOcuYya9WNwT9/njaYjlAhgkwCng1KZOQ=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#TheUpala" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-11T05:50:52.092Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-11T05:50:52.092Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..8-a54qEjAffUy__uIEoI7301XBrYtAPuwkgTNKn4f4TzMyF2KSjs9tOm5CcZ8vQCPKeU530koZOu96csGKJ7Aw" - }, - "expirationDate": "2023-04-11T05:50:52.092Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "xhujLRroTLUirGBfah70oCvMMs+KYP5aJPqqfopQr6PZeAUi9pU51WukY8quiBXr", - "encryptedSymmetricKey": "aa6d242206ffd0559d1e4c16c3c247e2ed29c0a0f91a2a021b920d0d523c1114cbf75ed3257986f59c7887a8637d3c0e073e56917c082844a27f31e84798bb20d9660ecdec1e5fe1cbc84b15ef5d126e43485dce018f0e3b463ffcd2b525a4b6dfc07a5779408095c953ec910ad5f317c7d75991a1244556cff3402155e02691000000000000002064714a06119f26745d1dbfa71fcbb12cdeb14f02bd41521a08a4c20135aae1270f5e311ca79051fb2c7590a80d65b486" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Gitcoin grants, Other grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "1" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/porobov, https://github.com/upala-digital-identity" - } - ] - } - } - }, - { - "projectId": "0xfbe30bd78a7f1ce0ea860bceed27bb9a3fed213dfe9a667c0a3d5a98a7c67ad9", - "roundId": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "data": { - "signature": "0xa863734e9277c4fc407d7978a95820c0252b7c9c785b65b3cd210f649617227e3cbe8f5bc1cf9b3c3fd1789afe1b4c9161da0392b2cb143596a1cffe9e090bed1b", - "application": { - "round": "0xd95a1969c41112cee9a2c931e849bcef36a16f4c", - "recipient": "0x66593b8C04a3797F74C786CeB7C22C9746dd5a3A", - "project": { - "lastUpdated": 0, - "createdAt": 1673854926385, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:219", - "title": "GiveStation", - "description": "What is GiveStation?\n\nGiveStation is a multi-chain give-to-earn grant protocol that rewards users for funding projects, ideas and public goods in web3. GiveStation is decentralized which means anyone can create a grant anytime and get grants approved by a consensus vote from the contributiors.\n\nProblem?\n\nThe main driving factor for the success of crowdfunding was the ability to raise funds by just making some short description of what you want to raise funds for and then submit it on platforms like Kickstarter, GoFundme, etc.\n\nHowever, later it turned out that this model was polluted and centralized crowdfunding platform does little or no background checks and follow-up on the projects.\n\nThe crowdfunding community is too centralized and while the Contributors are being screwed for donating and trusting a project/idea, they end up not seeing the impact of their contributions.\n\nThere is almost no room from transparency by default. This a huge challenge for every of the traditional crowdfunding ecosystem, and that is what we are here to fix.\n\nLesson learned:\n\nWe have learnt that web3 is the tool needed to solve this problem once an for all.\n\nContributors should be empowered by recurring incentives for the value they create according to the level of impact.\n\nContributors are the backbone of every crowdfunding system.\n\nSolution\n\nOur mission is reward and protect the contributors while making sure that the funds allocated to this founders and teams are used in the right way.\n\nIncentivization\n\nTo encourage Contributors to participate in funding projects and to also experience a better community while contributing to the GiveStation\u2019s ecosystem, we have put together a reward mechanism.\n\nTo paint a better scenario - At the end of each funding round, contributors will be able to claim GVST token as additional rewards.\n\nGovernance and Decentralization\n\nOn GiveStation, the community governing system which most of its missions and goals are largely influenced by votes and users are granted flexibility and control not otherwise seen with traditional crowdfunding models.\n\nIf Contributors matters a lot in the crowdfunding system then introducing a transparent way to raise fund is the best way to raise funds and this it will not only protect the Contributors, it also creates an atmosphere of trust where the Contributors know where his/her donations go to and how its being used.\n\nOverview Project Overview\n\nAfter the funding is completed. There will be no disbursement of funds if the grant does not get at least 50% approval vote from its donors.\n\nHow it works:\n\nThe creators/team creates a project,\n\nThey hit their target from contributions.\n\nThey make funds withdrawal request.\n\nFunds get sent to their provided wallet after at least 50% of donors have approved the withdrawal request.\n\nFurthermore, our medium article here explains how we take care of KYC and compliance to prevent rogue grants creators/team from listing projects for the aim of defrauding the system.\n\nWe are currently on the Gitcoin grants round and the little we have raised so far along with our personal team funds has helped us build the project to the stage it is today and we plan and hope to raise more to introduce more features soon.\n\nThe goal is to incentivize the web3 ecosystem by integrating token rewards for users who contributes to projects on each of this blockchain protocols.\n\nProject links:\n\nDApp: app.givestation.org\n\nWebsite:Givestation.org\n\nTwitter: @givestation\n\nGithub: GiveStation Github.com/Givestation\n\nDiscord/Discourse/Community: Givestation Discord\n\nEcosystem Value Proposition:\n\nWhat is the problem statement this proposal hopes to solve for the Optimism ecosystem?\n\nUser incentivization - We believe ideas can get funding from VCs and all but user acquistion is whole different journey and while other dapps are focusing on exchange, defi, swap, etc Givestation is creating a platform where public goods can get funding with no middle man while rewarding the users which are the pillars and real reason these ideas come to live.\n\nOn the other hand, building a project can take a lot of time and the idea may end up on the shelf not because its not good enough, but funding in the industry seem to be tilting towards a certain part and that\u2019s why we are creating a p2p grant ecosystem where donors meets creators, create an impact by donating and also be in charge of how/when funds are released.\n\nWith this solution, we expect to see a major increase in number of developers and builders coming to build very good projects while contributors who will later turn to users will also stay to support as there is now an instant reward for them.\n\nWho can raise funds on GiveStation - GiveStation is accessible to everybody as long as you have a great idea. Regardless of your country, tribe, race, etc.\n\nProgress Our Dapp is on testnet on five blockchains inclusing Optimism, Arbitrum, Gnosis, Polygon and Binance.\n\nUsers can create and contribute to grants and claim Givepoints (GP) on their dashboard.\n\nWhile we were at this stage, we saw what bringing the protocol to other chain could mean for the crowdfunding ecosystem and what the subsequent version will look like including features like:\n\nSome new features like Hosting of hackathons for other projects will be introduced in the next update.\n\nDifferentiation The platform is not limited to developers and web programmers alone as we have made the platform available for everybody as long as they need funds to bring their ideas into reality.\n\nAny user can visit the platform, pick any idea or project they believe in, contribute directly to this life changing projects and in doing so, they get rewarded.\n\nThe requested funds will serve as a bridge to launch the new, ready-for-prime-time version of GiveStation. Expenses include:\n\nMarketing\n\nDesign and branding .\n\nGovernance, airdrop, staking, and/or liquidity\n\nCompensation to contributors.", - "website": "https://app.givestation.org", - "bannerImg": "bafybeia6cwqidhwhatmayngb6ur7iu3mxpqxiqpvo4pt4igc65ogwk5v6a", - "logoImg": "bafybeibs5rioc5t6czic75oi4dj72ryx24zc6qsxjhjgewcyjom2wfbaxi", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreig7ihhdh6zuqczvepjcj4bigta3vmw3zi7yuhva2ekecfsb5njt5e" - }, - "userGithub": "givestation", - "projectGithub": "https://github.com/MrBloomguy/givestaion-team-dapp", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "XJD/add2YpKGwUimn3wtCFJ2Do0ecjTDQmLnyalG6Q0WZ3OwQ6T+Pems1GStTPa5", - "encryptedSymmetricKey": "ab41da3ba1a2eb5ec592fd91015bfccfbb1c66cb52864d93b8a076e8f645bd15b92b119ce3567368e36a72cb75a40808074e0d61c8e17572df68452cdf0e2b1a949648a51e14c5b14559ad58ea93937a60356bb21dec426248cd9c4364dff28f6acfc3e1ad132629997e83a676a6ab3ed1c9953ef52fedbdeb671b6a61fbd4c70000000000000020568624fc526962e68f67866ee6550faf34997de292943ccf5f9f4b99d3881f956f211d77567b53aa7d78879adb2de08a" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "gitcoin grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "4" - }, - { - "questionId": 3, - "question": "Have you verified your Github and or Twitter account on Grants Hub?", - "answer": "yes" - }, - { - "questionId": 4, - "question": "Confirm and include links to your Github user account and organization account here", - "answer": "https://github.com/MrBloomguy/givestaion-team-dapp" - } - ] - } - } - }, - { - "projectId": "0x0cdbfe30f8bfea9a33a297e1812c0ff146d326a3afa5832e24dc941a2e415b8f", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "data": { - "signature": "0x928ffd5b09eb821ef710e4558e2e8f72d4042d676626cc62c82aaffc19c68e8b1bdd067f804d6c7fccd3ec2cbff38487139dcf7f582982d77a6501eef7b5901601", - "application": { - "round": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "recipient": "0xb7081Fd06E7039D198D10A8b72B824e60C1B1E16", - "project": { - "lastUpdated": 0, - "createdAt": 1673391009470, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:111", - "title": "Otterscan", - "description": "Otterscan is an open-source, fast, local, laptop-friendly Ethereum block explorer", - "website": "https://otterscan.io", - "bannerImg": "bafybeidh22fvqahrapg4j5nuzkmsox3nrcghgqdkjn6zdvvaswaglh3b34", - "logoImg": "bafybeigoyezwswvwbedbf4b2gsr66tl5vfq5qdfiq3huwsivp37qmwd5ce", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreicn4otnggecmtmymkk6hgctzctor7lqqndr3covc2ts6y5j4gau6a" - }, - "userGithub": "wmitsuda", - "projectTwitter": "otterscan", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "yr0+qhhQj+3Wg0R2NhQewRkxE9Cq/J4L5ZDCLSc6n4/GbpDxZRHd2jE7yJvP6XYU", - "encryptedSymmetricKey": "cadccde1f54c6417f64eaca50f3aae6e44608059ff5626032f4bd89cdd62d5b38c0250b6239b2485fe43f509a185460a97ec8938e795536351cae122e4c226fb13758613588c92b67e5f06e5fc8c25bde428b300830a1aefd38bd900d68e6fabf92fc71bb0db6fa64fd1b8b72128819ae7ed672ecfd5b54c4ac6e39745536252000000000000002085ffc01c90ed168173037302b8ac84a9296d84aeb9234a49133a2bc805bdf73709627b1d5f698b2c7bef3961607809a8" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Other grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "1" - }, - { - "questionId": 3, - "question": "Have you verified your Github and/or Twitter on Grants Hub?", - "answer": "yes" - } - ] - } - } - }, - { - "projectId": "0x218820f6e3edc6a007e830331ba1435144e4a5db5aff9a3f40025cc07371f087", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "data": { - "signature": "0xac22fca56f34180d6d992ff9bb2208bc962d7dc5350a93190d69a947987344a8794b46f98691a95539d1515055223f867964572f7fa5b99e8d5b9f979bcba0641c", - "application": { - "round": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "recipient": "0xA47669cBc53985333423e4d3D00188f4049fB695", - "project": { - "lastUpdated": 0, - "id": "10:0x8e1bD5Da87C14dd8e08F7ecc2aBf9D1d558ea174:13", - "title": "Optimism DAppNode Package", - "description": "This package allows home users to run a full Optimism node on their DAppNode.\n\nI am raising funds to be able to dedicate more time getting the package ready for the upcoming Optimism Bedrock update\n\nA little funding will go a long way with this project \ud83d\udd34\ud83c\udf31", - "website": "https://github.com/DanieleSalatti/DAppNodePackage-optimism", - "logoImg": "bafkreidaaaxr3dxful3vowgh53nrtn3wcjrsbynhirtfiakfajpdt5eyo4", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreifo34njbr7l6hcdltpomypu5vie3yqp7nfqjqralymxikbimacuva" - }, - "userGithub": "DanieleSalatti", - "projectGithub": "DanieleSalatti", - "projectTwitter": "DanieleSalatti", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x523d007855B3543797E0d3D462CB44B601274819", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#DanieleSalatti", - "hash": "v0.0.0:PjfFlORGnC/OPi0oZGmzpqvkyA5SqElzdkcUjnPryxE=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-07T21:18:37.115Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-07T21:18:37.115Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..j1jpJHHUGkiMMNVH5kXQAHXgngQkPcHPN0P-zgtATj26uarB8pB_AbLgcNb-j253xVEAWW3uk3Uw-Bl-73GsCw" - }, - "expirationDate": "2023-04-07T21:18:37.115Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "dbJ/BPv+aBbuagnGyWjbjppU0vdrZS6IG4XgXHV/OidT9/PVL1dMSD5b5+NUVhnF", - "encryptedSymmetricKey": "199be5d4f605e2863b4cf3e699f7de0a907c544ace2ee290f48e37c9a0985eec4910fee181385bc3fb9406d7726e9b0226f6654208f7956d48f55acdca2beda457d36a0aa5dca678adbaec0397a8c472b7471436b71feaa14c86fd2ece44a2829464085edef260393a0c50fb64db385297ac476980b1eaa40044fcc9c4026bb300000000000000204f9498f480de7ec075a993e0de315a551b9df297ced54cc4d59f60746e46be22d663766deda127f2e63237a5b07405b7" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "1" - }, - { - "questionId": 3, - "question": "Have you verified your Github and/or Twitter on Grants Hub?", - "answer": "Twitter yes, GitHub fails" - } - ] - } - } - }, - { - "projectId": "0x2fa0c5a9ec73a08b88a971be79bc374f319f50588732a00e4018111196e89337", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "data": { - "signature": "0xe98e5745999c8ca9fbaa22fff8a2af739ff4c3c2c902a4c491cb1a8aabe311c559397cbf9264bf6d139f5c5a2dc86ac478fd81176e66f6aa6ffa174d835700c91b", - "application": { - "round": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "recipient": "0x97843608a00e2bbc75ab0c1911387e002565dede", - "project": { - "lastUpdated": 0, - "createdAt": 1673471733556, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:127", - "title": "BuidlGuidl", - "description": "A curated group of Ethereum builders creating products, prototypes, and tutorials to enrich the web3 ecosystem.", - "website": "https://BuidlGuidl.com", - "bannerImg": "bafkreiftoy6owlsffsd2pkgmtzdltgixbbuberr25yb3omu5j5ym3wxrhm", - "logoImg": "bafkreigwapqamrot3qlayerrra22ud3jzoc6w7y7qttbelj3hp3psltp54", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreihalaoukf2enq3quhqtsccrkzy46xndovuyf6tv2b2hqnvhqgc4c4" - }, - "projectGithub": "BuidlGuidl", - "projectTwitter": "buidlguidl", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "zXwdoOXNf51VfGOLJAmwnl0hFsSvga7XoSpCbm7TFOCd41xRYs736pWNWFL6nZVu", - "encryptedSymmetricKey": "3c577905cfcce94c0a2cd258e878cc9712f49c2119b358601e4b139f68d4ed951ad15a5574243bf69d290dd51d7c9a083a96d6a78c996eed6513bb5262643093fac178c29450234fcd6e402140723e480c5167de3f8ac9c1d0803c2c9b8523874b5748e9109eeda796dd5891a714ef76f839990268d228ec7835e06d073d89530000000000000020a28bc52fdbcf7e4c528598006bf04c28908fcc910041191b43a2ab821ddddc7292e56a085a041addf9e3d3a1ccb59598" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "only EF grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "40" - }, - { - "questionId": 3, - "question": "Have you verified your Github and/or Twitter on Grants Hub?", - "answer": "idk?" - } - ] - } - } - }, - { - "projectId": "0x41b838dc0a624db0eb8a096d90ade9f01a8598117f8d94d419f0496af1d04dbd", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "data": { - "signature": "0x9faa4f3cde028dbc0fc0cf201a2dfa5f161003d18a8d479b5d6c18eafe52441c7fc1502c1bbb70e46e619810beb7dd823ca4983b32abe063794087b59a86e3551c", - "application": { - "round": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "recipient": "0xA47669cBc53985333423e4d3D00188f4049fB695", - "project": { - "lastUpdated": 0, - "id": "10:0x8e1bD5Da87C14dd8e08F7ecc2aBf9D1d558ea174:13", - "title": "Optimism DAppNode Package", - "description": "This package allows home users to run a full Optimism node on their DAppNode.\n\nI am raising funds to be able to dedicate more time getting the package ready for the upcoming Optimism Bedrock update\n\nA little funding will go a long way with this project \ud83d\udd34\ud83c\udf31", - "website": "https://github.com/DanieleSalatti/DAppNodePackage-optimism", - "logoImg": "bafkreidaaaxr3dxful3vowgh53nrtn3wcjrsbynhirtfiakfajpdt5eyo4", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreifo34njbr7l6hcdltpomypu5vie3yqp7nfqjqralymxikbimacuva" - }, - "userGithub": "DanieleSalatti", - "projectGithub": "DanieleSalatti", - "projectTwitter": "DanieleSalatti", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x523d007855B3543797E0d3D462CB44B601274819", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#DanieleSalatti", - "hash": "v0.0.0:PjfFlORGnC/OPi0oZGmzpqvkyA5SqElzdkcUjnPryxE=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-07T21:18:37.115Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-07T21:18:37.115Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..j1jpJHHUGkiMMNVH5kXQAHXgngQkPcHPN0P-zgtATj26uarB8pB_AbLgcNb-j253xVEAWW3uk3Uw-Bl-73GsCw" - }, - "expirationDate": "2023-04-07T21:18:37.115Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "xc1ye5CTJ+mVMyYGXV4TE0aYCGEh4+/ugizbwp7eI6PYSSNobXQG62oFkhaP0c7m", - "encryptedSymmetricKey": "cdd7b29eb69f1da3cc00f6d56161f549bd0b1ff6b4aece16c8d36ffd77afb41919447a37a034fde569418bd90d2bde0286def89bcfaf9e19ddea2e31c5d3234b382a61aa2d573086ca4af84ab404d1c4b37f110f1cb698a1619ea66c015061a0c467bd4473a4de70c14793a7edd82277ab3d89588305a0422dbd4ace8a8e1db900000000000000206e2a0b76635c28cced95199c6b01b3a7e599e0129bf101940353d289a922b0a2b5bacddce420d3a885eb18832b27388f" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "1" - }, - { - "questionId": 3, - "question": "Have you verified your Github and/or Twitter on Grants Hub?", - "answer": "Twitter yes, Github no (failed)" - } - ] - } - } - }, - { - "projectId": "0x429927c3a14cbe156749adb31371f385749150ac3604513b24d0ddfb6e7b8b90", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "data": { - "signature": "0x5621c2ef5fc121ed55f128908954888a37bfbc1c317fe48f9cc670c956e4e60b5b7f7b37a246227cf5bd4570c97ce213b365022077946e1515bb95e6bee6a80201", - "application": { - "round": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "recipient": "0x7f06Ac71366631157551D97559b82975c293FdBa", - "project": { - "lastUpdated": 0, - "createdAt": 1673441915287, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:120", - "title": "Ethereum on ARM", - "description": "Help us to build a <$400 PnP Ethereum full/archive/staking node based on ARM boads that uses only ~10 watts of power to run.\n\nEthereum on ARM provides a PnP Ubuntu server image for the Rock 5B and the Raspberry Pi 4 that run both Execution and Consensus clients as a Systemd service and automatically turns the device into a full Ethereum EL+CL node or a home staking box.\n\nThis is what we've been at these last months (thanks to your contributions): \n\n- Support and include more Ethereum clients. Current list: Geth, Erigon, Besu, Nethermind, Prysm, Nimbus, Teku and Lighthouse\n- Testing and releasing an image for the Radxa Rock 5B device\n- Updating the documentation and translating to Spanish\n- Research and include other blockchain components in the image: IPFS, Swarm, Status, StarkNet\n- Research on Layer 2 solutions such as Polygon and Arbitrum\n- RISC V: Continue to research and try to run an node on this architecture. Wouldn\u2019t It be great to run an Ethereum node on Open Hardware?.\n\nOther info:\n\nWe are running a $365 Ethereum stake device with 3 validators using 10 watts \n\t\t\thttps://twitter.com/EthereumOnARM/status/1597889744821944320\n\nThanks for your donations and support. \n\nOur repository\n\nhttps://github.com/diglos/ethereumonarm\n\nDocumentation page\n\nhttps://ethereum-on-arm-documentation.readthedocs.io\n\nDiscord Channel\n\nhttps://t.co/LvKzLMSXlZ\n\nCheck our twitter account for updates\n\nhttps://twitter.com/EthereumOnARM\n\nEthereum on ARM is An EOA Blockchain Labs, S.L. company project.", - "website": "https://ethereum-on-arm-documentation.readthedocs.io/", - "bannerImg": "bafybeiat3evblpuozjnykv7n2thytfc7rq3vdz5ognbjuwfrlpmzxusjiy", - "logoImg": "bafkreiggxot2tb7ise574vc2br225z2cenov25sgbm5e5ylkyvh63puvx4", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreic2xg5xuod3lpkrnjrqkvhuhapw5bae3e3juu23gr7pe4xrzhbcei" - }, - "userGithub": "diglos", - "projectGithub": "", - "projectTwitter": "EthereumOnARM", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xd1933DF1c223ad7CB5716B066cA26BC24569e622", - "provider": "ClearTextTwitter#EthereumOnARM", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "hash": "v0.0.0:sVMFphaffGc2zqqEglS7JSkHLycOu/NVYuL/3fMCNqQ=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-11T13:17:18.506Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-11T13:17:18.506Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..JYtlWLjeYm4UuquJRviokYAM8jMu40j4KEPiRw26vTQvtOKALA9rSm5wu62rqXepXVT4msTk_OhXXlxeCyuECg" - }, - "expirationDate": "2023-04-11T13:17:18.506Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "UU1B//yCP37hy209pc//4ApnLIvB8JEw0JQ5XYlBeqgATr3iBLYa+S8+munp3zqp", - "encryptedSymmetricKey": "188912eb38a4a8f27014be6616f29f85289877b3179c851442bce5a725523605af89364cb8283eb751d09f773812b60bdd99d2cfb2dce377f67dc5ffd804f49f416692d1c1779b2077035f5fd2998bb8dd3311316c05730dec701d3c1ae79080c4f2f6dabf5340237cd21b614d730032a6f1ab02bbae5b260d6e750a5a565f70000000000000002016edd4e92ed108140f9510758894904042fa36ecd5538285cb11dacc3b0d70620030dac18795d187f61f8190187ead90" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Gitcoin Grants, EF and QF rounds" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "2" - }, - { - "questionId": 3, - "question": "Have you verified your Github and/or Twitter on Grants Hub?", - "answer": "Yes" - } - ] - } - } - }, - { - "projectId": "0x46de99c3a4e0542fde6d77bfa1ff6d19e107f253ea5254f7fdb59869b30e2b7a", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "data": { - "signature": "0xaceb589b6e5d96ecb0491094794f61b880d11db8867a4de3253b146a8801ed0163e5af9b750dc4e3c0943406680f237cc660f37d3b0faf004bd0d83095bb10441b", - "application": { - "round": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "recipient": "0x08a3c2A819E3de7ACa384c798269B3Ce1CD0e437", - "project": { - "lastUpdated": 0, - "createdAt": 1673826251073, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:215", - "title": "Chainlist", - "description": "We track all RPCs available for all chains, monitoring their latency and privacy policies, so users can evaluate RPCs without having to waste their time waddling through all their docs and legalese.", - "website": "https://chainlist.org/", - "bannerImg": "bafkreieiiw3ru2wt4ykqpsujyich57252ta3b2bsost5ckae3ojlwyscmq", - "logoImg": "bafkreiea4y67orw4wx62n5x265qyma66veukuo77d6doc27oqbfa6momfm", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreihiascmyhx4f7fegouzrhc7xkugykfdfhp5cdrcds7xdembiltjrm" - }, - "userGithub": "0xngmi", - "projectGithub": "DefiLlama", - "projectTwitter": "DefiLlama", - "credentials": { - "github": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x08a3c2A819E3de7ACa384c798269B3Ce1CD0e437", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextGithubOrg#DefiLlama#80541789", - "hash": "v0.0.0:JhN6QtxC7EJnJ4xasFMzE+wO9L3RwnXy5aIyZCNXFE4=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-15T23:41:05.497Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-15T23:41:05.497Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..PaJGzmGksf290RIWDI77y504H44PAtFUHplM5FpxpgnliW-EhEmU4Hjg1367QoEu413OeBIG0-drEKxwYqp9Dw" - }, - "expirationDate": "2023-04-15T23:41:05.497Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "F5jtAQlHwvzRuno/6iJnPPDak8Yw7rTD+lvWJCdXibCSrvJcWM1U2/N/7XkTeF+Z", - "encryptedSymmetricKey": "e1d124fbf48c1410f0d6d9eb89f1ffaad2427d7192bcb718c30d3d5e5929bea622ef7e20f3769397474dc9a17740fd01d1ce33beb85a57e1b048b5a4ec6c5ba9a36f247cd5dc09b5f8b2a0731df161259c743af9c0a77acc27a149f448cc3690a6a63b38c19690ceb2ba794ae57a5910e15d44a9cfc5a8f37f49ca05cfcf2d370000000000000020bc78c1719a6568a708ba53cfc11b2350bbf0865515322bdae9d732d6b657e56408383aecc14f8562ca72a3aab3e784a5" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Donations + self-funding" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "2" - }, - { - "questionId": 3, - "question": "Have you verified your Github and/or Twitter on Grants Hub?", - "answer": "Yes" - } - ] - } - } - }, - { - "projectId": "0x4a8d8bb79a51a2b0e3d136c15b672ea87c9fd7dc5b0c3cd76674d5ebe4f7dac0", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "data": { - "signature": "0x96c95c9c45abee92304187671c009691675676f6a223333a01cd351afec8a8207a77f403ea61266f2700627a107c988323af9849b71baac822a1e504115fd3641b", - "application": { - "round": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "recipient": "0x6c5a2688c83C806150cA9DD0b2f10f16F8f1c33e", - "project": { - "lastUpdated": 0, - "createdAt": 1673879756612, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:221", - "title": "L2BEAT", - "description": "L2BEAT is an analytics and research website about Ethereum layer two (L2) scaling.\n\nWe provide a comparison of the various Ethereum L2 systems available today. Because of our commitment to education, we present different non-trivial metrics aside from Total Value Locked (TVL). We have carefully examined each L2 project to determine its technology's inner workings and associated risks. We act as an objective watchdog and develop public goods in the L2 space. \n\nIn the future, we plan to introduce more metrics, upgrade the risk framework, automatize our monitoring, and build special-purpose tools for various L2s that empower users to execute operations like forced transactions or view the L2 state from the perspective of L1.\n\nBy donating to this grant, you support our continuous efforts to bring education and transparency to the L2 space.\n\nThank you very much for your support!", - "website": "https://l2beat.com", - "bannerImg": "bafybeid5sznby6tdturjdtnbwmjygxos5etrbv4boyxa3dx5l6ko4trplm", - "logoImg": "bafkreigereu6gzsxtdd5ehhr5taxyq7wqgh76fgoxacwshgnqe5ipvdfhe", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreicouautfcxo53qbgckkbslet6hncugkccrdgphaze3my6iyklpsjy" - }, - "projectGithub": "l2beat", - "projectTwitter": "l2beat", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x79bF97b7Ff676d4CB323F0383A31Ed6616D87996", - "provider": "ClearTextTwitter#l2beat", - "hash": "v0.0.0:0fkBXsAqSK9F/DzyNf6rb+eOOc7MzCZMoJgW8EwXvtU=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-16T14:29:22.606Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-16T14:29:22.606Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..Y4UdzBEZbwSlVb3_yPFJxyy0iTmDkLbPaf3By7swYIJPe0JaPJ0glchsXPtsSoNTNttBqHHRv4FsWz_Hgk6wDg" - }, - "expirationDate": "2023-04-16T14:29:22.606Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "ns+v+PZyFfddhtOV/VnoEnoe4sLBySN7gaZL75eG7DK8+hig11ENfcRL30adxv1u", - "encryptedSymmetricKey": "b38248517151a9943b2ecd09e47515447d447998ac49a043131370d7e6e2023a291fb578c059d5c52bb90e13474a51010c35a0a7bd57cc8a8cc6b4e6fa6bdbd2da162529b4b7d0d3bc812b822dd9c9126ae5ec6a9f1123638bc561045c77b7b6c98b8a81e135e17e0d8543ef53acfe7dd6e4d7da5ff0c11b2c5f6f5803f01d7300000000000000204ad3ada0aef3df3b9eb67d9dc877e11bfe634281eca2edf9cc3d984dbf4b34c56246cfcc4de1abdf29a06e455606188d" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Ethereum Foundation Grants, Donations, Private Investment" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "13" - }, - { - "questionId": 3, - "question": "Have you verified your Github and/or Twitter on Grants Hub?", - "answer": "Yes" - } - ] - } - } - }, - { - "projectId": "0x50f3dbb23d121a397941e827ce2f10a0aea7f5cf311de6e3abcfe3847c56c405", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "data": { - "signature": "0xb0c58bf3d600050705b5420ca8951a8a9ff7052ca719cfd37b6a714f4135a5c17b8dafd1da28705374284cf80ee3e1867d3eafe5010b1cac232ef8dd5c30f2851b", - "application": { - "round": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "recipient": "0x4557B18E779944BFE9d78A672452331C186a9f48", - "project": { - "lastUpdated": 0, - "createdAt": 1673903797592, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:232", - "title": "wagmi", - "description": "wagmi is a collection of React Hooks containing everything you need to start working with Ethereum. It\u2019s used at organizations like ENS, Sushi, LooksRare, WalletConnect, Stripe Crypto, and Gitcoin. wagmi makes it easy to \"Connect Wallet,\" display ENS and balance information, sign messages, interact with contracts, and much more \u2014 all with caching, request deduplication, and persistence.\n\nYour contributions support the entire wagmi project. The funds collected are used to support the core team and compensate significant contributions to the project. Our work on wagmi is only sustainable thanks to the generous financial backing of our Gitcoin donors.", - "website": "https://wagmi.sh", - "bannerImg": "bafybeicwsvrnwljplqcius7uflb2razcay3ns5wuelzagdazt5gfsgbt3m", - "logoImg": "bafkreiamlbvahwmdj4enqlqohsgr632tga2rt6fo5sjunmcse67o6iu5qa", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreicawwp3f6znznpdlxspyvxlwwtyt6fglu436t3kc6xffco7mdvb5q" - }, - "userGithub": "wagmi-dev", - "projectGithub": "wagmi-dev", - "projectTwitter": "wagmi_sh", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xd2135CfB216b74109775236E36d4b433F1DF507B", - "provider": "ClearTextTwitter#wagmi_sh", - "hash": "v0.0.0:H6PGiuXrCFtBNIInQXODlm2iI5O82CZoF8MYyrPOyOQ=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-16T21:15:00.565Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-16T21:15:00.565Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..jmf2trYw2L1BFA9OwCGYLavg2OEJ4pKODvuTo692VQ_P_UaWkbuamH6X8y73Fjx-ClwLst7qMujDdSvg0GfxAQ" - }, - "expirationDate": "2023-04-16T21:15:00.565Z" - }, - "github": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xd2135CfB216b74109775236E36d4b433F1DF507B", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextGithubOrg#wagmi-dev#6759464", - "hash": "v0.0.0:OGfhqwsc6AxrRuOU7L6Jkcc+qt7Xn6ckkcx26Pdj2Vw=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-16T21:15:38.343Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-16T21:15:38.343Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..kBrMI_iOdtFYNHjk_sJUVNhjvnWTMvUbIwHjwbxvqWFc6wIArq-M1v9KdX83w0phTiHOIGQtvggJ-cruz-6cBw" - }, - "expirationDate": "2023-04-16T21:15:38.343Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "i8I91cKezRDR+w+77UYpHNkoeIiLCw01NFgPPPd+p0s=", - "encryptedSymmetricKey": "f0c46aced01546500b045662c2468d996816d63c1f42472d29e4617825874f61670a332e0ff236455f9f90785938a502d5cfbd26edecf3fbf6704044bd1685317cd6aa07fff3a37d40476ffe25d4282a1e29c3443d3c8de209fed04adedbb6b17e633fccbfbff3037d5917648260342b0e576cebd2f5abbe510991c702839d9200000000000000202ec26b327c2d17eebf282fc1b71f0c2c8c5ad5160b5321014d8e278920a848e3e5daaa8b96ceea23856efc3050da64ae" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "GitHub Sponsors" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "2" - }, - { - "questionId": 3, - "question": "Have you verified your Github and/or Twitter on Grants Hub?", - "answer": "Yes" - } - ] - } - } - }, - { - "projectId": "0x68bf035f1ecb5914aede9bcae5512d0f3efa2c9f4cd7e3c7a69c7cb5836418b4", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "data": { - "signature": "0x8d48a2ac2cfe46b03622c0a99667b519905478678ecdd6de408b75d01ae2e9632cc18b3427f5640937c027b907e35b7886ca917124b365b1095fbaa841e1122a1c", - "application": { - "round": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "recipient": "0xC9a872868afA68BA937f65A1c5b4B252dAB15D85", - "project": { - "lastUpdated": 0, - "createdAt": 1673829248359, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:217", - "title": "Lighthouse by Sigma Prime", - "description": "Lighthouse is an Ethereum consensus-layer client. We provide a stable, performant and open-source implementation which is relied upon by a significant portion of the Ethereum network.\n\nWe're actively engaged in research, specification and implementation. Providing a safe and scalable base-layer is our commitment and passion.", - "website": "https://github.com/sigp/lighthouse", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreidrbcyhvmxkjwvtka35nm23rywxijftcjo7mox2xv22ppa7irhypm" - }, - "userGithub": "", - "projectGithub": "sigp", - "projectTwitter": "sigp_io", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "kusNXf81gZdRYo1Zr4krnevI5NcTxOrx9xU53ksD7B6XXsGp0GqpP4iIVotzVLa/", - "encryptedSymmetricKey": "c09113d6f65d1d9da165854a0957919fdd8187b6c0718f0d7151a01268d652f9cbce9fb2c73a5316b240097a2a8dde05562b580d9be570507148c3c0e8dd90a1f56e90b9a97a3d8137586973e3f49f83a5cc53a51cc29424226c2f47b83cd0a5f358281c097a9ad840d62fe55a41892e828e542fd4e2d2ea772d3057fa0efd36000000000000002062e8fb4c9266278ddeb89236c7e7251d26815a775ce93645aa4093aa4ed10adac60efb4faa3a0dbd2011d820b8f8d98b" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Ethereum Foundation, Gitcoin Grants, Sigma Prime, various other grant programs." - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "10" - }, - { - "questionId": 3, - "question": "Have you verified your Github and/or Twitter on Grants Hub?", - "answer": "Yes" - } - ] - } - } - }, - { - "projectId": "0x6912f9b68921b6f227dfd5b321f38a531d73fe560c6d1055c01ed1c6b00d5ee1", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "data": { - "signature": "0x236969098d2b3362a5c096dc9498be4b435afbaabad97e69f3787800a246315e3e18477bf7c589271548ce61e5475c2f03d2c6e1040ae10fb41c3324aadda5231b", - "application": { - "round": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "recipient": "0x32B74B90407309F6637245292cd90347DE658A37", - "project": { - "lastUpdated": 0, - "createdAt": 1673732387464, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:206", - "title": "Somer Esat Ethereum Staking Guides (Ubuntu)", - "description": "Hello,\n\nI have created a series of Ethereum mainnet and testnet staking guides on Ubuntu for: \n\n- Ethereum Consensus Clients: Lighthouse, Nimbus, Prysm, Teku, and Lodestar.\n\n- Ethereum Execution Clients: Besu, Erigon, Geth, and Nethermind.\n\nThese guides are intended for new/intermediate users, and are hopefully a reasonable and pleasant onboarding vehicle for newcomers to the Ethereum staking community.\n\nUpcoming Edits: \n\n- Instructions for withdrawals.\n\n- Migration guides to encourage client diversity.\n\nYour support is appreciated <3\n\nSomer", - "website": "https://someresat.medium.com", - "bannerImg": "bafybeigfrkb4n4dab5zzup42vdwlx3iq2jhd6shplxiaccim4lyrmvawmu", - "logoImg": "bafkreiagtlbhkjgglue3jdfohnx5aavgzbzwsay7op6nu5txujbartn4rm", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreihap4cm2minpcpu37jtayh2qzj2on4q4ehfc3lm5ghcyecqjffrcy" - }, - "userGithub": "SomerEsat", - "projectTwitter": "SomerEsat", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x32B74B90407309F6637245292cd90347DE658A37", - "hash": "v0.0.0:4oSJstqmoURlMaVbkIBv5HsbEHDeVXMYTLjGGI/sZ70=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#SomerEsat" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-14T21:22:30.685Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-14T21:22:30.685Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..f35dF6aVwnytztBkDRW7YLg0Bu5cggcWY7UNKuEVk6WlYciVBBP7S9OMe3O4FulQ42tAWfFVbEp1yv9gZqPlBg" - }, - "expirationDate": "2023-04-14T21:22:30.685Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "DMvMgOnU4SWrtEmmLHVHEuIx0l1rwNTqTJdJxwNcfVSKVFva1GG2IZXtg/PacO+h", - "encryptedSymmetricKey": "22986ddee7730395ef7e2f293cb2924fed77f95bf8065fa39b4b6945ba1e18188e982b1b699700894a96f9f84d3fcb0128e327e1144cc9490c605e6f6d4e8b196a408b4868de1b823f3bab06be254dc738b19966c1790125a7ae1207015c04808c3bc8dc548702ee92851b0d7c8dd85cfb78aa096b45973f2a5801f86f2f9c230000000000000020092cb9808ca2d33750f4372a92b2f9d49d24b632c12cbc4b5816a71e5733499c275e890d548047fe192899296959e7a0" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Gitcoin Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "1" - }, - { - "questionId": 3, - "question": "Have you verified your Github and/or Twitter on Grants Hub?", - "answer": "Yes" - } - ] - } - } - }, - { - "projectId": "0x755e5c4d042c1245555075b699e774c2ed0f0f1499460201fc936a0595e91683", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "data": { - "signature": "0xcbe8d27801557b927aec2a61e6cad36d3be142cd9e8bc0a1c35cde0267187919191aaa670221f3abefc946a892616bdec7f146a011b4dbce2e1ad0da638f55f51c", - "application": { - "round": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "recipient": "0x9531C059098e3d194fF87FebB587aB07B30B1306", - "project": { - "lastUpdated": 0, - "createdAt": 1673472206614, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:128", - "title": "rotki", - "description": "Rotki is an open source portfolio tracking, accounting, analytics and tax reporting tool that protects your privacy.\n\n\n\nThe mission of Rotki is to bring transparency into the crypto and financial sectors through the use of open source. Most importantly unlike virtually every other competing service which consists of closed source SaaS onto which you are forced to hand over all your financial data, with Rotki your data is stored encrypted locally in your computer. It enables you to take ownership of your financial data.", - "website": "https://rotki.com", - "bannerImg": "bafybeidhdawf7wo6qwlgr72vybrgca3mmnhdko56zwlndy5xff367uqnpa", - "logoImg": "bafkreiglt4vux2nfbqlmcc4lxnmiuqqoniummtm52ak5a5pq25c6jche5q", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiakmopl2kd44pd7smrrlmmf37gcmlvar4fyiwoms3h4ghl54b3iqu" - }, - "userGithub": "rotki/rotki", - "projectGithub": "rotki", - "projectTwitter": "rotkiapp", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "BsdnVxxxjB0iYOojB88FFgTVeEiqtGICW62exazz9V0pwBwtj9fZ7SSoYCbElXAL", - "encryptedSymmetricKey": "7eb8c7ade6890596447ad431975cdadb1885776564939100f682009841e745d171ae1e051e76e7f01708f23c4fc1f80970e99b6e4da1dbb57ae483a28ed94ff1aff2ea67311253d459eba66134a67466bdde08797502374c0fd0402531688ea99c54250994f1d5e50ec461f9cc3c999ea6e4219028c5884cc06c9d4b1a258d8b000000000000002032c07547e5f10ed08ceadaf46ac34a351528d6b9c4950de62a0b2b0a7195678da9978b6bffa46f469a1ba3b1b31ed381" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants + Donations. A little bit of revenue" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "6" - }, - { - "questionId": 3, - "question": "Have you verified your Github and/or Twitter on Grants Hub?", - "answer": "Twitter yes. Github failed. No idea why." - } - ] - } - } - }, - { - "projectId": "0x76eabce511626d1d54bdae4770c3dc172bffca39ba53d82c27defe44ddb94cfa", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "data": { - "signature": "0xd50e7498d02097a273faf721f3d660f176d200d29397a4a3e5cfcd9e286e167c37c506ca7df038f09df223ba3be698817e0765c29b69b4197041a90d215480481c", - "application": { - "round": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "recipient": "0xD165df4296C85e780509fa1eace0150d945d49Fd", - "project": { - "lastUpdated": 0, - "createdAt": 1673040515541, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:49", - "title": "EthStaker", - "description": "EthStaker is a welcoming first, knowledgeable second community dedicated to supporting Ethereans in safely and securely staking their ETH by creating guides, instructional videos, educational content and technical support. ", - "website": "https://ethstaker.cc/", - "logoImg": "bafkreifodkbfb3i6cm3a6wwjhtonesbep5bv2b564i54jlii37k72pu26q", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreigybsei42umhf5hi4jv4suzmpid7r2zy7asvglrubizfpockemnea" - }, - "projectGithub": "eth-educators", - "projectTwitter": "ethStaker", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "mXLLP7hs4hmAXAG4dwYX9v18z+YeljVSH3VecsKE9MC350P8fKWtIgPTjWCEH/cF", - "encryptedSymmetricKey": "3476ac8df01bc8bee7673a6644511f2bc592bf1142fc7212e675fb6cf484f7406bfd719efa38b4ccc61233292f95c005329fbbe973ff83bd596c5a011484e5cce9bd007fb1bf1cde742ab5c35f7afcf330078f6a0da832593a3969260b95888a0e31bd612c9a1a3d88b26bff9ad1a0e46cd47d38588ef207b014b611448cb46c0000000000000020a1817a58eba2744a6c6ecc0434d8b933cd6bb62e3b689934983a6395d5ff09b57dfc4b4b5de265fdcf05aa8fb43d7896" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Ethereum Foundation" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "8" - }, - { - "questionId": 3, - "question": "Have you verified your Github and/or Twitter on Grants Hub?", - "answer": "Yes" - } - ] - } - } - }, - { - "projectId": "0x7a8072161b166f17d280a4427fdac169f9dab2426ca178a6ca9ba167f2fe16ef", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "data": { - "signature": "0x62be5c4fab615f5f290f46cb556388dfb5e2b30b42a257e23350beaec80c4e706ee9599dbf31c19d3bf54edd251833edfff0556671d67c503e48e7fb4a52a6f31b", - "application": { - "round": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "recipient": "0xA47669cBc53985333423e4d3D00188f4049fB695", - "project": { - "lastUpdated": 0, - "createdAt": 1673623855381, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:185", - "title": "Optimism DAppNode Package (Mainnet)", - "description": "This package allows home users to run a full Optimism node on their DAppNode.\n\nI am raising funds to be able to dedicate more time getting the package ready for the upcoming Optimism Bedrock update\n\nA little funding will go a long way with this project \ud83d\udd34\ud83c\udf31", - "website": "https://github.com/DanieleSalatti/DAppNodePackage-optimism", - "logoImg": "bafkreicbgeopgxiaj3xxoqz66unyamcxb6apxzetd7vdmicqjkaydmjwqq", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreigtbzn5hcvm25g2g2sd2dj2p4jxf2n2znbwhxawnqgwcqp7ivq3h4" - }, - "userGithub": "DanieleSalatti", - "projectGithub": "DanieleSalatti", - "projectTwitter": "DanieleSalatti", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x523d007855B3543797E0d3D462CB44B601274819", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "hash": "v0.0.0:PjfFlORGnC/OPi0oZGmzpqvkyA5SqElzdkcUjnPryxE=", - "provider": "ClearTextTwitter#DanieleSalatti" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-13T15:30:17.350Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-13T15:30:17.350Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..i5tiQEd2Dm6nsMwGTnJ8PVofmxGcYjktwSWRj66OPUPSo0oXtvh7OkTj3pWSfzJM88p88K-K-43WHbbmC2-kDg" - }, - "expirationDate": "2023-04-13T15:30:17.350Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "iKnYgIDeu3lE2xQkz40C+hoJ0/sH7nt8CuwedGGOe53t6l1YuBF2rIFrE3bVISlv", - "encryptedSymmetricKey": "d42e8f639b9d926614581c07c2681b360e6b1bfec6ed95d56f9eb4cb4b7831b1a62e895120e05a1dd675eecf6ccc541573a5ea0da31ea84ffd0590ed570ce7d64cbef9a5ff4faf8e7bf96a6a3b4a9e415275a3b688a47f0042d9777dab2e99a073913cff4959c91f19d7ea77400c6e2a4ba2e95e03808705479f7b46cf5cde5700000000000000200a1961673dd7513af625d7e3d504301be38f5db1d97332efc4db9ae3b3cfc7e2d85d068d68d797cb479e69a4c33148ab" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "1" - }, - { - "questionId": 3, - "question": "Have you verified your Github and/or Twitter on Grants Hub?", - "answer": "Twitter yes, GitHub fails" - } - ] - } - } - }, - { - "projectId": "0x7e9c8fa1694bdebd30515fb4ccebd4eb6a5a4f489228dab49a4e60af1c13a424", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "data": { - "signature": "0x5950889a4991b4276f55721ef20a247a6ef02aa99fe07e252b7c05716aa3a9465cfa0e767d38c1e5b1cf5dcaea93bb3d96d202ae0e54929470e2ce81e08e59c61b", - "application": { - "round": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "recipient": "0xD41BDBD4101e02057b7F621f681540ef3Ac81e55", - "project": { - "lastUpdated": 0, - "createdAt": 1673654819784, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:201", - "title": "smol-evm", - "description": "A hacker-friendly Python implementation of the Ethereum yellow paper from scratch.", - "website": "https://smol-evm.glitch.me", - "bannerImg": "bafybeif5ehakrpd5be4fiewpwp2x3fkhkylqbrvdwfnv7rjnpfyft2flhi", - "logoImg": "bafkreif7sn3j35yppxo7ncbln54mn5bibt6rpuxmcagosdns5wkyjdiduu", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreibtgqtl2n2l5fk3q5k2rgvgw2z2uetslowhjfvebzvjfj3x3zn6ze" - }, - "userGithub": "karmacoma-eth", - "projectTwitter": "smol_evm", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x03433830468d771A921314D75b9A1DeA53C165d7", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#smol_evm", - "hash": "v0.0.0:HUsRtwzxKA+oMd6wcinRdlo6bOBXIuXlrgZZLBUlSsA=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-14T00:01:11.237Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-14T00:01:11.237Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..gjjbLAg9GeOuG-X-gkLbpQXQzKfvWin6ayvvsqGWUR1sH-iYqiNvvbzGkaQMNLEUCTfM5JE2VB41C8bxGIxqCQ" - }, - "expirationDate": "2023-04-14T00:01:11.237Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "vqphZFhm9taWVWYukMdqqSctXWrTP1rAjsXG+Yp22eM=", - "encryptedSymmetricKey": "f5a580cff8dd6daa15acddb988f73447d88df24622ba40014a9087fc6f4d9b76b5c36d58cb911ee3d26a97159256c414a608ba6cd2cf07050152e6f12a555973006e5d56ec350a8947e6496c90b8a4e895ecb12e9c649f11a8afefadc2f72788f6f777a91a42a45c38ccce7d2f1775d0eda715a7d13c6cef13feec22a2710acf0000000000000020b65ff286cd620e107249656d66868d5800cb48e62e19e9c311222d83ccebdf1eb70cffa1b5e151a94abde74a384f4cad" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "received a 1 ETH grant from Milk Road and Thirdweb before creating the Gitcoin grant" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "1 main dev (karmacoma), 9 people in the dev chat" - }, - { - "questionId": 3, - "question": "Have you verified your Github and/or Twitter on Grants Hub?", - "answer": "yes" - } - ] - } - } - }, - { - "projectId": "0x8eefdebc0d05e186432826739fca36c15ce59d940b8b37a2df5854e16168fd47", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "data": { - "signature": "0xb8bde9317ad0f75de5edbeb63ee2cc3ac58fd1fed25811f7b85166ed49dc1ae23d69d06dd4a0b02b4b66d0e9f1c3e644bccb655bbeba094e9b0f58fcb9e9ecdd1c", - "application": { - "round": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "recipient": "0x9d4E94dB689Bc471E45b0a18B7BdA36FcCeC9c3b", - "project": { - "lastUpdated": 0, - "createdAt": 1673039619350, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:47", - "title": "beaconcha.in", - "description": "beaconcha.in is an open source explorer that provides users with an easy and accessible way to explore the Ethereum network. \n\nOur explorer is designed to be user-friendly, making it accessible to non-technical users. In addition to our web-based explorer, we also offer an open source mobile app for iOS and Android, providing users with the ability to monitor their validators on the go.\n\nOne of our key features is the integration of both the consensus layer and the execution layer in a single explorer. \nThis allows users to easily access and analyze data from both layers, providing a more comprehensive view of the network.", - "website": "https://beaconcha.in/", - "bannerImg": "bafybeigxur27d3coppebqx3izx7lnzpoitx4eq53umcpjuie6tmf3jshvy", - "logoImg": "bafkreifgi3b4nik2ujd3zmtpd4zo76pr43casvbhuo5cju7qcs3vkppmlm", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreigfgkbwcu4mp557vyv4w7etqgukzwjbzajwodx5ftrf57upi5td4e" - }, - "userGithub": "Buttaa", - "projectGithub": "", - "projectTwitter": "beaconcha_in", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "QjAMKsfUdC387YY4HQt2Tn88orFRqopD9fZYDUEEwp4=", - "encryptedSymmetricKey": "198075c33d8272459880af8d77a202997b9d09cd9f7f3171a559fd77ff4a921a32a6fccf709154875aa61b1e5969ee0faed4e5499250953a7c4c7fb4f51cbf05ad70694a088806b223dec6e78eb14c3295252a6fe432a14f12684f051ce25183e196ec7f36c7d764c61cd01003675cda515ce746a00d59b14c0556593491bf3000000000000000200b763b37beab0b926f73478106d552cdfae62273cfd159e26468f3acf875bf7e3c684d87d56c2390a5f794271b95c78b" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "N/A" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "10" - }, - { - "questionId": 3, - "question": "Have you verified your Github and/or Twitter on Grants Hub?", - "answer": "No" - } - ] - } - } - }, - { - "projectId": "0x99b81016d61f8b9115282b1055649d4876f38619759064b783478047ca61b714", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "data": { - "signature": "0x65b7b3fbeb10c308aa2dc96e2338135fc75ab57157989f8f0db46b2bf8d14afd57ad0043d275bae85cd807615e0514731cc2316d604410a03080c1603dd2cfbd1c", - "application": { - "round": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "recipient": "0x9cce47E9cF12C6147c9844adBB81fE85880c4df4", - "project": { - "lastUpdated": 0, - "createdAt": 1673382167227, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:107", - "title": "NiceNode: Run a node \u2014 just press start", - "description": "\nThe current options to run a node require technical skills to open a terminal and run commands or install a new operating system. Running a node should be as simple as downloading an app.\n\n\n\nI started NiceNode to solve this. NiceNode is an app that runs, monitors, and controls a node. \n\n\n\nYour contributions will fund a whole new and improved UI/UX, more node options, and a foundation for staking with validators!\n\nNiceNode is currently available for Linux (tested on Ubuntu), Windows, and macOS and the alpha release is ready for downloading and testing. Please try out NiceNode and give feedback and suggestions! Report a problem or request a feature on NiceNode\u2019s Github.\n\n\n\nFor now only Execution clients (Besu, Nethermind, and Geth) and Consensus Clients (Lodestar, Nimbus, Teku, Lighthouse, and Prism) are supported by NiceNode, but stay tuned as the next releases will include the ability to run Layer 2 nodes and other Ethereum ecosystem nodes, and testnet nodes! \n\n\n\n\"Hey, client teams and others!\" -> Open a Github pull request to add a node or modify the default config of an existing now!", - "website": "https://nicenode.xyz", - "bannerImg": "bafybeigzdqudd3aao54je43ttj7qzck3wjtwan225b7ubufvdkckfqnd64", - "logoImg": "bafkreiemylta64tmyfsjn6nmiygtchcrknzknxf4xml5xfsbf23qphj7vu", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreieeejuahu4jx5nhy23ytszczagm7r2xmq3ati3pwu36z4kfom6huu" - }, - "userGithub": "jgresham", - "projectGithub": "nicenode", - "projectTwitter": "NiceNodeApp", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x9cce47E9cF12C6147c9844adBB81fE85880c4df4", - "hash": "v0.0.0:LusEyJuFzXWnG3TeHZggukZKCI3sI76jq5pmAeeIh4A=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#NiceNodeApp" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-10T20:19:46.441Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-10T20:19:46.441Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..rQVqai9HNYBLOO24fXN9Xt3w_-zhKaDWUbE05UtCrkvQvl24zFu0UC6p0yh0KpiSzP_n83MYPO3J8wQwlxUlBg" - }, - "expirationDate": "2023-04-10T20:19:46.441Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "PRr+Ku263SThXt7zr63rVhP6BaDAf4LVTaKUiI1IRwjFQbELau56/cV6QAEZxayN", - "encryptedSymmetricKey": "c2420ad65292e9cfc245a152f6038ea99c8d460c8cf55490dd22d0a7026c66b999940e5438d9a1d9dd217fd58dabe3150ad26b134b94b128d91c3ede429505b6fc95407cb2c04d00ffb02bfa60a9cb4a55bf41bec40b6d2f5a063f6ccf2325a2c533a7f56a3c02aeb778fdb123671bfd5ef1d8f277dc040e0b5b2b1fdb62d4f30000000000000020ba8f6d2cdd1df6b309cb9ec7aa704c55dbe3b071b522a6188748b418738e017d57d4d1dee456c24346e5220b7acf91a6" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Gitcoin, CityDAO, EF ESP program" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "3" - }, - { - "questionId": 3, - "question": "Have you verified your Github and/or Twitter on Grants Hub?", - "answer": "yes for Twitter, working on Github (was an error)" - } - ] - } - } - }, - { - "projectId": "0x9cf538295b69125db2e7036df4bee5d9f40ce2966577064a1af58f60985d98a4", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "data": { - "signature": "0x89cab3fc3c68c15b5e4df54a250f40452a0471fa672769a64af1a940e664f82801cefb7afcb5df78530a1ff94853d0b68c0fa883883fbd51a37e6012cef3650c1c", - "application": { - "round": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "recipient": "0x23aDa6E6A9E9D4EcDDd185e3ec353163BCeeBF2a", - "project": { - "lastUpdated": 0, - "createdAt": 1673038958378, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:48", - "title": "PLUME: Pseudonymously Linked Unique Message Entities, aka Verifiably Deterministic Signatures on Ethereum", - "description": "Verifiably deterministic signatures on Ethereum make it possible to have a unique, anonymous identity. Developing this cryptographic primitive into wallets will unlock sybil-resistant anonymous apps like zk nullifiers for anonymous unlinked airdrops, anonymous decentralized voting which only allows one vote per account, and message boards with a consistent identity. We think that fully executing this work will create a whole new class of dapps and web3 social apps with pseudonymity.\n\n\n\nThis grant will go to helping to integrate a new, non-interactive signature scheme into wallets such as Metamask, filing an EIP, and engineering the zero knowledge cryptography behind it. Note that this scheme offers an improvement to semaphore or tornado cash nullifiers, because the first few people who sign up will not have small anonymity sets. The grant will also help to publish the paper that proves the security of the scheme via a DDH-VRF argument, and pay for conference expenses so it can be presented more widely. It will be split amongst Kobi, Aayush, Richard, Piotr, and anyone else who would like to help productionize this work!\n\n\n\nWe will likely call the final version your plume -- a privately linked unique message entity. In other words, we will deploy verifiably deterministic signatures on Ethereum.\n\n\n\nIf you'd like to read the paper, it can be found at https://aayushg.com/thesis.pdf. The slides to fully explain the new scheme are found here: https://docs.google.com/presentation/d/1mKtOI4XgKrWBEPpKFAYkRjxZsBomwhy6Cc2Ia87hAnY, and the code is here: https://github.com/zk-nullifier-sig/zk-nullifier-sig. The academic paper is here: https://eprint.iacr.org/2022/1255. A blog post is here: https://blog.aayushg.com/posts/nullifier. DM @yush_g on Twitter with questions or in the Personae Discord! Initial research was funded by a $4k grant from 0xPARC and done as part of an MIT masters thesis.\n\n\n\nUPDATE: Your money has gone to good use! Due to your generosity, we were able to push forward a lot of progress, including that we were able to develop a Metamask snap (deployed at nullifier.xyz) and push an independent Javascript implementation that discovered an overflow bug in both of the Rust implementations! We also are building towards a burner wallet integration and EIP, both of which we are actively polishing drafts on. This project is now being developed to power future anonymity tech at Personae Labs.", - "website": "https://github.com/zk-nullifier-sig/zk-nullifier-sig", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreickpby3ovp4imwfebdw4s6i3uxxuiwjpeokc7n2jbntumnaaszcw4" - }, - "userGithub": "divide-by-0", - "projectGithub": "personaelabs", - "projectTwitter": "yush_g", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "JUC+cR3PqFcWB6cQM/VKKk+6NQk9jJJKABWQobiVrxJe4qYBTfw/n4XZLcfutWRM", - "encryptedSymmetricKey": "4687d1d4d3d36adf771cbb26ebc11b481c1fe5efa26bebb6438e4a5377cdab8204676e35b8f9a1579fd831a00610620497fb06957b96682c3016fbe0d848797853ad1c43613fb4182773098bca2baf498216ea0b748062df9a3303921c903da0dc6453d8985ddf4d0f4932b7784e71e2094feed7ba49fed75a653dad83d8ce5900000000000000205d7f2a3fa0887732b1718e6b9d22139d93c98f7802a273fd7c1265741950c25dcdaeb896414ca21d7551c166ec78cca5" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "N/A" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "4" - }, - { - "questionId": 3, - "question": "Have you verified your Github and/or Twitter on Grants Hub?", - "answer": "Yes" - } - ] - } - } - }, - { - "projectId": "0xaa09ef03fe5e4d9a0aa3d49a203ea8d1d89969e19cfe8af2135ecec38f035ae0", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "data": { - "signature": "0x05b763ee1e5fb5477469b257f975a29ee8c76fc92289982cf744b7e58a6287b30128626b3c5a833292afd91b520e966315e9a8d41c1e275231edacfa8e947e3400", - "application": { - "round": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "recipient": "0x6E41fe2F8303b89c9dbcCABE59A7F7f8F4312cA9", - "project": { - "lastUpdated": 0, - "createdAt": 1673594113902, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:173", - "title": "Stereum - Ethereum Node Setup", - "description": "\ud83c\udf44 THE PROBLEM \n\nSetting up an Ethereum Node is technically demanding and needs a lot of research & preparation to do. Being confronted with this challenge a lot of nontechnical people therefore, even if they are in the position of owning 32 ETH, are choosing to use a staking service to not risk their funds, which in turn slowly centralises the network. \n\n\ud83c\udf44 OUR SOLUTION \n\nStereum is our answer to this problem, a toolkit to simplify the process of setting up and maintaining an Ethereum/Gnosis Node using an intuitive GUI to abstract the installation process down to a few clicks, lessening the technical entry barrier for the average person. \n\nTo use Stereum, you download the launcher & connect remotely to your fresh Ubuntu server. \n\nIn three clicks, Stereum configures all necessary prerequisites your server has to meet, installs and runs Ethereum client software, and ensures that your node is properly connected and synced with the network. \n\nBy setting up your own node with Stereum you are able to participate in Solo Staking in your preferred network and validate transactions and blocks. The node also serves as your gateway to the network for data science, dApp usage and development. \n\nWith Stereum you also have the opportunity to run different node related protocols (like SSV, etc.) & profit off of there unique architecture. \n\nStereum, our Ethereum Node Installation, Setup & Management tool aims to be the most flexible way to leverage your node for ETH staking, data science dApp hosting & development. \n\nWe hope to explore every hermit\u2019s dream with you! \n\n\ud83c\udf44 USE OF FUNDS \n\nYour contribution is greatly appreciated by the team and will be used in various ways \u2013 development, testing and security audits. We spend the funds generated through grants and donations purely on tasks, that will benefit the progress of the project and therefore the decentralisation of Ethereum as well as protocols on it. \n\n\ud83c\udf44 FURTHER LINKS\n\n\t\ud83c\udf44 Project Website - https://stereum.net/\n\n\t\ud83d\udd28 GitHub - https://github.com/stereum-dev/ethereum-node\n\n\t\ud83d\udcac Discord - https://discord.gg/DzAwgnSXtB\n\n\t\ud83d\udcf0 Twitter - https://twitter.com/stereumdev\n\n\t\ud83d\udcfa YouTube - https://www.youtube.com/@Stereum\n\n", - "website": "https://stereum.net", - "bannerImg": "bafybeihzfpfkkyssyvejaqv4ozafbwkd2rrghsd6n7cdxcf54iv7goqjwe", - "logoImg": "bafkreidw5c4datoqfpmpsegdiibglqkj3dv32as7brwpbqo64hwuttdole", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreigowg2soh27buigbjfnyqo6duprx2cc7yzck6o2mm5mbmje6fpdqi" - }, - "userGithub": "stefa2k", - "projectGithub": "stereum-dev", - "projectTwitter": "stereumdev", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x6E41fe2F8303b89c9dbcCABE59A7F7f8F4312cA9", - "hash": "v0.0.0:3Z4WYB8fzEDozu1Fl2fv1Y4DdM50uQ0syc2zoXtQ+To=", - "provider": "ClearTextTwitter#stereumdev", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-13T07:13:51.567Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-13T07:13:51.567Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..SxPFxSGY2ocXjMR1hmXvNe8wq2lK3hoLuAismpHKxpGDuCdRtmrrwEDBJGaE0ePJ5mYBU-opOHI5efr-rIM4AA" - }, - "expirationDate": "2023-04-13T07:13:51.567Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "FQSs/LRX4+u674hQmyQYQwNMBFQ9ZyPQEhBWo2jb3bntec1CDPTky2VhSXHgVFXv", - "encryptedSymmetricKey": "9d576ea1c7d3c8e5d21d9ec57321afe19b9a05e655956d1b7d0670f7608c9c83f421657645aa381c8b2dc47dad03d20b099f5db0f6f857d34d02ce002bbbe4bb627dafbbb5717468db545dc893785dae9abcb45c0cc537172cb4c85a59bec48e93bbe7c26b8dbbb5ae76eebaa08401513d148d6c8a19f0fb0cc139272ca9f68d0000000000000020a5853403a2e2057733bf448faee0d519253eaf5ce89446ff42675e56f411c2562c8b1db33058ea7e0914e93ab486baaf" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "10" - }, - { - "questionId": 3, - "question": "Have you verified your Github and/or Twitter on Grants Hub?", - "answer": "yes" - } - ] - } - } - }, - { - "projectId": "0xb901109e1791c6a48f7315a198536a9e2211834e3fe4b47d48fde0528f118ae4", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "data": { - "signature": "0x7d1e21c9bb49ec89001f6446cf7fc59a03aa0eba92a382707f568ab641deeb3f331c0dfaa442671147ed4eb2c2b41e0d4880c862cece59400a0cb4f9a592216d01", - "application": { - "round": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "recipient": "0xc8F9f8C913d6fF031c65e3bF7c7a51Ad1f3a86E5", - "project": { - "lastUpdated": 0, - "createdAt": 1673749693231, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:208", - "title": "Lodestar", - "description": "Lodestar is a Typescript ecosystem for Ethereum consensus, developed by ChainSafe Systems.\n\nOur flagship product is our production-capable beacon chain and validator client.\n\nIn addition, we maintain public repositories of useful tools for public use. Some of these libraries include BLS, SSZ, Discv5, Gossipsub, and Noise.\n\nWe are committed to maintaining these critical libraries for use in our client and for the wider community.\n\nLodestar's niche is in its implementation language, Typescript. Our software and tooling is uniquely situated as the go-to for researchers and developers for rapid prototyping and browser usage. Millions of developers around the world are familiar with Typescript, and Lodestar's high-quality codebases are excellent introductions to the Ethereum world.\n\nLodestar has also been a leader in light client research, standardization, and implementation of Ethereum light clients. We strive to work with other client implementers, researchers and developers to demonstrate the importance of having browsers utilize trustless data directly from blockchain.\n\nA demo of our light client is available at https://lodestar-lightclient.chainsafe.io/.\n\nVisit us at https://lodestar.chainsafe.io", - "website": "https://lodestar.chainsafe.io", - "bannerImg": "bafkreib37bg5krjh3725gljlubfbksrfakqqtxtho2omotr5652bjoojdm", - "logoImg": "bafkreiaga3hosplhruxrr4w5be7lyali7iks4pzp4sksuybtvaovdmd3di", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreihi2ypzvxopeh7v233pycjyljxooxzcytmqrmxetir7ctxg5gwhke" - }, - "projectGithub": "chainsafe", - "projectTwitter": "lodestar_eth", - "credentials": { - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x6Fa4C420E9567203Aa65eB38da5DBe361fD61ff2", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#lodestar_eth", - "hash": "v0.0.0:I6O+LYB5/I4CgCKliSphoZr0Pv8lAp4YaltHkS3cCS8=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-15T20:59:09.012Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-15T20:59:09.012Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..zTvvP8GSF0AaM8iVKkbzIYZFcppvX9-nSX1XYUwLTCzEqHXAvPuFnp8CVYoSKd2n6DGduHxw0Wi6bxDDAe58AA" - }, - "expirationDate": "2023-04-15T20:59:09.012Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "gzdspTnMAUpiksu61gG59HsBSPZC9IILxl9u9hb13Re3ocsTZFtrii4A+wR10H4s", - "encryptedSymmetricKey": "9fdbdc8873248183385cfc31b8e6195ff46169e3703db2f5878860498202c0a65634f5cf7592bbe9c94d557c4b9d1119806adcd201404c84cfbdbfee865b90d80200c662d18dc98cca20e610d25613cffec2a429d9858d7ddc25bf41624f39969a3ebd7bce580a3987098ee717b87ad25a24ff17e5cd22f7cd8198f8103dd8bf0000000000000020f6b2aaa4d437ac2980b7b086ab5ee3b713c2bfb8397ee815308bc11bf14237dea92c49d79e8697b2d9c47039ec6ec88c" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Ethereum Foundation" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "8" - }, - { - "questionId": 3, - "question": "Have you verified your Github and/or Twitter on Grants Hub?", - "answer": "Yes" - } - ] - } - } - }, - { - "projectId": "0xbccb2617f0d5ddaf2d8d010d682575f679e73545ad74048dd8e20374ee3ff37a", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "data": { - "signature": "0x2a6fa9586d8d6545d25440a30b1d9189d1ef638f546bb23ed01f34053510785203dce9684a1b12dc423f86f805593bbff388eca6695356f26f80413bfaecfd111c", - "application": { - "round": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "recipient": "0x70CCBE10F980d80b7eBaab7D2E3A73e87D67B775", - "project": { - "lastUpdated": 0, - "createdAt": 1673280720472, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:86", - "title": "Vyper Smart Contract Language", - "description": "Pythonic Smart Contract Language for the EVM", - "website": "https://vyperlang.org", - "logoImg": "bafkreif5ydmrjv4z3i7xg4xpye6guql5ljtw3x3oj7gkdkgmxt7wcuibo4", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreidgmkzkearat7wji2pqb6qxif453y5fnkcmvkg6afsvthwu33sshq" - }, - "userGithub": "fubuloubu", - "projectGithub": "vyperlang", - "projectTwitter": "vyperlang", - "credentials": { - "github": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x1C277bD41A276F87D3E92bccD50c7364aa2FFc69", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextGithubOrg#vyperlang#3859395", - "hash": "v0.0.0:3Dti1NOfEUTsOraKccEd8S/n3Ns6b4V8aRyRzzP0ges=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-09T16:11:52.346Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-09T16:11:52.346Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..nArV95WLe1Ehra1aQ8RvD8XSvRsz_f4g-xUaAkrdFcyHX5aBtKEsFlw20ceNW0D0IfSivpHcyZ8jWLmt5yIfAg" - }, - "expirationDate": "2023-04-09T16:11:52.346Z" - }, - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x1C277bD41A276F87D3E92bccD50c7364aa2FFc69", - "hash": "v0.0.0:l7yVyXKFJpvIRhpIX2g+wzqrxwTP9VHcAUT7vc/IXrg=", - "provider": "ClearTextTwitter#vyperlang", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-09T16:11:41.343Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-09T16:11:41.344Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..OE2KgVZNEmrIGpuUS9Sj_dqttAB8vDWEG4bVTyfQFS33NpMBwLm_m5ci6aVFj_SugcprVKo2Bnvo9mXzcx_kDQ" - }, - "expirationDate": "2023-04-09T16:11:41.343Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "+Pimj047w+qCQWg2es/M4Lil/HejC8uzajgTTYkVpQBcXnll1t5Er1A/qM6ktl8q", - "encryptedSymmetricKey": "bc3482efb5dd7f0a956eee2d907313016214db49486d2187de20327618b4b6bfc79d6a38fc04e24681f360b6d0c79313ba79c1115b3d6e57b34c0728f34b56d8d22869b60a3173a1e954990b1fdbf5e81bd528e88f4a8e03df1fda2e988d308eaef51300279b0ed1fac75423ad45699e33b4a768c142889d0e6ecc59f2d3d299000000000000002043566e2e1ae7be1ccbdfb58118a1c19ec85086170929a69712430e50618755e4807d2c8c9dcf02512f1bc31b28536097" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "2" - }, - { - "questionId": 3, - "question": "Have you verified your Github and/or Twitter on Grants Hub?", - "answer": "Yes" - } - ] - } - } - }, - { - "projectId": "0xe0acd0898fada5b0a3f1a6a918858f39fdb7f8408f62a0f583afb70fe488022b", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "data": { - "signature": "0x9d6e77379cc60598d76c855aac36693584211ac5787a500b10bb706de822f7ba445e30a58552dfef6079aad408c7f2461a5fa1185d2b0e9f1734656aa1bb38f201", - "application": { - "round": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "recipient": "0x8ba1f109551bD432803012645Ac136ddd64DBA72", - "project": { - "lastUpdated": 0, - "createdAt": 1673073607340, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:62", - "title": "ethers.js", - "description": "The ethers.js library is a complete and compact library for interacting with the Ethereum Blockchains and their ecosystem.\n\nWith over 4 million npm installs per month, it can be used to create dapps, wallets and utilities as well as debug and analyze blockchain data.", - "website": "https://ethers.org", - "bannerImg": "bafybeia5lgtuhubvlgk7ssjoo55rsxt3zpwbaxddybq2rqrox345j4mvfa", - "logoImg": "bafkreiba4ex3nvm6bdnc75yb4ejzqcvccbdc5ci6gjjt6zc43iugsxkc24", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreihnm7scrguze2qgtzuw2hq4ggb5bwnpdab3pfaost7adqyurfw7t4" - }, - "userGithub": "ricmoo", - "projectGithub": "ethers-io", - "projectTwitter": "ricmoo", - "credentials": { - "github": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x8ba1f109551bD432803012645Ac136ddd64DBA72", - "hash": "v0.0.0:vdrRq+pggcjDwg/Py3eBWBqvPzx8dG1K57B+a1Y1W4o=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextGithubOrg#ethers-io#975687" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-07T06:39:40.996Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-07T06:39:40.996Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..VNiaBnNMHpuqBow_rXrQrvpLTQ_aow1pLwmmSDfiCARvsKrfRA0DnxzZgeyZF1W78Oss4DI6JvgypwnYZiDLDA" - }, - "expirationDate": "2023-04-07T06:39:40.996Z" - }, - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x8ba1f109551bD432803012645Ac136ddd64DBA72", - "provider": "ClearTextTwitter#ricmoo", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "hash": "v0.0.0:ynIPtyqUYu/TZqE+f061HD06N37sUfdX94SNwupf9RA=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-07T06:37:21.097Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-07T06:37:21.098Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..hfCOzMW8mobYD2DImP7AiQ64FP0p6sJ0SQ-jAG6q1_VJXzr9MsM3DaMerfN1wCM_Np-GggkStbqaNfrp_PbfCw" - }, - "expirationDate": "2023-04-07T06:37:21.097Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "kvjf2qEYRiXfwndEUbQpw3bDZVfXlCoYJd8UVumU20Y=", - "encryptedSymmetricKey": "593361eb0db1802c7773344767ea84c0c6d383cdd404844854b49ebd8dfadae361db3be77aa8e4646d62eaa15a8265057d7a4743bfdb9ed29e5bd4539d3c72ed3e5a439cfa6ea8068d2dc6cd08b1de7d4a5c8cf6c8917f090f152488ac305eb6409ca63e14624e90857ecf41bde9d91ff305c99307c9439f253e1d8835938c690000000000000020cb6dbd308057963c7588cef594774f0c2338ef80c8c2c69219c4b5feb3905090b1ebf7ded681d6d77dfc6aebde297ea0" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Donations + Grants + EF" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "1" - }, - { - "questionId": 3, - "question": "Have you verified your Github and/or Twitter on Grants Hub?", - "answer": "yes" - } - ] - } - } - }, - { - "projectId": "0xe619c469f518291bc793096e0416512755edaee8cd66ce0c65ef286d73c6291f", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "data": { - "signature": "0xcac522abd8e0eddc36783b70b6be557c253b1d4ff1294d00156ef75d3aa246090abda8b541808c3ecaa5bb4fe230086e40dc53b0c1b3c325fdff941e469706b31b", - "application": { - "round": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "recipient": "0x187089b65520D2208aB93FB471C4970c29eAf929", - "project": { - "lastUpdated": 0, - "createdAt": 1673279733974, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:85", - "title": "Ape Framework", - "description": "Ape is a smart contract development tool for Pythonistas, Data Scientists, and Security Professionals working on Ethereum and other EVM and non-EVM blockchain ecosystems.", - "website": "https://apeworx.io", - "bannerImg": "bafybeicsnnqj6p2o6nvb4q7kjl5tav7nbuhmiogbs7ryehlhybpcaqc2ii", - "logoImg": "bafkreigkj3mtsaxx2xtruqaeip724dgu34cynv2otbic3ovhwggjjs6674", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreic2iq75yegr6dwvcpobdcoh3tv24qke44o2p2qqf463f44m4bf6ny" - }, - "userGithub": "fubuloubu", - "projectGithub": "ApeWorX", - "projectTwitter": "ApeFramework", - "credentials": { - "github": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x1C277bD41A276F87D3E92bccD50c7364aa2FFc69", - "hash": "v0.0.0:hY0uOfKs6S6WlouXimORzCYKtd7i3BnK0ntcV195v7g=", - "provider": "ClearTextGithubOrg#ApeWorX#3859395", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-09T15:57:52.061Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-09T15:57:52.061Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..Deb_qPxOv7Bq9bVid5r6JY2tIMnmaCl8Xa13CggNZEo8QaFWrsWjsSG44fsjzWLrOU15iL37iqkJ6hdEgODIAw" - }, - "expirationDate": "2023-04-09T15:57:52.061Z" - }, - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x1C277bD41A276F87D3E92bccD50c7364aa2FFc69", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#ApeFramework", - "hash": "v0.0.0:Cl3Obf7daiaDsZVS7fVwuBU6/XPaBoD0sf/aTZDXGsU=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-09T15:57:46.170Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-09T15:57:46.170Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..3GvQ7PZRxwOw8kijlCZxy22x-0flkcx8uH1UcEPKoW3rS2k8S-mq0kykBopX1SGWdPKF4oRa7B4VrNDZqKOVAQ" - }, - "expirationDate": "2023-04-09T15:57:46.170Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "kEPubJIlHJ4APz7w6v/MgTW54i8k67dULe8ls4/ELwDWFa6yoneFaC9ayBrClFbd", - "encryptedSymmetricKey": "30a3bffdc4fe7339bf49acc59174e7017a42935f935f172e10463b4c5023bc69dbf7d53dd00cdd4a00dcded3012bac04cf18037f6a86c32c9ebd7bfdec6bd55c4fe9e14b70e211753ddc03358305a94571c424d0fb46cd36d44cb5d3635627a976ec19d5d89411b8cfbdaa4a2975ee177402953e19a842e433c6e43a1e62b98500000000000000200ab03e1ec82710de5119cc65e4e35054679996632b293b71855c27a960c64daa1bf7bea58f5cd8337166079da0d352a5" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Venture Capital; Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "12" - }, - { - "questionId": 3, - "question": "Have you verified your Github and/or Twitter on Grants Hub?", - "answer": "Yes" - } - ] - } - } - }, - { - "projectId": "0xe9ff6b7f6d8ef7844830ef3506a8a2d06b1dcf567e3ae71ee0308f86a1db2a1e", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "data": { - "signature": "0x47b7fac90ff7a406db6eee712d7c9b577d89a4de203f42d4b9d1577815f7a29424d89eaa9796d2b75a4618de8e20d8b66e95344fb982366730742494a4319bb001", - "application": { - "round": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "recipient": "0x242ba6d68FfEb4a098B591B32d370F973FF882B7", - "project": { - "lastUpdated": 0, - "createdAt": 1673902700326, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:230", - "title": "Blockscout 2.0 - Premium Open-Source Block Explorer", - "description": "\nPROBLEM\n\nEtherscan provides a great block explorer for web3, much like Alphabet provides a great search engine for web2 and Microsoft provides a great OS for businesses. However, core Ethereum values run counter to a closed-source, single-solution ideology for a decentralized blockchain network. Open-source alternatives are absolutely required to augment, improve, and democratize the block explorer experience. \n\nEthereum-based blockchains and L2s need better open-source explorer options to support: \n-Checks and balances (is the data accurate?)\n-Redundancy and resiliency (what if Etherscan is down?)\n-Community-driven features and innovation (I want to improve and customize that explorer!)\n-Transparency (How does it work?)\n-Quick, cost-effective implementation (I don\u2019t have much capital but I need to spin up an explorer yesterday!)\n-Trustlessness (I trust the code, not any single entity in charge of all data presentation.)\n\nSOLUTION\n\nBlockscout has been in production for nearly 5 years. We provide an open-source explorer used by more than 100 chains in the space, including public goods support for an Ethereum mainnet instance. \n\nBlockscout has been used by small chains, big chains, private chains, test chains, L2 chains and many others to quickly spin up an instance and provide transactional transparency right away for their users...AND we know that Blockscout needs to be improved to compete with and provide a viable alternative to closed-source explorers.\n\nHOW FUNDING WILL BE USED\n\nWe\u2019ve started working on a major overhaul called Blockscout 2.0. It aims to provide all the views, functionality and UX you expect from a premium block explorer. In addition, new features including Rollup support, an optimized API layer, DApp marketplace, and a new microservices infrastructure written in Rust are all in active development. More on the 2.0 roadmap -> https://docs.blockscout.com/about/roadmap/blockscout-2.0\n\nBlockscout 2.0 is currently being built, and with your help we can bring it to the community much faster, with many more features, and with much greater impact. We are particularly excited about the new React UI for users and Rust microservices for developers. With this new architecture in place, our team as well as the greater developer community will be able to easily customize functionality without compromising performance.\n\nWe will also devote grant funding resources to improving rollup support. Rollup usage is growing every day, and we need to provide comprehensive views to support this ever-expanding world of layer 2 data. \n\nAs we continue to decentralize the future, the tools and infrastructure supporting decentralization must also follow this pattern. We appreciate your funding to support a transparent, open-source, premium block explorer! ", - "website": "https://www.blockscout.com", - "bannerImg": "bafybeicqpem6vp2i7apaxt4qjydmv5xoneipk72z6n6okpdrk7zvmpzozu", - "logoImg": "bafkreiamkeivqatsinylojalkta5ccodrau5fvqhyw32365hnx4eavwh5e", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreiba4pyggrll25cpxwc3kd2vnfsegw25ixk55qjs6codarmrlruasm" - }, - "projectGithub": "https://github.com/blockscout", - "projectTwitter": "blockscoutcom", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "PZyXTyfyj+TUwOyR9U5nqluehhgPw2vLHt+OPooW6Mxac33TPq5iJpgfWl+Lx9zo", - "encryptedSymmetricKey": "8874a70f1ae45a378cbef336310f561064e61713887e1a27c16f3df436168c7dd2f49afd12d281a421717206fa569f0e9dd24f7c84800eecaa43082161ea5cdc6283a1c0118ba23e57fed3187287d9d2451e18776868c9ca9684ea28e1792293377bd6bcac02815e9f7521146ea85f47d797ca2a952b10c859dfc2dba84786ad0000000000000020b085570eaaa3f8df0623b2351d88d811287b7f82b91c26c6d3d3b9ef641fffd3f0c635156f772e281dedd1ff87a3c399" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "https://docs.blockscout.com/about/funding" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "20" - }, - { - "questionId": 3, - "question": "Have you verified your Github and/or Twitter on Grants Hub?", - "answer": "No - verified in previous rounds" - } - ] - } - } - }, - { - "projectId": "0xf1922b59f3eb4f496bf8b083d6bbfb3bac092119127a84e7c50eefa9461dc9ca", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "data": { - "signature": "0x16d1e22103e0992d8f1ec6e68f388c3d51d676b878f9c362bb4a01b7e776e1fa430842c4c9caaecee6a9ff3ea14eb64c290c3ce2637e85fafda6180a8a63df561b", - "application": { - "round": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "recipient": "0xB35cD25e91B376EAfbA79AbE71D78814dEC3401a", - "project": { - "lastUpdated": 0, - "createdAt": 1673479036831, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:133", - "title": "Ethereum Magicians", - "description": "TL:DR Ethereum Magicians continues to support coordination and development in the ecosystem. Funds raised through this grant will be used to pay people to coordinate and navigate community to better educational resources, educate community, encourage people to work and build in open source, support Ethereum Core development.\n\n\n\nThe Ethereum Magicians is a Community of Individuals collaborating on improving the Ethereum Protocol. FEM (Fellowship of Ethereum Magicians) forum provides a high signal noise free space for discussing any Ethereum Protocol Improvements, supporting the community in protocol decision making, and providing space for high quality discussions.\n\n\n\nThe Ethereum Magicians community is focused mainly around Ethereum Improvement Proposals (EIPs) and Ethereum Request for Comments (ERCs). We provide a key communication channel (forum) for core developers and the community to discuss anything EIP or Ethereum Improvements and Protocol related. \n\nWe are hanging out on https://ethereum-magicians.org/ forum and sometimes in person at bigger events. \n\n\n\nThe ongoing benefit that we bring to the community is that our work empowers decision-makers to gather feedback and move the tech forward, and encourages developers and researchers to collaborate closely via the Magicians' Forum. This helps make Ethereum the best technology that it can be!\n\n\n\nFunds received will be managed by members of the Operations Ring, a group which manages resources for the Fellowship of Ethereum Magicians, organises events, and maintains the Forum. Your donation will be used to organise upcoming events and discussions, operate and pay for maintaining and moderating the FEM forum and expenses related to these activities.\n\n \n\nAll contributions to our grant highly appreciated \ud83d\ude4f", - "website": "https://ethereum-magicians.org", - "logoImg": "bafkreigbyhxet3mcl5h73nn2hs6yzt53xgc2nxgiwqmvpqvc5umj6rkrq4", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreicjjskyebiasy3eqzly4hvvmkgtsgvvxkeomoie5v44lhxoc546hm" - }, - "projectTwitter": "https://twitter.com/EthMagicians", - "credentials": {} - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "p0ibSsNUmSRt6nvvHX0fI2D5hLUbYbm/GvXeF8x9yRirKVRYGfFw5zx0Yk7kV3aR", - "encryptedSymmetricKey": "b788f205b9bae05ac365476a25ef39bcb2eaa1d0f8eb60b3bd43e0f121e6a902e2117bae632cb73e8a6a9d3b7b67410960e6f47aef9ca1dd3074be07e62ecda9f1bab85f0e933853c980f6722205ed80c19bb4aba931bd77ddc5665630c7668913ebe89d88ed6ad88df8c05662533a552e293724c4dcc924c58828b4050cad7f00000000000000200eeefb8a205ae875cac1ef2d88455d927be170b1bc1b4d2cb8180e53fdeec01872b6b77cd953c223b74175ac3a1faba7" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Donations" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "2" - }, - { - "questionId": 3, - "question": "Have you verified your Github and/or Twitter on Grants Hub?", - "answer": "yes" - } - ] - } - } - }, - { - "projectId": "0xfb5b07f162ab081bf8608d275e9d595a331e0b36b2e445a9a67a2baad6195444", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "data": { - "signature": "0x5e4ba128598d2f1adf930d93b1b07c933a4ea6d6c79fafa7966e86d96e1fe6e74cead29e48606422d1d3ef0b3c9a38da75bac65fa69b1adb03dd626915a9b8a91b", - "application": { - "round": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "recipient": "0xf503017d7baf7fbc0fff7492b751025c6a78179b", - "project": { - "lastUpdated": 0, - "createdAt": 1673109777110, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:68", - "title": "TrueBlocks and the Unchained Index", - "description": "TrueBlocks and the Unchained Index are open-source, local-first indexing solutions for any EVM-based blockchains. It provides censorship-resistant, private, and fast access to immutable data--there is no \u201crecentralization\u201d of chain data. \n\nTrueBlocks uniquely: \n\n- Creates an address-optimized index allowing for 18-decimal-place-accurate-reconciliation,\n- Provides local-first queries, caching, and transformations without the fear of third-party snooping,\n- Produces and distributes\u2014for the public good\u2014an \u201cequitably\u201d maintained and low-cost index through content-addressable storage,\n- Retains the integrity of the data through a \u201creproducible\u201d extraction process,\n- Offers a set of technologies that can be used as building blocks for \u201ctruly\u201d decentralized applications,\n- Scales in a way natural to web3 by leveraging content-addressable storage (IPFS) to shard and cache received data.\n\nFrom their desktop, users can/will be able to privately access their own historical blockchain activity. Accomplishing:\n\n- Monitor token holdings and market values over time,\n- Manage securely and view NFT holdings,\n- Determine gas fees paid over time,\n- View and export fully reconciled transaction histories by account/asset\n- Watch for and notify about airdrops\n- Track activity with other addresses\n- Receive off-chain email notifications/triggers of activity on addresses (future...)\n- Watch DAO activity (What proposals are pending? Must I vote on something? Who has voted for what in the past?)\n- Conduct DAO-level monitoring and accounting\n- Manage ENS names and expiration dates\n- Programmatically and quickly filter, sort, and enhance blockchain data\n- Consolidate data across accounts/addresses\n- Build testing algorithms (e.g. \"digital twins\") to facilitate smart contract testing, auditing, ongoing monitoring, and simulation\n- Take our highly efficient and precise indexing engine, metadata layer (time and name databases), and query functionality and add more specialized, use-case-focused, features (e.g. different UIs, data visualization, exporting options).", - "website": "https://trueblocks.io", - "bannerImg": "bafybeicb4fgjmsuqz6hdwsbwb5c64y4ekendau2e6e4k3773qe3fb664yq", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreigtiecbtlt6q2e6lbnce4l63fa6on5g2vqhekuvdr453d3fpnmjia" - }, - "userGithub": "tjayrush", - "projectGithub": "TrueBlocks", - "projectTwitter": "tjayrush", - "credentials": { - "github": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xf503017D7baF7FBC0fff7492b751025c6A78179b", - "provider": "ClearTextGithubOrg#TrueBlocks#5417918", - "hash": "v0.0.0:4qsdiDUQuByWGoI68xAzExjAme5IZ6VKpx2rz8aTr7Q=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-07T16:42:37.275Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-07T16:42:37.275Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..9KyGJl2vU9NwPTqDpTnThpCLJQY78jzjkaynsuoJusyLbUbOQH_h-L8mD8l6AwHTNTkKlNDZrgiBCIOO4skXAQ" - }, - "expirationDate": "2023-04-07T16:42:37.275Z" - }, - "twitter": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0xf503017D7baF7FBC0fff7492b751025c6A78179b", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ], - "provider": "ClearTextTwitter#tjayrush", - "hash": "v0.0.0:Ti94nQ6aTn+tvMdb1GoGC/iT/InQMYKRRasE+8EfzT4=" - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-07T16:42:14.942Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-07T16:42:14.942Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..x5Gska1aLXNao8DM6Vrg-WbU7kCt-6SVfO6FH2izT2rGz11Z4V-ectHlHYMGyAVqGL4X4rcd7PEQH89ZlebgDA" - }, - "expirationDate": "2023-04-07T16:42:14.942Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "QQ/0d9v0bpPPRfn8bbegIp7rSz79bdK8vxDL9gYcPN6uZ2mASPTXeboOXhEAYkuD", - "encryptedSymmetricKey": "c9dc642c25e70438456659b31fd9659675387be7520d39dbb869862469802af54e712abad2d038d1cd7ed3088505f313e44fdcc401cc45375399088406ee634c3015188c48638cd57383d21e7258bb83035eb5c5795ffe2d15a489a61bae44adf0412ef8535828fc942b146e7fd49da7edcd97c6565687a3f0fd090994124a5900000000000000207892f700fe628af89c16c6391134a3aec55e8fc6b26be1b235b4757291a61183ea3db89af349a4233c29fcf76d779c8e" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Self funded. Ethereum Foundation Grant Sept. 2022, GitCoin Grants" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "2 engineers" - }, - { - "questionId": 3, - "question": "Have you verified your Github and/or Twitter on Grants Hub?", - "answer": "Yes." - } - ] - } - } - }, - { - "projectId": "0xfce9d62f9a833d6f7185f0051701d5a9e64c83d1daca62059c7bcd309c7f7f99", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "data": { - "signature": "0x0fd7be6177fed2815dc1b95de6b2d910c9bce9125e73508d45cae7c488eaa13c563511163fe3166c1df6325bce16d870334b5cfeef6450901b6ca792f2fd37fc1c", - "application": { - "round": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "recipient": "0x08a3c2A819E3de7ACa384c798269B3Ce1CD0e437", - "project": { - "lastUpdated": 0, - "createdAt": 1673733499167, - "id": "1:0x03506eD3f57892C85DB20C36846e9c808aFe9ef4:207", - "title": "DefiLlama APIs", - "description": "DefiLlama provides multiple APIs for free that are used by multiple projects:\n- Our price API, which prices all common tokens along with custom ones that aren't directly traded (uniswap LPs, curve LPs, yearn yTokens, GLP, compound's cTokens...)\n- Data APIs and csv exports for all the data that we collect at defillama, such as TVL, volume, fees, revenue, APYs, funding rounds...\n- Some indexing APIs such as getting the closest block to a timestamp on all EVM chains\n- Function and event signature decoding for all contracts", - "website": "https://defillama.com", - "bannerImg": "bafkreib3qgqaf26srkth5u6unvthpeqzx6txft7g2g2y37ysegdxe6z4ky", - "logoImg": "bafkreie6clq57ydjxut76icjd2qhnx6ya3r6wt2ucf4yzp6y5kmlqhxwoe", - "metaPtr": { - "protocol": "1", - "pointer": "bafkreierfyfsieah4ibr67g3dn4xtzubcn53mvxca35f5ubn4l7ztss2ee" - }, - "userGithub": "0xngmi", - "projectGithub": "DefiLlama", - "projectTwitter": "DefiLlama", - "credentials": { - "github": { - "@context": ["https://www.w3.org/2018/credentials/v1"], - "type": ["VerifiableCredential"], - "credentialSubject": { - "id": "did:pkh:eip155:1:0x08a3c2A819E3de7ACa384c798269B3Ce1CD0e437", - "provider": "ClearTextGithubOrg#DefiLlama#80541789", - "hash": "v0.0.0:JhN6QtxC7EJnJ4xasFMzE+wO9L3RwnXy5aIyZCNXFE4=", - "@context": [ - { - "hash": "https://schema.org/Text", - "provider": "https://schema.org/Text" - } - ] - }, - "issuer": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "issuanceDate": "2023-01-14T21:58:09.920Z", - "proof": { - "type": "Ed25519Signature2018", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC#z6MkghvGHLobLEdj1bgRLhS4LPGJAvbMA1tn2zcRyqmYU5LC", - "created": "2023-01-14T21:58:09.920Z", - "jws": "eyJhbGciOiJFZERTQSIsImNyaXQiOlsiYjY0Il0sImI2NCI6ZmFsc2V9..OG_Mu4nh9vNCvNpeo-xxB7OPdOvywcpc4fWea23ApmI_QiGg5cEnjWTQ05aVzI-vLA7imxVwJzD0P3AaLDTGAg" - }, - "expirationDate": "2023-04-14T21:58:09.920Z" - } - } - }, - "answers": [ - { - "questionId": 0, - "question": "Email Address", - "encryptedAnswer": { - "ciphertext": "fzPDsuur5G083hdDBKOX2q1DnpqosanPbqErGcsfafJLlg86TvlgY7FAuRtlOGPH", - "encryptedSymmetricKey": "c4500008adc338bfb8ac7de1c8b0a09631145c7283c71c9925051388102dee835bd52fc6a38e21a2b03bbc2afb255113dd716f83ba6dc2d73c1a204bf50e15791039182eb5b7cc36cc1b304339430354e39ac499bf267f1c41a3254bedc919879d00118ee9e1bdb33ae85af79c5da95267f0da153639f3128f4384369553d4a4000000000000002032440a8ae076d31e40a09ed846d2dddf06cb8ec6337bcd27e4178698252f90be54d6130402c631443d5d969e7f98b090" - } - }, - { - "questionId": 1, - "question": "Funding Sources", - "answer": "Donations + self-funding" - }, - { - "questionId": 2, - "question": "Team Size", - "answer": "11 full time people + 2 interns" - }, - { - "questionId": 3, - "question": "Have you verified your Github and/or Twitter on Grants Hub?", - "answer": "Yes" - } - ] - } - } - } -] diff --git a/utils/gitcoin/gitcoin-alpha/data/images/README.md b/utils/gitcoin/gitcoin-alpha/data/images/README.md deleted file mode 100644 index c996212..0000000 --- a/utils/gitcoin/gitcoin-alpha/data/images/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Images - -This directory should include project banner images, generated by `process_images.py`. - -There should be one PNG file per project. - -A copy of the images should also be stored on IPFS. diff --git a/utils/gitcoin/gitcoin-alpha/data/qfvotes.json b/utils/gitcoin/gitcoin-alpha/data/qfvotes.json deleted file mode 100644 index 98ebed5..0000000 --- a/utils/gitcoin/gitcoin-alpha/data/qfvotes.json +++ /dev/null @@ -1,902 +0,0 @@ -[ - { - "id": "118ZUNadSFUpb6KtPE47PscU621ZUta1hia4Je3P8LA", - "from": "0x8c0a58e4399ce264da68c6ed036866a15021273a", - "to": "0x08a3c2a819e3de7aca384c798269b3ce1cd0e437", - "amount": "700000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0x46ddc886ac23d5bc2cbc96cd2aa990627bcd98c881a953070f94c15e03267707", - "createdAt": "1675200179" - }, - { - "id": "11F7h9p7H2XBBirnbeTxxDH8mXuAn96CgbFbGr9YKGs", - "from": "0x77f390aa25d85ddaa23e7145d4fa78e553ce76ca", - "to": "0x3a5bd1e37b099ae3386d13947b6a90d97675e5e3", - "amount": "800000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0xbe519f8c8f7ff2acb359dd757c5d2bf25b05d9fd29b8684885aa27f1fa487fcf", - "createdAt": "1675096235" - }, - { - "id": "11L9wDYotJcgSXwqtmfX1BKEgokvNvkcBNka5kcxS2P", - "from": "0x5e5f08baecb1a9ceae68845e1fca141cb1b7b18d", - "to": "0x9d100f017095e53b24d81296bca1d26742f1800f", - "amount": "1000000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0x67583b52562147ffe4d7b9c4422c6109d0d18a596c25355eea583e13e146224b", - "createdAt": "1674977087" - }, - { - "id": "11dTdE9wA8tg9XABwbt72p4qNrPjp8cfC7SdLtXt2C5", - "from": "0x18a3a09e417d9d101bd3c28d0130b28492676bec", - "to": "0x01d79bceaeaadfb8fd2f2f53005289cfcf483464", - "amount": "1000000000000000000", - "token": "0x6b175474e89094c44da98b954eedeac495271d0f", - "projectId": "0x0f1d31d427400106f3d2958225dd235ae60b6a7572fb5155201b723e1ae79632", - "createdAt": "1674792455" - }, - { - "id": "11f159yjRryCZgNBebpqaa8FUCpApzNtkW2SBpY9EQL", - "from": "0xe95ab07a55e8489fe8e81e3281c8b3fd95c7d8af", - "to": "0xd27e1a1a60ebc1b70f4cae5265092c0f6edc7f9d", - "amount": "1000000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "", - "createdAt": "1671287867" - }, - { - "id": "1211mfsDFbVRSw3E1BbY92YCk9wqq9yMMmaAUHam467D", - "from": "0x789ca7ea4c826340c9d52c6af80d716438c2d993", - "to": "0x9d100f017095e53b24d81296bca1d26742f1800f", - "amount": "680000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0x67583b52562147ffe4d7b9c4422c6109d0d18a596c25355eea583e13e146224b", - "createdAt": "1675160063" - }, - { - "id": "121ASF2anrsZKsmNRXjyRYYSy553azYTjyhp37mqxhox", - "from": "0x33ef89d1e9333f7b0e84bb9b69974f43704eac23", - "to": "0x57ea12a3a8e441f5fe7b1f3af1121097b7d3b6a8", - "amount": "1000000000000000000", - "token": "0x6b175474e89094c44da98b954eedeac495271d0f", - "projectId": "0x9fb5b0d0698dc64cbd3a01c5205ebc5ef609e7d20c21ce20ee2c73905a8309a0", - "createdAt": "1674879047" - }, - { - "id": "121BYEFrztQ8dvngkt2AWtnt6xPMmN2zjhoBC8R3u1cq", - "from": "0xbc70bc022ebc5e4cc99e7ecc3b69f6ab47f43c3c", - "to": "0x39d77e51c485f1ff65b1b3b42e9f67cda221f597", - "amount": "15000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "", - "createdAt": "1671558755" - }, - { - "id": "121Bu9DQH2XYZRmpc4MBME9u31VbztuffyzZawSHyx5W", - "from": "0x7d1ef741c40ddffdd4f19549d42fed9a0193f8ea", - "to": "0x39d77e51c485f1ff65b1b3b42e9f67cda221f597", - "amount": "850000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "", - "createdAt": "1671472979" - }, - { - "id": "121FTpg7NP1hrHzLS3AKRdUkkN2bkKgdPM5tZevEekPM", - "from": "0x639ae2665d7ad352f3ad2552438fac8b213df44c", - "to": "0x4b8810b079eb22ecf2d1f75e08e0abbd6fd87dbf", - "amount": "2000000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0xe9dfc4da2e9fbcf33042b9c978322967e52985162659fa8a0627bc8573cbbb59", - "createdAt": "1675208387" - }, - { - "id": "122Ha1gzuyYsPxqJtRzhr7uFKtpxn7eMuW9wW2xnKyBg", - "from": "0x329c787b163a730bd7900df2beb3ff4fe4670375", - "to": "0x8ddfa84bbf59c0e6dbd05a56e9b9931b64255f08", - "amount": "100000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "", - "createdAt": "1671242015" - }, - { - "id": "122jFcgBDgXR2oKHUC2oL5jpFTytQccwqf8g9bU45YVV", - "from": "0x6d090246fb2dbadfc9d9784705a415014c96876a", - "to": "0xe126b3e5d052f1f575828f61feba4f4f2603652a", - "amount": "2000000000000000000", - "token": "0x6b175474e89094c44da98b954eedeac495271d0f", - "projectId": "0xf05829c76e3da92a8942378240ab4dc70c8c509f558eca9b0621c61054e9342c", - "createdAt": "1674528263" - }, - { - "id": "122uuPcmegzM1yF1CW3CdrSc73Xdqtd44N6iJPXZfDKu", - "from": "0x76a45e6a43353bb15ba6c7ccc68e009ec07c5d60", - "to": "0x08a3c2a819e3de7aca384c798269b3ce1cd0e437", - "amount": "3000000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0x46de99c3a4e0542fde6d77bfa1ff6d19e107f253ea5254f7fdb59869b30e2b7a", - "createdAt": "1674814259" - }, - { - "id": "123tixZocwhF3acoN1qW9GPNozH9MLCesVB62rkxT97A", - "from": "0x3121bba71909e74e8802fc42ef94a345bc12fdec", - "to": "0x3806a85d9b8e017d2714b5a240f3e7737279a3ba", - "amount": "1000000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0xf22becdb87631f44c3cf5839e471811ed21c4200324cc9e5e16771703d03e819", - "createdAt": "1675039127" - }, - { - "id": "124YuQVBuFkADfqJ6K12RueqHVYypSxA5cVDdrBWDNvY", - "from": "0xe297fbed1407dad6d8c2fad606ef15a5cb3d2041", - "to": "0x01d79bceaeaadfb8fd2f2f53005289cfcf483464", - "amount": "1000000000000000000", - "token": "0x6b175474e89094c44da98b954eedeac495271d0f", - "projectId": "0x0f1d31d427400106f3d2958225dd235ae60b6a7572fb5155201b723e1ae79632", - "createdAt": "1675087487" - }, - { - "id": "124h8Un1Gr6ALnvowt3fUPUVrnHwjcrGqPctV9x1esfh", - "from": "0x49c9fb3402dc8a7f36b784d42aef56639dc89178", - "to": "0x0e5c6c79f44a19d98dd58d4c22d3a2fbd555eebe", - "amount": "100000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "", - "createdAt": "1671564695" - }, - { - "id": "124hF8ptCKmWMn5yafNQWKUvdbrCbp7ZSMzrf8cziFC5", - "from": "0x4a851f4031345b17a857e12a0f5daa881731f74a", - "to": "0x06fd1a0356a1e58852721331a3aed1b7ebe214ed", - "amount": "1000000000000000000", - "token": "0x6b175474e89094c44da98b954eedeac495271d0f", - "projectId": "", - "createdAt": "1671153479" - }, - { - "id": "124p5GiKzwVp8Y9ohcyk2zbpd8MuJSfCAudMM61ogztb", - "from": "0x7cf4d009b905264264c07af09eaa3d0e54e7cde3", - "to": "0x0e5c6c79f44a19d98dd58d4c22d3a2fbd555eebe", - "amount": "1000000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "", - "createdAt": "1671532367" - }, - { - "id": "124vRAfTaammykerxoGkpxgiYaCJtGSz9PMac4NFFf4j", - "from": "0xdc8e5fbd2d60e3464ff5158f90a2ff76806281ed", - "to": "0x2af4125c8fe208a349ef78d3cb980308ab1ed34f", - "amount": "702000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0x91db8779fa1b15d75761e358fe57683892c68d5cad11a4f9d19c468876d3c402", - "createdAt": "1675162187" - }, - { - "id": "125rNXADoAEVcZR1pGHg2r5anrqcVNAhFhWaxMuuYtwy", - "from": "0xa8c1d7de150529942b35c11f2a8319fe957bafc2", - "to": "0x18aa467e40e1defb1956708830a343c1d01d3d7c", - "amount": "700000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0x60c037f9dfa5daee0f07bc26fb73393ef924e36c73c41ea6bd58029e1724de36", - "createdAt": "1675191623" - }, - { - "id": "125ugmdvNGpacunT8jxkg9HUrckjFdXho3MFB2LxCYXi", - "from": "0x665caad23417d378c4abca024bf57e65d2196c95", - "to": "0x08a3c2a819e3de7aca384c798269b3ce1cd0e437", - "amount": "1325567000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0x46ddc886ac23d5bc2cbc96cd2aa990627bcd98c881a953070f94c15e03267707", - "createdAt": "1674405395" - }, - { - "id": "126Rp3jdBppYGyzfH17FmzdgXvMGaFxzKPo4f4bZFYzD", - "from": "0x56b2d1bc149298489c2864c36c273c1229dc75cf", - "to": "0x18aa467e40e1defb1956708830a343c1d01d3d7c", - "amount": "2000000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0x60c037f9dfa5daee0f07bc26fb73393ef924e36c73c41ea6bd58029e1724de36", - "createdAt": "1674100199" - }, - { - "id": "126ef1AT5ZtX55z4mivqkcQW9tjz3UoaWXst6yqz9jNX", - "from": "0x3803431f81fde7239c6947b09bdc02a8beac6ebc", - "to": "0x95d34596db5a2f65f2a92b97955bf7920fd1c9e3", - "amount": "1200000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "", - "createdAt": "1671399095" - }, - { - "id": "126p1nG7MyMssnCsWzrSAayYqmyxyiAZtrENeysR6xgD", - "from": "0x7da7970724acab686f9ab241572313f507a1e62f", - "to": "0x3a5bd1e37b099ae3386d13947b6a90d97675e5e3", - "amount": "5000000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0xbe519f8c8f7ff2acb359dd757c5d2bf25b05d9fd29b8684885aa27f1fa487fcf", - "createdAt": "1675153367" - }, - { - "id": "127TVFm9ZDNF8XfiC1pBGpbruAyFuTgKDn25ASYBrgh6", - "from": "0xedfe7087167a724ec00e8094f07bf87f911fa7f8", - "to": "0x947f8a49640b4770a8c7fe3c1e69ffc974295448", - "amount": "1000000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0xc290dd8e51ac35480d9872ce4484aac23bb812c47c0567bfd4beb9113726ed11", - "createdAt": "1674221243" - }, - { - "id": "127jDq3GjTWRwL41GjdJukLEJDoyPHvUsEiYQHtX2pm2", - "from": "0x9cead5773f576e9ae649251339b5f71c21edee3c", - "to": "0x7d658841f8ba93299970f6e765c2ce205f1e70dd", - "amount": "1200000000000000000", - "token": "0x6b175474e89094c44da98b954eedeac495271d0f", - "projectId": "0x3b839e762e389f72b3c43b70aeb7bb5c43a3781feda8683c29d5ae4896c6166c", - "createdAt": "1675045367" - }, - { - "id": "127yVsSQ9ReKyeF6tUc8DjR9uT6AUfwHyTnqKCnYfB4e", - "from": "0x3f1aa12447353a794ba4b2a721462c113f06efe0", - "to": "0x2906e0181f371b7a4c4bffe13e31b2a917b368e8", - "amount": "100000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "", - "createdAt": "1671028475" - }, - { - "id": "1281ib95v6EFJ77JvTwbfadG6o3PFYqFnn6KDBzdgs9T", - "from": "0x7cb001371efa798c86f4aa881d31fa8ff123e4ca", - "to": "0x06fd1a0356a1e58852721331a3aed1b7ebe214ed", - "amount": "20000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "", - "createdAt": "1671293663" - }, - { - "id": "1289Anrp8xNscdE4PWkU1Bpf36aqgJ2MTxKvLLeSPpzP", - "from": "0x61beabb01bf270fa63d5735fa725d18d742bd33e", - "to": "0x3a5bd1e37b099ae3386d13947b6a90d97675e5e3", - "amount": "9000000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0xbe519f8c8f7ff2acb359dd757c5d2bf25b05d9fd29b8684885aa27f1fa487fcf", - "createdAt": "1675153151" - }, - { - "id": "128FoBjmmwNAT64pMGhoxRDs1X9PwQkWGWMywAhjwkuz", - "from": "0x1fbc5cd1a8f56b694a4d3884d4863fca29f5e8f5", - "to": "0x6078c8eeb7ed8916a8f1e85dc8f6e780c09a89ff", - "amount": "1065000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "", - "createdAt": "1671596171" - }, - { - "id": "128STwmr3BhmiY26h1iHbTmeJnd9bnSKMzqMeBNTYcsD", - "from": "0xa87f09323cc009957503132d9b7ea8db7384288d", - "to": "0x01d79bceaeaadfb8fd2f2f53005289cfcf483464", - "amount": "100000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0x0f1d31d427400106f3d2958225dd235ae60b6a7572fb5155201b723e1ae79632", - "createdAt": "1673963015" - }, - { - "id": "129NPoXo8JcHYbvBZjnPojSs9bZUgVf387pGNABSKt4u", - "from": "0xb3486c406e906eade161027289e3ddd652c03046", - "to": "0x5afc7720b161788f9d833555b7ebc3274fd98da1", - "amount": "3000000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0xcc6d33fe291d0fafb19cf8b833dc27d2f469fac52e3cc1f050ca4a0d83d66c74", - "createdAt": "1674414335" - }, - { - "id": "129k3m1W3T4UHubgeZn8JCKxNDBpQDamXQa8CyTN836J", - "from": "0xa399a2476e664abe42610dbb93c5dd88b6bffede", - "to": "0x06fd1a0356a1e58852721331a3aed1b7ebe214ed", - "amount": "300000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "", - "createdAt": "1671513107" - }, - { - "id": "129o2ACZmB8jnMMfip1nwNZKtgRxVbgdsYQcGPn1Pafi", - "from": "0x9a19a1098dd931e966927c5ee59a1957812a279c", - "to": "0x9d100f017095e53b24d81296bca1d26742f1800f", - "amount": "750000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0x67583b52562147ffe4d7b9c4422c6109d0d18a596c25355eea583e13e146224b", - "createdAt": "1674644243" - }, - { - "id": "129uTxitTiq1EGzY53HGmWTqB9YEcWEogQATbHskTNUa", - "from": "0xf10004ac75f5ba024bedf3768fc6c5b3aad4508a", - "to": "0x08a3c2a819e3de7aca384c798269b3ce1cd0e437", - "amount": "2000000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0x46ddc886ac23d5bc2cbc96cd2aa990627bcd98c881a953070f94c15e03267707", - "createdAt": "1675148747" - }, - { - "id": "12A3KEy1CRZDbLKXDjZ8Cs685uYxQZPFtPq2fqMfLLS2", - "from": "0x179725c26fa52f8fa41352ccefcc961230a7c385", - "to": "0x3a5bd1e37b099ae3386d13947b6a90d97675e5e3", - "amount": "1000000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0xbe519f8c8f7ff2acb359dd757c5d2bf25b05d9fd29b8684885aa27f1fa487fcf", - "createdAt": "1674040979" - }, - { - "id": "12AFNcivafmZdCN1bynpwkTycv1L4deXY2gnXbH6vhHs", - "from": "0xc6b9817b7c1ee805c660f5fe2627ab4b6f26711d", - "to": "0xfe97e32a873aa2f926fbfc560abeef01f753c128", - "amount": "680000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0x8029c7cda58d70a6cd81ac56a6a678e8ccfb560f153eb86b1f5b5c3ca4566e82", - "createdAt": "1674578555" - }, - { - "id": "12AceDeyEH7P14jzQQdmKM8bDFNTP4Ap1ktaEPqwrAyH", - "from": "0x8139ed77150bce16accb24c907b243cca667ad1a", - "to": "0x08a3c2a819e3de7aca384c798269b3ce1cd0e437", - "amount": "700000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0x46ddc886ac23d5bc2cbc96cd2aa990627bcd98c881a953070f94c15e03267707", - "createdAt": "1675167095" - }, - { - "id": "12AeDZeJ4VitCd8QyNrtwYdNs92Hv6BvWCUXLG1HNFk9", - "from": "0x39f8936f12b7645f08f611ba75f0d6216090c99b", - "to": "0x18aa467e40e1defb1956708830a343c1d01d3d7c", - "amount": "1000000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0x60c037f9dfa5daee0f07bc26fb73393ef924e36c73c41ea6bd58029e1724de36", - "createdAt": "1674797675" - }, - { - "id": "12AkmC2hmJCzvZRnahXXCq9swFjmzNoz812aJPv5WHAD", - "from": "0xfc49302fd05e7c3a84113288fa194551fcf5134d", - "to": "0x0b0e6486648fbbb8e9ab33e3ae9d0b44b6faa701", - "amount": "700000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0xdce910ac23823b6f29196e90eda26ad6fb42e7726a49a7affe24b4780eaf6c80", - "createdAt": "1675167599" - }, - { - "id": "12AseaFZ1n7Kbopum2v8azyT1htLB7ZCGgYv6aGrNLQa", - "from": "0xfca865aa00d124e7a4e001b2c2c79f8689fa24e7", - "to": "0x4b8810b079eb22ecf2d1f75e08e0abbd6fd87dbf", - "amount": "500000000000000000", - "token": "0x6b175474e89094c44da98b954eedeac495271d0f", - "projectId": "0xe9dfc4da2e9fbcf33042b9c978322967e52985162659fa8a0627bc8573cbbb59", - "createdAt": "1674284243" - }, - { - "id": "12B6dun62KD52FiPnqsDyYJhCqpZDzmDqyS2cxFG6FaS", - "from": "0xa680358e7d01e0413de50b7d6285ebe2ab74538b", - "to": "0xde81d67af572ec0f22841da702c1edc25608dbbb", - "amount": "1000000000000000000", - "token": "0x6b175474e89094c44da98b954eedeac495271d0f", - "projectId": "0xe2f4ea6f46ef9d67818f71b8c40403b8528768af11f7fe0c2d10cd2afe21de62", - "createdAt": "1674276767" - }, - { - "id": "12BDwgwTqP9FddK8oNpJTyQKmvoGydtkg3Sd4P35QcGB", - "from": "0x296877173e29a51e6bf85e5c959577012cf2844c", - "to": "0x18aa467e40e1defb1956708830a343c1d01d3d7c", - "amount": "1000000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0x60c037f9dfa5daee0f07bc26fb73393ef924e36c73c41ea6bd58029e1724de36", - "createdAt": "1674219035" - }, - { - "id": "12BpVVUcbdiehJffTjbK5uDE7jU6UASLmRh2xgAfcohe", - "from": "0x2193ed5e46874a48c04f3f7adb9943fe42153541", - "to": "0x06fd1a0356a1e58852721331a3aed1b7ebe214ed", - "amount": "800000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "", - "createdAt": "1671519275" - }, - { - "id": "12BubNntCicK6dfZ4Qjzj8TvP93Af1dWV2ZdFrrMU8q1", - "from": "0x212944bff1143bf7d24a2f4a2d23f906483cc2fd", - "to": "0x95d34596db5a2f65f2a92b97955bf7920fd1c9e3", - "amount": "1001000000000000000", - "token": "0x6b175474e89094c44da98b954eedeac495271d0f", - "projectId": "", - "createdAt": "1671179987" - }, - { - "id": "12CNUqn43kCzFvfLd2UgUp39Y4DbG3HD5rqGFrwbknF3", - "from": "0x2d2128ebfdb589a404ae1c1f90a994f4ee9378e2", - "to": "0xd27e1a1a60ebc1b70f4cae5265092c0f6edc7f9d", - "amount": "900000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "", - "createdAt": "1671353915" - }, - { - "id": "12CU7ubcm5e1QdUXTcZd1vAy1tbNCqq4cmahwPqmfPF3", - "from": "0x9fb7563a1969f034e8feb83e499c967d31538e86", - "to": "0x3a5bd1e37b099ae3386d13947b6a90d97675e5e3", - "amount": "800000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0xbe519f8c8f7ff2acb359dd757c5d2bf25b05d9fd29b8684885aa27f1fa487fcf", - "createdAt": "1674976871" - }, - { - "id": "12CWM7jdYhzzWJ2zyovuj1sqamYNXgfF2QjMQmwhJzMx", - "from": "0x363403398aa1d2cf50f80aabca13ce80d1f72a64", - "to": "0x3a5bd1e37b099ae3386d13947b6a90d97675e5e3", - "amount": "10000000000000000000", - "token": "0x6b175474e89094c44da98b954eedeac495271d0f", - "projectId": "0xbe519f8c8f7ff2acb359dd757c5d2bf25b05d9fd29b8684885aa27f1fa487fcf", - "createdAt": "1674042803" - }, - { - "id": "12CwiVEASGKKGwfSPHLFN5Vi1zjLbtCeekrgBZ2eQFLD", - "from": "0x8c976a43f34fe14313e65b90ec5a396617cfb525", - "to": "0x9d100f017095e53b24d81296bca1d26742f1800f", - "amount": "1100000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0x67583b52562147ffe4d7b9c4422c6109d0d18a596c25355eea583e13e146224b", - "createdAt": "1675066367" - }, - { - "id": "12DL5r2KoMLSGeVH6KAkYe5De3LAvmAT3AWGCC8W4ZD6", - "from": "0x4b7b4ae00947878b5f4ec6f24144561767a68a02", - "to": "0x08a3c2a819e3de7aca384c798269b3ce1cd0e437", - "amount": "1000000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0x46ddc886ac23d5bc2cbc96cd2aa990627bcd98c881a953070f94c15e03267707", - "createdAt": "1674056027" - }, - { - "id": "12DsTytmnZ5JZWBy9W8pdo98miHUroSpsX4mudhSHXKN", - "from": "0xc9d1927375e7cf5365113c51a38a0aa5c496bcce", - "to": "0x18aa467e40e1defb1956708830a343c1d01d3d7c", - "amount": "690000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0x60c037f9dfa5daee0f07bc26fb73393ef924e36c73c41ea6bd58029e1724de36", - "createdAt": "1674559391" - }, - { - "id": "12E99qppma5a5dudnTTETS6r7hnvbBJcGuGmHiVGiH3D", - "from": "0xb4677b54fabef4950ef4056a42172b5577700d6d", - "to": "0x3a5bd1e37b099ae3386d13947b6a90d97675e5e3", - "amount": "600000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0xbe519f8c8f7ff2acb359dd757c5d2bf25b05d9fd29b8684885aa27f1fa487fcf", - "createdAt": "1675147691" - }, - { - "id": "12ECCUZuhazMqsqKy9GUuECEe6AAsFkVTqe9qg5gcHoe", - "from": "0xb22981ba3fe1de2325935c91a3b717168fb86714", - "to": "0xde81d67af572ec0f22841da702c1edc25608dbbb", - "amount": "5000000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0xe2f4ea6f46ef9d67818f71b8c40403b8528768af11f7fe0c2d10cd2afe21de62", - "createdAt": "1675201175" - }, - { - "id": "12EDJvZwJgFdx2qBGCKpZTSLuNVfypRjBX8KBqchnRVp", - "from": "0xa3c5958da4d3c709d5991fd0b39f577f7fd7d31c", - "to": "0x95d34596db5a2f65f2a92b97955bf7920fd1c9e3", - "amount": "1050000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "", - "createdAt": "1671595535" - }, - { - "id": "12ENyxjNMPS9z9Dqn6R87irGkQghdepkSpBzcuRoHX8R", - "from": "0x30aee7a692427143ba7e65efb7db35d360a0ac51", - "to": "0xe07b0f3c2a669b656476e4d6a054f4922d539d3d", - "amount": "1100000000000000000", - "token": "0x6b175474e89094c44da98b954eedeac495271d0f", - "projectId": "0xd716c3a7c353f0458ff8387fb435606934e25b631a83db017e5eb9a0022358f0", - "createdAt": "1674121367" - }, - { - "id": "12ERhwMziL6ewGk8z29MtQyyTcqeR9JUFWbyi25HowzH", - "from": "0x72df54f3db8feedb05b0b59e4eb8f190db832726", - "to": "0x7a0857d314f62d383341b4ed8fe380e7c98fb978", - "amount": "1000000000000000000", - "token": "0x6b175474e89094c44da98b954eedeac495271d0f", - "projectId": "0xa9956ceed5830e7f1c9e820c38453edc222265ff98e8592d25544464570266a1", - "createdAt": "1675158335" - }, - { - "id": "12Eb5YyCP912bn737gDzxn8jg7TDxfENXxtVFsaxcZQC", - "from": "0x86338bb91bf39a95fc1a23834941dafd53b8cd06", - "to": "0x06fd1a0356a1e58852721331a3aed1b7ebe214ed", - "amount": "1000000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "", - "createdAt": "1671296159" - }, - { - "id": "12EeVHfMkw9kC6ZQoqaYtfQ2N7iTperMm4dPkSgXdNiz", - "from": "0x0dd055c4b62d2cc7c5787f3d1645a241592e6821", - "to": "0x7a2b50ff3ad40e335a94a6858ab727fdbbc0a9ba", - "amount": "50000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "", - "createdAt": "1671373991" - }, - { - "id": "12F22r6sCUzMG96aQxJGmxkmX63A6CJXaZj4Qnj8ubEK", - "from": "0x6fdd049121fdc6e11ed89971763316eb9723d3c1", - "to": "0xd27e1a1a60ebc1b70f4cae5265092c0f6edc7f9d", - "amount": "100000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "", - "createdAt": "1671090683" - }, - { - "id": "12FBuGpf7tpsQJvCCU9Uvqrmi16sRFXJJKjUKxrFQsnT", - "from": "0x59c1df31f4cc740c4b7f2ca137212b43bc2011a9", - "to": "0x57ea12a3a8e441f5fe7b1f3af1121097b7d3b6a8", - "amount": "1800000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0x9fb5b0d0698dc64cbd3a01c5205ebc5ef609e7d20c21ce20ee2c73905a8309a0", - "createdAt": "1674943487" - }, - { - "id": "12FFfNJuZ51nZ3EqANsTkg65NsRQ7adUSjeCFEtj9ZLB", - "from": "0xa437edb5987318649c05386801135a0c0bfcb701", - "to": "0x01d79bceaeaadfb8fd2f2f53005289cfcf483464", - "amount": "650000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0x0f1d31d427400106f3d2958225dd235ae60b6a7572fb5155201b723e1ae79632", - "createdAt": "1675076339" - }, - { - "id": "12FZgPPSvQzYRdkwgknMApkb2qEKzDDmXg62fiAohkHL", - "from": "0xbbb6ca6833771b870ec47d4fe4de9946a57fddb6", - "to": "0x7a2b50ff3ad40e335a94a6858ab727fdbbc0a9ba", - "amount": "60000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "", - "createdAt": "1671090083" - }, - { - "id": "12FhK25FhD5xjrVPTWH47JdbE7dknCsp72Hj4ycYo2aN", - "from": "0x6dc55350abf888cc1edb2edafd36d3be3d658bd7", - "to": "0x08a3c2a819e3de7aca384c798269b3ce1cd0e437", - "amount": "2000000000000000000", - "token": "0x6b175474e89094c44da98b954eedeac495271d0f", - "projectId": "0x46ddc886ac23d5bc2cbc96cd2aa990627bcd98c881a953070f94c15e03267707", - "createdAt": "1674939023" - }, - { - "id": "12Fj54p1UeQcmKHkK4Jj4YT5LtL4iXwQvYW1cLoqHqjc", - "from": "0x77d15e5d7a7d3aceec38cd84aecb0670567c8abe", - "to": "0x9d100f017095e53b24d81296bca1d26742f1800f", - "amount": "700000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0x67583b52562147ffe4d7b9c4422c6109d0d18a596c25355eea583e13e146224b", - "createdAt": "1675063247" - }, - { - "id": "12G8USZdynkBhCaVJEaodLp8bTNsbWyvdNyArrdYnyTx", - "from": "0xac2a5e92cc0d2b22c4001edba0018f3e91e983f4", - "to": "0x3806a85d9b8e017d2714b5a240f3e7737279a3ba", - "amount": "700000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0xf22becdb87631f44c3cf5839e471811ed21c4200324cc9e5e16771703d03e819", - "createdAt": "1674988427" - }, - { - "id": "12G9Zk8orQFs7kn2TUnRRTGLt6Ywawz7ztAYJFgzW8sn", - "from": "0xff860db8a8f026c02f552fdc2d730299bb3a00da", - "to": "0x8ddfa84bbf59c0e6dbd05a56e9b9931b64255f08", - "amount": "50000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "", - "createdAt": "1671018647" - }, - { - "id": "12GHUZTG9xxpSDnqCz6vZPy1oT9cjF575q6TbMVywSCz", - "from": "0x9b09405ca36d366b4f1ea5edfe2268f074c17b61", - "to": "0xde81d67af572ec0f22841da702c1edc25608dbbb", - "amount": "800000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0xe2f4ea6f46ef9d67818f71b8c40403b8528768af11f7fe0c2d10cd2afe21de62", - "createdAt": "1675104839" - }, - { - "id": "12GLCDRtcXvM4zhoReLeM7jamxmoF4dmkgaCbetzU8mW", - "from": "0x83dc985930b909efaab72927bbd32f8cdce3ac71", - "to": "0xd27e1a1a60ebc1b70f4cae5265092c0f6edc7f9d", - "amount": "50000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "", - "createdAt": "1671279707" - }, - { - "id": "12Gc5y8h79RySttRxwGqE3fCGv6g7ionwoo27AyofkJJ", - "from": "0x0449e53aa1a3f75133df621d0ee755d5381a934e", - "to": "0x2906e0181f371b7a4c4bffe13e31b2a917b368e8", - "amount": "800000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "", - "createdAt": "1671257927" - }, - { - "id": "12GcdmyNP4E5aV4yj198YMHhq9mBbqKJPCWxAbsKeuQX", - "from": "0x9b4182a3e49ab9016d2054dc19dc206e3fffa7b5", - "to": "0x3a5bd1e37b099ae3386d13947b6a90d97675e5e3", - "amount": "1800000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0xbe519f8c8f7ff2acb359dd757c5d2bf25b05d9fd29b8684885aa27f1fa487fcf", - "createdAt": "1675207751" - }, - { - "id": "12GpPUhd5SX7k28BAKFZdqiECXymhUtdXJhbwH3Ez7in", - "from": "0x352cfe5c61dc1b1648762fa31c875dc73ca12015", - "to": "0x2af4125c8fe208a349ef78d3cb980308ab1ed34f", - "amount": "700000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0x91db8779fa1b15d75761e358fe57683892c68d5cad11a4f9d19c468876d3c402", - "createdAt": "1674904103" - }, - { - "id": "12GtKWPdRZJ1xLcsQ9iQBX2dqFfzTrUV3eoVdvMtMwgi", - "from": "0x6d6368d68c1d0ec553f90ad97cbb2252d98471bb", - "to": "0x99b36fdbc582d113af36a21eba06bfeab7b9be12", - "amount": "700000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0xafb022ea11846bceb90516c35155defd6404e4948697cbfca25f5d34cf5321fb", - "createdAt": "1674943847" - }, - { - "id": "12HE91XpQvRpcxN8KUVaTSt38fb2R8dXzAdCktA1AzrW", - "from": "0xd23773d6d9c9e67bb47abb20fc4c4dbd0174876c", - "to": "0x08a3c2a819e3de7aca384c798269b3ce1cd0e437", - "amount": "8900000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0x46ddc886ac23d5bc2cbc96cd2aa990627bcd98c881a953070f94c15e03267707", - "createdAt": "1674550355" - }, - { - "id": "12HVNsviEac88Uvtwc4QXBvrbrbsA5JnumqAshx3tRqY", - "from": "0x4d855cb147628267068b1b784040b1b89a55318c", - "to": "0x4b8810b079eb22ecf2d1f75e08e0abbd6fd87dbf", - "amount": "6500000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0xe9dfc4da2e9fbcf33042b9c978322967e52985162659fa8a0627bc8573cbbb59", - "createdAt": "1675188443" - }, - { - "id": "12HVofaAwBkay7vpb9bzRnBFiVqrc2U6aSAGrAkgrSMP", - "from": "0x813365348385dfebd6461c4052043f78615771dc", - "to": "0x08a3c2a819e3de7aca384c798269b3ce1cd0e437", - "amount": "700000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0x46ddc886ac23d5bc2cbc96cd2aa990627bcd98c881a953070f94c15e03267707", - "createdAt": "1675082159" - }, - { - "id": "12HiCCwRwDm6qc4LmGXLRvByz1zkqvQeGqnJisjYuTQy", - "from": "0xf04157640e52eaaeec5ea2e1a02e643ca93ad6b3", - "to": "0x2906e0181f371b7a4c4bffe13e31b2a917b368e8", - "amount": "160000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "", - "createdAt": "1671576923" - }, - { - "id": "12HscKZ8SG6FNEr15iTNxHebipKXTUUNC55rLjdqhvdG", - "from": "0x3c36e10c0048c298b87eb26601a374aeb86b1b93", - "to": "0xc8f9f8c913d6ff031c65e3bf7c7a51ad1f3a86e5", - "amount": "700000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0xb901109e1791c6a48f7315a198536a9e2211834e3fe4b47d48fde0528f118ae4", - "createdAt": "1675094819" - }, - { - "id": "12J6zqBvPt9TR2VyNYMRWDPWjjuEffY8TcRKct6dFzSx", - "from": "0x6847412b3123cf8e598f0b0f4da83b84c15e183f", - "to": "0xb7081fd06e7039d198d10a8b72b824e60c1b1e16", - "amount": "8100000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0x0cdbfe30f8bfea9a33a297e1812c0ff146d326a3afa5832e24dc941a2e415b8f", - "createdAt": "1675169483" - }, - { - "id": "12JSgfKfNm8HSbbhcwwLRVu3pk4obdTWB4HeWoLuobRB", - "from": "0xa8eca15b729a3e241e93c7bbfad14e0ff0757454", - "to": "0x06fd1a0356a1e58852721331a3aed1b7ebe214ed", - "amount": "500000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "", - "createdAt": "1671371159" - }, - { - "id": "12JbbY1G1ok4QmacFVpjoPbUhrpKxmea52RscXGXBbxa", - "from": "0xd29ca180a7cf28a0847deadc73fcbf7aadaac3e1", - "to": "0x9d100f017095e53b24d81296bca1d26742f1800f", - "amount": "1100000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0x67583b52562147ffe4d7b9c4422c6109d0d18a596c25355eea583e13e146224b", - "createdAt": "1674993647" - }, - { - "id": "12JdoCKvGZXHKRTHD4jUf8AqBfAJjQT3tqn9tGZ5vAEy", - "from": "0xa791e718c3691b62b056d8cc521203d84e4a0945", - "to": "0x99b36fdbc582d113af36a21eba06bfeab7b9be12", - "amount": "2500000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0xafb022ea11846bceb90516c35155defd6404e4948697cbfca25f5d34cf5321fb", - "createdAt": "1674546815" - }, - { - "id": "12Jr96Aww6rGSH56xHgjksdwLDvTqUPkY9zUgPcQAks1", - "from": "0x78f1875d13f9c822634400246ba1527b3c3103e7", - "to": "0x8ddfa84bbf59c0e6dbd05a56e9b9931b64255f08", - "amount": "2000000000000000000", - "token": "0x6b175474e89094c44da98b954eedeac495271d0f", - "projectId": "", - "createdAt": "1671568019" - }, - { - "id": "12Jv9rwEL6uYE8UC8HTKCot2PK71EtQuwqZnXExo798D", - "from": "0x978f88dc513b2069319bd9431702794e58169d92", - "to": "0x18aa467e40e1defb1956708830a343c1d01d3d7c", - "amount": "3000000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0x60c037f9dfa5daee0f07bc26fb73393ef924e36c73c41ea6bd58029e1724de36", - "createdAt": "1675011575" - }, - { - "id": "12JzXCVuYiBRPSayX5NjwSW7PvDtfhojxncskyJFNWZf", - "from": "0xe43f6352cbbb43a286f77d7dbc9348fb9a4344c9", - "to": "0xd2584c1cf7e3ff11957195732d380dc886f5f05b", - "amount": "1000000000000000000", - "token": "0x6b175474e89094c44da98b954eedeac495271d0f", - "projectId": "0x2e4e97b9d9c36923cf2c1062f16c6cb83259c1e0b9a10ac466bf20cec9589ae1", - "createdAt": "1674127511" - }, - { - "id": "12K1qFo5aLpQ4B1BHD7amYzwR8pWwAddi5opJRjcK6fN", - "from": "0x4885c24d5b463d3b44e4e0ad22c614ebc23d6088", - "to": "0x18aa467e40e1defb1956708830a343c1d01d3d7c", - "amount": "6700000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0x60c037f9dfa5daee0f07bc26fb73393ef924e36c73c41ea6bd58029e1724de36", - "createdAt": "1674691979" - }, - { - "id": "12KAWJXqheJeACbMicPmRufvNFAfbjcB5PEKXyyN3YR3", - "from": "0x29c9c782cb6cc0c60ed497dbba92f3d3e620527c", - "to": "0x3a5bd1e37b099ae3386d13947b6a90d97675e5e3", - "amount": "3300000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0xbe519f8c8f7ff2acb359dd757c5d2bf25b05d9fd29b8684885aa27f1fa487fcf", - "createdAt": "1674358403" - }, - { - "id": "12KGBm9w3Vnx74ejoSELJgSytqDDKPGJKg2EiGNG1tFV", - "from": "0xdf9a768c27f03d1b1b26c965dad4e7c78ae79dee", - "to": "0xf0d7a8198d75e10517f035cf11b928e9e2ab20f4", - "amount": "700000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0x42528ac5ae7f27b36de1e40649628a762a8746d07b1440c32d30ded000ff125c", - "createdAt": "1675132907" - }, - { - "id": "12KGZABudLWfFxdweFXGzQLr4LKFojRe2KgEThALNzzd", - "from": "0x24812570dc1a07f8d533072e095ec2e594e932db", - "to": "0x57ea12a3a8e441f5fe7b1f3af1121097b7d3b6a8", - "amount": "1320000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0x9fb5b0d0698dc64cbd3a01c5205ebc5ef609e7d20c21ce20ee2c73905a8309a0", - "createdAt": "1675049099" - }, - { - "id": "12KMVLCr1y8HPZmFd9oETpaAPB1ARqvUnjmU8JRLkCCq", - "from": "0xd67b007fe046c6758baa28cf3d2bb7bf127e90f6", - "to": "0x3a5bd1e37b099ae3386d13947b6a90d97675e5e3", - "amount": "1230000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0xbe519f8c8f7ff2acb359dd757c5d2bf25b05d9fd29b8684885aa27f1fa487fcf", - "createdAt": "1675065311" - }, - { - "id": "12KS4HP3UTKHinZJVC7CDVFy2gtuXUzKoLtC8wbqmPGx", - "from": "0xf392f3c66791269c7e6a34ca17ac697b62354b03", - "to": "0x7a2b50ff3ad40e335a94a6858ab727fdbbc0a9ba", - "amount": "50000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "", - "createdAt": "1671260903" - }, - { - "id": "12KYuGCiSp58jQQEVFGbymV31jfkgJmVvizhqG3vgP4t", - "from": "0x8b5d712130a70d25bce5a49f9cef0000f6e12ad9", - "to": "0x81c776d0d7f7d9d3699851993ecaa88a46187f11", - "amount": "550000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "", - "createdAt": "1671406631" - }, - { - "id": "12KZdWBEjmcgNE9ZKQJGg7pMeRj6RjZxpSrqUT53PLeW", - "from": "0x175c2a83c001ab70c4e772591e0a0b26e573e397", - "to": "0xe6d7b9fb31b93e542f57c7b6bfa0a5a48efc9d0f", - "amount": "1500000000000000000", - "token": "0x6b175474e89094c44da98b954eedeac495271d0f", - "projectId": "0x128a79c5f52d33bc49f5677dd0fcd695e44f22916b920dc3490c18f10099db66", - "createdAt": "1673969831" - }, - { - "id": "12KbVMDCfZq4tjBVjeNmZAYqwRxNQ1tE9LPrtJj8T6jh", - "from": "0xec0cf15a2857d39f9ff55bc532a977fa590e5161", - "to": "0x4af147188bfe1c02d18d752ed5e473d8394f2300", - "amount": "7000000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0x76667ee469d4e3b8dcbca33d612ebd437cceb3ffc8aab8908a0e0f5fd94248c3", - "createdAt": "1674592523" - }, - { - "id": "12KjRpCsitu4q6PLQwJpFdgBBPQzrT3s3tptUhEHY7hS", - "from": "0x4a3588812a9da7a2b1d3f5eba57c7169008f7c38", - "to": "0x78dc08c6f14e26b2c91edae9a6e03eed7ae5218b", - "amount": "2050000000000000000", - "token": "0x6b175474e89094c44da98b954eedeac495271d0f", - "projectId": "0x0b84bfa1e358e2c7816e5244258c16e4d6d06930fb4cf20f2d714ce35d330308", - "createdAt": "1674251807" - }, - { - "id": "12Kv1b7cjTEkFk72YjSgyTuHv1PVeYQJSBXdAY2YMDdt", - "from": "0x7a93750afdfcc232050c8a5a8e26e29f2f3d0840", - "to": "0xb67fd6f4b908d702c2cf0e2b9d30d52d4ea5b2bc", - "amount": "1000000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0x0f648ff5caf73611e70ebaaa9df9bf0dc81f5a633af3996672c6a5e44df791b1", - "createdAt": "1674292703" - }, - { - "id": "12LEDfXCX9JSVwbUYdn5QPi68rG7UnCHMFNiugxF2wRF", - "from": "0xc5c6f9f0ea697c4727190da140bb776adae026b9", - "to": "0x99b36fdbc582d113af36a21eba06bfeab7b9be12", - "amount": "1400000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0xafb022ea11846bceb90516c35155defd6404e4948697cbfca25f5d34cf5321fb", - "createdAt": "1675050035" - }, - { - "id": "12LM9wGL1AnYGtBZsknUU7hkZmSKbopWwHz8wbZGE5xC", - "from": "0xf8a3e23e747ff310b968f9de04080b3d1ed40167", - "to": "0x2af4125c8fe208a349ef78d3cb980308ab1ed34f", - "amount": "780000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0x91db8779fa1b15d75761e358fe57683892c68d5cad11a4f9d19c468876d3c402", - "createdAt": "1674046211" - }, - { - "id": "12LQsLoKjVzVnSAoE1F5797Y2b6M5L8Ha5qYv2F1QUvo", - "from": "0x16453788be4ac24f15116437fcd2b8c6ebc056bb", - "to": "0x3a5bd1e37b099ae3386d13947b6a90d97675e5e3", - "amount": "1000000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0xbe519f8c8f7ff2acb359dd757c5d2bf25b05d9fd29b8684885aa27f1fa487fcf", - "createdAt": "1675073891" - }, - { - "id": "12LaPbXwY6mqtPRzypLZzxJCjFsRy77HwU7r89YiuBn8", - "from": "0x1cf274a674a29ffe2425c1111b64b4d181744ce2", - "to": "0xc9a872868afa68ba937f65a1c5b4b252dab15d85", - "amount": "2000000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0x68bf035f1ecb5914aede9bcae5512d0f3efa2c9f4cd7e3c7a69c7cb5836418b4", - "createdAt": "1675208723" - }, - { - "id": "12LepGYchPXYLv4Venn8PEKqUFKxLP3ikq28BFCpmm3s", - "from": "0x455e3097fb0f45a2e139c22eb4b6b8684e3c5283", - "to": "0x5b3920527cfe207100312f4685e048ee032fa391", - "amount": "790000000000000", - "token": "0x0000000000000000000000000000000000000000", - "projectId": "0x958a27cbbf604752b32e4593aa7d3801d5de011248d5732360bccac67024ca85", - "createdAt": "1675053983" - } -] diff --git a/utils/gitcoin/gitcoin-alpha/docker-start.sh b/utils/gitcoin/gitcoin-alpha/docker-start.sh deleted file mode 100644 index 30a436f..0000000 --- a/utils/gitcoin/gitcoin-alpha/docker-start.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -echo "===== BUILDING ====" && \ - docker build -t local/hypercerts-utils . && \ - echo "===== RUNNING =====" && \ - docker run --rm -it \ - --name hypercerts-utils \ - --env-file .env \ - -v "$PWD":/code \ - -w /code/ \ - local/hypercerts-utils diff --git a/utils/gitcoin/gitcoin-alpha/get_grants_data.py b/utils/gitcoin/gitcoin-alpha/get_grants_data.py deleted file mode 100644 index f174184..0000000 --- a/utils/gitcoin/gitcoin-alpha/get_grants_data.py +++ /dev/null @@ -1,104 +0,0 @@ -from dotenv import load_dotenv -import json -import os -import requests - - -load_dotenv() -API_KEY = os.environ['THEGRAPH_API_KEY'] - -CONFIG = json.load(open("config/config.json")) -SETTINGS = json.load(open("config/gitcoin-settings.json")) -ROUNDS = json.load(open("config/rounds-list.json")) - - -# Get the Round Data by Querying TheGraph -def get_round_data(round_id): - - # URL with the endpoint of the Gitcoin round manager subgraph for mainnet - subgraph = SETTINGS["resources"]["subgraphId"] - url = f"https://gateway.thegraph.com/api/{API_KEY}/subgraphs/id/{subgraph}" - - # Construct the GraphQL query - query = ''' - { - rounds(where:{ - id: "''' + round_id + '''" - }) { - id - projects(first:300) { - id - project - status - payoutAddress - metaPtr { - protocol - pointer - } - } - } - } - ''' - # Query TheGraph API for the round's data by POST request - response = requests.post(url, json={'query': query}) - data = response.json() - - print(url) - records = [] - - # Iterate through the JSON object and add data to our list - for round in data['data']['rounds']: - for project in round['projects']: - records.append({ - 'roundId': round['id'], - 'projectId': project['project'], - 'pointer': project['metaPtr']['pointer'] - }) - - print(f"Total of {len(records)} projects extracted.") - return records - - -def retrieve_ipfs_file(cid): - # Build the URL to the file on the Cloudflare IPFS gateway - url = CONFIG['hostedCidBaseUrl'] + cid - - try: - # Send a GET request to the URL - response = requests.get(url) - response.raise_for_status() - - # Parse the JSON data - data = json.loads(response.content) - return data - - except requests.exceptions.HTTPError as e: - print(e) - return None - - -def get_grants_for_all_rounds(): - - # Pull the data from TheGraph for each round - data = [] - for rnd in ROUNDS: - grant_data = get_round_data(rnd['roundId']) - for grant in grant_data: - - # Retrieve the project's IPFS data - ipfs_data = retrieve_ipfs_file(grant['pointer']) - - # Store the data - data.append({ - 'projectId': grant['projectId'], - 'roundId': rnd['roundId'], - 'data': ipfs_data - }) - - out_file = open(CONFIG["localPaths"]["graphData"], "w") - json.dump(data, out_file, indent=4) - out_file.close() - - -if __name__ == "__main__": - get_grants_for_all_rounds() \ No newline at end of file diff --git a/utils/gitcoin/gitcoin-alpha/initialize.sh b/utils/gitcoin/gitcoin-alpha/initialize.sh deleted file mode 100644 index 0327b7c..0000000 --- a/utils/gitcoin/gitcoin-alpha/initialize.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -python get_grants_data.py - -python allowlist.py -# python screen_allowlist.py - -python serialize_project_data.py -python serialize_address_data.py -python serialize_hypercert_data.py - -python process_images.py -python create_hypercert_minting_urls.py \ No newline at end of file diff --git a/utils/gitcoin/gitcoin-alpha/matching_pools.py b/utils/gitcoin/gitcoin-alpha/matching_pools.py deleted file mode 100644 index 43eaf16..0000000 --- a/utils/gitcoin/gitcoin-alpha/matching_pools.py +++ /dev/null @@ -1,69 +0,0 @@ -import json -import pandas as pd - - -CONFIG = json.load(open("config/config.json")) -PAYOUT_DF = pd.read_csv(CONFIG["localPaths"]["payoutData"], index_col=0) -PROJECTS_DB = json.load(open(CONFIG["localPaths"]["canonicalDataset"])) -ROUND_DATA = json.load(open("config/rounds-list.json")) -OUTPATH = CONFIG["localPaths"]["payoutExports"] - - -def get_donors(round_name): - for round_data in ROUND_DATA: - if round_data["roundName"] == round_name: - return round_data["matchPoolDonors"] - - -def clean_usd(val): - val = val.replace("$","") - val = val.replace(",","") - return float(val) - - -def get_payout(project): - data = [] - grant_id = "-".join([project["projectId"], project["roundId"]]) - payout_data = PAYOUT_DF.loc[grant_id] - payout_amount = clean_usd(payout_data["match_amount_dai"]) - donor_list = get_donors(project["roundName"]) - for matching_pool_donor in donor_list: - for donor_address, donor_share in matching_pool_donor.items(): - data.append({ - 'donor': donor_address.lower(), - 'title': project["title"], - 'usd': payout_amount * donor_share - }) - return data - - -def assign_payouts(): - payouts = [] - for project in PROJECTS_DB: - try: - result = get_payout(project) - payouts.extend(result) - except: - print(project["title"], project["projectId"]) - - df = pd.DataFrame(payouts) - df.to_csv(OUTPATH) - print(df.head()) - print("Successfully exported to:", OUTPATH) - - -def reconcile_data(): - for grant_id, project_data in PAYOUT_DF.iterrows(): - match = False - for project in PROJECTS_DB: - project_grant_id = "-".join([project["projectId"], project["roundId"]]) - if project_grant_id == grant_id: - match = True - if not match: - print(grant_id, project_data['title']) - - - -if __name__ == "__main__": - assign_payouts() - #reconcile_data() \ No newline at end of file diff --git a/utils/gitcoin/gitcoin-alpha/process_images.py b/utils/gitcoin/gitcoin-alpha/process_images.py deleted file mode 100644 index 010f871..0000000 --- a/utils/gitcoin/gitcoin-alpha/process_images.py +++ /dev/null @@ -1,74 +0,0 @@ -from io import BytesIO -import json -from math import ceil -import os -from PIL import Image -import requests - -from utils import create_project_filename - - -GITCOIN = json.load(open("config/gitcoin-settings.json")) -CID_HOST_URL = GITCOIN["resources"]["hostedCidBaseUrl"] -DEFAULT_BANNER = GITCOIN["defaultArt"]["banner"] - -CONFIG = json.load(open("config/config.json")) -JSONDATA_PATH = CONFIG["localPaths"]["canonicalDataset"] -IMG_DIR = CONFIG["localPaths"]["imagesDirectory"] - -IMG_WIDTH, IMG_HEIGHT = 320, 214 - - -def crop_and_resize(img): - - width, height = img.size - cropped_dims = img.getbbox() - cropped_width = cropped_dims[2] - cropped_dims[0] - cropped_height = cropped_dims[3] - cropped_dims[1] - - if cropped_width < width: - cropped_img = img.crop(cropped_dims) - ratio = IMG_WIDTH / cropped_width - resized_img = cropped_img.resize((IMG_WIDTH, ceil(cropped_height * ratio))) - _, resized_height = resized_img.size - cropper = ceil((resized_height - IMG_HEIGHT) / 2) - new_img = resized_img.crop((0,cropper,IMG_WIDTH,cropper+IMG_HEIGHT)) - else: - ratio = IMG_HEIGHT / height - resized_img = img.resize((ceil(width * ratio), IMG_HEIGHT)) - resized_width, _ = resized_img.size - cropper = ceil((resized_width - IMG_WIDTH) / 2) - new_img = resized_img.crop((cropper,0,cropper+IMG_WIDTH,IMG_HEIGHT)) - - return new_img - - -def process_image(uri, name, overwrite=False): - - outpath = create_project_filename(name) + ".png" - if not overwrite: - if outpath in os.listdir(IMG_DIR): - return - - response = requests.get(uri) - img = Image.open(BytesIO(response.content)) - img = crop_and_resize(img) - img.save(IMG_DIR + outpath) - - -def run_image_processing(): - - projects_list = json.load(open(JSONDATA_PATH)) - for i, project in enumerate(projects_list): - name = project['title'] - cid = project['projectBannerCid'] - if cid is None: - cid = DEFAULT_BANNER - uri = CID_HOST_URL + cid - print("Processing", name, uri) - - process_image(uri, name) - - -if __name__ == "__main__": - run_image_processing() \ No newline at end of file diff --git a/utils/gitcoin/gitcoin-alpha/requirements.txt b/utils/gitcoin/gitcoin-alpha/requirements.txt deleted file mode 100644 index 2602150..0000000 --- a/utils/gitcoin/gitcoin-alpha/requirements.txt +++ /dev/null @@ -1,9 +0,0 @@ -aiohttp>=3.8.1 -aiolimiter>=1.0.0 -aiosignal>=1.2.0 -pandas -python-dotenv -requests==2.27.1 -urllib3==1.26.9 -pillow==8.4.0 -web3==5.29.0 \ No newline at end of file diff --git a/utils/gitcoin/gitcoin-alpha/screen_allowlist.py b/utils/gitcoin/gitcoin-alpha/screen_allowlist.py deleted file mode 100644 index b2bb960..0000000 --- a/utils/gitcoin/gitcoin-alpha/screen_allowlist.py +++ /dev/null @@ -1,69 +0,0 @@ -import asyncio -import aiohttp -from dotenv import load_dotenv -import json -import os -import pandas as pd -import requests - -from aiolimiter import AsyncLimiter - - -load_dotenv() -CHAINALYSIS_API_KEY = os.environ['CHAINALYSIS_API_KEY'] - -# currently configured to update directly to the same directory -CONFIG = json.load(open("config/config.json")) -ALLOWLIST_DIR = CONFIG["localPaths"]["allowlistDirectory"] - -# Allow-listing modules - -limiter = AsyncLimiter(4500) - -async def remove_sanctioned(df, address): - async with aiohttp.ClientSession() as session: - async with limiter: - url = f"https://public.chainalysis.com/api/v1/address/{address}" - headers = { - "X-API-Key": CHAINALYSIS_API_KEY, - "Accept": "application/json" - } - - resp = await session.get(url, headers=headers) - content = await resp.json() - - is_sanctioned = len(content['identifications']) != 0 - if is_sanctioned: - print(f"Removing sanctioned wallet: {address}") - df.drop(df[df['address'] == address].index, inplace=True) - - -async def screen_allowlist(csv_path): - df = pd.read_csv(csv_path) - if 'address' not in df.columns: - print(f"Error reading {csv_path}. Requires a CSV file with an 'address' column") - return None - - # Test sanctions by adding a sanctioned address - # new_row = {'address':'1da5821544e25c636c1417ba96ade4cf6d2f9b5a', 'title':'test_project', 'usd':100} - # df = df.append(new_row, ignore_index=True) - - await asyncio.gather(*[remove_sanctioned(df, address) for address in df['address']]) - - return df - - -async def batch_screen_allowlists(in_dir, out_dir): - - allowlist_paths = [p for p in os.listdir(in_dir) if p[-4:] == '.csv'] - for p in allowlist_paths: - df = await screen_allowlist(in_dir+p) - if not df.empty: - df.to_csv(out_dir+p) - - -async def main(): - await batch_screen_allowlists(ALLOWLIST_DIR, ALLOWLIST_DIR) - - -asyncio.run(main()) \ No newline at end of file diff --git a/utils/gitcoin/gitcoin-alpha/serialize_address_data.py b/utils/gitcoin/gitcoin-alpha/serialize_address_data.py deleted file mode 100644 index 49ccde3..0000000 --- a/utils/gitcoin/gitcoin-alpha/serialize_address_data.py +++ /dev/null @@ -1,143 +0,0 @@ -from collections import Counter -from dotenv import load_dotenv -from ens import ENS -import json -import os -import requests -from web3 import Web3 - - -load_dotenv() -OPTIMISM_KEY = os.environ['OPTIMISM_ETHERSCAN_API_KEY'] -ETHERSCAN_KEY = os.environ['ETHERSCAN_KEY'] -ALCHEMY_KEY = os.environ['ALCHEMY_KEY'] - -CONFIG = json.load(open("config/config.json")) -JSONDATA_PATH = CONFIG["localPaths"]["canonicalDataset"] - -# create a web3 connection -alchemy_url = f"https://eth-mainnet.g.alchemy.com/v2/{ALCHEMY_KEY}" -w3 = Web3(Web3.HTTPProvider(alchemy_url)) -ns = ENS.fromWeb3(w3) - -# get hex codes for checking address/wallet types -SPLITS_CODE = w3.eth.get_code("0xD2584c1CF7E3fF11957195732d380DC886F5f05b") -EOA_CODE = w3.eth.get_code("0xEAF9830bB7a38A3CEbcaCa3Ff9F626C424F3fB55") - -# get Gnosis Safe ABI -abi_endpoint = "https://api.etherscan.io/api?module=contract&action=getabi&address=" -safe_contract = "0xd9Db270c1B5E3Bd161E8c8503c55cEABeE709552" -response = requests.get(abi_endpoint + safe_contract) -response_json = response.json() -ABI = json.loads(response_json['result']) - - -def get_ens(addr): - return ns.name(addr) - - -def get_address_type(addr): - code = w3.eth.get_code(addr) - if code == EOA_CODE: - return "EOA" - if code == SPLITS_CODE: - return "0xSplits" - return "Safe" - - -def create_ens_mapping(list_of_addresses): - return { - addr: get_ens(addr) - for addr in list_of_addresses - } - - -def get_safe_owners(addr): - contract = w3.eth.contract(address=addr, abi=ABI) - owners = contract.functions.getOwners().call() - mapping = create_ens_mapping(owners) - return mapping - - -def get_safe_users(addr, top_n=5): - - normal_txs_query = "".join([ - "https://api.etherscan.io/api", - "?module=account", - "&action=txlist", - f"&address={addr}", - "&startblock=0", - "&endblock=99999999", - "&page=1", - "&offset=100", - "&sort=asc", - f"&apikey={ETHERSCAN_KEY}" - ]) - - response = requests.get(normal_txs_query, headers={"Accept": "application/json"}) - data = response.json() - - if data.get('message') == 'OK': - from_addresses = [x['from'] for x in data['result']] - count = Counter(from_addresses) - top_addresses = count.most_common(top_n) - ens_mapping = {} - for address, num in top_addresses: - name = ns.name(address) - if name: - ens_mapping.update({name: num/len(from_addresses)}) - else: - ens_mapping.update({addr: num/len(from_addresses)}) - return ens_mapping - - -def optimism_scan(addr): - - query = "".join(["https://api-optimistic.etherscan.io/api", - "?module=account", - "&action=balancemulti", - f"&address={addr}", - "&tag=latest", - f"&apikey={OPTIMISM_KEY}"]) - - response = requests.get(query, headers={"Accept": "application/json"}) - data = response.json() - has_address = data['message'] == 'OK' - balance = float(data['result'][0]['balance']) / 1000000000000000000. if has_address else 0 - - return dict( - optimismAddressFound=has_address, - optimismBalanceEth=balance, - ) - - -def run_address_stats(): - - projects_list = json.load(open(JSONDATA_PATH)) - for project in projects_list: - address = project.get("address") - address = Web3.toChecksumAddress(address.lower()) - if project: - addr_type = get_address_type(address) - if addr_type == "EOA": - address_scan = optimism_scan(address) - elif addr_type == "Safe": - address_scan = dict( - safeOwners=get_safe_owners(address), - safeUsers=get_safe_users(address) - ) - else: - address_scan = {} - project.update(dict( - ensName=get_ens(address), - addressType=addr_type, - addressScan=address_scan - )) - - out_file = open(JSONDATA_PATH, "w") - json.dump(projects_list, out_file, indent=4) - out_file.close() - - -if __name__ == "__main__": - run_address_stats() \ No newline at end of file diff --git a/utils/gitcoin/gitcoin-alpha/serialize_bundle_data.py b/utils/gitcoin/gitcoin-alpha/serialize_bundle_data.py deleted file mode 100644 index d84d75d..0000000 --- a/utils/gitcoin/gitcoin-alpha/serialize_bundle_data.py +++ /dev/null @@ -1,209 +0,0 @@ -from dotenv import load_dotenv -import json -import openai -import os -import pandas as pd -import time - -from utils import create_project_filename, datify - - -# Set up OpenAI API client -load_dotenv() -openai.api_key = os.environ['OPENAI_API_KEY'] - - -CONFIG = json.load(open("config/config.json")) -GRAPH_DATA = json.load(open(CONFIG["localPaths"]["graphData"])) -ALLOWLIST_DIR = CONFIG["localPaths"]["allowlistDirectory"] -DONORLIST_DIR = CONFIG["localPaths"]["donorlistDirectory"] -BUNDLES_DATA = CONFIG["localPaths"]["bundleDataset"] -PROJECTS_DATA = CONFIG["localPaths"]["bundleProjectsDataset"] -SETTINGS = json.load(open("config/gitcoin-settings.json")) -DEFAULT_DIMS = SETTINGS["defaultDims"] - -ROUND_ID = "0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0" -BUNDLE_IDS = [ - "0x0b84bfa1e358e2c7816e5244258c16e4d6d06930fb4cf20f2d714ce35d330308", - "0x95adaaef6d0a11b862f47a236bbca9d93dcfe35d1ae044edc0223d5485e1bfbb", - "0x89c4fbe0d97ba25cba17b36c837c27cb7b39c96ccc8b43a99df2dfaca9732763", - "0x5b82b9d0cb3d0d14c8fe693502b197cfbc0f55115446632448549da20538c96c", - "0x42c5410440da06b29d782ee691783aad21d76b0de61c1034432f816af89aa57f", - "0xd716c3a7c353f0458ff8387fb435606934e25b631a83db017e5eb9a0022358f0", - "0xedc8c2863195c102234eb522c94568c4aabd91d4eb2df52d2c4dc9f953e01295", - "0xe8017af6c0a19b08c86e8ef94d9b3dadcbe8f55bc446d7359a6f294d68227b84", - "0x52f41f0f49803ae47f13977a8a5dd1b170348e82e2d59303861efb83d1413b50", - "0xf39a20c932f2445f48214e8726d305bac89d54b3c99940d601a168e2b8745014" -] -BUNDLE_MAPPING = { - 'Bundle: Agriculture': 'Agriculture', - 'Act Now Climate Change Bundle': 'Act Now Climate Change', - 'Bundle ⚡️♻️Renewable Energy': 'Renewable Energy', - 'Bundle: Climate Research Alpha Round': 'Climate Research', - 'Bundle: Oceans & Forests': 'Oceans & Forests', - 'Bundle #3: Verification Infrastructure (Impact Certs, Measurement, Reporting & Verification (MRV) and Oracles)': 'Verification Infrastructure', - 'Bundle: Carbon Markets': 'Carbon Markets', - 'Community Engagement - Bundle 6': 'Community Engagement', - 'Bundle: Emerging Economies and Indigenous Communities': 'Emerging Economies', - 'Bundle: Creative Works': 'Creative Works' -} -DEFAULT_URL = "https://grant-explorer.gitcoin.co/#/round/1/0x1b165fe4da6bc58ab8370ddc763d367d29f50ef0" - - -def extract_projects(text_blob, max_tokens=1250): - - prompt = (f"Consider the following text:\n\n" - f"---\n\n" - f"{text_blob}\n\n" - f"---\n\n" - f"Convert the text into a JSON that lists the projects and has the following keys for each project:" - f"`project_name`, `twitter_handle`, `description`." - f"Edit the `description` field to 2-3 sentences.") - - try: - response = openai.Completion.create( - model="text-davinci-003", - prompt=prompt, - temperature=0.5, - max_tokens=max_tokens, - n=1, - stop=None - ) - - data = response.choices[0].text - - data = data.replace("```json", "") - data = data.replace("```", "") - data = data.strip() - - json_data = json.loads(data) - print(f"Retrieved {len(json_data)} projects.") - return json_data - - # most common exceptions are rate limiting or a mis-formatted JSON object - except Exception as e: - print(e) - time.sleep(30) - return(extract_projects(text_blob)) - - -def extract_bundles(): - - bundles = [] - for project_record in GRAPH_DATA: - bundle_id = project_record["projectId"] - round_id = project_record["roundId"] - info = project_record["data"]["application"]["project"] - bundle_name = info["title"] - description = info["description"] - if bundle_id in BUNDLE_IDS and round_id == ROUND_ID: - print(f"Getting project data for: {bundle_name}.") - bundles.append(dict( - bundleId=bundle_id, - roundId=round_id, - bundleName=bundle_name, - bundleDescription=description, - projects=extract_projects(description) - )) - time.sleep(10) - - out_file = open(BUNDLES_DATA, "w") - json.dump(bundles, out_file, indent=4) - out_file.close() - - -def get_twitter_url(handle): - if not isinstance(handle, str): - return DEFAULT_URL - handle = handle.strip() - if " " in handle or "." in handle or len(handle) < 3: - return DEFAULT_URL - if handle[0] == '@': - handle = handle[1:] - return f"https://twitter.com/{handle}" - - -def map_projects_to_bundles(): - bundles = json.load(open(BUNDLES_DATA)) - mapper = {} - for b in bundles: - bundle_name = b["bundleName"] - for p in b["projects"]: - project_name = p["project_name"] - if project_name not in mapper.keys(): - mapper.update({ - project_name: { - "bundles": [bundle_name], - "data": { - "title": project_name, - "description": p["description"], - "externalLink": get_twitter_url(p["twitter_handle"]) - } - } - }) - else: - mapper[project_name]["bundles"].append(bundle_name) - - return mapper - - -def create_project_allowlists(project, bundles_list): - paths = [ALLOWLIST_DIR + create_project_filename(f) + ".csv" for f in bundles_list] - df = (pd - .concat([pd.read_csv(p) for p in paths], axis=0, ignore_index=True) - .groupby('address')['price', 'fractions'] - .sum() - .sort_values(by='fractions', ascending=False) - .reset_index()) - df.index.name = 'index' - df.to_csv(ALLOWLIST_DIR + create_project_filename(project) + ".csv") - - return dict( - fractionsTotalSupply=round(df['fractions'].sum()), - hypercertEligibleDonors=len(df) - ) - - -def build_bundle_hypercert(bundles_list): - - workscope = ",".join([BUNDLE_MAPPING[b] for b in bundles_list]) - return dict( - workScopes = workscope, - workTimeStart = datify(DEFAULT_DIMS["workTimeStart"]), - workTimeEnd = datify(DEFAULT_DIMS["workTimeEnd"]), - - impactScopes = [DEFAULT_DIMS["impactScopes"]], - impactTimeStart = datify(DEFAULT_DIMS["workTimeStart"]), - impactTimeEnd = datify(DEFAULT_DIMS["impactTimeEnd"]), - - contributors = "", - rights = [DEFAULT_DIMS["rights"]] - ) - - -def run_project_stats(): - - projects_dict = map_projects_to_bundles() - project_records = [] - for project, project_fields in projects_dict.items(): - bundles_list = project_fields["bundles"] - allowlist_data = create_project_allowlists(project, bundles_list) - hypercert_data = build_bundle_hypercert(bundles_list) - - project_records.append({ - "title": project, - "address": "", - "roundId": ROUND_ID, - "projectDescription": project_fields["data"]["description"], - "projectWebsite": project_fields["data"]["externalLink"], - **allowlist_data, - "hypercertData": hypercert_data - }) - out_file = open(PROJECTS_DATA, "w") - json.dump(project_records, out_file, indent=4) - out_file.close() - -if __name__ == "__main__": - # run this to generate the initial JSON - #extract_bundles() - run_project_stats() \ No newline at end of file diff --git a/utils/gitcoin/gitcoin-alpha/serialize_hypercert_data.py b/utils/gitcoin/gitcoin-alpha/serialize_hypercert_data.py deleted file mode 100644 index 8822f38..0000000 --- a/utils/gitcoin/gitcoin-alpha/serialize_hypercert_data.py +++ /dev/null @@ -1,53 +0,0 @@ -import json -import pandas as pd - -from utils import datify - - -CONFIG = json.load(open("config/config.json")) -JSONDATA_PATH = CONFIG["localPaths"]["canonicalDataset"] -SETTINGS = json.load(open("config/gitcoin-settings.json")) -DEFAULT_DIMS = SETTINGS["defaultDims"] -WORKSCOPES = (pd.read_csv(CONFIG["localPaths"]["workScopeOverrides"]) - .set_index('project')['work_scope'] - .to_dict()) - - -def build_hypercert(project): - - contributors = project["ensName"] - if not contributors: - contributors = project["address"] - - workscope = WORKSCOPES.get(project["title"].strip()) - if not workscope: - print("Missing workscope for project:", project["title"]) - - return dict( - workScopes = workscope, - workTimeStart = datify(DEFAULT_DIMS["workTimeStart"]), - workTimeEnd = datify(DEFAULT_DIMS["workTimeEnd"]), - - impactScopes = [DEFAULT_DIMS["impactScopes"]], - impactTimeStart = datify(DEFAULT_DIMS["workTimeStart"]), - impactTimeEnd = datify(DEFAULT_DIMS["impactTimeEnd"]), - - contributors = contributors, - rights = [DEFAULT_DIMS["rights"]] - ) - - -def add_hypercert_fields(): - - projects_list = json.load(open(JSONDATA_PATH)) - for project in projects_list: - hypercert = build_hypercert(project) - project.update(dict(hypercertData=hypercert)) - - out_file = open(JSONDATA_PATH, "w") - json.dump(projects_list, out_file, indent=4) - out_file.close() - - -if __name__ == "__main__": - add_hypercert_fields() \ No newline at end of file diff --git a/utils/gitcoin/gitcoin-alpha/serialize_project_data.py b/utils/gitcoin/gitcoin-alpha/serialize_project_data.py deleted file mode 100644 index ac3b456..0000000 --- a/utils/gitcoin/gitcoin-alpha/serialize_project_data.py +++ /dev/null @@ -1,75 +0,0 @@ -import json -import pandas as pd -from utils import create_project_filename - - -CONFIG = json.load(open("config/config.json")) -GRAPH_DATA = json.load(open(CONFIG["localPaths"]["graphData"])) -ALLOWLIST_DIR = CONFIG["localPaths"]["allowlistDirectory"] -DONORLIST_DIR = CONFIG["localPaths"]["donorlistDirectory"] -OUTPATH = CONFIG["localPaths"]["canonicalDataset"] -PROJECTS = json.load(open("config/projects-list.json")) -SETTINGS = json.load(open("config/gitcoin-settings.json")) - - -def serialize_donor_stats(project_name): - - fname = create_project_filename(project_name) + ".csv" - donorlist_df = pd.read_csv(DONORLIST_DIR + fname) - allowlist_df = pd.read_csv(ALLOWLIST_DIR + fname) - - return dict( - fundingTotalDollars=round(donorlist_df['usd'].sum()), - donorsTotal=len(donorlist_df), - fractionsTotalSupply=round(allowlist_df['fractions'].sum()), - hypercertEligibleDonors=len(allowlist_df) - ) - - -def serialize_project_info(project_record): - - info = project_record["data"]["application"]["project"] - - return dict( - projectId=project_record["projectId"], - projectDescription=info.get('description'), - projectWebsite=info.get('website'), - projectLogoCid=info.get('logoImg'), - projectBannerCid=info.get('bannerImg'), - projectTwitter=info.get('projectTwitter'), - projectGithub=info.get('projectGithub'), - userGithub=info.get('userGithub') - ) - - -def find_project_record(project_dict): - for record in GRAPH_DATA: - if all([ - record["roundId"] == project_dict["roundId"], - record["data"]["application"]["project"]["title"] == project_dict["title"], - record["data"]["application"]["recipient"] == project_dict["address"] - ]): - return record - - -def run_project_stats(): - - project_records = [] - for project_dict in PROJECTS: - record = find_project_record(project_dict) - if record: - project_dict.update(serialize_project_info(record)) - project_dict.update(serialize_donor_stats(project_dict["title"])) - project_records.append(project_dict) - else: - print("Record not found for project:", project_title["title"]) - - out_file = open(OUTPATH, "w") - json.dump(project_records, out_file, indent=4) - out_file.close() - - print(f"Serialized data for {len(project_records)} projects") - - -if __name__ == "__main__": - run_project_stats() \ No newline at end of file diff --git a/utils/gitcoin/gitcoin-alpha/utils.py b/utils/gitcoin/gitcoin-alpha/utils.py deleted file mode 100644 index 2b8699c..0000000 --- a/utils/gitcoin/gitcoin-alpha/utils.py +++ /dev/null @@ -1,49 +0,0 @@ -""" -NOTE: -There is a bug in web3.storage that prevents filenames with -accents on Latin letters like á or ó from being retrieved. -If you run into this issue, uncomment the unidecode module -and apply it to the `create_project_filename` function. - -""" - -from datetime import datetime -#from unidecode import unidecode - - -def datify(u): - return datetime.fromtimestamp(u).strftime('%Y-%m-%d') if u else "indefinite" - -def shorten_address(a): - # todo: build more robust handling - if isinstance(a, str): - return a[:5] + "..." + a[-3:] - else: - return "unknown" - -def create_project_filename(project_name): - #filename = unidecode(filename) - filename = project_name.replace("/","-").replace(":", "-") - filename = filename.replace(" ","_") - filename = filename if filename[0] != '.' else filename[1:] - return filename - -def build_scope(name, include_list, exclude_list=[]): - - def format_list(lst): - lst = [x.strip() for x in lst] - return lst - - include_list = format_list(include_list) - exclude_list = format_list(exclude_list) - - neg_operator = "¬" - array_value = include_list + [f"{neg_operator}{x}" for x in exclude_list] - display_value = " ∧ ".join([x.replace(" ", "-") for x in array_value]) - - return { - "name": name, - "value": include_list, - "excludes": exclude_list, - "display_value": display_value - } \ No newline at end of file diff --git a/utils/gitcoin/gitcoin-beta/.env.example b/utils/gitcoin/gitcoin-beta/.env.example deleted file mode 100644 index 510f634..0000000 --- a/utils/gitcoin/gitcoin-beta/.env.example +++ /dev/null @@ -1,7 +0,0 @@ -#.env -ALCHEMY_KEY= -ETHERSCAN_KEY= -CHAINALYSIS_API_KEY= -OPTIMISM_ETHERSCAN_API_KEY= -OPENAI_API_KEY= -WEB3_STORAGE_TOKEN= \ No newline at end of file diff --git a/utils/gitcoin/gitcoin-beta/.gitignore b/utils/gitcoin/gitcoin-beta/.gitignore deleted file mode 100644 index 588984b..0000000 --- a/utils/gitcoin/gitcoin-beta/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -# ignore local storage artifacts -.env -__pycache__/ -.DS_Store -*.csv -*.png -*.ipynb -*.log -.ipynb_checkpoints/ -data/* diff --git a/utils/gitcoin/gitcoin-beta/README.md b/utils/gitcoin/gitcoin-beta/README.md deleted file mode 100644 index 4ee78ff..0000000 --- a/utils/gitcoin/gitcoin-beta/README.md +++ /dev/null @@ -1,51 +0,0 @@ -# Gitcoin Beta Round - -Scripts which may be helpful when working with Gitcoin Data and Allo Protocol. Contributions welcome! - -# Setup - -1. Set environment variables in a `.env` file. You may need the following API keys: - - - ALCHEMY_KEY - - ETHERSCAN_KEY - - OPTIMISM_ETHERSCAN_API_KEY - - OPENAI_API_KEY - - WEB3_STORAGE_TOKEN - -2. Check you have installed the necessary requirements in `requirements.txt` and for web3.storage (npm) - -3. Reviewing settings in `config.json` - -# Funding Round Set-up - -To initialize the data, you will need to gather information about the Funding Rounds: - -1. In `get_grants_data.py`, run the `get_funding_rounds` module from the `main` function - -2. This will extract data from Gitcoin's allo protocol and create a file called `data/funding-round-data.json` - -3. Open the file and modify any of the styling for hypercert background colors and vector art. - -``` - { - "roundId": "0xdf22a2C8F6BA9376fF17EE13E6154B784ee92094", - "roundName": "Ethereum Infrastructure", - "backgroundColor": "blue", // YOU MAY EDIT THIS - "backgroundVectorArt": "contours" // YOU MAY EDIT THIS - } -``` - -4. Comment out `get_funding_rounds` in the `main` function so it doesn't overwrite your new settings - -# Generating Hypercerts - -1. Double check settings in `config.json` - -2. From the command line, execute `bash workflow.sh`. This will do the following: - - - Gather data for all projects - - Prepare allowlists for all projects (stored as CSV files locally in `data/allowlists/`) - - Extract and resize banner images for all projects (stored as PNG files locally in `data/img/`) - - Use GPT to generate a 2-3 sentence description and <30 character work scope for each project (stored as JSON files locally in `data/`) - - Upload allowlists and banner images to web3.storage (the CIDs are stored locally in `data/cids.json`) - - Create a custom hypercert minting link for each project (a table with each project and its minting link is stored locally in `data/minting_urls.csv` diff --git a/utils/gitcoin/gitcoin-beta/ai_helper.py b/utils/gitcoin/gitcoin-beta/ai_helper.py deleted file mode 100644 index 831f3a6..0000000 --- a/utils/gitcoin/gitcoin-beta/ai_helper.py +++ /dev/null @@ -1,179 +0,0 @@ -import argparse -from dotenv import load_dotenv -import json -import logging -import openai -import os -import time - - -PROJECTS_DATA = "data/projects-data.json" -DESCRIPTIONS = "data/descriptions.json" -WORK_SCOPES = "data/workscopes.json" - -MAX_TOKENS_SUMMARY = 1250 -MAX_TOKENS_WORK_SCOPE = 20 -MAX_RETRIES = 5 -WAIT_TIME = 10 - -logger = logging.getLogger(__name__) -logger.setLevel(logging.ERROR) -formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s") -file_handler = logging.FileHandler("error.log") -file_handler.setFormatter(formatter) -logger.addHandler(file_handler) - -def summarize(text_blob, max_tokens=MAX_TOKENS_SUMMARY): - if not isinstance(text_blob, str): - return "" - - tokens = text_blob.split(" ") - if len(tokens) < 100 or max_tokens < 200: - return text_blob - - text_blob = " ".join(tokens[:(max_tokens - 200)]) - - prompt = ( - f"Consider the following text:\n\n" - f"---\n\n" - f"{text_blob}\n\n" - f"---\n\n" - f"Please convert this into a 2-3 sentence summary that describes what the project is doing." - f"Use the name of the project in the description, e.g., 'Project X is an open source protocol for...'." - f"Only return the summary text; don't return any other comments or superfluous text." - ) - - try: - response = openai.Completion.create( - model="text-davinci-003", - prompt=prompt, - temperature=0.5, - max_tokens=200, - n=1, - stop=None - ) - - new_text = response.choices[0].text.strip().strip('"') - - return new_text - - except Exception as e: - logger.error(f"Error during summarization: {e}") - return "" - - -def shorten_workscope(title, description): - if not isinstance(title, str): - return "" - - title = title.strip() - - if len(title) <= 30: - return title - - text_blob = "\n\n".join([title, description]) - - prompt = ( - f"Consider the following text about a project:\n\n" - f"---\n\n" - f"{text_blob}\n\n" - f"---\n\n" - f"Please shorten this text to just project name. The project name should be 30 characters or less." - f"Only return the project name; don't return any other comments or superfluous text." - ) - - try: - response = openai.Completion.create( - model="text-davinci-003", - prompt=prompt, - temperature=0.5, - max_tokens=MAX_TOKENS_WORK_SCOPE, - n=1, - stop=None - ) - - new_text = response.choices[0].text.strip().strip('"') - - return new_text - - except Exception as e: - logger.error(f"Error during work scope shortening: {e}") - return "" - - -def process_project_descriptions(): - if os.path.exists(DESCRIPTIONS): - with open(DESCRIPTIONS) as f: - descriptions = json.load(f) - else: - descriptions = {} - - with open(PROJECTS_DATA) as f: - projects = json.load(f) - - for project_id, data in projects.items(): - if descriptions.get(project_id): - continue - descr = summarize(data['description']) - if descr == "": - break - descriptions[project_id] = descr - - with open(DESCRIPTIONS, 'w') as f: - json.dump(descriptions, f, indent=4) - - -def split_scope(work_scope): - - split_chars = ["-", ":", "|"] - for char in split_chars: - if char in work_scope: - return work_scope.split(char)[0].strip() - - return work_scope - - -def process_work_scopes(): - if os.path.exists(WORK_SCOPES): - with open(WORK_SCOPES) as f: - work_scopes = json.load(f) - else: - work_scopes = {} - - with open(PROJECTS_DATA) as f: - projects = json.load(f) - - with open(DESCRIPTIONS) as f: - descriptions = json.load(f) - - for project_id, descr in descriptions.items(): - if work_scopes.get(project_id): - continue - title = projects[project_id].get('name') - work_scope = shorten_workscope(title, descr) - if work_scope == "": - break - work_scopes[project_id] = split_scope(work_scope) - - with open(WORK_SCOPES, 'w') as f: - json.dump(work_scopes, f, indent=4) - - -def main(): - load_dotenv() - openai.api_key = os.environ['OPENAI_API_KEY'] - process_project_descriptions() - process_work_scopes() - - -if __name__ == "__main__": - parser = argparse.ArgumentParser(description="Process project descriptions and work scopes.") - parser.add_argument("--logfile", help="Specify the log file path.") - args = parser.parse_args() - - if args.logfile: - file_handler = logging.FileHandler(args.logfile) - file_handler.setFormatter(formatter) - logger.addHandler(file_handler) - - main() diff --git a/utils/gitcoin/gitcoin-beta/config.json b/utils/gitcoin/gitcoin-beta/config.json deleted file mode 100644 index b7c4bfa..0000000 --- a/utils/gitcoin/gitcoin-beta/config.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "version": "1.0.0", - "hypercertCreateUrl": "https://hypercerts.org/app/create/#", - "hypercertTestingUrl": "https://hypercerts.org/app/create/#", - "hostedCidBaseUrl": "https://cloudflare-ipfs.com/ipfs/", - "localPaths": { - "exportsDirectory": "data/", - "donorlistDirectory": "data/donorlists/", - "allowlistDirectory": "data/allowlists/", - "imagesDirectory": "data/img/" - } -} diff --git a/utils/gitcoin/gitcoin-beta/get_ens.py b/utils/gitcoin/gitcoin-beta/get_ens.py deleted file mode 100644 index 751d807..0000000 --- a/utils/gitcoin/gitcoin-beta/get_ens.py +++ /dev/null @@ -1,22 +0,0 @@ -from dotenv import load_dotenv -from ens import ENS -import os -from web3 import Web3 - -load_dotenv() -ALCHEMY_KEY = os.environ['ALCHEMY_KEY'] - -def get_ens(addr): - - # create a web3 connection - alchemy_url = f"https://eth-mainnet.g.alchemy.com/v2/{ALCHEMY_KEY}" - w3 = Web3(Web3.HTTPProvider(alchemy_url)) - ns = ENS.fromWeb3(w3) - - addr = addr.lower() - checksum = Web3.toChecksumAddress(addr) - name = ns.name(checksum) - if name: - return name - else: - return addr diff --git a/utils/gitcoin/gitcoin-beta/get_grants_data.py b/utils/gitcoin/gitcoin-beta/get_grants_data.py deleted file mode 100644 index b59193c..0000000 --- a/utils/gitcoin/gitcoin-beta/get_grants_data.py +++ /dev/null @@ -1,164 +0,0 @@ -from datetime import datetime -import json -import logging -import os -import pandas as pd -import re -import requests - -from get_ens import get_ens - -# https://github.com/gitcoinco/allo-indexer -CHAIN_NUM = "1" -CHAINSAUCE_URL = "https://indexer-grants-stack.gitcoin.co/data/" -START_TIME = 1682424000 - -ROUNDS_DATA = "data/funding-round-data.json" -PROJECTS_DATA = "data/projects-data.json" - - -def setup_logging(): - - logging.basicConfig( - level=logging.INFO, - format="%(asctime)s %(levelname)-8s %(message)s", - datefmt="%Y-%m-%d %H:%M:%S", - handlers=[ - logging.FileHandler("allo.log"), - logging.StreamHandler() - ] - ) - - -def flatten_dict(d): - - flattened_dict = {} - for key, value in d.items(): - if isinstance(value, dict): - inner_dict = flatten_dict(value) - flattened_dict.update({f"{key}.{inner_key}": inner_value for inner_key, inner_value in inner_dict.items()}) - elif isinstance(value, list): - flattened_dict.update({f"{key}.{i}": item for i, item in enumerate(value)}) - else: - flattened_dict[key] = value - return flattened_dict - - -def get_funding_rounds(): - - round_url = "/".join([CHAINSAUCE_URL, CHAIN_NUM, "rounds.json"]) - r = requests.get(round_url) - round_data = r.json() - - funding_round_data = [ - { - "roundId": r['id'], - "roundName": r['metadata']['name'], - "backgroundColor": "blue", # manually updated later - "backgroundVectorArt": "contours" # manually updated later - } - for r in round_data - if int(r['roundStartTime']) >= START_TIME and r['votes'] > 10 - ] - - with open(ROUNDS_DATA, 'w') as f: - json.dump(funding_round_data, f, indent=4) - - -def get_allo_data(): - with open(ROUNDS_DATA) as f: - funding_round_data = json.load(f) - - projects_data = {} - for funding_round in funding_round_data: - round_id = funding_round['roundId'] - round_name = funding_round['roundName'] - logging.info(f"Gathering projects data for round: {round_name}...") - - url = "/".join([CHAINSAUCE_URL, CHAIN_NUM, "rounds", round_id, "projects.json"]) - projects_json = requests.get(url).json() - - for project in projects_json: - if project['status'] != "APPROVED": - continue - - projectId = project.get('id') - if projects_data.get(projectId): - projects_data[projectId]['fundingRounds'].append(round_name) - continue - - app = flatten_dict(project['metadata']['application']) - name = app.get('project.title') - address = get_ens(app.get('recipient')) - - projects_data[projectId] = { - 'name': name, - 'description': app.get('project.description'), - 'address': address, - 'logoImg': app.get('project.logoImg'), - 'bannerImg': app.get('project.bannerImg'), - 'externalLink': app.get('project.website'), - 'backgroundColor': funding_round['backgroundColor'], - 'backgroundVectorArt': funding_round['backgroundVectorArt'], - 'fundingRounds': [round_name] - } - logging.info(f"Normalized data for project: {name}") - - logging.info(f"Obtained {len(projects_data)} projects in round {round_name}.") - - with open(PROJECTS_DATA, 'w') as f: - json.dump(projects_data, f, indent=4) - - df = pd.DataFrame(projects_data).T - df.index.name = 'id' - df.to_csv("data/projects.csv") - - -def get_allowlists(): - - path = "data/allowlists/" - if not os.path.exists(path): - os.makedirs(path) - - with open(ROUNDS_DATA) as f: - funding_round_data = json.load(f) - - votes_data = [] - for funding_round in funding_round_data: - round_id = funding_round['roundId'] - round_name = funding_round['roundName'] - logging.info(f"Gathering voting data for round: {round_name}...") - - url = "/".join([CHAINSAUCE_URL, CHAIN_NUM, "rounds", round_id, "votes.json"]) - votes_json = requests.get(url).json() - votes_data.extend(votes_json) - - df = pd.DataFrame(votes_data) - - for project in df['projectId'].unique(): - dff = ( - df[df['projectId'] == project] - .groupby('voter')['amountUSD'] - .sum() - .sort_values(ascending=False) - .reset_index() - .rename(columns={'voter': 'address'}) - ) - dff.index.name = 'index' - - # Round the hypercert quantity UP to the nearest integer - dff['fractions'] = dff['amountUSD'].apply(lambda x: int(x) + 1) - dff['address'] = dff['address'].apply(lambda x: x.lower()) - dff.drop(columns='amountUSD', inplace=True) - - dff.to_csv(f"{path}{project}.csv") - - -if __name__ == "__main__": - - # TODO: set colors and vectors dynamically - # Currently requires manually overriding a default color/vector combo - #get_funding_rounds() - - get_allo_data() - get_allowlists() \ No newline at end of file diff --git a/utils/gitcoin/gitcoin-beta/minting_urls.py b/utils/gitcoin/gitcoin-beta/minting_urls.py deleted file mode 100644 index 6b40fff..0000000 --- a/utils/gitcoin/gitcoin-beta/minting_urls.py +++ /dev/null @@ -1,108 +0,0 @@ -import csv -from dotenv import load_dotenv -import json -import os -import requests -import urllib.parse - - -PROJECTS = json.load(open("data/projects-data.json")) -DESCRIPTIONS = json.load(open("data/descriptions.json")) -WORK_SCOPES = json.load(open("data/workscopes.json")) -CIDS = json.load(open("data/cids.json")) - -CONFIG = json.load(open("config.json")) - -# TODO: update dates -WORK_START = "2023-01-16" -WORK_END = "2023-04-25" - - -def url_parse(val): - return urllib.parse.quote(val, safe='') - - -def safe_url_attr(name, value): - parser = lambda k,v: url_parse(k) + '=' + url_parse(v) - if isinstance(value, list): - url_field = "&".join([parser(f"{name}[{i}]", x) for (i, x) in enumerate(value)]) - else: - url_field = parser(name, value) - return url_field - - -def create_url(project_id): - - project = PROJECTS.get(project_id) - - # TODO: check for ENS - address = project.get("address") - hypercert = { - "workScopes": WORK_SCOPES.get(project_id), - "workTimeStart": WORK_START, - "workTimeEnd": WORK_END, - "impactScopes": ["all"], - "impactTimeStart": WORK_START, - "impactTimeEnd": "indefinite", - "contributors": address, - "rights": ["Public Display"] - } - - # TODO: confirm all projects have valid images - base = CONFIG['hostedCidBaseUrl'] - logo_uri = f"{base}{project.get('logoImg')}" - banner_uri = f"{base}{CIDS['img']}/img/{project_id}.png" - allowlist_uri = f"{base}{CIDS['allowlists']}/allowlists/{project_id}.csv" - - properties = [ - { - "trait_type": "Funding Platform", - "value": "Gitcoin Grants" - }, - { - "trait_type": "Funding Round", - "value": "Beta Round" - }, - # TODO: figure out how to make this render as an array value - { - "trait_type": "Matching Pool", - "value": ", ".join(project['fundingRounds']) - } - ] - - params = dict( - name = project['name'], - **hypercert, - description = DESCRIPTIONS.get(project_id), - externalLink = project['externalLink'], - logoUrl = logo_uri, - bannerUrl = banner_uri, - allowlistUrl = allowlist_uri, - metadataProperties = json.dumps(properties), - backgroundColor = project['backgroundColor'], - backgroundVectorArt = project['backgroundVectorArt'], - ) - params = "&".join([safe_url_attr(k,v) for (k,v) in params.items()]) - url = CONFIG['hypercertTestingUrl'] + params - - return url - - - -def create_csv_export(): - - csv_filename = "data/minting_urls.csv" - with open(csv_filename, 'w') as f: - writer = csv.writer(f) - cols = ['id', 'name', 'mintingUrl'] - writer.writerow(cols) - - for project_id, project in PROJECTS.items(): - url = create_url(project_id) - writer.writerow([project_id, project['name'], url]) - - f.close() - - -if __name__ == "__main__": - create_csv_export() diff --git a/utils/gitcoin/gitcoin-beta/process_images.py b/utils/gitcoin/gitcoin-beta/process_images.py deleted file mode 100644 index 8a4df2a..0000000 --- a/utils/gitcoin/gitcoin-beta/process_images.py +++ /dev/null @@ -1,66 +0,0 @@ -from io import BytesIO -import json -from math import ceil -import os -from PIL import Image -import requests - -CID_HOST_URL = "https://gitcoin.mypinata.cloud/ipfs/" -PROJECTS_DATA = "data/projects-data.json" -IMG_DIR = "data/img/" - -IMG_WIDTH, IMG_HEIGHT = 320, 214 - - -def crop_and_resize(img): - - width, height = img.size - cropped_dims = img.getbbox() - cropped_width = cropped_dims[2] - cropped_dims[0] - cropped_height = cropped_dims[3] - cropped_dims[1] - - if cropped_width < width: - cropped_img = img.crop(cropped_dims) - ratio = IMG_WIDTH / cropped_width - resized_img = cropped_img.resize((IMG_WIDTH, ceil(cropped_height * ratio))) - _, resized_height = resized_img.size - cropper = ceil((resized_height - IMG_HEIGHT) / 2) - new_img = resized_img.crop((0,cropper,IMG_WIDTH,cropper+IMG_HEIGHT)) - else: - ratio = IMG_HEIGHT / height - resized_img = img.resize((ceil(width * ratio), IMG_HEIGHT)) - resized_width, _ = resized_img.size - cropper = ceil((resized_width - IMG_WIDTH) / 2) - new_img = resized_img.crop((cropper,0,cropper+IMG_WIDTH,IMG_HEIGHT)) - - return new_img - - -def process_image(uri, project_id, overwrite=False): - - outpath = project_id + ".png" - if not overwrite: - if outpath in os.listdir(IMG_DIR): - return - - response = requests.get(uri) - img = Image.open(BytesIO(response.content)) - img = crop_and_resize(img) - img.save(IMG_DIR + outpath) - - -def run_image_processing(): - - projects = json.load(open(PROJECTS_DATA)) - for project_id, data in projects.items(): - cid = data['bannerImg'] - if cid is None: - continue - uri = CID_HOST_URL + cid - print("Processing", data['name'], uri) - - process_image(uri, project_id) - - -if __name__ == "__main__": - run_image_processing() \ No newline at end of file diff --git a/utils/gitcoin/gitcoin-beta/requirements.txt b/utils/gitcoin/gitcoin-beta/requirements.txt deleted file mode 100644 index f34fa1d..0000000 --- a/utils/gitcoin/gitcoin-beta/requirements.txt +++ /dev/null @@ -1,9 +0,0 @@ -ens -openai -pandas -pillow -python-dotenv -re -requests -urllib3 -web3 \ No newline at end of file diff --git a/utils/gitcoin/gitcoin-beta/workflow.sh b/utils/gitcoin/gitcoin-beta/workflow.sh deleted file mode 100644 index 74f2e0b..0000000 --- a/utils/gitcoin/gitcoin-beta/workflow.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash - -# get grant data and allowlists -python get_grants_data.py - -# resize and process images -python process_images.py - -# shorten project titles and descriptions -python ai_helper.py - -# upload to web3.storage -source .env -path="../../../node_modules/@web3-storage/web3-storage-quickstart/put-files.js" - -r=$(node $path --token="$WEB3_STORAGE_TOKEN" data/img/) -img_cid=$(echo "$r" | awk -F'CID: ' '{print $2}' | tr -d '\n') - -r=$(node $path --token="$WEB3_STORAGE_TOKEN" data/allowlists/) -allowlist_cid=$(echo "$r" | awk -F'CID: ' '{print $2}' | tr -d '\n') - -echo "{\"img\": \"$img_cid\", \"allowlists\": \"$allowlist_cid\"}" > data/cids.json - -# generate urls -python minting_urls.py \ No newline at end of file diff --git a/utils/optimism/.env.example b/utils/optimism/.env.example deleted file mode 100644 index 845a60c..0000000 --- a/utils/optimism/.env.example +++ /dev/null @@ -1,3 +0,0 @@ -ALCHEMY_KEY= -ETHERSCAN_KEY= -OPTIMISM_ETHERSCAN_API_KEY= diff --git a/utils/optimism/.gitignore b/utils/optimism/.gitignore deleted file mode 100644 index 915c46f..0000000 --- a/utils/optimism/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -# ignore local storage artifacts -.env -__pycache__/ -.DS_Store -*.csv -*.pickle -*.ipynb -links.txt -.ipynb_checkpoints/ -data/projects/*.json -data/github/*.json diff --git a/utils/optimism/.ipynb_checkpoints/Optimism Retro PGF - Round 2 - V2-checkpoint.ipynb b/utils/optimism/.ipynb_checkpoints/Optimism Retro PGF - Round 2 - V2-checkpoint.ipynb deleted file mode 100644 index b13423d..0000000 --- a/utils/optimism/.ipynb_checkpoints/Optimism Retro PGF - Round 2 - V2-checkpoint.ipynb +++ /dev/null @@ -1,178 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "601742b4", - "metadata": {}, - "outputs": [], - "source": [ - "import json\n", - "from selenium import webdriver \n", - "from selenium.webdriver import Chrome \n", - "from selenium.webdriver.chrome.service import Service \n", - "from selenium.webdriver.common.by import By \n", - "import time\n", - "from webdriver_manager.chrome import ChromeDriverManager" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "bc018912", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "''" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# initialize a headless web scraper\n", - "\n", - "options = webdriver.ChromeOptions() \n", - "options.headless = True \n", - "options.page_load_strategy = 'none' \n", - "\n", - "chrome_path = ChromeDriverManager().install() \n", - "chrome_service = Service(chrome_path) \n", - "\n", - "driver = Chrome(options=options, service=chrome_service) \n", - "driver.implicitly_wait(5)\n", - "\n", - "link = \"https://app.optimism.io/retropgf-discovery/0xD06CaC3a900Dd34FE9CCd32F15DCC75E2423b816\"\n", - "driver.get(link)\n", - "driver.find_element(By.TAG_NAME, \"div\").text" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "8713106c", - "metadata": {}, - "outputs": [], - "source": [ - "# initialize a headless web scraper\n", - "\n", - "options = webdriver.ChromeOptions() \n", - "options.headless = True \n", - "options.page_load_strategy = 'none' \n", - "\n", - "chrome_path = ChromeDriverManager().install() \n", - "chrome_service = Service(chrome_path) \n", - "\n", - "driver = Chrome(options=options, service=chrome_service) \n", - "driver.implicitly_wait(5)\n", - "\n", - "# local path names\n", - "\n", - "LINKS_PATH = 'links.txt'\n", - "DATA_PATH = 'optimism/data/projects/'\n", - "\n", - "\n", - "# module for extracting fields from a given project page\n", - "def extract_fields(link):\n", - "\n", - " driver.get(link)\n", - " content = driver.find_element(By.CSS_SELECTOR, \"div[class^='_content'\")\n", - " project = content.find_element(By.CSS_SELECTOR, \"h1[class^='_header'\").text\n", - " socials = [s.get_property(\"href\")\n", - " for s in content.find_elements(By.CSS_SELECTOR, \"a[class^='_socialLink'\")]\n", - " responses = content.find_elements(By.TAG_NAME, \"section\")\n", - " description = responses[0].find_element(By.TAG_NAME, \"p\").text\n", - " category = responses[1].find_element(By.CSS_SELECTOR, \"span[class^='_label'\").text\n", - " address = content.find_element(By.CSS_SELECTOR, \"div[class^=_addressWrapper'\").text\n", - " p_grabber = lambda r: \"\\n\".join([t.text for t in r.find_elements(By.TAG_NAME, \"p\")])\n", - " logo = driver.find_element(By.CSS_SELECTOR, \"img[class^='_image'\").get_property(\"src\")\n", - " try:\n", - " banner = (driver\n", - " .find_element(By.CSS_SELECTOR, \"div[class^='_banner'\")\n", - " .find_element(By.TAG_NAME, \"img\").get_property(\"src\"))\n", - " except:\n", - " banner = None\n", - " \n", - " return {\n", - " 'project': project,\n", - " 'socials': socials,\n", - " 'description': description,\n", - " 'category': category,\n", - " 'public_goods': p_grabber(responses[2]),\n", - " 'sustainability': p_grabber(responses[3]),\n", - " 'team_size': p_grabber(responses[4]),\n", - " 'address': address,\n", - " 'banner': banner,\n", - " 'logo': logo \n", - " }\n", - "\n", - "\n", - "# process each link and store the data\n", - "def process_url(link):\n", - "\n", - " result = extract_fields(link) \n", - " result.update({'project_link': link})\n", - " result.update({'project_pathname': link.split(\"/\")[-1]})\n", - " \n", - " j = json.dumps(result, indent=4)\n", - " outpath = f\"{DATA_PATH}{result['project_pathname']}.json\"\n", - " with open(outpath, \"w\") as outfile:\n", - " outfile.write(j)\n", - "\n", - " return result\n", - "\n", - "\n", - "# read and process all links\n", - "def scrape_all_projects():\n", - "\n", - " with open(LINKS_PATH, 'r') as txt_file:\n", - " links = [f.strip() for f in txt_file.readlines()]\n", - "\n", - " for project_url in links:\n", - " time.sleep(2)\n", - " try:\n", - " result = process_url(project_url) \n", - " print(\"✅ Scraped: \", result['project'])\n", - " except:\n", - " print(\"❌ Error:\", project_url) \n", - "\n", - "\n", - "scrape_all_projects() \n", - "driver.quit()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b8418920", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.7" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/utils/optimism/.ipynb_checkpoints/Optimism Retro PGF - Round 2-checkpoint.ipynb b/utils/optimism/.ipynb_checkpoints/Optimism Retro PGF - Round 2-checkpoint.ipynb deleted file mode 100644 index 363fcab..0000000 --- a/utils/optimism/.ipynb_checkpoints/Optimism Retro PGF - Round 2-checkpoint.ipynb +++ /dev/null @@ -1,6 +0,0 @@ -{ - "cells": [], - "metadata": {}, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/utils/optimism/Dockerfile b/utils/optimism/Dockerfile deleted file mode 100644 index aa4b043..0000000 --- a/utils/optimism/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM python -CMD /bin/bash - -# Install dependencies -RUN mkdir -p /install/ -COPY requirements.txt /install/ -RUN pip install -r /install/requirements.txt diff --git a/utils/optimism/Optimism Retro PGF - Round 2 - V2.ipynb b/utils/optimism/Optimism Retro PGF - Round 2 - V2.ipynb deleted file mode 100644 index b13423d..0000000 --- a/utils/optimism/Optimism Retro PGF - Round 2 - V2.ipynb +++ /dev/null @@ -1,178 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "601742b4", - "metadata": {}, - "outputs": [], - "source": [ - "import json\n", - "from selenium import webdriver \n", - "from selenium.webdriver import Chrome \n", - "from selenium.webdriver.chrome.service import Service \n", - "from selenium.webdriver.common.by import By \n", - "import time\n", - "from webdriver_manager.chrome import ChromeDriverManager" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "bc018912", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "''" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# initialize a headless web scraper\n", - "\n", - "options = webdriver.ChromeOptions() \n", - "options.headless = True \n", - "options.page_load_strategy = 'none' \n", - "\n", - "chrome_path = ChromeDriverManager().install() \n", - "chrome_service = Service(chrome_path) \n", - "\n", - "driver = Chrome(options=options, service=chrome_service) \n", - "driver.implicitly_wait(5)\n", - "\n", - "link = \"https://app.optimism.io/retropgf-discovery/0xD06CaC3a900Dd34FE9CCd32F15DCC75E2423b816\"\n", - "driver.get(link)\n", - "driver.find_element(By.TAG_NAME, \"div\").text" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "8713106c", - "metadata": {}, - "outputs": [], - "source": [ - "# initialize a headless web scraper\n", - "\n", - "options = webdriver.ChromeOptions() \n", - "options.headless = True \n", - "options.page_load_strategy = 'none' \n", - "\n", - "chrome_path = ChromeDriverManager().install() \n", - "chrome_service = Service(chrome_path) \n", - "\n", - "driver = Chrome(options=options, service=chrome_service) \n", - "driver.implicitly_wait(5)\n", - "\n", - "# local path names\n", - "\n", - "LINKS_PATH = 'links.txt'\n", - "DATA_PATH = 'optimism/data/projects/'\n", - "\n", - "\n", - "# module for extracting fields from a given project page\n", - "def extract_fields(link):\n", - "\n", - " driver.get(link)\n", - " content = driver.find_element(By.CSS_SELECTOR, \"div[class^='_content'\")\n", - " project = content.find_element(By.CSS_SELECTOR, \"h1[class^='_header'\").text\n", - " socials = [s.get_property(\"href\")\n", - " for s in content.find_elements(By.CSS_SELECTOR, \"a[class^='_socialLink'\")]\n", - " responses = content.find_elements(By.TAG_NAME, \"section\")\n", - " description = responses[0].find_element(By.TAG_NAME, \"p\").text\n", - " category = responses[1].find_element(By.CSS_SELECTOR, \"span[class^='_label'\").text\n", - " address = content.find_element(By.CSS_SELECTOR, \"div[class^=_addressWrapper'\").text\n", - " p_grabber = lambda r: \"\\n\".join([t.text for t in r.find_elements(By.TAG_NAME, \"p\")])\n", - " logo = driver.find_element(By.CSS_SELECTOR, \"img[class^='_image'\").get_property(\"src\")\n", - " try:\n", - " banner = (driver\n", - " .find_element(By.CSS_SELECTOR, \"div[class^='_banner'\")\n", - " .find_element(By.TAG_NAME, \"img\").get_property(\"src\"))\n", - " except:\n", - " banner = None\n", - " \n", - " return {\n", - " 'project': project,\n", - " 'socials': socials,\n", - " 'description': description,\n", - " 'category': category,\n", - " 'public_goods': p_grabber(responses[2]),\n", - " 'sustainability': p_grabber(responses[3]),\n", - " 'team_size': p_grabber(responses[4]),\n", - " 'address': address,\n", - " 'banner': banner,\n", - " 'logo': logo \n", - " }\n", - "\n", - "\n", - "# process each link and store the data\n", - "def process_url(link):\n", - "\n", - " result = extract_fields(link) \n", - " result.update({'project_link': link})\n", - " result.update({'project_pathname': link.split(\"/\")[-1]})\n", - " \n", - " j = json.dumps(result, indent=4)\n", - " outpath = f\"{DATA_PATH}{result['project_pathname']}.json\"\n", - " with open(outpath, \"w\") as outfile:\n", - " outfile.write(j)\n", - "\n", - " return result\n", - "\n", - "\n", - "# read and process all links\n", - "def scrape_all_projects():\n", - "\n", - " with open(LINKS_PATH, 'r') as txt_file:\n", - " links = [f.strip() for f in txt_file.readlines()]\n", - "\n", - " for project_url in links:\n", - " time.sleep(2)\n", - " try:\n", - " result = process_url(project_url) \n", - " print(\"✅ Scraped: \", result['project'])\n", - " except:\n", - " print(\"❌ Error:\", project_url) \n", - "\n", - "\n", - "scrape_all_projects() \n", - "driver.quit()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b8418920", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.7" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/utils/optimism/Optimism Retro PGF - Round 2.ipynb b/utils/optimism/Optimism Retro PGF - Round 2.ipynb deleted file mode 100644 index af47888..0000000 --- a/utils/optimism/Optimism Retro PGF - Round 2.ipynb +++ /dev/null @@ -1,135 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "e4264799", - "metadata": {}, - "outputs": [], - "source": [ - "import json\n", - "from selenium import webdriver \n", - "from selenium.webdriver import Chrome \n", - "from selenium.webdriver.chrome.service import Service \n", - "from selenium.webdriver.common.by import By \n", - "import time\n", - "from webdriver_manager.chrome import ChromeDriverManager\n", - "\n", - "# initialize a headless web scraper\n", - "\n", - "options = webdriver.ChromeOptions() \n", - "options.headless = True \n", - "options.page_load_strategy = 'none' \n", - "\n", - "chrome_path = ChromeDriverManager().install() \n", - "chrome_service = Service(chrome_path) \n", - "\n", - "driver = Chrome(options=options, service=chrome_service) \n", - "driver.implicitly_wait(5)\n", - "\n", - "# local path names\n", - "\n", - "LINKS_PATH = 'links.txt'\n", - "DATA_PATH = 'optimism/data/projects/'\n", - "\n", - "\n", - "# module for extracting fields from a given project page\n", - "def extract_fields(link):\n", - "\n", - " driver.get(link)\n", - " content = driver.find_element(By.CSS_SELECTOR, \"div[class^='_content'\")\n", - " project = content.find_element(By.CSS_SELECTOR, \"h1[class^='_header'\").text\n", - " socials = [s.get_property(\"href\")\n", - " for s in content.find_elements(By.CSS_SELECTOR, \"a[class^='_socialLink'\")]\n", - " responses = content.find_elements(By.TAG_NAME, \"section\")\n", - " description = responses[0].find_element(By.TAG_NAME, \"p\").text\n", - " category = responses[1].find_element(By.CSS_SELECTOR, \"span[class^='_label'\").text\n", - " address = content.find_element(By.CSS_SELECTOR, \"div[class^=_addressWrapper'\").text\n", - " p_grabber = lambda r: \"\\n\".join([t.text for t in r.find_elements(By.TAG_NAME, \"p\")])\n", - " logo = driver.find_element(By.CSS_SELECTOR, \"img[class^='_image'\").get_property(\"src\")\n", - " try:\n", - " banner = (driver\n", - " .find_element(By.CSS_SELECTOR, \"div[class^='_banner'\")\n", - " .find_element(By.TAG_NAME, \"img\").get_property(\"src\"))\n", - " except:\n", - " banner = None\n", - " \n", - " return {\n", - " 'project': project,\n", - " 'socials': socials,\n", - " 'description': description,\n", - " 'category': category,\n", - " 'public_goods': p_grabber(responses[2]),\n", - " 'sustainability': p_grabber(responses[3]),\n", - " 'team_size': p_grabber(responses[4]),\n", - " 'address': address,\n", - " 'banner': banner,\n", - " 'logo': logo \n", - " }\n", - "\n", - "\n", - "# process each link and store the data\n", - "def process_url(link):\n", - "\n", - " result = extract_fields(link) \n", - " result.update({'project_link': link})\n", - " result.update({'project_pathname': link.split(\"/\")[-1]})\n", - " \n", - " j = json.dumps(result, indent=4)\n", - " outpath = f\"{DATA_PATH}{result['project_pathname']}.json\"\n", - " with open(outpath, \"w\") as outfile:\n", - " outfile.write(j)\n", - "\n", - " return result\n", - "\n", - "\n", - "# read and process all links\n", - "def scrape_all_projects():\n", - "\n", - " with open(LINKS_PATH, 'r') as txt_file:\n", - " links = [f.strip() for f in txt_file.readlines()]\n", - "\n", - " for project_url in links:\n", - " #time.sleep(2)\n", - " try:\n", - " result = process_url(project_url) \n", - " print(\"✅ Scraped: \", result['project'])\n", - " except:\n", - " print(\"❌ Error:\", project_url) \n", - "\n", - "\n", - "scrape_all_projects() \n", - "driver.quit()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c33bbfb9", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.7" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/utils/optimism/README.md b/utils/optimism/README.md deleted file mode 100644 index a594235..0000000 --- a/utils/optimism/README.md +++ /dev/null @@ -1,118 +0,0 @@ -# Gitcoin-Helpers - -Scripts which may be helpful when working with Gitcoin Data and Allo Protocol. Contributions welcome! - -# Setup - -1. Set environment variables in a `.env` file. You'll need the following API keys: - - - ALCHEMY_KEY - - ETHERSCAN_KEY - - CHAINALYSIS_API_KEY - - THEGRAPH_API_KEY - - OPTIMISM_ETHERSCAN_API_KEY - -2. Check you have installed the necessary requirements in `requirements.txt` - -3. Download the necessary Dune snapshots as CSV files and move them to the appopriate directory. - - - ETH Infra: https://dune.com/queries/1934656 - - Climate: https://dune.com/queries/1934689 - - OSS: https://dune.com/queries/1934969 - -4. Using the Dune datasets, configure `confg/projects-list.json` so there is an array containing the project title, address, and round details for each project. - - For example: - - ``` - { - "title": "Otterscan", - "address": "0xb7081Fd06E7039D198D10A8b72B824e60C1B1E16", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure" - }, - { - "title": "BuidlGuidl", - "address": "0x97843608a00e2bbc75ab0c1911387e002565dede", - "roundId": "0xe575282b376e3c9886779a841a2510f1dd8c2ce4", - "roundName": "Ethereum Infrastructure" - } - ``` - - Note that project "bundles" are stored in `bundles-list.json`. - -5. Review the other files in `config/*.json` to ensure that all directories, filenames, and other settings are correct. - -# Organization - -- `/data/csv`: snapshots of on-chain data taken using Dune Analytics and exported as CSV files (requires paid API); also includes work-scope overrides -- `/data/allowlists`: CSV files containing the addresses donating to each Gitcoin Grant (one CSV per project) that are eligible for hypercerts fractions (1 DAI = 1 hypercert fractional unit); to be stored on IPFS -- `/data/donorlists`: CSV files containing the addresses donating to each Gitcoin Grant (one CSV per project) -- `/data/images`: cropped and resized banner images for hypercert artwork; to be stored on IPFS -- `/data`: local versions of project data from Round Manager graphs; exports of relevant project data - -# Modules - -## get_grants_data.py - -This script queries The Graph API (using a Round ID and an API_KEY stored in `.env`) to gather data about all projects in a given round. It exports data on all the projects into a JSON file called `/data/graph-data.json`. Data is gathered from the mainnet subgraph and IPFS. - -## allowlist.py - -This script ingests a list of CSV files generated from Dune Analytics queries. It generates a unique allowlist (exported as a CSV file) for each project. An allowlist contains the following information: -| index | address | price | fractions | -| -------- | -------- | -------- | -------- | -| 0 | 0x... | 0.0 | 20 | -| 1 | 0x... | 0.0 | 15 | -| 99 | 0x... | 0.0 | 1 | - -The queries used to generate the allowlists can be viewed here: - -- ETH Infra: https://dune.com/queries/1934656 -- Climate: https://dune.com/queries/1934689 -- OSS: https://dune.com/queries/1934969 - -The `allowlist.py` module makes assumptions about how amounts donated to each project translate into hypercert fractions. The current assumptions award a fraction for every $1 donated using a `floor` function. For example: - -- $5.60 donated --> 5 fractions -- $5.20 donated --> 5 fractions -- $0.52 donated --> 0 fractions - -The `screen_allowlist.py` module utilizes the Chainalysis API to log and exclude any wallets that appear on sanctions lists. - -After running these script, the allowlists should be stored on IPFS and the CID should be updated in `config.json`. - -## serialize_project_data.py - -This script creates a `canonical-project-data.json` by parsing the `graph-data.json` file with information about each project. - -## serialize_address_data.py - -This script updates `canonical-project-data.json` by adding on-chain informationa bout each wallet, including ENS names, Safe multisigs, 0xSplits, and ETH tokens on Optimism. - -## serialize_hypercert_data.py - -This script reads project data and default assumptions for the grants round to create hypercert metadata for each project. This script also updates `canonical-project-data.json`. - -## process_images.py - -This script creates a local copy of each project's banner image and resizes it to the hypercert required dimensions. After running this script, the updated images should be stored on IPFS and the CID should be updated in `config.json`. - -## create_hypercert_minting_url.py - -This script converts `canonical-project-data.json` to urls used for populating the hypercert minting form. It also exports several tables in markdown, CSV, and HTML format to facilitate operations in `data/project_urls.*`. - -# Recommended workflow - -1. Complete the setup instructions and download the necessary CSV snapshots from Dune Analytics -2. Review each of the config files, including `/config/projects-list.json` to ensure that all projects are correctly listed for each round -3. Run `get_grants_data.py` to pull all the grant data from the round -4. Run `allowlist.py` to generate (and sanction screen) the allowlists -5. Bulk upload the allowlist CSVs to a web3.storage; copy the CID -6. Update the `allowlistBaseUrl` property in `config.json` with the new CID base -7. Run `serialize_project_data.py`, then `serialize_address_data.py`, and finally `serialize_hypercert_data.py` to prepare a complete version of `canonical-project-data.json` -8. Run `process_images.py` to resize and crop the banner images -9. Bulk upload the images to a web3.storage; copy the CID -10. Update the `bannerImageBaseUrl` property in `config.json` with the new CID base -11. Run `python create_hypercert_minting_url.py` -12. View the complete URL sets and datasets in `/data/project_urls.*` diff --git a/utils/optimism/data/optimism_project_data.json b/utils/optimism/data/optimism_project_data.json deleted file mode 100644 index 058332d..0000000 --- a/utils/optimism/data/optimism_project_data.json +++ /dev/null @@ -1,4206 +0,0 @@ -[ - { - "project": "cp0x", - "socials": [ - "https://twitter.com/cp0xdotcom", - "https://www.youtube.com/@cp0xcrypto" - ], - "description": "We as community constantly hosts ad-free educational podcasts about crypto concepts and translates various educational videos, including videos about optimistic rollups.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nThanks to our translations and teaching materials, people who do not know English also learn about various concepts (rollups, 2nd layer networks) and begin to use these concepts in practice.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe use personal funds to support the project and our educational process. No advertising or funding.", - "team_size": "4 people: - two translators (one is me, who does the rest of the work as well) - editor - working with audio", - "address": "0x74630370197b4c4795bFEeF6645ee14F8cf8997D", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x6f9BB7e454f5B3eb2310343f0E99269dC2BB8A1d", - "project_pathname": "0x6f9BB7e454f5B3eb2310343f0E99269dC2BB8A1d", - "optimismAddressFound": true, - "optimismBalanceEth": 0.03622360811258065, - "github_data": [] - }, - { - "project": "SEED LATAM (formerly DeFi LATAM)", - "socials": ["https://twitter.com/SEEDLatam", "https://defilatam.com/"], - "description": "SEED LATAM is a space with the primary objective of creating an environment where its members collectively benefit from shared knowledge. We cover all these needs with quality content and events. Today's crypto ecosystem in LATAM follows trends; our goal is to raise the bar of knowledge in this part of the world and provide all the necessary tools so that every participant can feel part of it.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nSince its inception in 2020, we have provided free quality content on Ethereum's scaling solutions, including Optimism, across different instances, such as writing content, Community Calls, Twitter spaces, and events. Together with our participation as a delegation, we have been informing hundreds of users interested in Optimism about the current state of the network and governance over time.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nOur organization has no revenue because our content is conceived as a public good and does not sell anything to users. Our operations have been supported through grants such as: - Gitcoin ( $21000) - Uniswap ($15000) - ETHLatam BA QF ($5015) - ETHColombia Devcon ($4569) Some of our events have been supported by specific sponsors for that sole purpose.", - "team_size": "Currently, our organization is composed of a team of 6 core team members: - Candu - CryptoChica - Joxes - Nahue - Pacha - Pepo", - "address": "0x59De6dEBDbb63C374EEB418C80191831A69027d5", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xbe0fc34488CaA2766C3225B56ade0c1E409c0De7", - "project_pathname": "0xbe0fc34488CaA2766C3225B56ade0c1E409c0De7", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [] - }, - { - "project": "Layer 2 Landscape", - "socials": [ - "https://twitter.com/bitsplaining", - "https://github.com/fainashalts", - "https://github.com/truffle-box/optimism-box" - ], - "description": "Technically this nomination is for the the Truffle Optimism Box, which allows developers to use boilerplate to create Optimism dapps. This educational tool led to my broader effort to spread information about the Layer 2/Scaling ecosystem's development via my Twitter account (@bitsplaining), w/ a weekly educational thread, for which I'd like to accept this nomination.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nI lead Layer 2 tooling at Truffle, & work to develop open source tooling that makes Layer 2 development easier and more straightforward, in order to help the ecosystem continue to grow. From my personal Twitter handle (@bitsplaining), I publish a weekly thread called \"Layer 2 Landscape\", where I detail new educational materials & protocol developments in the Layer 2 space.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nI work full time as an engineer at ConsenSys, on the Truffle team. I spend a great deal of time outside working hours learning about developments in the Layer 2 ecosystem and conveying that information to the community via my Layer 2 Landscape Twitter thread, which I have published nearly every weekend for over a year.", - "team_size": "The Truffle team is 10 people. I am currently the only engineer fully focused on the Layer 2 space, and I write the Layer 2 threads by myself.", - "address": "0x7a48A728d9Fd2d5a55c545c4378E5bA909349E90", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x7a48A728d9Fd2d5a55c545c4378E5bA909349E90", - "project_pathname": "0x7a48A728d9Fd2d5a55c545c4378E5bA909349E90", - "optimismAddressFound": true, - "optimismBalanceEth": 0.004413607541581524, - "github_data": [ - "data/github/https:__github.com_fainashalts_events_2022-07-01_2023-03-01.json", - "data/github/https:__github.com_truffle-box_optimism-box_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "EthereansOS", - "socials": [ - "https://twitter.com/ethereanslabs", - "https://github.com/EthereansOS", - "https://ethereans.app/" - ], - "description": "Ethereans is a decentralized nation that uses secure DeFi routines for seamless transactions, self-sovereign on-chain governance with granular control over its resources, and specialized assets that are interoperable across marketplaces and DEX\u2019s. Everything in the nation is powered by generalized smart contract factories built on EthereansOS.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWe have deployed Ethereans OS both on main-net and Optimism. Some of the tools include: Colonies: A tool for managing earnings of protocols between L1 and L2. Items: Super-standard of ERC-721 and ERC-20 with dynamic metadata. Covenants: Factory customizable DeFi routines and farming set ups. Generalized Factories: A factory aggregator and set of generalized contracts for developers.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nEthereansOS is the first on-chain Entity that rules the economy of the EthereansOS Nation. Earnings come from the usage of our tools, the inflation of our token OS, and the management of an Investment fund. Holders run the economy of EthereansOS independently from Ethereans Labs. There is no VC funding for EthereansOS. https://dune.com/ethereans_labs/ethereans-os-economics", - "team_size": "The Ethereans Labs team currently counts 15 core members divided into three primary teams: - Magicians (coders and Data Analysts) - Artists (illustrators and video animators) - Masters (Communication, law, and B2B) We also expand our team with the constant collaboration of 5 external teams for UI, development, and R&D.", - "address": "0xdc0090f8aDD5DB06De0897A54e753af143668668", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xdc0090f8aDD5DB06De0897A54e753af143668668", - "project_pathname": "0xdc0090f8aDD5DB06De0897A54e753af143668668", - "optimismAddressFound": true, - "optimismBalanceEth": 0.12011054197128418, - "github_data": [ - "data/github/https:__github.com_EthereansOS_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "RockX", - "socials": ["https://twitter.com/rockx_official", "https://www.rockx.com/"], - "description": "RockX is an institutional-grade global node operator for business to build, scale and stake with ease. RockX provide access node API for Optimism and helps accelerate your growth by providing you instant and secure on-chain data access via APIs, giving you more time to focus buliding", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nRockX provides Access Node API for Optimism: https://access.rockx.com/product/optimism-blockchain-api-for-web3-builders Guide video on how to set up and use Optimism Access Node API: https://www.youtube.com/watch?v=hRIzPbYqRNk Educational piece on why you should build with Optimism: https://blog.rockx.com/why-optimism-is-premium/ Support devs and projects looking to build with Optimism", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe recently had our funding round back in April 2022 https://blog.rockx.com/rockx-receives-6m-in-successful-series-a-funding-led-by-amber-group/", - "team_size": "Team size: 35 team members globally, mostly based in Asia.", - "address": "0x9275cC6de34471f4a669e9dc0F90994Ad6702DA9", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x56262562506967a08Bf60a5aC5a5cEEAc02BECD2", - "project_pathname": "0x56262562506967a08Bf60a5aC5a5cEEAc02BECD2", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [] - }, - { - "project": "\ud83d\udc0d snekmate", - "socials": [ - "https://twitter.com/pcaversaccio", - "https://github.com/pcaversaccio" - ], - "description": "\ud83d\udc0d snekmate are state-of-the-art, highly opinionated, hyper-optimised and secure Vyper smart contract building blocks. Or in other words, it's the OpenZeppelin version for Vyper.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWhile there are plenty of Solidity libraries out there, very few people are working on high-quality and easy-to-integrate library-like Vyper code. Not only does client diversity matter but also language diversity. Any Vyper-based project built on the OP Stack will probably use Snekmate under the hood mid-term. Or in other words, Snekmate helps Vyper builders to kick start on the OP Stack.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nSome bug bounties helped me to become independent and focus on open-source work. Some people donated money to support me. No other income nor revenue streams currently.", - "team_size": "1", - "address": "0x07bF3CDA34aA78d92949bbDce31520714AB5b228", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x07bF3CDA34aA78d92949bbDce31520714AB5b228", - "project_pathname": "0x07bF3CDA34aA78d92949bbDce31520714AB5b228", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_pcaversaccio_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Gitcoin", - "socials": [ - "https://twitter.com/gitcoin", - "https://github.com/gitcoinco", - "https://gitcoin.co/" - ], - "description": "For the past 5 years Gitcoin has been focused on building and funding digital public goods. By popularizing these concepts, it's helped spark a trend across the industry of giving back and supporting Ethereum developers. Through its implementation of quadratic funding specifically, it's helped fund projects like ethers.js, Hardhat, POAP, Prysm, and even Optimism itself.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nGitcoin and Optimism have both helped fund each others ecosystems through the heart of the last bear market, and continue to find ways to interoperate.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nGitcoin funds itself via a DAO and has meaningful, sustainable funding. This should be strongly considered in vote allocations.", - "team_size": "45+", - "address": "0xc92D76E01BD4e7CE25819c94FC6c3aea7b2Cd155", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x48A63097E1Ac123b1f5A8bbfFafA4afa8192FaB0", - "project_pathname": "0x48A63097E1Ac123b1f5A8bbfFafA4afa8192FaB0", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_gitcoinco_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Kernel", - "socials": [ - "https://twitter.com/KERNEL0x", - "https://github.com/kernel-community/", - "https://kernel.community/" - ], - "description": "Kernel is peer-to-peer learning environment, growing one block at a time. Traditionally, each block accommodates 250 individuals and runs for 8 weeks. In two years, and after 7 Kernel blocks, there are: - 1,800 Kernel fellows (see more here: https://www.kernel.community/en/love) - 470 Kernel \"adventures\": web3 projects, protocols, writings & research - 70+ Kernel projects who have raised $1MM", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nKernel curates & deploys foundational crypto wisdom. This is best illustrated by the Kernel Book: https://www.kernel.community/en/learn/ Optimism (Ether's Phoenix) is a big part of that story. We have deployed & taught optimistic contracts, we host co-learning conversations on 4844 (& 4337, prior), encourage deployment on Optimism when appropriate, and have contributed to early OP governance.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nKernel is funded by grants (80%), Kernel dues (15%), and donations (5%). We received $625k in the last year in grants, including notable contributions from Filecoin, The Graph, Celo, and Gitcoin.", - "team_size": "Full Time Kernel Stewards: 4 - Andy Tudhope: https://twitter.com/cryptowanderer - Salim Virani: https://twitter.com/SaintSal - Aliya Donn: https://twitter.com/aliyajypsy - Vivek Singh: https://twitter.com/vsinghdothings Part Time Contributors: 2 - Angela Gilhotra: https://twitter.com/anggxyz - sidcode: https://www.cyber-physical.space/", - "address": "0x7DAC9Fc15C1Db4379D75A6E3f330aE849dFfcE18", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xC728DEa8B2972E6e07493BE8DC2F0314F7dC3E98", - "project_pathname": "0xC728DEa8B2972E6e07493BE8DC2F0314F7dC3E98", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_kernel-community__events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "ERC-5560: Redeemable NFTs", - "socials": [ - "https://twitter.com/ATO_nft", - "https://github.com/ATO-nft", - "https://eips.ethereum.org/EIPS/eip-5560" - ], - "description": "The EIP-5560 (Redeemable NFTs) adds a redeem function to EIP-721. It can be implemented when an NFT issuer wants his/her NFT to be redeemed for a physical object. An increasing amount of NFT issuers such as artists, fine art galeries, auction houses, brands and others want to offer a physical object to the holder of a given NFT. This standard allows EIP-721 NFTs to signal reedemability.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nThe EIP-5560 is a tool at the disposal of the Optimism NFT community. We're planning to deploy a reference implementation to OP Mainnet: the Minifolio NFT contract (https://github.com/ATO-nft/minifolio/blob/main/contracts/Minifolio.sol) will hold 1 ETH for hackers to grab in case of a successful attack. We also provide 24/7 support to any Optimism project integrating with EIP-5560.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nSo far, the project never received any funding. It is developed by the dev team of \u0100to (https://ato.network).", - "team_size": "Olivier Fernandez (@fernandezOli), Fr\u00e9d\u00e9ric Le Coidic (@FredLC29), Julien B\u00e9ranger (@julienbrg). We have a rich experience in developing NFT projects so we'll be happy to share our expertise on tech, legal, and security aspects with NFT projects and teams developing on Optimism.", - "address": "0x5874D5D530D1f969FD962579c445A0f3A8682D48", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x5874D5D530D1f969FD962579c445A0f3A8682D48", - "project_pathname": "0x5874D5D530D1f969FD962579c445A0f3A8682D48", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_ATO-nft_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "The Optimistic Series", - "socials": [ - "https://twitter.com/Subli_Defi", - "https://linktr.ee/subli_defi" - ], - "description": "Provide educational content about decoding yield farming strategy on Defi Protocols mainly on ETH and Optimism chains: Project presentation, tutorials, fundamentals analysis, How to start Defi for begginners I've also created The Optimistic Series (podcast, newsletter (500subs), research database) in January 2023. Metrics: Twitter (monthly): >1millions impressions Youtube channel: >15k views", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nEducational contents made so far: - 16 Twitter Threads specific to OP + The most complete Quests Tutorials (18) + How to bridge to OP / Buy a token + Follow-up of each Project Grand Cycles - Knowledge DataBase for DEFI-notion - 15 Youtube Videos - Unique Defi Newsletter on Optimism - Twitter spaces to interview project - Animation of French community on various discord servers + OP Server", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nSometimes i got grants from projects for the content creation, but most of the time, work is done without any compensation. I can remember that starting the tutorial of the 18 Quests took me 7 days...didn't expect it will take that long, but also didn't expect it could be so useful! But the best part of my impact is: - Getting nominated by a user not on my behalf - 2nd most liked nomination", - "team_size": "Myself as content creator A friend of mine named Pedro that is working with me for making thumbnails/pictures", - "address": "0x03143ee031aa7bd7b6846750d066a27f18d39edd", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x03143EE031AA7bD7b6846750d066A27f18D39edd", - "project_pathname": "0x03143EE031AA7bD7b6846750d066A27f18D39edd", - "optimismAddressFound": true, - "optimismBalanceEth": 0.41529338971145996, - "github_data": [] - }, - { - "project": "Solady", - "socials": [ - "https://twitter.com/optimizoor", - "https://github.com/Vectorized", - "https://solady.org/" - ], - "description": "Highly-optimized Solidity snippets.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\n- Develop highly optimized building blocks for smart contracts, which impacts many projects across the OP stack. - Develop novel gas optimization techniques, many of which have found their way into heavily used contracts and other public goods. - Develop new robust fuzz testing techniques with Foundry's forge (i.e. Solady's TestPlus). - Serve as a reference for low-level Solidity development.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\n- Salary from sound.xyz, which is most of my income. - Freelance part time small-scale smart contract audits. - Secondary market sales from NFT donations.", - "team_size": "1 main developer. Rest are ad-hoc open source contributors. I've paid the top 3 contributors (besides me) 1 ETH, 1ETH, 0.5ETH respectively.", - "address": "0x1F5D295778796a8b9f29600A585Ab73D452AcB1c", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x1F5D295778796a8b9f29600A585Ab73D452AcB1c", - "project_pathname": "0x1F5D295778796a8b9f29600A585Ab73D452AcB1c", - "optimismAddressFound": true, - "optimismBalanceEth": 0.004983837891411276, - "github_data": [ - "data/github/https:__github.com_Vectorized_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Bankless Academy", - "socials": [ - "https://twitter.com/BanklessAcademy", - "https://github.com/didierkrux", - "https://app.banklessacademy.com/" - ], - "description": "Bankless Academy has been providing a growing range of free-to-access education packets for over a year - featuring tight writing & infographics, quizzes, and on-chain quests with proof-of-knowledge badges. Our mission is to continue Public Good operations on Ethereum, building w/ communities like Gitcoin Passport, Mintkudos and Optimism, and developing community content via our Writers Cohorts.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nBankless Academy equips users with Gitcoin Passport, and basic knowledge + tools for confident navigation, before onboarding them to the OP ecosystem to continue their learning journey (see our L2/OP lesson). We are building more OP ecosystem content, allowing our users to collect badges and build their on-chain identity. We also host our collectable content (currently mirror.xyz articles) on OP.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe are a non-profit project. We currently receive public goods funding from BanklessDAO, funding from lesson sponsors like 1inch and Optimism, and funding for supporting our whitelabel partners like humanDAO Academy. We previously received funding from Gitcoin grants. These sources generally fund day-to-day ops, and we hold a small treasury: 0xf80Cd14ec747b2AdF7B1A9911b38c65a885dAeeA", - "team_size": "4", - "address": "0xbFBceA2a72Bc2e62E967fA0c79458dD507708469", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xB30dD1198Feed1e22EC969f61EEd04cB75937adf", - "project_pathname": "0xB30dD1198Feed1e22EC969f61EEd04cB75937adf", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_didierkrux_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Slither", - "socials": [ - "https://twitter.com/trailofbits,%20https://twitter.com/Montyly", - "https://github.com/montyly", - "https://github.com/crytic/slither" - ], - "description": "Slither is a Solidity static analysis framework written in Python. It runs a suite of vulnerability detectors, prints visual information about contract details, and provides an API to easily write custom analyses. Slither enables developers to find vulnerabilities, to enhance their code comprehension, and to quickly prototype custom analyses.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nSlither can be run directly on contracts deployed on Optimism (ex: slither optim:0x\u2026). The tool has been used to prevent numerous vulnerabilities by security auditors and bug hunters (https://github.com/crytic/slither/blob/master/trophies.md). It is also integrated in CIs through its github action (https://github.com/crytic/slither-action).", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nSlither is being developed by Trail of Bits and is open source. It does not have any direct revenue stream.", - "team_size": "The core contributors is composed of 4 individuals. However the project has +100 contributors on github", - "address": "0xc44F30Be3eBBEfdDBB5a85168710b4f0e18f4Ff0", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xA6826463a53bBe3d673f7e61E94a6099581FfC7d", - "project_pathname": "0xA6826463a53bBe3d673f7e61E94a6099581FfC7d", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_montyly_events_2022-07-01_2023-03-01.json", - "data/github/https:__github.com_crytic_slither_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Eneagon by zenbit.eth", - "socials": [ - "https://twitter.com/zenbitMX", - "https://github.com/zenbitETH/eneagon", - "https://ethglobal.com/showcase/eneagon-0hf0o" - ], - "description": "A prefiltering platform for RPGF, based on the bicameral governance model from Optimism. Developers are able to mint PG Projects as NFTs and set multiple development stages to be retroactively funded. These stages are tracked from GitHub milestones, any user can get rewards by donating to these, while stakeholders can mint SBT to evaluate the progress and deliver funds after completing each stage.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWe have been supporting the OP stack by providing liquidity and participating in governance voting on different protocols deployed on Optimism mainnet through the zenbit.eth address. We are providing a prefiltering solution for Retroactive Public Goods Funding that takes leverage of the OPstack to generate on-chain data about PG projects and proof of their progress.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nzenbit.eth funding sources and revenue for 2022: ETH global hackathon prizes: \u2248 10,500usd Filecoin Next Step grants: \u2248 10,000usd Quadratic Funding @Devcon:\u2248 36,500usd", - "team_size": "3 core developers: Shyam Patel / ZK and blockchain engineer / GH: shyam-patel-kira Krisztian Barta / Fullstack engineer / GH: Riki0923 Habacuc Vera / R&D engineer / GH: HabacucMX", - "address": "0xeCB4C1245665e8A1F43826355aaB0Dd6bF336e05", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x04cc6b487566B1C821bEa04d7ac0d23CEDe05cC9", - "project_pathname": "0x04cc6b487566B1C821bEa04d7ac0d23CEDe05cC9", - "optimismAddressFound": true, - "optimismBalanceEth": 0.02524942207562111, - "github_data": [ - "data/github/https:__github.com_zenbitETH_eneagon_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Pocket Network", - "socials": [ - "https://twitter.com/POKTnetwork", - "https://github.com/pokt-network", - "https://www.pokt.network/" - ], - "description": "Pocket Network is a decentralized web3 infrastructure provider focused on optimizing the developer experience with scalable, reliable, fast, and privacy-centric services. As of writing this, in the past 24 hours, Pocket Network has served 1.4B requests across 25 networks. This traffic is served by over 150 independent 3rd party node operators on a mix of bare-metal and cloud providers.", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWe integrated Optimism to Pocket Network free of charge on 13/06/2022 as we strongly believe in Ethereum's potential and Optimistic Rollups' scalability. We provide a public endpoint with no rate limits and support for private accounts at portal.pokt.network for enterprise SLA. This grant will greatly help us maintain this public good and continue to contribute to the community's growth.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nPocket Network Inc.(PNI), one of the primary contributors to Pocket Network, is backed by top-tier crypto VCs such as Placeholder, 1KX, Republic Crypto, Arrington Capital, and many others. In addition to VC funding, PNI generates revenue streams through blockchain API services and new chain integration fees.", - "team_size": "Pocket Network Inc\u2019s core team consists of 45 full-time employees, the majority of who are in product and engineering. In addition to PNI, Pocket Network as a whole is supported by over 150 independent node operators.", - "address": "0x5F1Feefc4BB7a414096cCF070BeEF94da8Ff88A6", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xb89e800719a96c609dB746397b7d2c3B917694e0", - "project_pathname": "0xb89e800719a96c609dB746397b7d2c3B917694e0", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_pokt-network_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Quark ID", - "socials": [ - "https://twitter.com/Quark_ID", - "https://github.com/Quark-id", - "https://www.quarkid.org/" - ], - "description": "Quark ID is a digital trust protocol that implements a new security framework for the creation and management of digital identities and all their credentials in a decentralized way, using asymmetric cryptography and the immutability of blockchain to create trust in a digital world. Open standards SSI protocol Multichain Interoperable Off-chain private data Autonomous governance Public/private ecos", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nCreation of roads for the OP ecosystem to streamline access to governments, business and millions of users in LATAM and eventually the world. Becoming part of the first LATAM government-endorsed public decentralized Digital ID infrastructure and gaining visibility into future business opportunities. Significant reduction of the operational costs for running current OP ID solution. And more", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nSustained with contributions from the participating partners, and also with grants. All partners contribute funds and/or personnel to the work. Also in the process of obtaining Grants from multilateral financial organizations in LATAM. Amount Contributed: U$S 1,5M Development team UX team Marketing and Communication Team Launching Event Expenses Travel Expenses an Representation Other staff hour", - "team_size": "Extrimian IOVlabs Beon OSCity XCapit Buenos Aires City Government 35 people aprox", - "address": "0x98c72aFaA2797cb194433de46Fe9E3ceF39F7a53", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x5A930B098Ed8D58dD4590577af85a8E864A8F6fE", - "project_pathname": "0x5A930B098Ed8D58dD4590577af85a8E864A8F6fE", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_Quark-id_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Big Sybil'or", - "socials": ["https://twitter.com/kavourias"], - "description": "I spent some time hunting for sybil attackers of the first OP airdrop, mostly using dune queries because I was bored while I had covid", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nMaking sure everyone plays by the rules :)", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nJust a hobby", - "team_size": "Just me :)", - "address": "0x8B93910594e2a09c30D7e97883f6d35d8772801d", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x8B93910594e2a09c30D7e97883f6d35d8772801d", - "project_pathname": "0x8B93910594e2a09c30D7e97883f6d35d8772801d", - "optimismAddressFound": true, - "optimismBalanceEth": 0.049200064891489106, - "github_data": [] - }, - { - "project": "ETHGlobal", - "socials": [ - "https://twitter.com/ETHGlobal", - "https://github.com/ethglobal", - "https://ethglobal.com/" - ], - "description": "ETHGlobal is the largest developer focused community in Ethereum. Most known for their hackathons, ETHGlobal has run 50+ hackathons around the world and online. To support builders at any point in their journey, ETHGlobal builds products for its developer community's success including: Hackathon (online/in-person), Guides (self-directed education), Summits (online/in-person), Jobs, and more.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nOver the last few years, we've been supporting Optimism, the Collective, and the OP Stack by continuously putting the technology in front of builders. We've seen 250+ projects built and deployed to Optimism Mainnet at our 2022 events and we organized and managed the Optimism Summit (https://www.youtube.com/live/GCmfFdNdEfU), one of the first major pieces of education about the OP Stack.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nIn order to remove any barrier to entry to builders, ETHGlobal has never charged a fee to attend our hackathons, as a result, we are fully funded by our generous partners, like Optimism, who help support the work that we do directly.", - "team_size": "15", - "address": "0x336DEe4022d6CC2F95cfe9e0949B9E0EDDAC457D", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xe993486B257Cd1481aef74b3B909A2627Fc8d305", - "project_pathname": "0xe993486B257Cd1481aef74b3B909A2627Fc8d305", - "optimismAddressFound": true, - "optimismBalanceEth": 0.05, - "github_data": [ - "data/github/https:__github.com_ethglobal_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "OP Dashboards by Springzhang", - "socials": [ - "https://twitter.com/superamscom", - "https://github.com/springzh" - ], - "description": "I created several dashboards for Optimism chain on Dune Analytics platform. Some of them are quite popular. These dashboards are helpful for users to know better about OP chain and for project team to understand their users better from a public onchain data perspective.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nThe main dashboards I've created are: 1. Optimism Quests Tracking https://dune.com/springzhang/optimism-quests-tracking 2. Optimism Airdrop 1 https://dune.com/springzhang/optimism-airdrop-1-all-in-one 3. Uniswap V3 On Optimism Liquidity Mining https://dune.com/springzhang/uniswap-optimism-liquidity-mining-program-performance More can be reviewed at https://dune.com/springzhang", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nI worked for a US based company as a WEB development team leader (remotely) but my contract ended in January 2023. I'm currently looking for new opportunity.", - "team_size": "I created these dashboard myself.", - "address": "0xdbE38D1d3631a04875d3FAd945D0dFcb2C20f91c", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xdbE38D1d3631a04875d3FAd945D0dFcb2C20f91c", - "project_pathname": "0xdbE38D1d3631a04875d3FAd945D0dFcb2C20f91c", - "optimismAddressFound": true, - "optimismBalanceEth": 0.019100434103383048, - "github_data": [ - "data/github/https:__github.com_springzh_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Where has the OP Gone?", - "socials": [ - "https://twitter.com/jack_anorak", - "https://gov.optimism.io/t/op-grants-through-season-2-where-has-the-op-gone/4025" - ], - "description": "Continuously updated governance thread detailing, at a transaction level, what happened with Governance Grants through the first two seasons.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nI'm trying to establish a paper trail of these other grants to, among other things, 1) help set standards for how the Collective ought to distribute and track grants, 2) find issues with custody before something bad happens, and 3) revealknown bad actors", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nI am core Velodrome team and get payments for internal ops, which funds my other activities.", - "team_size": "just me, jack anorak", - "address": "0x4f41877773e44F2275dA1942FEe898556821bf66", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x4f41877773e44F2275dA1942FEe898556821bf66", - "project_pathname": "0x4f41877773e44F2275dA1942FEe898556821bf66", - "optimismAddressFound": true, - "optimismBalanceEth": 0.01283998882204793, - "github_data": [] - }, - { - "project": "EthernautDAO", - "socials": [ - "https://twitter.com/EthernautDAO", - "https://github.com/ethernautdao", - "http://ethernautdao.io/" - ], - "description": "We are a developer's bridge from web2 to web3. We pair senior solidity devs with senior web2 devs for a 2-month crash course to expand the blockchain teams. We also started the distribution of a soulbond token called EXP on optimism to have an on-chain attestation of developer contributors.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWe have provided 34 new developers into the space most of them to the optimism space for free, we are now funding and promoting 2 educational games \"EVM runners\" led by Karmacoma who's mentoring while in prod, and \"Not your Keys\" led by Kethic who is also mentoring while in prod. Both are to be deployed in optimism and we made a Bedrock / OPstack high-level AMA with Kelvin.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe live on donations from our mint wepage: https://mint.ethernautdao.io/#donate All the EthernautDAO treasury is in one multi-sig here: 0x2431BFA47bB3d494Bd720FaC71960F27a54b6FE7 There are 5 ETH for maintenance and 108.000 OP tokens that can only be used to pay future mentors and distribution between EXP holders for the next 4 months.", - "team_size": "We are a DAO with 7 council members elected every 6 months to avoid calling for votes on every decision. Anyone can run for a council member, to be a voter you just need to provide human proof by making a 1 min vid call with a council member.", - "address": "0x2431BFA47bB3d494Bd720FaC71960F27a54b6FE7", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x3B3980936707A8299AFb5424Fa807c1CBac37cCb", - "project_pathname": "0x3B3980936707A8299AFb5424Fa807c1CBac37cCb", - "optimismAddressFound": true, - "optimismBalanceEth": 1.695, - "github_data": [ - "data/github/https:__github.com_ethernautdao_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Prettier Solidity", - "socials": [ - "https://twitter.com/prettiersol", - "https://github.com/prettier-solidity" - ], - "description": "Prettier Solidity is a Prettier plugin for formatting Solidity code. It's the de-facto formatter for the Solidity language, used by multiple projects including Optimism itself.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nAs the most popular formatter for the Solidity language, Prettier Solidity contributes to the productivity of Solidity developers, including many of those building on top of Optimism (and those building Optimism too!)", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nPrettier Solidity is a free and OSS project, and its contributors work on it in their spare time. We've received some funding, mainly through Gitcoin and in Optimism's RetroPGF round, but we don't have any continuous funding nor any revenue.", - "team_size": "While we happily accept contributions from anyone, the vast majority of the project has been written by a team of 3 people.", - "address": "0xFc756d8632A19CEbd76560CE0A6967279E32131b", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xFc756d8632A19CEbd76560CE0A6967279E32131b", - "project_pathname": "0xFc756d8632A19CEbd76560CE0A6967279E32131b", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_prettier-solidity_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "delegation.tools", - "socials": [ - "https://twitter.com/DanieleSalatti", - "https://github.com/DanieleSalatti", - "https://delegation.tools/" - ], - "description": "delegation.tools allows you to see who you are delegating your OP to, and to change delegate in a couple of clicks. It was created shortly after the OP token was launched: there was some confusion on how to change delegate after completing all the steps in the airdrop process, so I made delegation.tools to make the process as easy as possible.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nThis tool has provided value to the collective by enabling users to change their delegate easily. It has been used by ~13000 users since October 2022 (I don't have stats from before that), and has been shared on various socials (Twitter and YouTube). It is a very easy way to show users how to switch delegate. Stats are available here: https://plausible.io/delegation.tools", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nMy 9-to-5, plus grants", - "team_size": "1", - "address": "0xA47669cBc53985333423e4d3D00188f4049fB695", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xA47669cBc53985333423e4d3D00188f4049fB695", - "project_pathname": "0xA47669cBc53985333423e4d3D00188f4049fB695", - "optimismAddressFound": true, - "optimismBalanceEth": 0.008779511128978852, - "github_data": [ - "data/github/https:__github.com_DanieleSalatti_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "ITU Blockchain", - "socials": [ - "https://twitter.com/ITUblockchain", - "https://github.com/itublockchain", - "http://itublockchain.com/" - ], - "description": "ITU Blockchain is the first and largest university blockchain community established in Turkey. The mission of ITU Blockchain is primarily to increase blockchain literacy and awareness in its geography and to educate its community to develop qualified projects. With its nearly 3000 members, it organizes face-to-face and online educations and events every year.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nITU Blockchain has helped many people wanting to improve themselves in this field by offering the first and only free Solidity training. It educates a wide audience on blockchain technology through the many trainings and events it organizes every year. It is a collective knowledge-sharing community that anyone in Turkey who wants to learn about blockchain can use.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe are a community based entirely on voluntary work. Therefore, we have very few expenses. We can use the event spaces from the university by reserving them. To go to hackathons abroad, we make sponsorship agreements with some companies. The sponsorship money received from here is spent entirely on hackathon expenses.", - "team_size": "We have more than 70 active members working in the organization of events and educations. In total, there are nearly 3000 members who have become members of our community. Our face-to-face educations are generally held with 150-200 participants. We usually attend conferences and hackathons abroad with 8 hackers (2 teams of 4 people) and 3-4 participants.", - "address": "0xBEC643BD5b7F5e9190617CA4187ef0455950C51C", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xBEC643BD5b7F5e9190617CA4187ef0455950C51C", - "project_pathname": "0xBEC643BD5b7F5e9190617CA4187ef0455950C51C", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_itublockchain_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Frame", - "socials": [ - "https://twitter.com/0xFrame", - "https://github.com/floating/frame", - "https://frame.sh/" - ], - "description": "Frame is a web3 platform that creates a secure, system-wide interface to your chains and accounts, giving any browser, command-line, or native application the ability to access web3. Our routing architecture, Omnichain, simplifies the user experience by eliminating the concept of \"being on a chain\" and allowing dapps to route requests to any of the user's available chains in parallel.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nOmnichain routing was built to enable a seamless experience for users operating in the multichain world of EVM L2s. We are dedicated to developing the wallet-level specs and interfaces needed to push this space forward and make it easy for developers to build multichain functionality that minimizes complexity and streamlines the user experience across the entire OP stack and ecosystem.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nFrame's development is funded by a seed round raised at the end 2021. We raised 3.8m in that round. Frame does not currently have any revenue.", - "team_size": "Frame Labs is currently a team of four engineers. We're eager to continue growing the team over the next year.", - "address": "0x7c929EfA9a8A2A1524BA90aBc2B70801413fFD4c", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x7c929EfA9a8A2A1524BA90aBc2B70801413fFD4c", - "project_pathname": "0x7c929EfA9a8A2A1524BA90aBc2B70801413fFD4c", - "optimismAddressFound": true, - "optimismBalanceEth": 0.039066658290958456, - "github_data": [ - "data/github/https:__github.com_floating_frame_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Blobscan", - "socials": [ - "https://twitter.com/blossom_labs", - "https://github.com/Blobscan", - "https://blobscan.com/" - ], - "description": "Blobscan is the first EIP4844 Blob Transaction explorer, a web-based application that offers a seamless experience for navigating and indexing blob data. The explorer will have data gas metrics to help users understand the costs associated with this new transaction type, blob data decoding for each rollup, and an API to manipulate blobs.", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nThe explorer was built during ETHBogota hackathon and is developed as an open source project. It has been used by client teams building the EIP4844 specification. EIP4844 will enable cheaper, more scalable L2s, which will benefit the Optimism ecosystem, and Blobscan was contribution to that effort.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe sustain ourselves through grants. Right now our only source of funding is a grant from the Ethereum Fundation Ecosystem Support Program. We have plans to monetize by offering premium features and services for advanced users and enterprises. Our goal is to balance the need for sustainability with our commitment to providing a public good for the Ethereum community.", - "team_size": "Our team consists of 4 full-time developers with years of experience developing on Ethereum and a solid background in blockchain infrastructure. We are working with a contractor for the UI/UX designs. And we have plans to add one more person full-time to help us with the web development.", - "address": "0xd228A0054246577d9c6F978d11Ab9405AE566c5D", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xd7BDE01888B8A2a97924444009E31C8d8c2391F3", - "project_pathname": "0xd7BDE01888B8A2a97924444009E31C8d8c2391F3", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_Blobscan_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Rigoblock", - "socials": [ - "https://twitter.com/RigoBlock", - "https://github.com/RigoBlock", - "https://rigoblock.com/" - ], - "description": "Rigoblock is a fully open source and free to use smart contracts protocol that facilitates the interaction with DeFi applications and the organization of tokens and group of token holders in smart wallets. It has been live on Optimism since November 2022. Rigoblock liquidity has generated more than 50MM USD token swap volume on Ethereum mainnet.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nRigoblock provides onchain-deployed factories which allow users to deploy inexpensive smart wallets; we also provide deployed factories for projects to deploy their own onchain governance. Rigoblock smart wallets (aka \"pools\") facilitate user interaction with Dapps and improve security by abstracting approvals. Everything we build is open sourced under the Apache2.0 License and public.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\n1) Operating as a peer on Rigoblock, mining GRG staking rewards \u224330k USD p.a. 2) Liquidity mining / yield farming on DeFi with proprietary assets, variable revenue, 5k-100k USD p.a. 3) Revenue from the 0x Dao \u2243 5k USD p.a. + variable During a bear market we have positive cash burn and tap into our reserves; during a bull market we are cash flow positive and save for the rainy days.", - "team_size": "1 Gabriele Rigo https://www.linkedin.com/in/gabrielerigo/", - "address": "0x080f08076e8EAdC66006C3CbFEd28a34918A1fA6", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x080f08076e8EAdC66006C3CbFEd28a34918A1fA6", - "project_pathname": "0x080f08076e8EAdC66006C3CbFEd28a34918A1fA6", - "optimismAddressFound": true, - "optimismBalanceEth": 0.004501019366293531, - "github_data": [ - "data/github/https:__github.com_RigoBlock_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Akula", - "socials": [ - "https://twitter.com/AkulaApp", - "https://github.com/akula-bft", - "https://akula.app/" - ], - "description": "Fastest Ethereum node ever built", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nUnderpins Ethereum, potential base for building Optimism network node", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nGrants", - "team_size": "3", - "address": "0x9d6d3b09F8AC8615805bd82e53B80D956F451CFa", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x9d6d3b09F8AC8615805bd82e53B80D956F451CFa", - "project_pathname": "0x9d6d3b09F8AC8615805bd82e53B80D956F451CFa", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_akula-bft_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Ankr", - "socials": ["https://twitter.com/ankr", "http://ankr.com/"], - "description": "Ankr is a decentralized Web3 infrastructure provider powering the foundational layer for Web3, DeFi, and the digital economy across dozens of blockchains. Ankr's RPC node marketplace enables independent node providers to monetize their node infrastructure and allows Web3 developers to access Ankr's increasingly decentralized RPC services with a pay-as-you-go model secured by the ANKR token.", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nTo further Optimism platform decentralization and facilitate increased ecosystem development Ankr provides: - globally distributed node infrastructure - robust load-balancing - Supporting Caching rules - Web Sockets Endpoints - Indexed Available Data through a library of Advanced APIs", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nOur funding and revenue come from; 1) blockchain foundational support 2) developer RPC volume 3) liquid staking fees", - "team_size": "180+ employees globally distributed", - "address": "0x3a78741AC7f96724bf32Cd33de68D54438c1Ef9b", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x5eEeB9F8a2050533BBEd20F87d445Dcf309a5eA7", - "project_pathname": "0x5eEeB9F8a2050533BBEd20F87d445Dcf309a5eA7", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [] - }, - { - "project": "ETHEREUM M\u00c9XICO", - "socials": [ - "https://twitter.com/ethereum_mexico", - "https://linktr.ee/ethmexico" - ], - "description": "We create virtual and IRL workshops to teach about Ethereum and technologies across its ecosystem. We share the latest updates and we inspire builders to create amazing projects in Ethereum in M\u00e9xico! We'd like to keep teaching about Optimism. Provide scholarships for people to learn about tech and code, visit universities across M\u00e9xico, teach how to become a validator node, and more for 2023!", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nThis project will have a huge impact on the future of Ethereum\u00b4s ecosystem and Optimism, as a public good for the community where our focus is to inform about what\u2019s happening in Ethereum and how to easily and safely use Optimism. We'd love to have IRL and virtual workshops focused on Optimism in M\u00e9xico and visiting universities to onboard them to web3 and inspire them to build in the ecosystem!", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nAt this moment, we are a public good project where our funding it's coming from organizing events, grants, sponsorships, quadratic funding rounds, collaborations, and volunteers.", - "team_size": "We are a multi-disciplinary team of 8 people: Ethereum and Web3 enthusiasts from different cities in M\u00e9xico, currently, we keep teaching people from M\u00e9xico and Latin America about blockchain technology together.", - "address": "0xC0aC93ABb5539769Edac951D9EbD5BCbFB854b0f", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xC0aC93ABb5539769Edac951D9EbD5BCbFB854b0f", - "project_pathname": "0xC0aC93ABb5539769Edac951D9EbD5BCbFB854b0f", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [] - }, - { - "project": "Optinames | ENS on Optimism", - "socials": [ - "https://twitter.com/optinames", - "https://github.com/stevegachau/optimismresolver", - "https://optinames.xyz/" - ], - "description": "Hello, Badgeholders. What are Optinames? Optinames are tradable and transferable sub-domains deployed on Optimism that are fully integrated with the Ethereum Name Service (ENS). They can be resolved on popular web3 wallets i.e Coinbase Wallet by utilizing an off-chain ENS resolver. We built the Optinames toolset to enable anyone to easily and cheaply create ENS subdomain-based communities.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\n- Developers can leverage our tools to create their own ENS communities on Optimism. One such project is ECC Name Service, the largest Optimism native ENS community with more than 3,797 unique users & over 19,132 names registered. - The integration of Optinames by Coinbase Wallet has greatly increased the user-friendliness of transacting on Optimism, making it a more attractive option for users.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nOptinames has previously been funded by the ENS Ecosystem working group via the monthly small grants competition as well as community contributions during the Gitcoin-grants alpha round. - October 2022 ENS small grants competition (top 5 winners) - https://ensgrants.xyz/rounds/8 - 1 ETH. - Gitcoin grants alpha round - community contributions - USD 4260.", - "team_size": "The Optinames core team is a diverse group based in Nairobi, Kenya comprised of: Steve Gachau (stevegachau.eth), a back-end dev with extensive experience in solidity. Hellen Stans (hellenstans.eth) is a seasoned product manager who has worked on several successful web3 projects. Violah Matwaka (violah.eth) is a talented front-end dev with a passion for designing intuitive user interfaces.", - "address": "0x1D7b8D3c6c896d7eB4f9118Ea377C359073d4083", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x1208a26FAa0F4AC65B42098419EB4dAA5e580AC6", - "project_pathname": "0x1208a26FAa0F4AC65B42098419EB4dAA5e580AC6", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_stevegachau_optimismresolver_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Thumbs Up Finance", - "socials": [ - "https://twitter.com/thumbsupfinance", - "https://mirror.xyz/thumbsupfinance.eth" - ], - "description": "For almost two years I've been learning everything I can about cryptocurrency and distilling it down to entertaining critiques, deep dives, and tutorials to help people understand and engage with cryptocurrencies, blockchain technology, and web3 protocols safely and productively.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nI'm not just a content creator, I'm an outspoken advocate of things like open source, public goods, tools for financial and social equity, and beyond. I aim to provide entertainment and education, but not clich\u00e9, boring, nor overly hype-driven content; fun, unique, and entertaining written and video content for people to engage with.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nI've got a 9-5 job fully separate from crypto. It just barely covers my living costs, student loans etc. Any money I've made in crypto I've made by doing work for DAOs, writing for bounties, grants, and contests (I'm one of the most decorated winners of such programs for 2021/2022). Since the bear market began though, I've had almost no work. I keep grinding though, broke as I have been.", - "team_size": "1 person.", - "address": "0x4d85e4F760fb58E380f02657AE5Aafb8bd010601", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x4d85e4F760fb58E380f02657AE5Aafb8bd010601", - "project_pathname": "0x4d85e4F760fb58E380f02657AE5Aafb8bd010601", - "optimismAddressFound": true, - "optimismBalanceEth": 0.004246573896006605, - "github_data": [] - }, - { - "project": "Optimism FM", - "socials": ["https://twitter.com/jiananxz", "http://www.optimism.fm/"], - "description": "Optimism FM is a collaborative and open (unofficial) community dedicated to promoting the adoption of Optimism by disseminating information about its technology,ecosystem,governance processes and public goods, in Chinese. Our goal is to reach all China citizens and Chinese speakers in general, so that they can learn about the benefits of this Ethereum scaling solution.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nOptimsim FM believes it is equally important to make more people aware of the existence of these public products and to bring them to the attention and understanding of a wider audience, in addition to getting directly involved in the way the code is programmed. We want to use another way, a media, to influence and spread the promotion of the OP Stack, the construction of public goods, with words,", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nI work in a department store and earn about $1000 a month. All operating expenses for the Optimism FM project come from my salary and part-time income", - "team_size": "Optimism FM is a small team, run by me and two other friends.Work together on content planning, article translation, feature interviews, offline party events, etc.", - "address": "0x09c41efc1C7E2C2A11Bb153eF39AFFeaFf2CeDcD", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x09c41efc1C7E2C2A11Bb153eF39AFFeaFf2CeDcD", - "project_pathname": "0x09c41efc1C7E2C2A11Bb153eF39AFFeaFf2CeDcD", - "optimismAddressFound": true, - "optimismBalanceEth": 0.2767153851440616, - "github_data": [] - }, - { - "project": "Solidity", - "socials": [ - "https://twitter.com/solidity_lang", - "https://github.com/ethereum/solidity", - "https://soliditylang.org/" - ], - "description": "Solidity is a statically-typed curly-braces programming language designed for developing smart contracts that run on Ethereum.", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nSolidity is used to write smart contracts for various EVM-compatible chains (including rollups like Optimism). Currently, Solidity is the most used language for smart contracts on Ethereum. According to DeFi Llama, more than 90% of all \"DeFi TLV\" is locked in contracts written in Solidity. The L1 and L2 contracts for Optimism itself are also written in Solidity.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nThe Solidity programming language is an open-source, community project governed by a core team. The core team is sponsored by the Ethereum Foundation (see https://soliditylang.org/about/). Besides the funding from the Ethereum Foundation, the Solidity team received a contribution from the first Optimism RPGF round in 2021.", - "team_size": "The core team currently consists of 10 people.", - "address": "0xF0F1eF973C7Ae51Ef7ae917812932569100956ae", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x151EF20A3ADe1CC1161391594f8a32461389a54e", - "project_pathname": "0x151EF20A3ADe1CC1161391594f8a32461389a54e", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_ethereum_solidity_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Rust-cannon-template", - "socials": [ - "https://twitter.com/WillemOlding1", - "https://github.com/willemolding", - "https://github.com/willemolding/rust-cannon-template" - ], - "description": "The Rust Cannon template is a starting point for developers who want to build and experiment with the provable execution layer of the OP stack. It makes it simple to compile Rust code to MIPs with helpers to read inputs, write outputs and access the pre-image oracle. The results of the execution of this code can be fraud-proven on-chain using the OP stack challenge game Solidity contracts.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nPreviously only Golang was supported by Optimism for targeting for the Cannon provable execution layer. Adding support for Rust means a lot of existing code and expertise can be leveraged in building for the OP stack. This will hopefully lead to more experimentation and innovation. This has the potential to challenge projects such as TrueBit and Cartesi for on-chain provable execution.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWork on this project was done in spare time and without funding. It has no sources of revenue.", - "team_size": "2", - "address": "0xc0017405E287476443Ab1B342B86f2ea92Ef9F73", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xc0017405E287476443Ab1B342B86f2ea92Ef9F73", - "project_pathname": "0xc0017405E287476443Ab1B342B86f2ea92Ef9F73", - "optimismAddressFound": true, - "optimismBalanceEth": 0.02, - "github_data": [ - "data/github/https:__github.com_willemolding_events_2022-07-01_2023-03-01.json", - "data/github/https:__github.com_willemolding_rust-cannon-template_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Small Brain Games", - "socials": [ - "https://twitter.com/0xsmallbrain", - "https://github.com/smallbraingames", - "https://words3.xyz/" - ], - "description": "Small Brain Games is focused on quickly iterating on casual games. These games: 1. Are open source and fully on-chain 2. Strive to be accessible to anybody\u2013not just crypto-native users 3. Are about persistence and composability (less so than ownership) We've launched Words3, a fully on-chain word game on Optimism. We have 2 more games queued up for Q1 2023.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWords3, a game launched on Optimism, was played by around 100 unique wallets. These people had to learn about Optimism, bridge to the chain, and play a game on it! Also, many of these people had never heard of Optimism (or some, even rollups) before. This is a great type of audience to bring to the chain.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nGrant funding from 0xPARC. No revenue was taken from Words3, which is the game we've launched so far.", - "team_size": "1 FT member", - "address": "0xc152Cc22488f1383E675f5738dF9a4244fB113a5", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xc152Cc22488f1383E675f5738dF9a4244fB113a5", - "project_pathname": "0xc152Cc22488f1383E675f5738dF9a4244fB113a5", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_smallbraingames_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Blockscout", - "socials": [ - "https://twitter.com/blockscoutcom", - "https://github.com/blockscout", - "https://blockscout.com/" - ], - "description": "Blockscout is the first fully-featured open-source blockchain explorer available for use by any EVM chain. Blockscout currently supports 120+ different chains. We are currently working on 2.0 version: https://docs.blockscout.com/about/roadmap/blockscout-2.0 WIP: https://eth-goerli.blockscout.com/ OP instances will be among the first where 2.0 will be deployed in Q2 this year.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWe are actively working with OP team since summer 2022 to support full transparency and searchability for all Optimism data. In addition to a mainnet instance, we are supporting the Optimism Goerli instance and supported recent upgrades through Bedrock Alpha and Beta. We also spun up a custom explorer for the OPCraft game featured at Devcon and are ready to support any other future OP instances.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nAs an open-source project without any external funding or token, we completely rely on grants. Main sources include Gitcoin, grants from Ethereum Foundation, and grants from various ecosystems we are collaborating with: Gnosis Chain, Optimism, Astar Network, and others.", - "team_size": "Currently, there are 18 people contributing to the project either in a full or part-time capacity.", - "address": "0x242ba6d68FfEb4a098B591B32d370F973FF882B7", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x245cE6de47A5D44E5B73f923F1aDA4cc1688D22b", - "project_pathname": "0x245cE6de47A5D44E5B73f923F1aDA4cc1688D22b", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_blockscout_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "MetricsDAO", - "socials": ["https://twitter.com/MetricsDAO", "https://metricsdao.xyz/"], - "description": "We are a community of data analysts and web3 enthusiasts who provide Web3 organizations with on-demand data insights and tooling. We have a community of 4700 members, most of them actively completing analytics challenges and/or taking part in our educational programs, including web3 analytics, and web3 ecosystem-specific programs.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWe regularly host Ethereum 101 live sessions, and have more in-depth Etherem content and resources in our learning platform. There, we introduce roll-up technologies, including OP\u2019s innovation as the key driver behind scaling Ethereum. As we believe in the innovation brought by the OP's roll-up technology , on the 2nd of March we are hosting a Optimism 101 webinar for our community.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nMetricsDAO's runway comes from client revenue ($400k in 2022, $45k Jan \u201823, $110k Feb \u201823), $250k in funding from Flipside Crypto (https://discourse.metricsdao.xyz/t/proposal-funding-to-secure-metricsdao-runway/217), and we are currently exploring an additional fundraise. Also, MetricsDAO has contractual agreements with Flipside Crypto to subservice bounties of Flipside Crypto partners.", - "team_size": "Total number of contributors: 60 Education team: 8", - "address": "0xC4467e31C1E21187700Cd2Ae759369Dc4C5206c6", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x4c6E3610a222E4518cc7ef3d8826Ee8640995c5C", - "project_pathname": "0x4c6E3610a222E4518cc7ef3d8826Ee8640995c5C", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0025, - "github_data": [] - }, - { - "project": "blst by Supranational", - "socials": [ - "https://twitter.com/_Supranational", - "https://github.com/supranational", - "https://supranational.net/" - ], - "description": "blst is a BLS12-381 signature library focused on performance and security. The library has undergone security audits and formal verification, and supports assembly backends for x86 and ARM platforms. Currently blst is used by all of the Eth2 / Ethereum consensus clients (Prysm, Lighthouse, Teku, Nimbus, and Lodestar). blst is a critical component for enabling scalability and performance of PoS.", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nBLS signatures can help to reduce the cost of data availability for L2 transactions by aggregating multiple sigs into a single sig. The security of L2 protocols also inherent their security from the L1 protocol, and therefore the security of L2s are directly dependent on the cryptographic libraries used by the L1 teams. The OP Stack is crucial for enabling decentralization and scalability for Eth", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nSupranational is self-funded by the founding team and obtains revenue for software and hardware development services.", - "team_size": "~10", - "address": "0x0a6CD04Ca9Ce730c709276C6868D9F2C4D9Ef1D6", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x0a6CD04Ca9Ce730c709276C6868D9F2C4D9Ef1D6", - "project_pathname": "0x0a6CD04Ca9Ce730c709276C6868D9F2C4D9Ef1D6", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_supranational_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Women Biz - Optimism education", - "socials": [ - "https://twitter.com/HiWomenbiz", - "https://github.com/womenbiz", - "https://%20https//hiwomenbiz.com/" - ], - "description": "Would you like to help us impact more women? Our next project is focused on carrying out free courses that open the doors to Web 3, even if they don\u2019t know anything about this world. We want at least 10 women from different cities outside of Lima participating. Block 1: Introduction to web 3 - I Block 2: Basic concepts about metaverse, networks, smart contracts, tokens. Block3: Specialization", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWe will work together to continue promoting the participation of women in web3, Blockchain and the OP ecosystem. Another objective is for more women to present their projects and be able to access funds from the OP ecosystem. The public good is Education", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe sustain ourselves thanks to the support of local communities and DAOS: *AndinoDao: Network and presence in social media *NTT Data: Place to organize our events *Local entrepreneurships leaded for women: Merch and gifts to our team. But all of those are\u00b4nt enough to make our project become to reality. For that we are applying to the OP Grants.", - "team_size": "Women Biz is a community of women empowering women through the web3. We are a team of 20 ambassadors representing us across the country and more than 100 active women participating in our events.", - "address": "0x0693401dF5CbAE158be6bbAdDD69d52283a8076E", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x0693401dF5CbAE158be6bbAdDD69d52283a8076E", - "project_pathname": "0x0693401dF5CbAE158be6bbAdDD69d52283a8076E", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_womenbiz_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Attestation Station Interface", - "socials": [ - "https://twitter.com/soyboy_vegan", - "https://github.com/sbvegan", - "https://attestationstation.xyz/" - ], - "description": "This project provides a no-code solution for builders and community members to directly interact with the AttestationStation smart contract.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nThis project helps the OP Stack as we are starting to build out an identity layer with the AttestationStation (and Optimist NFTs). This tool allows anyone to interact with the AttestationStation smart contract and helps builders understand the underlying building blocks. This will grow to have more functionality and hopefully inspire more things to be built on these primitives.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nI work full time as a Senior Solutions Engineer and I have received a one time grant from Perpetual Protocol in the past. This project's hosting and analytics all come out of my own pocket.", - "team_size": "I'm the only developer working on this project but it's fully open source and open to outside contributions.", - "address": "0x5EfF4B8c042AA6003cBDA6E32C4aA23657d3b6AF", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x5EfF4B8c042AA6003cBDA6E32C4aA23657d3b6AF", - "project_pathname": "0x5EfF4B8c042AA6003cBDA6E32C4aA23657d3b6AF", - "optimismAddressFound": true, - "optimismBalanceEth": 0.3200600405873465, - "github_data": [ - "data/github/https:__github.com_sbvegan_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Sugar", - "socials": [ - "https://github.com/stas", - "https://github.com/velodrome-finance/sugar/" - ], - "description": "Sugar makes Velodrome devs life sweeter Sugar was born as the need to unify the 10+ contracts handling Velodrome into an easy to use interface with full access to the normalized dataset representing the real-time state of our protocol.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nSugar massively reduced our RPC costs and improved our V2 UI/UX. It reduced the development time and maintenance, and allowed to onboard partners into protocol mechanics with minimal effort. Developers are free to use it to integrate Velodrome liquidity pool data and even historical emissions, veNFT status and available rewards or just display the voting distribution.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nCore contributing dev at Velodrome Finance, other open source projects.", - "team_size": "While building sugar I benefited from feedback and reviews from https://github.com/ethzoomer and https://github.com/AkemiHomura-maow", - "address": "0x892Ff98a46e5bd141E2D12618f4B2Fe6284debac", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x892Ff98a46e5bd141E2D12618f4B2Fe6284debac", - "project_pathname": "0x892Ff98a46e5bd141E2D12618f4B2Fe6284debac", - "optimismAddressFound": true, - "optimismBalanceEth": 0.8390104563609855, - "github_data": [ - "data/github/https:__github.com_stas_events_2022-07-01_2023-03-01.json", - "data/github/https:__github.com_velodrome-finance_sugar__events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Boardroom", - "socials": [ - "https://twitter.com/boardroom_info", - "https://github.com/boardroom-inc", - "https://boardroom.io/" - ], - "description": "Boardroom is a comprehensive and user-friendly governance dashboard helping increase participation in voting and decision-making in DAOs. It allows token holders, from institutions to contributors, to influence the direction of their projects by making faster, smarter, and more informed governance decisions. The Governance API makes this data accessible to any stakeholder or developer.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nThe dashboard is free and fully integrated with Optimism governance to display all information in an intuitive way for users, facilitating decision-making when delegating and voting. Boardroom has also integrated the forum, snapshot, onchain governance, and information about Optimism. Boardroom also provides weekly recaps of governance and forum activity, delegates, proposals, news, and calls.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nVenture funding, protocol grants", - "team_size": "9", - "address": "0xF6a4475a006b28b9996c92bEE27DEEDc38032cDe", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xc1a69F906Ce4366C0C77e0219b3132FeA0969231", - "project_pathname": "0xc1a69F906Ce4366C0C77e0219b3132FeA0969231", - "optimismAddressFound": true, - "optimismBalanceEth": 0.8045, - "github_data": [ - "data/github/https:__github.com_boardroom-inc_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "OptiChads", - "socials": ["https://twitter.com/OptiChads", "https://optichads.art/"], - "description": "OptiChads is an 10K NFT Collection that utilizes art and human psychology to promote health & wellness culture on OP.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nOur original art has onboarded many new users to Optimism. Half of our mint was donated to retropgf.eth We famously gave out 50,000 OP through fitness challenges that increased the social presence of Optimism while strengthening the health of its users. We continue to build new art and tools (like an upcoming exchange) that will grow the usage of the OP Stack.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\n- OptiChads was entirely self funded by myself the artist (Dicaso). - 5E gained from our mint after our 5E donation - 600 Chads in our Treasury (Worth 24E currently) - Royalties from secondary sales is my only source of income. OptiChads is my full time job. Our holdings are for giveaways and future partnerships and aren't so liquid currently.", - "team_size": "6 Total: Artist - @Dicaso5 Dev - @DistractionBoy_ Discord Team (4)", - "address": "0x10850762bAc0dc6660630c1EfFe188A7cbFDdc88", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x10850762bAc0dc6660630c1EfFe188A7cbFDdc88", - "project_pathname": "0x10850762bAc0dc6660630c1EfFe188A7cbFDdc88", - "optimismAddressFound": true, - "optimismBalanceEth": 0.000906999512425505, - "github_data": [] - }, - { - "project": "Nethermind", - "socials": [ - "https://twitter.com/nethermindeth", - "https://github.com/NethermindEth", - "https://nethermind.io/" - ], - "description": "Nethermind is a team of world-class builders and researchers. We empower enterprises and developers worldwide to access and build upon the decentralized web. Our work touches every part of the Web3 ecosystem, from our Nethermind node to fundamental cryptography research and application-layer protocol development. We\u2019re passionate builders solving Ethereum\u2019s most difficult challenges.", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWe contribute to the continuous development of Ethereum by building a high-performance and highly configurable Nethermind Execution Client and working on various EIPs. This in turn benefits Optimism and its ecosystem.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nGrants from the Ethereum Foundation and we generate revenue from development, research and security related work.", - "team_size": "~220", - "address": "0xbc11295936aa79d594139de1b2e12629414f3bdb", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xFED0e586cB372Fd0b17ead9F8cb1347BF8a5937f", - "project_pathname": "0xFED0e586cB372Fd0b17ead9F8cb1347BF8a5937f", - "optimismAddressFound": true, - "optimismBalanceEth": 0.009848771375476977, - "github_data": [ - "data/github/https:__github.com_NethermindEth_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Token Terminal", - "socials": [ - "https://twitter.com/tokenterminal", - "https://tokenterminal.com/" - ], - "description": "Token Terminal is a platform that aggregates financial data on the leading blockchains and decentralized applications.", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nAllowing users to track financial data on blockchains and decentralized applications (dapps) that run on blockchains including Dapps that run on Optimism network, for example, Lyra, Kwenta, Velodrome, Synthetix, ETC. Updating Optimism progress by showing active developers and code commits. Featuring OP in our content, e.g. https://youtu.be/gqOP5wHy-pw & https://tokenterminal.com/crypto-researc", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nRevenue from Token Terminal PRO subscriptions, and we've also raised outside funding over the years.", - "team_size": "20", - "address": "0xeB67e286faf667A047e435EC90107122b0bC2C01", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xeB67e286faf667A047e435EC90107122b0bC2C01", - "project_pathname": "0xeB67e286faf667A047e435EC90107122b0bC2C01", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [] - }, - { - "project": "Perpetuals Dune Abstraction", - "socials": ["https://twitter.com/robplust", "https://github.com/RplusT"], - "description": "The perpetuals trading abstraction on Dune standardizes the trading data amongst all the perpetuals trading platforms on Optimism and makes them all accessible in a single table, called perpetuals.trades. The primary goal is to help analysts and builders alike in gaining a deep understanding of the perpetuals market and in building tools related to the data being surfaced.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nThe goal of this abstraction was to make the analysis of perpetuals convenient and accessible. As one of the main use cases of Optimism, it's important to keep track of the related metrics and help others build on top of the perpetuals data. Michael of OP Labs, other analysts, and various parties (eg traders) have been able to use this data for their analyses of the market and Optimism as a whole", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nI didn't/don't get paid for building and maintaining this project but I do have a separate full-time job that pays me a monthly salary to sustain myself.", - "team_size": "While I was the one who primarily built the abstractions themselves, my discussions with drethereum, and Michael Silberling were invaluable in helping me gain a good understanding of the perpetuals trading landscape on Optimism.", - "address": "0x08290908a251119a1C75bb9C36A7A41e9BF2f1E3", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x08290908a251119a1C75bb9C36A7A41e9BF2f1E3", - "project_pathname": "0x08290908a251119a1C75bb9C36A7A41e9BF2f1E3", - "optimismAddressFound": true, - "optimismBalanceEth": 0.20728109603629483, - "github_data": [ - "data/github/https:__github.com_RplusT_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "DexKit", - "socials": [ - "https://twitter.com/dexkit", - "https://github.com/DexKit", - "https://dexkit.com/" - ], - "description": "We offer no code solutions for (digital) artists, collectors and crypto projects, allowing them to deploy crypto focused websites. Clients that use our white label tool can customize everything within the app: look and feel, fees, customize pages, add custom domains, among others. This specific tool is a CMS focused on crypto content. We also provide a collection wizard powered by AI.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nToday Optimism network users have the opportunity to: [1] create amazing NFT collections with generative art using our Contract Wizard; [2] sell them on your own third-party free crypto website, thus controlling every aspect of your sales and [3] trading tokens within the OP network using the same crypto website that has been created given the inclusion of the swap platform \"on steroids\".", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nOur current business model includes the fee that we collect on our swap interfaces. In turn, we still have a few thousand dollars received from grants from our same 0x DAO, Polygon Studios (another project that helps us in our journey). We also provide personalized support to crypto entrepreneurs who want to deploy a site with more advantages and customizations than those allowed by our free pla", - "team_size": "Five", - "address": "0x5265Bde27F57E738bE6c1F6AB3544e82cdc92a8f", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x5265Bde27F57E738bE6c1F6AB3544e82cdc92a8f", - "project_pathname": "0x5265Bde27F57E738bE6c1F6AB3544e82cdc92a8f", - "optimismAddressFound": true, - "optimismBalanceEth": 0.04977826796723874, - "github_data": [ - "data/github/https:__github.com_DexKit_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Remix Project", - "socials": [ - "https://twitter.com/EthereumRemix", - "https://github.com/ethereum/remix-project", - "https://remix-project.org/" - ], - "description": "The Remix Project is a rich toolset including Remix IDE, a comprehensive smart contract development tool available for web and desktop. Remix Plugin Engine and Remix Libraries are low-level tools for wider use. Remix IDE can be used for the entire journey of contract development by users of any knowledge level and as a learning lab for teaching and experimenting with Ethereum.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWe foster the usage of Optimism from the Remix interface. Devs can seamlessly connect to Optimism using the Metamask api and to the Optimism bridge. We reward our contributors with NFT Badges that they mint on Optimism. We want to expand the Optimism integration - including setting up a debug node. We also want to educate devs about the advantages of using Optimism.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe receive funding from the Ethereum foundation.", - "team_size": "8 people", - "address": "0x2ba1aebA3fBd69aa74944F17326Bfdc229fD986E", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x2ba1aebA3fBd69aa74944F17326Bfdc229fD986E", - "project_pathname": "0x2ba1aebA3fBd69aa74944F17326Bfdc229fD986E", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_ethereum_remix-project_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Zapper", - "socials": ["https://twitter.com/zapper_fi", "https://zapper.xyz/"], - "description": "Zapper is a social web3 explorer which allows users to follow the blockchain journey of other people in NFTs, DeFi and DAOs. Our mission to make the blockchain readable and accessible to everyone. We believe that a self-custodial and decentralized future allows for more economic freedom, and that making the blockchain easier to understand is a critical problem to solve to attain this future.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWe support the OP ecosystem in many ways: - Users can track all of their OP assets, including DeFi and NFT assets - Users can swap on Optimism and bridge to Optimism - We've indexed every Optimism NFT collection, enabling users to explore and find new opportunities - Any OP protocol builder can easily integrate their project to Zapper using Zapper Studio", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe raised $1.5M in seed funding in August 2020, and $15M in a series A in May 2021. We generate revenue on exchange and bridge fees, while also charging fees to users of our API service.", - "team_size": "The team is currently 23 people strong. Mostly based in Canada, US and Europe.", - "address": "0x7f9d4208d404d86396f856c4f3db0195bb677f17", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x7f9D4208D404d86396F856C4f3db0195bB677f17", - "project_pathname": "0x7f9D4208D404d86396F856C4f3db0195bB677f17", - "optimismAddressFound": true, - "optimismBalanceEth": 0.000403261634781658, - "github_data": [] - }, - { - "project": "Nested", - "socials": [ - "https://twitter.com/nestedfi", - "https://github.com/NestedFi", - "https://nested.fi/" - ], - "description": "The crypto world suffers from general over-complication and unbearable user experience that dissuade people from getting involved. Nested is a crypto trading/investing platform that breaks that trend by revolutionizing the accessibility to web3 in a way that is unprecedentedly simple, social and safe.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nNested\u2019s platform will make Optimism accessible to everyone around the world. As Layer 2 chains are attracting more and more users & liquidity, and as new Layer 1s emerge, it\u2019s necessary for Optimism to maintain a high level of attractivity, possibility, and capital efficiency. Nested will be able to offer a unique UI/UX to onboard new users with a wide range of integrated DeFi solutions.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe take a fee on every user's transaction between 0.3% and 0.8%, depending on the nature of the operation. For instance, if a user creates a custom index with 1000 USDC on Nested, there is a 0.3% fee (=3$). We also raised about $7.5M from the most renowned angel and institutional investors, including Jump, Alan Howard, Julien Bouteloup (Curve, Rekt, StakeDAO), Marc Zeller (Aave), DeFi Dad, etc.", - "team_size": "21 mainly based in the UK, France and Switzerland, including 13 developers.", - "address": "0xf944069B489F1ebfF4C3C6a6014d58cBEf7C7009", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x0BE55326919F08Af4D14A42aAfb3B68F95738355", - "project_pathname": "0x0BE55326919F08Af4D14A42aAfb3B68F95738355", - "optimismAddressFound": true, - "optimismBalanceEth": 0.2114556964725364, - "github_data": [ - "data/github/https:__github.com_NestedFi_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "RadicalxChange Foundation", - "socials": [ - "https://twitter.com/RadxChange", - "https://github.com/RadicalxChange", - "https://www.radicalxchange.org/" - ], - "description": "RadicalxChange (RxC) is a global movement for next-generation political economies. We\u2019re committed to advancing plurality, equality, community, an decentralization through upgrading democracy, markets, the data economy, the commons, and identity. Founded by economist Glen Weyl in 2018, the RadicalxChange Foundation is a 501(c)(3) nonprofit dedicated to advancing the RxC movement.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nRxC contributes with research and experimentation that helps orient crypto towards public goods funding and plural political economies. It's the hub out of which Quadratic Funding came out, and, more recently, the ideas around DeSoc and non-transferrable tokens, which relates to Optimism\u2019s attestation and social layer.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nIndividual donations and philanthropic grants (see full list of supporters here https://www.radicalxchange.org/about/ )", - "team_size": "5", - "address": "0x3945D766185E2264900C84faC10958B3619C2bD4", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x3945D766185E2264900C84faC10958B3619C2bD4", - "project_pathname": "0x3945D766185E2264900C84faC10958B3619C2bD4", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_RadicalxChange_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Blocktrend (\u5340\u584a\u52e2)", - "socials": [ - "https://twitter.com/astro_hsu", - "https://github.com/astro-hsu", - "https://blocktrend.substack.com/" - ], - "description": "Blocktrend is a Taiwan-based independent media that focuses on blockchain and Web3. We have been publishing original and explanatory articles and podcasts since 2017 to help readers understand Web3 in a simple and easy-to-understand way and encourage them to gain hands-on experience. Blocktrend have produced over 500 articles and 200 podcast interviews to date, ranking #1 on Apple Podcast in TW.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nBlocktrend have written 4 articles related to OP Stack, including intro to Optimism ecosystem, how RetroPGF works, and governance model of OP Collective. The article on RetroPGF is the only Chinese in-depth content on this topic and has been recommended by admin of the Optimism Discord community. We partnered with g0v.tw launch a podcast called \"da0\" aimed at helping people understand public goods", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nBlocktrend sustain by paid subscriptions from its readers at $8/month. Despite this, over 70% of our articles and all of our podcast content is available to the public, making it accessible to even those who do not subscribe. In Asia, there is not a strong culture of paying for subscriptions, and currently has approximately 700 paying members, 14,000 free readers, and 20,000 free podcast listeners", - "team_size": "We consists of 1 writer and 3 editors. The writer decides the topics, writes the articles, and conducting interviews, while the 3 editors each handle editing the articles, podcasts, creating and publishing infographics to social media. Blocktrend regularly releases 2 articles, 1 podcast episode, and 1 visual piece every week, and has been consistently operating for 5 years without interruption.", - "address": "0x36F322fC85B24aB13263CFE9217B28f8E2b38381", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x36F322fC85B24aB13263CFE9217B28f8E2b38381", - "project_pathname": "0x36F322fC85B24aB13263CFE9217B28f8E2b38381", - "optimismAddressFound": true, - "optimismBalanceEth": 0.10627896516932497, - "github_data": [ - "data/github/https:__github.com_astro-hsu_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Nimbus", - "socials": [ - "https://twitter.com/ethnimbus", - "https://github.com/status-im/", - "https://nimbus.team/" - ], - "description": "Nimbus is a client implementation for both Ethereum\u2019s consensus layer and execution layer that strives to be as lightweight as possible in terms of resources used. This allows it to perform well on embedded systems, embedded devices \u2013 including Raspberry Pis and mobile devices.", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nNimbus is trying to accelerate the development of L2 protocols such as OP through the ongoing work on EIP-4844. In the future, we hope to bring more client diversity in the Optimism network, both in terms of node software for end users and in highly efficient components for the construction and verification of fault proofs.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe receive development grants for the Ethereum Foundation, donations for individuals and revenue from Ethereum staking and oracle node provision services. These sources of funding are currently not enough to cover our development costs and the sustainability of the project depends on additional funding from Status.im.", - "team_size": "8", - "address": "0x4F0E571C956d54658FD9eBee5e5B4279eB5e765a", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x4413E96F6b46e59326a7695eF871FA902Ff7935d", - "project_pathname": "0x4413E96F6b46e59326a7695eF871FA902Ff7935d", - "optimismAddressFound": true, - "optimismBalanceEth": 0.01, - "github_data": [ - "data/github/https:__github.com_status-im__events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Erigon", - "socials": [ - "https://twitter.com/ErigonEth", - "https://github.com/ledgerwatch" - ], - "description": "Erigon is an implementation of Ethereum (execution client), on the efficiency frontier. Archive Node by default.", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nErigon has a fast and compact data model, pushing the boundaries of archive node performance. More innovations are coming: check out https://twitter.com/ErigonEth", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nThe Ethereum Foundation and Gnosis DAO, among others, have been supporting Erigon.", - "team_size": "16", - "address": "0x9D20893054afC4A74b856089c44F9A09d1C38Db0", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x9D20893054afC4A74b856089c44F9A09d1C38Db0", - "project_pathname": "0x9D20893054afC4A74b856089c44F9A09d1C38Db0", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_ledgerwatch_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Espacio Cripto", - "socials": [ - "https://twitter.com/EspacioCripto", - "https://t.me/espaciocripto" - ], - "description": "Espacio Cripto is a web3 community founded in 2019 focused on providing education in an inclusive, safe, and kind environment We think that understanding this industry is like understanding the internet in 1997. We want to accelerate crypto knowledge and adoption for Spanish-speaking people We engage with our community with weekly podcasts (+ 153 episodes), IRL events, Telegram, and other channels", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWe believe that access to education should be a public good, so we've been producing educational content for 2 years without charging anything to the community. We support the development of the OP Stack by helping people understand what it is, how to get involved, and incentivizing the community to explore and question the space. The public good we provide is free educational content.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nThe founders sustained the expenses for some time; then we got grants and sponsorships from organizations like: - The Ethereum Foundation - Ethereum Global - Bitso, the largest crypto exchange in LATAM We think education should be free, so we don't charge anything to our community. All money gather goes to produce content and to educate the community. The founders don't profit from EC.", - "team_size": "7 People: - Lalo: founder - Abraham: founder - Anatech: community lead - Diego: content analyst and researcher - Vale: design and media lead - Gabo: strategic design - Fede: Operations analyst", - "address": "0x1d4d44Bca3F094A64db1f5C2AAdc636B8e557772", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xcE36608441F24E2d5642932F2A511D98BBBC06A9", - "project_pathname": "0xcE36608441F24E2d5642932F2A511D98BBBC06A9", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [] - }, - { - "project": "Optimism Cult Merch", - "socials": [ - "https://twitter.com/prosto_crypto", - "https://drive.google.com/drive/folders/1PIE70_FxSJZMps-21MbcofRq37Y75IX2?usp=share_link" - ], - "description": "CULT MERCH optimism is an exclusive T-shirt collection consisting of several themes: 1. optimism Cultists. 2. optimistic Evil 3. Opti Samurai. + a few bonus ones: for the OPLabs team and minimalistic ones with different lettering Each print is hand-drawn by me with love. The t-shirts will be two colors, white and black.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nEvery person who has a measure of optimism falls under the distribution of OR tokens. I help spread optimism to the masses because my T-shirts can be worn to any event.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nMy income from drawing a month 200-300$ This is my only income", - "team_size": "1", - "address": "0x59E6Ca75DFb201BAFF565303CA52A3113DD6F223", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x59E6Ca75DFb201BAFF565303CA52A3113DD6F223", - "project_pathname": "0x59E6Ca75DFb201BAFF565303CA52A3113DD6F223", - "optimismAddressFound": true, - "optimismBalanceEth": 0.004328000276340408, - "github_data": [] - }, - { - "project": "Ethers", - "socials": [ - "https://twitter.com/ricmoo", - "https://github.com/ricmoo", - "https://ethers.org/" - ], - "description": "Ethers is a complete and compact library for Ethereum and related chains, providing all functionality required for dapps, wallets and any other utilities and scripts. It is widely used throughout the community and is a dependency for a large portion of the ecosystem with over 4 million npm downloads monthly.", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nAs OP is an Ethereum-compatible chain, the library is used extensively by developers working with Optimism, providing a comprehensive library of classes and functions to interoperate with contract ABIs, address calculation, signing, hashing and other cryptographic and protocol algorithms. The providers also enable simple, consistent access to the optimism network.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nCurrent funding sources includes: EF funding, GitHub Sponsors and GitCoin.", - "team_size": "The team is primarily just me, Richard Moore. I do occasionally get additional assistance from one or two others and in v6 working towards being able to delegate more work to other.", - "address": "0x8ba1f109551bD432803012645Ac136ddd64DBA72", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x8ba1f109551bD432803012645Ac136ddd64DBA72", - "project_pathname": "0x8ba1f109551bD432803012645Ac136ddd64DBA72", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_ricmoo_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "raise_exception (rotate.eth)", - "socials": [ - "https://twitter.com/raise_exception", - "https://github.com/rotate-eth" - ], - "description": "I am an independent researcher assisting crypto-native communities separate genuine users from Sybil attacks. This involves raising awareness, informing communities about ongoing attacks against them, providing advice & developing custom tools. I perform in-depth analysis of on-chain data, often identifying & visualising clusters of related addresses.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nA core value of crypto and the OP Stack is decentralization of authority. Sybil attacks are a major challenge to this goal, as a few individuals & teams attempt to gain outsized control of a network. This is furthered by the financial incentive to sell or rent out their voting power. Finding solutions for fair distribution of power is key to a secure & inclusive ecosystem.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nI have a full time job outside of the crypto industry and therefore perform this research for free in my spare time. Additionally I participate in Sybil bounty programs. My efforts are primarily a way of contributing back to the crypto ecosystem after benefiting from price rises in the last market cycles.", - "team_size": "Individual", - "address": "0x400aBc3DAE98Ec5aEEF2681b40D4CEd0A5aff934", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x400aBc3DAE98Ec5aEEF2681b40D4CEd0A5aff934", - "project_pathname": "0x400aBc3DAE98Ec5aEEF2681b40D4CEd0A5aff934", - "optimismAddressFound": true, - "optimismBalanceEth": 0.08961984483562149, - "github_data": [ - "data/github/https:__github.com_rotate-eth_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "MarcoV (Optimism Dashboards)", - "socials": [ - "https://twitter.com/marcov_91", - "https://github.com/MarcoVugts", - "https://dune.com/Marcov" - ], - "description": "Using Dune Analytics (and other analytics platforms), i surface data about the Optimism ecosystem. On a overall level, but also on in-depth on projects, to provide insights on users, transactions, volume, earnings etc. Examples are: - https://dune.com/Marcov/Optimism-Ethereum - https://dune.com/Marcov/Optimism-After-Bridge - https://dune.com/Marcov/OP-Optimism", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWith the analysis/dashboards i build projects and also users of Optimism will gain insights on how the network is doing in terms of usage, and also how specific projects on Optimism are performing. These are all public dashboards for everyone to use.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nCurrently i receive no funding for building these dashboards.", - "team_size": "1", - "address": "0x283266045Ab2aB0793a62CADC21D55f685636Ae0", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x283266045Ab2aB0793a62CADC21D55f685636Ae0", - "project_pathname": "0x283266045Ab2aB0793a62CADC21D55f685636Ae0", - "optimismAddressFound": true, - "optimismBalanceEth": 0.04663379641341249, - "github_data": [ - "data/github/https:__github.com_MarcoVugts_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Web3beach", - "socials": ["https://twitter.com/web3beach", "https://web3beach.io/"], - "description": "web3beach is dedicated to accelerating web3 education and adoption through impactful onboarding in communities where banking services are unavailable. In short, onboarding LatAm through Public Goods. Some of these initiatives include beach clean ups, educational events meet ups, health services", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWe use Optimism for p2p expenses; tuk tuks to beach clean ups, transporting. We're now expanding to other marginalized communities. We're also working with the National Archive of Honduras (Ministry of Culture) to mint historic documents as NFTs to cre ate a public archive and save documents that are being deteriorated", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe've recevied grant funding from GR15 and Alpha rounds on Gitcoin. Ethereum Foundation has also given us 1.25 ETH for activities. All team members are unpaid and have jobs to sustain themselves.", - "team_size": "5", - "address": "0xEFEdaf9c07E6eB56BB8F82f30018e4461B1c5F4c", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xEFEdaf9c07E6eB56BB8F82f30018e4461B1c5F4c", - "project_pathname": "0xEFEdaf9c07E6eB56BB8F82f30018e4461B1c5F4c", - "optimismAddressFound": true, - "optimismBalanceEth": 1.1323139241328635, - "github_data": [] - }, - { - "project": "rotki", - "socials": [ - "https://twitter.com/rotkiapp", - "https://github.com/rotki", - "https://rotki.com/" - ], - "description": "rotki is an open source portfolio tracking, analytics & accounting tool that protects your privacy. The mission of rotki is to bring transparency for crypto through the use of open source. Unlike virtually every other competing service which consists of closed source SaaS onto which you are forced to hand over all your financial data, with rotki your data is stored encrypted locally.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\n- An opensource tool for tracking portfolio of Optimism users across all their optimism addresses and protocols - An opensource tool for doing accounting and PnL across all optimism addresses - An ever growing set of modular opensource decoders to turn optimism transactions into human readable list of events that can be used by other software projects", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe sustain the project mainly through three distinct sources of funding. I will list them in descending order of worth/amount. 1. Grants (like this one) from projects/protocols/chains wanting to fund their integrations into rotki. 2. Donations from users/community (gitcoin) 3. Premium subscription from users.", - "team_size": "6 devs 1 non-dev", - "address": "0x9531C059098e3d194fF87FebB587aB07B30B1306", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x9531C059098e3d194fF87FebB587aB07B30B1306", - "project_pathname": "0x9531C059098e3d194fF87FebB587aB07B30B1306", - "optimismAddressFound": true, - "optimismBalanceEth": 0.1912909149310675, - "github_data": [ - "data/github/https:__github.com_rotki_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "WakeUp Labs", - "socials": [ - "https://twitter.com/wakeuplabs", - "https://github.com/wakeuplabs", - "https://wakeuplabs.io/" - ], - "description": "WakeUp Labs is a start-up that aims to lower the barriers for the integration of web3 features into web2 businesses and projects. The company provides a platform that enables developers, without previous blockchain experience, to integrate web3 features with ease and speed by offering REST APIs for straightforward integration. It offers full compatibility with the Optimism blockchain and others.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWe offer a platform that simplifies the creation of apps on the Optimism blockchain: our REST APIs let any web2 dev or company to deploy contracts, mint tokens, token-gate experiences, query chain info, among others, with ease. We lower the barriers to the minimum for anyone that wants to create using the Optimism chain. Our platform offers a Free tier with which anyone can start their OP journey.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe have recurrent paying customers on our platform. In addition we build ad-hoc blockchain solutions for Web3 projects. We also received USD 50K as pre seed investment from a small venture capital fund.", - "team_size": "Full-time team: * 3 Founders (1 Business & Sales background, 1 Technical Background, 1 Economic Tokenomics Background). * 2 fullstack Developers (Solidity & web3 experience). Part-time team: * 1 Fullstack Developer * 1 Marketing. * 1 Comms. * 1 Graphic Designer.", - "address": "0xab4f5A7fcd1Bb66C8c5f01bB77F6142759f46107", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xab4f5A7fcd1Bb66C8c5f01bB77F6142759f46107", - "project_pathname": "0xab4f5A7fcd1Bb66C8c5f01bB77F6142759f46107", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_wakeuplabs_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "geth", - "socials": [ - "https://twitter.com/go_ethereum", - "https://github.com/ethereum/go-ethereum", - "https://geth.ethereum.org/" - ], - "description": "Geth (go-ethereum) is a Go implementation of Ethereum - a gateway into the decentralized web. Geth has been a core part of Ethereum since the very beginning. Geth was one of the original Ethereum implementations making it the most battle-hardened and tested client.", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWe provide the other side of \"the diff\".", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nThe Ethereum Foundation", - "team_size": "11", - "address": "0x21539334f45Ac41Bd10789942b744a18a4775d6d", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x60AdC0F89a41AF237ce73554EDe170D733ec14E0", - "project_pathname": "0x60AdC0F89a41AF237ce73554EDe170D733ec14E0", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_ethereum_go-ethereum_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "ChugSplash", - "socials": [ - "https://twitter.com/ChugSplash_io", - "https://github.com/chugsplash/chugsplash", - "https://github.com/chugsplash/chugsplash" - ], - "description": "Dev tool for securely deploying and upgrading smart contracts. ChugSplash spun out of OP Labs, where it was designed for Optimism's deployments. Key features: -Define deployments/upgrades declaratively (5-10x less code than deployment scripts) -Consistent addresses across networks via Create2 -Fully deterministic and atomic -Approve upgrades with a single tiny txn -Automatic Etherscan verification", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nIn the short term, ChugSplash aims to be the deployment tool used by Optimism in production. Beyond this, we believe ChugSplash will be used by everyone from solo devs to large teams.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nFunding: angel investors Revenue: none yet", - "team_size": "2 devs", - "address": "0x6D308C0535FA135516a2A0c493001e62088B065D", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x4856e043a1F2CAA8aCEfd076328b4981Aca91000", - "project_pathname": "0x4856e043a1F2CAA8aCEfd076328b4981Aca91000", - "optimismAddressFound": true, - "optimismBalanceEth": 0.000520682632937888, - "github_data": [ - "data/github/https:__github.com_chugsplash_chugsplash_events_2022-07-01_2023-03-01.json", - "data/github/https:__github.com_chugsplash_chugsplash_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Hyperledger Besu", - "socials": [ - "https://twitter.com/HyperledgerBesu", - "https://github.com/hyperledger/besu" - ], - "description": "Hyperledger Besu is an open-source Java implementation of Ethereum's EL. Built initially for enterprise adoption, Besu has private and permissioning features. It's an actively developed Mainnet client. Besu has helped in shaping standards & core development since its beginning as Pantheon. Besu's unique Bonsai tries maintain the lowest storage requirements on Mainnet and it has a stand-alone EVM.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nEIP-1559: Besu championed EIP-1559 and led its adoption on Mainnet, with the first client implementation. This is part of the Bedrock fee structure. Besu is run on ~9% of Mainnet L1 nodes that secure the L2. Besu team is active in Mainnet development. This supports L2 through work on 4844 and other L2-pertinent spec updates. Besu has roadmapped work for a generalizable Rollup client use-case.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nBesu is an open-source project. It is sustained chiefly by its contributors. These are spread across a handful of parent organizations, chiefly ConsenSys, that support their Engineers. The EF Client Incentive Program supports shared infrastructure and some revenue for organizations developing the client. Hyperledger Foundation also provides minimal funding in support of tools, support, and staff.", - "team_size": "The current Besu Maintainer list has 24 members. These are contributors that have repo-level permissions, but do not all actively develop. There are closer to 20 main contributors. The list can be found here: https://github.com/hyperledger/besu/blob/main/MAINTAINERS.md", - "address": "0xAb7A08Be21dFEcd4c9902995F3e30A2659b564E1", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xe4Eb51D709D22FE02C42F68A0483fa70A772e984", - "project_pathname": "0xe4Eb51D709D22FE02C42F68A0483fa70A772e984", - "optimismAddressFound": false, - "optimismBalanceEth": 0, - "github_data": [ - "data/github/https:__github.com_hyperledger_besu_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Lodestar", - "socials": [ - "https://twitter.com/lodestar_eth", - "https://github.com/ChainSafe/lodestar", - "https://lodestar.chainsafe.io/" - ], - "description": "Lodestar is a Typescript ecosystem for Ethereum consensus, developed by ChainSafe Systems. Our flagship product is our production-capable beacon chain and validator client. In addition, we maintain public repositories of useful tools for public use. Some of these libraries include BLS, SSZ, Discv5, Gossipsub, and Noise.", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nActive work is being done to support the OP Stack by enabling EIP-4844 to benefit L2s such as Optimism, reducing tx costs of Layer 2 fees and increasing client diversity at the Layer 1 protocol level. Additionally, Lodestar team members have been working on side projects such as Zipline which used the OP Cannon verifiable computation tools to develop a light client, enabling a trustless bridge.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe are funded with grants from the Ethereum Foundation, Gitcoin donations and open source funding contracts for JS ecosystem open sourced libraries. We are supported by ChainSafe Systems and are a node operator on Lido Finance.", - "team_size": "We are a team of nine: One Project Manager, six full-time protocol engineers, and two devops engineers. We occasionally have community freelancers contribute work to the Lodestar open source project and our surrounding libraries.", - "address": "0xc8F9f8C913d6fF031c65e3bF7c7a51Ad1f3a86E5", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x6Fa4C420E9567203Aa65eB38da5DBe361fD61ff2", - "project_pathname": "0x6Fa4C420E9567203Aa65eB38da5DBe361fD61ff2", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_ChainSafe_lodestar_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Commons Stack", - "socials": [ - "https://twitter.com/commonsstack", - "https://github.com/commons-stack/", - "https://commonsstack.org/" - ], - "description": "Commons Stack builds 'Commons', tokenized communities supporting public goods. To achieve this, years of research have gone into developing cultural frameworks that reinforce Ostrom\u2019s principles of governing commons, novel tools such as the Augmented Bonding Curve, Conviction Voting & Praise reward system, and a radically inclusive methodology (Collaborative Economics) for launching a Commons.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nOur open-source tools & cultural frameworks can be used on Optimism, our most aligned L2, to coordinate the production of public goods. The success of our first Commons, TEC, demonstrates that resilient liquidity is achievable for regen economies. We will continue groundbreaking research and building so that others can employ our tools and frameworks to solve complex world problems.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nCommons Stack is a nonprofit & we\u2019ve never received any investment nor revenue for services. Up until now, our mission to build design patterns for commons-governed token economies has been sustained through generous donations on Giveth & Gitcoin. We\u2019ve also been gifted with long-term partnership endowments from Regen Network & Giveth. Any funding from Optimism will go toward continuing this work.", - "team_size": "Our team is composed of six (6) members who are based in France, Philippines, Brazil, Ecuador, Pakistan & Spain. Four of us have been working together for over 2 years on Commons Stack & collectively we have 22 years of experience in DAOs. We partner closely with various teams like Giveth, Token Engineering Commons, Blockscience, Regen Network, RefiDAO, 1Hive, Blossom Labs and General Magic.", - "address": "0x8110d1D04ac316fdCACe8f24fD60C86b810AB15A", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xC5A756D63C5fe67b438acBE468aA62a52093fDEf", - "project_pathname": "0xC5A756D63C5fe67b438acBE468aA62a52093fDEf", - "optimismAddressFound": true, - "optimismBalanceEth": 0.009632580466447712, - "github_data": [ - "data/github/https:__github.com_commons-stack__events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Optimism Translators Collection", - "socials": [ - "https://docs.google.com/spreadsheets/d/1mLNltubxm2YdNYDdiMZTyiFQm_yzTfrbqTp2zjH6rlk/edit?usp=sharing" - ], - "description": "The Optimism Translators are a group spanning 25 languages. They translate the Optimism User Help documentation, as well as translating blog posts and tweets as they are published. To find the full list of Translators and the weighting of their contributions click on the website link at the top of the profile \u2b06\ufe0f", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nTranslators provide one of the most important things you can contribute - accessibility. They make it easier for a wide (and more decentralised) community to fall in love with the Optimistic vision. They have done so voluntarily, and as such, their impact far outweighs their profit. To see examples of their contributions, check the official discord > resource-for-everyone, where you can see an incomplete list of existing translations.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nThe translators contribute on a voluntary basis", - "team_size": "This collection totals 87 contributors. There are 14 lead translators, who act as proofreaders and translators for our user docs on CrowdIn (our translating software of choice), as well as running the native channels in our discord. There are 31 general CrowdIn translators, who translate our docs into various languages. Last, but certainly not least are the 42 article translators, who, unprompted, translated dozens of blog posts, tweet threads and articles! The contributions of the translators are weighted based on the individual impact (such as the number of words translated in CrowdIn, number of articles translated, etc. See sheet for more info).", - "address": null, - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/translators", - "project_pathname": "translators", - "optimismAddressFound": false, - "optimismBalanceEth": 0, - "github_data": [] - }, - { - "project": "OAYC", - "socials": ["https://twitter.com/OptiApeYC", "https://oayc.io/"], - "description": "OAYC is a completely hand-drawn-from-scratch derivative collection inspired by the iconic BAYC. We have become one of the biggest communities & sold-out projects in the OP NFT space, with 500 $ETH+ secondary sales volume and a strong roadmap for continued growth and utility for the community.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nOAYC has made significant contributions to the educational function of the Optimism network through the following initiatives: - Attracting users from other networks - Exclusive minting for $OP tokens + guide to enter OP NFT space - Unique mechanic: Mutation Event - Supporting ecosystem projects Please check details in the nomination text", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe fund the project through personal initial fundings, income from the mint, and secondary fees.", - "team_size": "10+ members - CEO - CMO - CPO - blockchain dev - front-end dev - back-end dev - artist - 2x mods - collab manager - SMM manager", - "address": "0x81B7E9d8409B857D70aD14073E785c486945CaF4", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x81B7E9d8409B857D70aD14073E785c486945CaF4", - "project_pathname": "0x81B7E9d8409B857D70aD14073E785c486945CaF4", - "optimismAddressFound": true, - "optimismBalanceEth": 0.19322547342617394, - "github_data": [] - }, - { - "project": "MUX Protocol", - "socials": ["https://twitter.com/muxprotocol", "https://mux.network/"], - "description": "MUX Leveraged Trading Protocol - A decentralized leveraged trading protocol that offers zero price impact trading, , no counterparty risks for traders and an optimized on-chain trading experience. A sub-protocol in the MUX protocol suite that automatically selects the most suitable liquidity route and minimizes the composite cost for traders while meeting the needs of opening positions", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nexpand more dapps on optimism ecosystem and much adoption for community on this tech more scalability and usecase for this project", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\njust normal users love optimism To succeed and become more comprehensive on crypto space as best L2 solution", - "team_size": "more details on official docs https://docs.mux.network/protocol/overview", - "address": "0x7b4c5F852AA6b44Bd01F9252C3F93Ae1aa1c63e9", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x7b4c5F852AA6b44Bd01F9252C3F93Ae1aa1c63e9", - "project_pathname": "0x7b4c5F852AA6b44Bd01F9252C3F93Ae1aa1c63e9", - "optimismAddressFound": true, - "optimismBalanceEth": 0.001253642033482962, - "github_data": [] - }, - { - "project": "L2BEAT", - "socials": [ - "https://twitter.com/l2beat", - "https://github.com/l2beat/l2beat", - "https://l2beat.com/" - ], - "description": "L2BEAT is an Ethereum Layer Two (L2) scaling analysis and research website. We compare Ethereum L2s by monitoring their usage & TVL-related metrics, verifying their documentation against the source code, and manually assessing associated risks. We have created a risk framework for L2s and bridges, along with open-source monitoring tools that check for changes in their smart contracts' parameters.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nAs an independent watchdog, we provide the collective with an objective analysis of the various projects built on top of the OP stack. As an open-source developer, we provide tools that can be reused by other projects analysing OP stack projects. As an active delegate, we help the OP ecosystem to grow and we engage in building effective decentralised governance mechanisms.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe have strategic support and grants from the Ethereum Foundation and have received funding from Gitcoin rounds and direct crypto donations. We are also involved in some commercial and semi-commercial projects focused on bringing transparency into the L2 space, such as building rollup explorers and maintaining nodes.", - "team_size": "12", - "address": "0xeA78912803bE5E356EaC2b8e127D4BA87230A48e", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xa142aB9eab9264807A41F0E5cbDab877D204E233", - "project_pathname": "0xa142aB9eab9264807A41F0E5cbDab877D204E233", - "optimismAddressFound": true, - "optimismBalanceEth": 0.7633661362575699, - "github_data": [ - "data/github/https:__github.com_l2beat_l2beat_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Week in Ethereum News", - "socials": [ - "https://twitter.com/weekinethnews", - "https://weekinethereumnews.com/" - ], - "description": "Week in Ethereum News is (wait for it!) a weekly newsletter about Ethereum. Since August 21, 2016.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWe keep you up to date on Ethereum, so you can spend less time on Twitter and Reddit.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nEach issue has a sponsor and job listings.", - "team_size": "Editor: Andrew B Coathup, full time (7 days a week) Publisher & Founder: Evan Van Ness, part time & vacation cover", - "address": "0x13ebd3443fa5575F0Eb173e323D8419F7452CfB1", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x13ebd3443fa5575F0Eb173e323D8419F7452CfB1", - "project_pathname": "0x13ebd3443fa5575F0Eb173e323D8419F7452CfB1", - "optimismAddressFound": true, - "optimismBalanceEth": 6.542206363901649, - "github_data": [] - }, - { - "project": "Apetimism Launchpad", - "socials": [ - "https://twitter.com/apetimism", - "https://apetimism.com/launch" - ], - "description": "Apetimism Launchpad is a no-code NFT launchpad platform that provides highly secure smart contracts and minting systems. This helps NFT project owners to streamline the launch process from weeks to just a matter of minutes.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nIn most cases, the actual value of NFT is firmly bonded to its utility. Hence 'the core business' of an NFT project is what matters. With more business-driven NFT projects, more sustainable growth could be expected in the space, which would benefit everyone in the ecosystem. Apetimism Launchpad helps reduce the barrier of those project founders who do real business to start an NFT project.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nApetimism Launchpad collects 5% of the mint fee from the paid mint project as revenue. Additionally, the platform is soon to be integrated with Zonic, the recently launched NFT marketplace built for Layer 2, which will fulfill the whole loop of the NFT ecosystem. The project is self-funded and does not have any backers or investors.", - "team_size": "We currently have only one person working on product development. Our aim is to expand the team to 4-5 people once we secure funding.", - "address": "0x16ac527d938c36Caec5A6b0665ef7b456C22f7D2", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x2117085E7e4eE35825A9C71bbE46AAd8c01789f3", - "project_pathname": "0x2117085E7e4eE35825A9C71bbE46AAd8c01789f3", - "optimismAddressFound": true, - "optimismBalanceEth": 20.362219330248614, - "github_data": [] - }, - { - "project": "MerkleTreeJS", - "socials": [ - "https://github.com/merkletreejs", - "https://merkletree.js.org/" - ], - "description": "MerkleTreeJS is a TypeScript NPM package to construct merkle trees, generate proofs, and verify roots and proofs.", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nMerkleTreeJS has been a dependency in various OP packages, such as OP SDK, since OP inception MerkleTreeJS makes it very easy to work with merkle trees (generating roots and proofs, verification) that works well with Solidity merkle tree library contracts. MerkleTreeJS is used by the broader Ethereum ecosystem in general, with 80k weekly NPM downloads and used in more than 11k repos.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nGithub sponsors", - "team_size": "1", - "address": "0x358fdcCDE25e0aae7fBA01F088Da89b08aBF61DB", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x358fdcCDE25e0aae7fBA01F088Da89b08aBF61DB", - "project_pathname": "0x358fdcCDE25e0aae7fBA01F088Da89b08aBF61DB", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_merkletreejs_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "BwareLabs", - "socials": [ - "https://twitter.com/BwareLabs", - "https://github.com/bwarelabs", - "https://bwarelabs.com/" - ], - "description": "BwareLabs is a web3 infrastructure company providing decentralized RPC/WSS APIs, validator, indexing and bridge operator services. Our core objective is to improve the developer experience within a blockchain ecosystem. Blast is our main product, which is a decentralized API platform with support for 18 networks currently. From there developers can get easy access to RPC and WSS endpoints.", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nBware Labs has supported development and usage of the OP Stack by integrating Optimism blockchain into our product Blast (https://blastapi.io/), a decentralized API platform with multichain support. Using Blast, Optimism blockchain developers are able to bypass all the hurdles involved in running their own infrastructure thus reducing both their outage risks and infrastructure costs.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nBwareLabs had 2 investment rounds. Seed round in April 2021 where we raised 0,85M USD and Series A in February 2022 where we raised 6M at 50M valuation. Revenue streams include: - Validators - Blast API platform - Indexing Services - Bridge Operators", - "team_size": "Starting with the 5 co-founders, the team grew to more than 40 professionals with highly technical backgrounds and experience. Most of the team comes from the traditional tech industry, with previous experience at well-known companies such as Google, Intel, HPE, IBM and many others.", - "address": "0xb8950c47E8B9e539601cB47A167DE8bf4Cb1289E", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xE0D76bDF0Dcf83685dc41570Dd4536649119D304", - "project_pathname": "0xE0D76bDF0Dcf83685dc41570Dd4536649119D304", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_bwarelabs_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Keccak hashing", - "socials": [ - "https://twitter.com/KeccakTeam", - "https://github.com/XKCP/XKCP", - "https://keccak.team/" - ], - "description": "The Keccak project started in 2008 for the development of the Keccak hash function, winner of SHA3 competition and used in Ethereum. The project is a multi discipline effort of cryptography, software and hardware development. All the developments are open source, no patents and several incentives for 3rd party security analysis. The project is still active for providing improved implementations", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nThe Keccak hash function, and all its derivations, are cryptographic building blocks for the good of the society. We believe that open cryptography is a key technology for the digital society. The security of Keccak is key to the security of Ethereum and of many other digital projects. We worked a lot in analyzing its security and encouraged third-party cryptanalysis, with very positive results", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nGilles, Ronny and Michael are employees at STMicroelectornics. Gilles is professor at the University of Brussels. Joan is Professor at Radboud University. Guido is CEO of Security Pattern. We didn't receive any direct funding, the effort put in the project by team members is based on personal time, personal resources and partially allowed by the employer as R&D activity.", - "team_size": "Four of us (Guido, Joan, Micha\u00ebl, Gilles) intially designed Keccak. Ronny joined forces to help us with software implementations. We received cryptanalysis review by several other researchers. We publish third party results at https://keccak.team/third_party.html", - "address": "0x399aA07a970ea3711d002566cafDBe021f9DD0E8", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xD06CaC3a900Dd34FE9CCd32F15DCC75E2423b816", - "project_pathname": "0xD06CaC3a900Dd34FE9CCd32F15DCC75E2423b816", - "optimismAddressFound": true, - "optimismBalanceEth": 0.009899433211481888, - "github_data": [ - "data/github/https:__github.com_XKCP_XKCP_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "OptimismGuru", - "socials": ["https://twitter.com/GuruOptimism", "https://adminguru.co/"], - "description": "OptimismGuru is a Twitter account that works as an information aggregator regarding the Optimism chain, the Optimism Collective, and the OP Stack.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nOptimismGuru provides an up-to-date information feed specific to Optimism chain enthusiasts. This feed includes news, analytics, opportunities, and the current state of the protocols on Optimism. OptimismGuru also helps onboard new users to the network by providing a beginner-friendly presentation and cost-free guidance on how to utilize on-chain tools and how to reach valuable information.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nThe team behind OptimismGuru is formed from the AdminGuru crew, a blockchain community management firm. However, OptimismGuru is an initiative on a voluntary basis. Our team has no funding or revenue stream at this stage.", - "team_size": "OptimismGuru team consists of 4 people. (2 Community Managers + 2 Interns)", - "address": "0x3745c2468ab08e2038689f508C78d682864Aa72b", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x8E72a24221517E51502f20f387415a06b27A5b51", - "project_pathname": "0x8E72a24221517E51502f20f387415a06b27A5b51", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [] - }, - { - "project": "Fire", - "socials": ["https://twitter.com/_joinfire", "https://www.joinfire.xyz/"], - "description": "Web3 is hard to use. Self-custody and interacting directly with the blockchain today is overly complicated for the consumer, leading to the average user losing their funds and quitting the ecosystem. UX today is fraught with 'gotchas' and pitfalls. Fire - the Chrome extension that simulates transactions, showing you exactly what will go in and out of your wallet before you sign the contract.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWe protect over 35,000 unique wallets across EVM chains including Ethereum, Polygon, and Optimism today. We want this number to grow, helping support the Optimism ecosystem as well as onboard new users to it! Our goal is to make Web3 simple. Our public good to the collective is that we have saved users from being scammed using Web3 as well as given them confidence to make transactions.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe have no revenue and are VC funded.", - "team_size": "4 people Full Time.", - "address": "0x24ee055Ff80321cab8583a64a68Db12652dC60ea", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x57B02589d6e24203FC43e442ce9A4803E290293b", - "project_pathname": "0x57B02589d6e24203FC43e442ce9A4803E290293b", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [] - }, - { - "project": "Ipsilon", - "socials": [ - "https://twitter.com/teamipsilon", - "https://github.com/ipsilon", - "https://ipsilon.xyz/" - ], - "description": "Ipsilon is a research team focusing on the execution environment of Ethereum (aka the EVM or any future versions of it). We provide analysis and implementation of own and third party proposals (i.e. new EIPs proposing changes to the EVM), provide tooling (evmc, evmone, fizzy), and support existing teams (e.g. Solidity, go-ethereum, Silkworm, Erigon) with implementation and analysis.", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nA number of our EIPs have been adopted by Ethereum Mainnet. We have meaningfully contributed to go-ethereum, Solidity, the ACD process, and Ethereum testing. Currently our focus is EOF (EVM Object Format) and EVMMAX, revamping how the EVM works. Contributing to the selfdestruct-removal and EIP-4844 precompile. Fun fact: Optimism\u2019s Solidity modifications were an inspiration for the RJUMP opcode.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe are supported by the Ethereum Foundation for covering compensation (salaries) of team members. Some members are part of the Protocol Guild. No other funding or incentive system is in place.", - "team_size": "Currently 5 core contributors (see the list on https://ipsilon.xyz) and a handful of collaborators. We started in 2016 as a team of 2. Since 2018 mostly had 6 team members, with a peak of 12 people during 2019-2022.", - "address": "0xF96Aa4A25fDe246d9dD498B145F52Fab0eAd29f3", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xF96Aa4A25fDe246d9dD498B145F52Fab0eAd29f3", - "project_pathname": "0xF96Aa4A25fDe246d9dD498B145F52Fab0eAd29f3", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_ipsilon_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Jrocki - YouTube & Podcast", - "socials": [ - "https://twitter.com/Reformed_Normie", - "https://www.youtube.com/@JrockiCrypto" - ], - "description": "I have my YouTube Channel containing Optimism only content including a tutorial series for the Optimism Quests. In addition, I co-host a weekly Twitter space for the Optimism community which began as an Optipunk's NFT community call. When a project joins us the space is recorded and posted on an RSS feed known as \"The Web3 Experience\" podcast. Analytics: https://bit.ly/3KoGJGu", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nAll of my YouTube videos are step by step tutorials showing new users how to use the applications on the OP Stack. Example activities include the Optimism Quests, Attestations, Delegating OP. During our weekly Twitter Space we educate the community about the collective then open the space up for the community to freely share ideas and ask questions.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nI generated no revenue from any of the content I created. I had a full time web2 job that sustained me while I created this content for fun. It is important to note that I became a contractor with the Optimism Foundation in February 2023, however the work I was nominated for all happened before joining the Foundation.", - "team_size": "It is just me as an individual. It was my hope to submit this application as \"The Web3 Experience Podcast\", however my co-host is no longer in the web3 space any longer sadly. So please take this into account when valuing the public good of the The Web3 Experience Podcast episodes as I was only half of its value.", - "address": "0x91d667cfcAae0aea9A0ed1D2C0e8A157bfb61116", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xFC10A71B1E7974401D840fd15ceBf08Ed7E115Cc", - "project_pathname": "0xFC10A71B1E7974401D840fd15ceBf08Ed7E115Cc", - "optimismAddressFound": true, - "optimismBalanceEth": 1.2763736138140125, - "github_data": [] - }, - { - "project": "dm3 protocol", - "socials": [ - "https://twitter.com/dm3protocol", - "https://github.com/corpus-io/Optimism-Resolver", - "https://dm3.network/" - ], - "description": "The project consists of 3 parts: Optimism-Resolver: a trustless resolver for ENS utilizing CCIP. The verification is done using Merkle-proofs for all used slots. dm3 \u2013 web3 messaging protocol: a lean messaging protocol with focus on e2ee, decentralization, scalability, and interoperability. dm3 embedded components: messaging components to embed in dApps to add interoperable messaging to dApps.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nOptimism-Resolver: ENS names and records can be stored on OP and trustless resolved and verified in layer 1. The approach can be easily adapted to any other data from OP. dm3 protocol: Uses ENS as a registry for communication info (public keys, delivery info). Utilizes ENS names on OP as more practical storage than layer 1. dm3 embedded components: add messaging to any dApp in the OP ecosystem.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nAll these tools are open source and a Public Good, they were conceived to remain free and accessible, so no income comes from them. 400k funding came from Corpus.io: a venture studio that develops solutions for the Ethereum ecosystem. Winners of the Small Grants program from ENS.", - "team_size": "Steffen Kux (CEO), Heiko Burkhardt (CTO), Eduardo Vega-Pati\u00f1o (Community Lead), Mayra Castillo (Community manager) and Alex Plutta (Software Engineer). For the optimal conditions, two more developers are needed.", - "address": "0x11Ee133A1408FE2d7c62296D7eB33F234b774503", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x1d921dff757610FbDB0073479e12c0a07d382677", - "project_pathname": "0x1d921dff757610FbDB0073479e12c0a07d382677", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_corpus-io_Optimism-Resolver_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Bored Town", - "socials": [ - "https://twitter.com/BoredTownNFT", - "https://boredtown.app/nfts" - ], - "description": "Bored Town is a vibrant community of 5555 NFT monsters living on the Optimism blockchain, crafted by Thai NFT artist sorryvrerror. The project offers an exceptional opportunity for Bored Town holders to unleash their creativity and bring their ideas to life through derivative works, whether for personal or commercial purposes, governed by CC BY-SA terms.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\n10% of all royalties from Bored Town are donated to public goods. 50% of any future sales (currently free mint) and royalties from Catens project that developed by Bored Town will be allocated to public goods.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\n1. Income from business at www.srann.co 2. Income from NFT sales and royalties fee 3. Income from being a free-lance lecturer, writer, graphic designer, and project consultant", - "team_size": "4 people", - "address": "0x9D63038e7f74bc089eb38e61Be8Da937918900D6", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x6fF5723435b7dfC2371B57Fb5cB4c373E5995C78", - "project_pathname": "0x6fF5723435b7dfC2371B57Fb5cB4c373E5995C78", - "optimismAddressFound": true, - "optimismBalanceEth": 0.04765745045224472, - "github_data": [] - }, - { - "project": "Polynya", - "socials": [ - "https://twitter.com/apolynya", - "https://github.com/apolynya", - "https://polynya.mirror.xyz/" - ], - "description": "I write a blog and twitter profile about a variety of topics related to blockchain - scalability, sustainability, economics etc, and participate in various rollups-related research/discussion venues. I'm also a delegate for the Optimism Collective Token House and badgeholder-elect for the Citizen House.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nI've been writing about rollups since 2020, first Reddit, later on Medium, Twitter & Mirror. I have written over 100 blog posts about rollups, countless tweets and comments, with the sole focus of bridging the then vast information asymmetry around rollups & sustainable blockchain scalability. IMHO - job done on that front, so I'm semi-active now, but I suppose that's where \"retroactive\" comes in?", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nMy blog, twitter & writings are a hobby; my work is unrelated to crypto.", - "team_size": "1", - "address": "0x429F9aDA43e9F345CbB85EC88681BB70Df808892", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x429F9aDA43e9F345CbB85EC88681BB70Df808892", - "project_pathname": "0x429F9aDA43e9F345CbB85EC88681BB70Df808892", - "optimismAddressFound": true, - "optimismBalanceEth": 0.040803216942506174, - "github_data": [ - "data/github/https:__github.com_apolynya_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "L2planet", - "socials": [ - "https://twitter.com/layer2planet", - "https://github.com/l2planet", - "https://l2planet.xyz/" - ], - "description": "Layer 2 Planet is a research community that develops various products. Initially, we focused on a bi-weekly newsletter covering Layer 2 solutions. Now, we have a dApp store on our website. Going forward, our aim is to increase website traffic and provide more technical educational resources about Layer2 solutions and taking a role on big adaption.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nSo, we've made a big impact on OP Stack with our OptimismTR Twitter account. We're putting together sessions to share all the latest news in the OP ecosystem, and keeping our Turkish community in the loop. We're also making tutorial videos about special events on Optimism. Oh, and we're planning to post some cool dApp intro videos and other fun stuff on this account too!", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nLayer 2 Planet does not currently generate revenue through advertising or paid content. In the past, we have participated in the Gitcoin Grant Rounds 13 and 14.", - "team_size": "Our team consists of 8 individuals, each with diverse interests and skills. One focuses on Optimism and data analytics, another on StarkNet and research. Another member focuses on ZK tech and community growth, while one is skilled in graphic design (not necessarily related to blockchain tech).", - "address": "0x40170fA69481D9B197e226E63317B49dB3c2db02", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xf23F9C10D1559885dABEE67c59c4554E6152697b", - "project_pathname": "0xf23F9C10D1559885dABEE67c59c4554E6152697b", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_l2planet_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "ZachXBT", - "socials": ["https://twitter.com/zachxbt"], - "description": "Whistleblower / Open source investigations / Asset tracing & recovery", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nI publish open source investigations to Mirror.xyz as free digital collectables on Optimism. Investigations are free of charge to the community and have lead to legal proceedings as well as asset recovery.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nDonations and grants received to my public wallet address.", - "team_size": "1", - "address": "0x9D727911B54C455B0071A7B682FcF4Bc444B5596", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x9D727911B54C455B0071A7B682FcF4Bc444B5596", - "project_pathname": "0x9D727911B54C455B0071A7B682FcF4Bc444B5596", - "optimismAddressFound": true, - "optimismBalanceEth": 0.22241590831514949, - "github_data": [] - }, - { - "project": "\u26a1\ufe0fTurboETH - Web3 Build System", - "socials": [ - "https://twitter.com/KamesGeraghty", - "https://github.com/kamescg", - "https://turboeth.xyz/" - ], - "description": "\u26a1\ufe0fTurboETH is a Web3 Build System; designed to make building Web3 applications fast. Tightly integrated with WAGMI/SIWE, TurboETH template teaches developers how to build production ready Web3 applications by example. With 1-click deploy to Vercel going from `hypothesis > prototype > application` has never been easier. Soon a TurboCLI too => twitter.com/KamesGeraghty/status/1626182766218907654", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\n\u26a1\ufe0fTurboETH supports development and usage of the OP stack because it accelerates Web3 application development. New developers in the ecosystem can quickly launch a new weekend project and experienced developers can stay up-to-date with industry best practices and patterns. The public good is an Open Source Web3 Build System - a codebase to supercharge developers building decentralized apps.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nFor the last 8 months (since leaving PoolTogether) I've been self-funding experiments/projects in the Ethereum/Optimism/Celo ecosystem. Projects: 1. ERC721K - dynamic NFT framework (github.com/erc721k) 2. Friends of Pooly - Defending DeFi (friendsofpooly.com) 3. Impact Cards - impactcards.xyz 4. TurboETH", - "team_size": "Independent, but couldn't haven't done it without the help of friends: - https://twitter.com/McOso_ - https://twitter.com/0xJBass", - "address": "0x761d584f1C2d43cBc3F42ECd739701a36dFFAa31", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x761d584f1C2d43cBc3F42ECd739701a36dFFAa31", - "project_pathname": "0x761d584f1C2d43cBc3F42ECd739701a36dFFAa31", - "optimismAddressFound": true, - "optimismBalanceEth": 0.21239444163607937, - "github_data": [ - "data/github/https:__github.com_kamescg_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "OptimismArabia", - "socials": [ - "https://twitter.com/cryptoblarabi", - "https://optimismarabia.com/" - ], - "description": "We are working on two things: - A website specialized in publishing original and translated articles related to Optimism in Arabic. - An academy with many interactive features that contains courses related to blockchain and Optimism. We target users and developers in Arab countries such as UAE, Saudi Arabia, Egypt and Bahrain.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWe provide knowledge for free, with this knowledge developers and users can learn about Optimism and start building! Through the website and the academy, we can reach new users and developers, as the Arab world is full of talents, but suffers from a lack of resources.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nThere are no sources of funding or revenue. We spent from our own pocket to create and develop the website/the academy and make the content. We have support from cryptoblarabi.com (one of the largest and oldest Arabic crypto news websites) in terms of marketing.", - "team_size": "3", - "address": "0x6e4E55A49a8C8938BD8D8668E18DE95962740Fe1", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x6e4E55A49a8C8938BD8D8668E18DE95962740Fe1", - "project_pathname": "0x6e4E55A49a8C8938BD8D8668E18DE95962740Fe1", - "optimismAddressFound": true, - "optimismBalanceEth": 7.487976459201e-6, - "github_data": [] - }, - { - "project": "CryptoZombies", - "socials": [ - "https://twitter.com/CryptoZombiesHQ", - "https://github.com/CryptozombiesHQ/cryptozombie-lessons", - "https://cryptozombies.io/" - ], - "description": "CryptoZombies is an interactive school that teaches you all things technical about blockchains. It teaches students to write smart contracts by making their own crypto-collectibles game.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nCryptoZombies was the first tutorial on the internet for NFTs and is still very relevant to the new crop of web3 developers looking to enter the industry today. The CryptoZombies curriculum is focused on Solidity development. This helps onboard new developers to Optimism as well.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nAll the courses are free. We usually charge a fee when building a course for a blockchain company.", - "team_size": "3", - "address": "0xbb105E3c6D6406A3F0aAB98cD8D0E3a127bD6436", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xbb105E3c6D6406A3F0aAB98cD8D0E3a127bD6436", - "project_pathname": "0xbb105E3c6D6406A3F0aAB98cD8D0E3a127bD6436", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_CryptozombiesHQ_cryptozombie-lessons_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "TypeChain", - "socials": [ - "https://twitter.com/dethcrypto", - "https://github.com/dethcrypto", - "https://github.com/dethcrypto" - ], - "description": "dETH is organization focused on improving Ethereum Developer Experience. * TypeChain - generates TypeScript typings for Ethereum smart contacts, * dETH Code - is Visual Studio Code for reading smart contracts, * dETH Tools - a set of small tools useful for smart contract engineers,", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nOptimism codebase uses TypeChain. dEth Code (Visual Studio Code for reading smart contracts) supports Optimism network.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nIn the past, we received some grants from Ethereum Foundation and Optimism's RPGF#1.", - "team_size": "1", - "address": "0x4d2F0Efdb2AD1d709d8522E7b5aa9f5181563617", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x4d2F0Efdb2AD1d709d8522E7b5aa9f5181563617", - "project_pathname": "0x4d2F0Efdb2AD1d709d8522E7b5aa9f5181563617", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_dethcrypto_events_2022-07-01_2023-03-01.json", - "data/github/https:__github.com_dethcrypto_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Hop Protocol", - "socials": [ - "https://twitter.com/HopProtocol", - "https://github.com/hop-protocol", - "https://hop.exchange/" - ], - "description": "Hop Protocol is a modular stack for building cross-chain applications within the Ethereum ecosystem. To date, the Hop Token Bridge has bridged over $3.4B across Ethereum, Ethereum rollups, and adjacent chains. With our initial OP grant, Hop pioneered a fee refund program enabling users to recoup 80% of onboarding costs while gaining ownership in the Optimism network.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nHop received one nomination for our work on Sybil detection which helped identify 17k address and redistribute 14m OP and a second for Hop's role as core infrastructure. Hop was one of the first bridge to support Optimism and has helped onboard roughly $500M and countless users. Hop also pioneered a fee refund program enabling users to recoup 80% of Optimism onboarding costs in OP.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nHop has received minimal VC funding and will continue to raise funds sparingly to ensure broad distribution of governance power. All fund raises to date were conducted by Authereum Labs across 2 fundraises, one in 2018 and one in 2021. The total amount is just over $2m. Any fundraises moving forward will be through Hop DAO itself as Authereum Labs has transitioned to a service provider role.", - "team_size": "The core Hop team consists of 4 people but there are also individuals that contribute to the protocol and Hop DAO independently.", - "address": "oeth:0xC988107688b750dee6237B85A3ca49ba0a6", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x816a684f40b8B4B060A4Df7A10caD589Ef64E95e", - "project_pathname": "0x816a684f40b8B4B060A4Df7A10caD589Ef64E95e", - "optimismAddressFound": false, - "optimismBalanceEth": 0, - "github_data": [ - "data/github/https:__github.com_hop-protocol_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Launchifi", - "socials": [ - "https://twitter.com/launchifi", - "https://github.com/Launchifi/", - "https://launchifi.xyz/" - ], - "description": "Launchifi is a blockchain platform that enables you to launch anything to the blockchain without coding. The platform provides a secure, multi-chain compatible, and gas-optimized solution for deploying smart contracts. Pre-built contracts, advanced setups, and industry-leading integrations are available. Contracts that we currently include are tokens, NFTs, Staking, Auctions, and LP Tokens.", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nLaunchifi provides a valuable service to the OP stack collective by offering a no-code solution for deploying smart contracts. The platform simplifies the process, making it accessible to non-coders, and offers cost-effective and secure options for smart contract deployment. This helps to grow and develop the OP community by enabling more users to participate and launch their own projects.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nRight now Launchifi is a free to use platform as we just officially launched and want to bring as many new creators to the space with minimal barriers to entry as possible. We will be enabling in the future premium services that will include premium fees to use and we will introduce a 2.5%-5% withdrawal fee on our contracts where applicable to sustain long term growth of our platform.", - "team_size": "Right now we have a team of 3 founders. 2 of the founders are full stack developers and focusing primarily on the development of our platform and future features. The other founder is focusing on business development, marketing and partnership outreach and assisting with frontend design of the platform.", - "address": "0x64249ED5Ef7a004d268A508092851e987482a175", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x64249ED5Ef7a004d268A508092851e987482a175", - "project_pathname": "0x64249ED5Ef7a004d268A508092851e987482a175", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_Launchifi__events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Flexible Voting", - "socials": ["https://github.com/ScopeLift", "https://flexible.vote/"], - "description": "Flexible Voting is an extension to the widely used OpenZeppelin DAO Governor that enables powerful new voting patterns for voting through client contracts. This new building block allows arbitrary delegate contracts to be developed which can unlock all kinds of new use cases.", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWhen adopted and deployed, Flexible Voting will allow holders of mainnet DAO Governance tokens to bridge those tokens to Optimism but still participate (trustlessly) in Governance votes on L1. They will submit their vote on Optimsim, or even shield, or earn yield on their bridged token while still having votes reflected on L1. This will encourage Governance token liquidity bridged to Optimism.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nFlexible Voting was initially developed with a grant from the Uniswap Grants Program. It has since received funding from Aave, GitcoinDAO, and the EF for continued development.", - "team_size": "Flexible Voting is built by ScopeLift, a six person team of EVM experts that has contributed to many projects in the Ethereum ecosystem.", - "address": "0x5C04E7808455ee0e22c2773328C151d0DD79dC62", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x8f5906963Ae276E1631EFA8Ff1a9CaE6499EC5E3", - "project_pathname": "0x8f5906963Ae276E1631EFA8Ff1a9CaE6499EC5E3", - "optimismAddressFound": true, - "optimismBalanceEth": 0.01710102206413176, - "github_data": [ - "data/github/https:__github.com_ScopeLift_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "NFTEarth", - "socials": [ - "https://twitter.com/NFTEarth_L2", - "https://github.com/NFTEarth", - "https://nftearth.exchange/" - ], - "description": "NFTEarth is an NFT marketplace for buying and selling NFTs on L2. In addition to being a marketplace, the protocol has a native token, $NFTE, and is building out the NFTEarth \"NFT Hub\" - which aims to server as a one-stop-shop for NFT creators, collectors, and DAOs looking to generate NFT art, deploy and manage contracts, and create allowlists as well as Mint embeds for their NFTs.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nNFTs hold tremendous potential for on-boarding new users to web3 - especially on Layer2 networks like Optimism. NFTEarth chose to deploy on Optimism because there are already strong NFT communities that exist on the L2 network, but lack of a current sustainable marketplace that is dedicated to these communities like NFTEarth is.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nNFTEarth currently is generating revenue through trading fees on the marketplace contract - which is currently set at 2.5%. In addition to this, the project has created multiple NFT collections itself which have raised around $5,000 $USD at this point in time. The only other source of funding at this time has been the incubation round from the Layer2DAO in early January, 2023 of 27,500 $OP tokens.", - "team_size": "11", - "address": "0x78ED254b9c140c1A2BE10d2ad32C65b5f712f54b", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xD131F1BcDd547e067Af447dD3C36C99d6be9FdEB", - "project_pathname": "0xD131F1BcDd547e067Af447dD3C36C99d6be9FdEB", - "optimismAddressFound": true, - "optimismBalanceEth": 0.074209, - "github_data": [ - "data/github/https:__github.com_NFTEarth_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Filosof\u00eda C\u00f3digo", - "socials": [ - "https://twitter.com/FilosofiaCodigo", - "https://github.com/FilosofiaCodigo", - "https://www.youtube.com/@FilosofiaCodigo/videos" - ], - "description": "Filosof\u00eda C\u00f3digo is a YouTube channel that explains step by step how to program Smart contracts in Solidity. It also includes explanatory videos on Ethereum and L2 scalability. In addition accompanies each video detailed programming articles on Solidity, all information is available and free. Key Stats: * Available Spanish, English and French * 50+ tutorials * Video + Blog articles", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nFilosofia C\u00f3digo believes information should be available for free for everyone. That's why we provide a Discord for Web3 devs and creators to connect and learn with each other. We also believe in creating content that matters, directing a lot of attention to L2. We have created videos and blogs on L2s and Optimism specifically. We also do talks and help organizing hackathons internationally.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\n* Received 2 Ethereum Foundation grants * Content creation partnerships: Chainlink Bootcamp in Spanish and Platzi courses * Web 3 freelancing", - "team_size": "1", - "address": "0xb6F5414bAb8d5ad8F33E37591C02f7284E974FcB", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xb6F5414bAb8d5ad8F33E37591C02f7284E974FcB", - "project_pathname": "0xb6F5414bAb8d5ad8F33E37591C02f7284E974FcB", - "optimismAddressFound": true, - "optimismBalanceEth": 0.09982001438079244, - "github_data": [ - "data/github/https:__github.com_FilosofiaCodigo_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Atlantis World", - "socials": [ - "https://twitter.com/atlantis0x", - "https://github.com/carlomigueldy", - "https://atlantis.world/" - ], - "description": "Atlantis World is an exploratory web3 social metaverse that transforms everyday people into web3 super users, one fun & rewarding quest at a time.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\n1. We\u2019re mostly focused on education and onboarding users into the Optimism ecosystem through playful learning and practical experimentation (OP City, web3 integrations & guided quests) 2. Leading other public goods initiatives ft. Optimism (KyivTechSummit, SavePakistan, first ever web3 state implemented onboarding course ft. OP as partner) soon: OptimismUA - OP Regional Hub in Ukraine!", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe\u2019re a fully boostrapped project for more than 1 year and 10 months. We decided to stay true to our mission and values of building community first without any VCs or taking a single dollar in private investment. We\u2019ve been supported by the web3 ecosystem by executing on a series of builder grants, as well as revenue generated from a small community patron-style NFT sale Jan \u201822.", - "team_size": "We are a remote first full time team of 13, distributed all around the world.", - "address": "0x036C545Ae4f68059b4C83f7E3814429d4c73c089", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x036C545Ae4f68059b4C83f7E3814429d4c73c089", - "project_pathname": "0x036C545Ae4f68059b4C83f7E3814429d4c73c089", - "optimismAddressFound": true, - "optimismBalanceEth": 5.956656026236e-6, - "github_data": [ - "data/github/https:__github.com_carlomigueldy_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Infinitism (ERC-4337)", - "socials": [ - "https://github.com/eth-infinitism", - "https://github.com/eth-infinitism/account-abstraction" - ], - "description": "ERC-4337 standardizes account abstraction on all EVM chains without the need for consensus-layer protocol changes. It defines a way to implement and use account abstraction on EVM chains, with a focus on L2. Our goal is to bring the 10X usability improvement that the ecosystem needs, to support the next billion users.", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWe developed the EIP and the implementation. A system that enable safe and decentralized access to contract accounts without relying on centralized infrastructure. Our work is used by a growing number of projects on OP and elsewhere. A future version will also use the OP Stack to offer native account abstraction and even better usability.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nThe work is supported by EF grants. There are no revenues. The project is 100% Public Good, built to improve the ecosystem.", - "team_size": "5", - "address": "0x6A957e69A251D37CfD1F538F18EC1416FbdfA501", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xdb5781a835b60110298fF7205D8ef9678Ff1f800", - "project_pathname": "0xdb5781a835b60110298fF7205D8ef9678Ff1f800", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_eth-infinitism_events_2022-07-01_2023-03-01.json", - "data/github/https:__github.com_eth-infinitism_account-abstraction_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Cryptocurrency and Friends", - "socials": [ - "https://twitter.com/stonecoldpat0", - "https://cryptocurrencyclass.github.io/" - ], - "description": "Cryptocurrency and Friends is an educational initiative that builds up the knowledge for researchers, developers, and technically minded folk, to better understand how a blockchain system works under the hood. It covers an intro to crypto, UTXO/account models, p2p network, fee markets and the scalability challenge. All background feeds into the final classes on payment channels and rollups.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nI have put together educational resources on rollups which includes how they work, mental models for evaluating them, and some systematic reviews of them. Content in the form of in-person classes, online classes, papers and blog posts. Alongside tweets promoting them. It is not OP-stack specific, but general in pursuit of all rollups.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nI work at Infura full-time.", - "team_size": "Just me.", - "address": "0xaFaBa30769374EA0F971300dE79c62Bf94B464d5", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xEc087478B0bC2F1a18Ff01717e381f44B791114A", - "project_pathname": "0xEc087478B0bC2F1a18Ff01717e381f44B791114A", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__cryptocurrencyclass.github.io__events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "H.E.R. DAO LATAM", - "socials": [ - "https://twitter.com/herdaolatam", - "https://linktr.ee/herdaolatam" - ], - "description": "We onboard Latin American womxn from scratch into Web3 through Virtual and IRL Workshops teaching them the basics of blockchain and its scaling solutions, we build partnerships to offer scholarships for women to learn about development, blockchain technology, and tech skills. We need help to keep educating about Ethereum and Layer2 Optimism! :)", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWe are a public good community where we teach about Web3 and we would love to share more about Optimism, because of low gas fees. In LATAM, we can\u2019t afford high gas fees, especially when we are using crypto for remittances. We are also bringing more women to become builders and founders, happy to use Optimism for their projects!", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nFor now, we partner and get sponsorship from different organizations, providing workshops, talks, hackathon preparation and organization, and event organization. We apply for different grants from protocols and projects.", - "team_size": "Core team: 5 people Contributors: 10 people", - "address": "0x1F9E7984eDdb135ab6D6f354E229970bB332dCC4", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x1F9E7984eDdb135ab6D6f354E229970bB332dCC4", - "project_pathname": "0x1F9E7984eDdb135ab6D6f354E229970bB332dCC4", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [] - }, - { - "project": "DefiLlama", - "socials": [ - "https://twitter.com/defillama", - "https://github.com/DefiLlama", - "https://defillama.com/" - ], - "description": "DefiLlama is an OpenSource project that tracks metrics for DeFi protocols (TVL, volume, fees, revenue, treasury...) transparently, making our data available for free to everybody. On top of that we've built: - LlamaPay, a payments tool used by multiple optimism protocols such as Velodrome - LlamaSwap, a dex meta-aggregator - our free price & metrics API and we maintain ChainList.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\n- We provided the TVL metrics used by Optimism's team to allocate OP rewards - We built a calldata-optimized UniswapV3 router for Optimism, reducing costs 2-5x vs alternatives (https://github.com/0xngmi/llamazip) - Users use our site to discover defi protocols on optimism and track their metrics (TVL, volume, fees, treasury...) - Our price API is used by many Optimism protocols (eg Mean Finance)", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nDefiLlama has only been funded through self-funding from founders and donations from external parties (from multiple sources: through gitcoin, directly from individuals and from protocols), to maintain neutrality no donation has been in exchange for anything else. We have not received any investment.", - "team_size": "11 full-time, 2 interns.", - "address": "0x3754a10c1cA723961068B2653109E6201982Dd9c", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x3754a10c1cA723961068B2653109E6201982Dd9c", - "project_pathname": "0x3754a10c1cA723961068B2653109E6201982Dd9c", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_DefiLlama_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Otterspace", - "socials": [ - "https://twitter.com/otterspace_xyz", - "https://github.com/otterspace-xyz/", - "https://otterspace.xyz/" - ], - "description": "Otterspace develops easy-to-use tools for internet-native communities to create & distribute Badges (non-transferable NFTs) on Optimism. Badges enable communities to: 1. Increase member engagement via non-financial rewards 2. Reduce manual workload & improve security via automated permission (e.g. through Guild, CollabLand) 3. Implement on-chain, portable membership & reputation models", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWith >1.1k Badges minted, >7k addresses on Badge allowlists, over 40 communities have interacted with OP through Otterspace. Their members are eligible for $OP tokens under our grant, providing exposure to the collective's governance. We\u2019re launch partners of the Attestation Station. In sum, Otterspace contributes to making Optimism an attractive launching ground for new DAOs and web3 communities.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe\u2019ve received USD 3.6M in a venture capital funding round led by Inflection and Cherry Ventures. We also received an OP grant from the Optimism Foundation (50k OP) which we are distributing as usage incentives among users of Otterspace (mentioned above), the grant is not used to fund our operations.", - "team_size": "Otterspace has a team of nine people (covering 7 nationalities) across software development, product management, design & business. The team is based in Berlin, Germany.", - "address": "0x2696170bf5fD36320c3932fd9e85fe5b798385FE", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x0AB7C4123e84c975008fcfcb14f07152bb711F82", - "project_pathname": "0x0AB7C4123e84c975008fcfcb14f07152bb711F82", - "optimismAddressFound": true, - "optimismBalanceEth": 3.357513521217789, - "github_data": [ - "data/github/https:__github.com_otterspace-xyz__events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "OP Medicine", - "socials": [ - "https://twitter.com/OP_medicine_DAO", - "https://github.com/aspiringsecurity/EMTTR", - "https://sites.google.com/view/emttrservice/" - ], - "description": "Enabling the bottom of pyramid through empowering pharma companies and the medical eco-system to do medicine trial testing, clinical trials via Optimism and Ethereum blockchain enabled EMTTRs (Electronic Medicine Trial and Test Records as a Service), EHR and Radiology services. Developer Tools to to build solutions in medicine, healthcare, improve transparency in drug testing using Optimism tools.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWe are developing an Optimism NFT marketplace for DICOM images to enable research organizations and radiologists. This enables improving data transparency in drug testing and early-stage detection and prevention of diseases. Our OP solution enables medical trial testing and clinical trials via EMTTRs (Electronic Medicine Trial and Test Records as a Service), EHR, Radiology services, IPFS storage.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe collaborate with hospitals, medical device OEMs, research organizations, medical colleges and participate in grant programs, hackathons: Hospitals and research organizations (10,000 USD); Grant Programs (5000 USD from Filecoin Microgrants, 10,000 USD in server credits from AWS, GCP); Good performance in Blockchain Hackathons (60,000 USD); Teaching Innovation in Medicine, Healthcare (9800 USD)", - "team_size": "We are a team of 9 members: Manu Gupta (Blockchain Engineer, Software Architect, Project Lead), Deepti Gupta (Full Stack Developer), Vibhor Bijoy (Security Engineer), Praveen Patel (Data & Logistics Executive), Usha Gupta (Consultant, UI/UX), Dr M.P.S. Bhatia (Consultant, Partnerships & Technology), Arvind Kumar Gupta (Business Executive), Vithika Gupta (Web3, iot adviser), Rakhee (Test Engineer)", - "address": "0x8dc640a257DE18857F8d24e1Ae2645F8bBa1E034", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x8dc640a257DE18857F8d24e1Ae2645F8bBa1E034", - "project_pathname": "0x8dc640a257DE18857F8d24e1Ae2645F8bBa1E034", - "optimismAddressFound": true, - "optimismBalanceEth": 0.002697027795448751, - "github_data": [ - "data/github/https:__github.com_aspiringsecurity_EMTTR_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "EthereumETL", - "socials": [ - "https://twitter.com/EthereumETL", - "https://github.com/blockchain-etl/ethereum-etl" - ], - "description": "EthereumETL has been described as the most useful open-source project for facilitating data science on Ethereum data. In addition, a BigQuery Ethereum dataset published together with Google using EthereumETL has already proved useful for many companies and people: it empowers research and data science, and enables data-driven applications development.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nEthereumETL is an open-source Python package where you can insert an RPC and a block range, then extract transaction data for any EVM chain. It can be used to extract data from the Optimism chain. EthereumETL powers public Ethereum datasets in Google BigQuery https://cloud.google.com/blog/products/data-analytics/ethereum-bigquery-public-dataset-smart-contract-analytics", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\n- The open source tools https://github.com/blockchain-etl/ethereum-etl are sustained by community contributions, as well contributions from companies that use these tools such as Nansen.ai - The infrastructure behind the public datasets in BigQuery are funded by Google and Nansen.ai - GitCoin grant https://gitcoin.co/grants/233/ethereumetl", - "team_size": "4", - "address": "0x9fd0c742d81b6f08817f3ef11d09cb4a9f54ee5f", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x9FD0C742D81B6f08817F3eF11D09Cb4a9f54eE5f", - "project_pathname": "0x9FD0C742D81B6f08817F3eF11D09Cb4a9f54eE5f", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_blockchain-etl_ethereum-etl_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "hildobby's Dune dashboards", - "socials": [ - "https://twitter.com/hildobby_", - "https://github.com/hildobby", - "https://dune.com/browse/dashboards?user=hildobby&tags=RPGF2" - ], - "description": "This project includes various Dune dashboards I have created as a contribution to the Optimism ecosystem. I have also recently created an open source wash trades filtering method that can be used on Optimism NFT trade data. I intend to share more methods like this one going forward which will be usable on Optimism data within Dune and open sourced so it can easily be ported out of Dune.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nMany entities provide data behind a paywall but I think in a truly decentralised world, everyone should have equal access to easily digestible data for free, so that is where I come in. I try to make sense of public data and share that work!", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nI sustain myself through freelancing gigs and retroactive grants for my work. I have gotten grants from: - Gitcoin grant: https://gitcoin.co/grants/6191/hildobbys-dune-dashboards - ETH staker: https://qf.ethstaker.cc/#/project/0x6deb00f975dd2893d3383daccfdb5b7b89a06fd3f8decf81bcfd16c488104fb9 I have also received retroactive grants from the ENS and LIDO teams in the past for my Dune dashboards.", - "team_size": "1", - "address": "0x09a5943a6d10919571eE2C9F63380aEA747ECA97", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x09a5943a6d10919571eE2C9F63380aEA747ECA97", - "project_pathname": "0x09a5943a6d10919571eE2C9F63380aEA747ECA97", - "optimismAddressFound": true, - "optimismBalanceEth": 0.08461398142821043, - "github_data": [ - "data/github/https:__github.com_hildobby_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "TrueBlocks", - "socials": [ - "https://twitter.com/trueblocks", - "https://github.com/TrueBlocks/trueblocks-core", - "https://trueblocks.io/" - ], - "description": "TrueBlocks creates a shared, naturally sharded index of addresses for any EVM-based chain (including Optimism). This allows ultra-fast access to the underlying chain data and runs 100% locally. The near-zero cost of operation promotes a true public good. A video explainer is here: https://loom.com/share/fd75d19f1dc946498c4ea0344517c2c6. For detailed info, see here: https://urlis.net/i98eydu0.", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nTrueBlocks already works quite well on Eth mainnet. We've experimented (successfully) with indexing the Optimism chain, but we lack the resources to continue. We seek to bring the Unchained Index to the Optimism chain. The index is naturally sharded and shared by each user providing a near-zero cost of distribution ensuring its status as a public good. See the explainers.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nTrueBlocks is self-funded through grant money and some personal funds. Grant sources have been (and continue to be) Optimism RetroPGF Round 1, IPFS Foundation, Ethereum Foundation (twice), Moloch DAO, Consensys, and many individual and matching donations through GitCoin grants.", - "team_size": "Thomas Rush, CEO and lead architect. In the web 3.0 space since late 2015. An active member of many communities including Moloch DAO, GitCoin, Eth Magicians, and sometimes a core dev. Recipient of two Ethereum Foundation grants. Dawid Szlachta, lead developer. With TrueBlocks since 2019, Dawid holds a bachelor\u2019s degree in Philology from the University of Warsaw and long industry experience.", - "address": "0x89D107a9F019B4DC5dCa227d991c89e4E7251Ff5", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xf503017D7baF7FBC0fff7492b751025c6A78179b", - "project_pathname": "0xf503017D7baF7FBC0fff7492b751025c6A78179b", - "optimismAddressFound": true, - "optimismBalanceEth": 0.001, - "github_data": [ - "data/github/https:__github.com_TrueBlocks_trueblocks-core_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Snapshot", - "socials": [ - "https://twitter.com/SnapshotLabs", - "https://github.com/snapshot-labs", - "https://snapshot.org/#/" - ], - "description": "Snapshot is a platform that enables decentralized autonomous organization (DAO) governance. Snapshot provides a way for DAO members to cast votes on proposals and make decisions collectively, without the need for a centralized authority. By using Snapshot, DAOs can increase transparency and accountability in their decision-making processes.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nSnapshot has been used both by the Optimism Collective and 64 projects on Optimism to facilitate governance. All of these services have been provided for free, both for governance participants and the projects themselves. Some stats: - 1.15M votes have been cast in the Optimism collective\u2019s governance - 93 proposals - 88650 participants", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nSnapshot spun out of Balancer in August 2020. After sustaining ourselves based on donations and Gitcoin grants, we raised a seed round of $4M in August 2021. Since then, we haven't received any other funding and have removed ourselves from Gitcoin grants. We have no revenue, everything on Snapshot is free and we don't monetize any of our user's data.", - "team_size": "The team is currently 12 people, working on different initiatives. We're also lucky to have dedicated community members helping to build Snapshot bit by bit.", - "address": "0x3E87e5BCE4dEb09FeE5045EF15E18f873212E6A7", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xf9551c66995eD3Ff9bb05C9Fd7ff148Bd75dc99a", - "project_pathname": "0xf9551c66995eD3Ff9bb05C9Fd7ff148Bd75dc99a", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_snapshot-labs_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "timdaub\u2019s work as ETH Magician", - "socials": [ - "https://twitter.com/timdaub", - "https://github.com/attestate", - "https://proofinprogress.com/" - ], - "description": "Attestate is my bootstrapped online venture. Over a multi-year period, I've been working on foundational technology that accelerates the vision of blockchains as \"attestable\" knowledge graphs for permissions and credible neutral data storage. I've paid out-of-pocket to travel to conferences, and I've run workshops, done talks, and written standards.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nMy contributions to EIP standards (most notably EIP-5192 and EIP-4973 for Soulbound tokens) have been adopted within R&D circles (e.g., Otterspace). I've pioneered new mechanism designs by implementing prototypes from Radical Markets. I'm admittedly not DIRECTLY contributing to the OP stack, but my vision and yours are closely aligned. We want more democratic tech to create DeSoc and non-finance.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nI'm an individual freelancer in Germany. Throughout 2021 and 2022, I've taken on gigs to sustain my work on public goods. Among them are companies, DAOs, and artists (some of them: https://proofinprogress.com/projects.html). But with Attestate, since November 2022, I now want to implement my vision truly without having to do it via freelance gigs. So today, I don't have any revenue. Self-funded.", - "team_size": "It's mainly me, besides some occasional external contributors that I pay via request.network.", - "address": "0x005241438caf3eacb05bb6543151f7af894c5b58", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x005241438cAF3eaCb05bB6543151f7AF894C5B58", - "project_pathname": "0x005241438cAF3eaCb05bB6543151f7AF894C5B58", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_attestate_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "BanklessDAO Projects", - "socials": [ - "https://twitter.com/banklessDAO", - "https://github.com/BanklessDAO", - "https://www.bankless.community/" - ], - "description": "BanklessDAO\u2019s mission is to create user-friendly onramps for people to discover decentralized financial technologies through education, media, and culture. To further that mission, BanklessDAO produces educational content via its newsletters and Bankless Publishing on various crypto-related topics, including Layer 2 scaling solutions such as Optimism. We also make use of Mirror/OP functionality.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nFor usage, a number of our projects and contributors publish on Mirror, and make use of the Optimism-enabled mint function. The public good we provide to the Collective is the creation of educational content through our newsletters and articles on the Collective, scaling technologies, and other 101 content. This content has been translated into 6 languages and has reached a wide audience.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nAt present, BanklessDAO projects are largely funded through its Grants Committee in the form of the BANK token. Our newsletters have received sponsorship funding in the past, but we're seeking greater ecosystem funding, in part, to move away from the sponsorship model.", - "team_size": "Bankless Publishing, Newsletters, International Media Nodes, and The Rug all have different team sizes, but the core team for many of these projects is less than six. Most of the content is curated in a decentralized manner, so the number of contributors on any given project varies greatly from week to week and season to season. To be clear, this Application is NOT for Bankless Academy", - "address": "0x745ce2Af76E9a6EBa65CC0cAcaa9eA109bB7FaBd", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x958c20A43F5206F186B0195cCB61Acb724b2EE1E", - "project_pathname": "0x958c20A43F5206F186B0195cCB61Acb724b2EE1E", - "optimismAddressFound": true, - "optimismBalanceEth": 0.001, - "github_data": [ - "data/github/https:__github.com_BanklessDAO_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Optimism DAppNode Package", - "socials": [ - "https://twitter.com/DanieleSalatti", - "https://github.com/DanieleSalatti", - "https://github.com/DanieleSalatti/DAppNodePackage-optimism" - ], - "description": "This is a package I created that lets home users easily run an Optimism node on their DAppNode. 3 clicks (and a few days while it syncs) will get you a full node. It is now part of the official collection of packages in the DAppStore. Funds will be used to allow me to dedicate more time getting the package ready for the upcoming Optimism Bedrock update. A little funding will go a long way here!", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nThis project supports usage of the OP Stack by making it very easy for home users to run their own Optimism node \ud83d\udd34\ud83c\udf31", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nMy 9-to-5, plus grants", - "team_size": "1", - "address": "0x523d007855B3543797E0d3D462CB44B601274819", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x523d007855B3543797E0d3D462CB44B601274819", - "project_pathname": "0x523d007855B3543797E0d3D462CB44B601274819", - "optimismAddressFound": true, - "optimismBalanceEth": 0.014955552643715423, - "github_data": [ - "data/github/https:__github.com_DanieleSalatti_events_2022-07-01_2023-03-01.json", - "data/github/https:__github.com_DanieleSalatti_DAppNodePackage-optimism_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "beaconcha.in", - "socials": [ - "https://twitter.com/beaconcha_in", - "https://github.com/beaconchain", - "https://beaconcha.in/" - ], - "description": "Beaconcha.in is an open source Ethereum explorer which makes the beacon chain and execution layer accessible to non-technical users. In addition, beaconcha.in provides an open source mobile app for iOS and android for validator monitoring.", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nbeaconcha.in is an open source explorer that provides users an easy and accessible way to explore the Ethereum network. Our explorer is designed to be user-friendly and is the visual backbone of the Ethereum ecosystem by making it accessible to non-technical users. It visualizes the Execution & Consensus Layer in a single explorer. In addition to our web-based explorer, we also offer an open sourc", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nMostly Grants, API Key Sales, Mobile App subscriptions, Ads.", - "team_size": "13", - "address": "0x9d4E94dB689Bc471E45b0a18B7BdA36FcCeC9c3b", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xd9ED89A0f4cfbC1be4b7b1aA744b5bd25ACA9979", - "project_pathname": "0xd9ED89A0f4cfbC1be4b7b1aA744b5bd25ACA9979", - "optimismAddressFound": true, - "optimismBalanceEth": 0.09715400672172587, - "github_data": [ - "data/github/https:__github.com_beaconchain_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Duniversity (Dune Education)", - "socials": [ - "https://twitter.com/agaperste,%20https://twitter.com/andrewhong5297,%20https://twitter.com/0xBoxer", - "https://dune.com/duniversity" - ], - "description": "We teach people about all things web3 data related. Goal is to empower the curious through education and support to explore the vast ocean of web3 data.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWe teach analysts how to use Dune infrastructure to conduct web3 analysis, including for OP. We had Michael from OP last year on an Arcana episode to talk about L2 and how to do analysis on L2 using OP as an example. And we continue to enable and support more web3 data people to do data work on OP via Dune.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe are on the community team of Dune. We get paid via Dune.", - "team_size": "2-3 people depending on the time. The regular education squad at Dune is 2 people.", - "address": "0xAA857AC645733FbF3105b0406417d35BA1576ff8", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xAA857AC645733FbF3105b0406417d35BA1576ff8", - "project_pathname": "0xAA857AC645733FbF3105b0406417d35BA1576ff8", - "optimismAddressFound": true, - "optimismBalanceEth": 0.00982885429360496, - "github_data": [] - }, - { - "project": "Gelato", - "socials": [ - "https://twitter.com/gelatonetwork", - "https://github.com/gelatodigital", - "https://gelato.network/" - ], - "description": "Gelato is Web3\u2019s decentralized backend empowering builders to create augmented smart contracts that are automated, gasless and off-chain aware on all major EVM-compatible blockchains. Gelato has already emerged as the preferred choice for some of the most important Web3 projects and is powering 200+ decentralized applications and handling tens of thousands of transactions each day.", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nGelato supports the Optimism Stack by focusing on 3 key areas: utility, usability and user experience. Our mission is to accelerate the adoption of web3 and democratize the web by building the infrastructure necessary for developers to create augmented smart contracts that are automated, gasless and off-chain aware. As a result, Gelato is contributing to the public good by enhancing web3 UX.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nThe company is sustained through venture capital financing.", - "team_size": "29", - "address": "0x01ea687Be2937D4Bfd9e302b8dbD3be8d9bDb14e", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x587e9cbc67Af10a9d95F3e38836943667b331392", - "project_pathname": "0x587e9cbc67Af10a9d95F3e38836943667b331392", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_gelatodigital_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Messari Protocol Services", - "socials": [ - "https://twitter.com/MessariCrypto", - "https://github.com/messari", - "https://messari.io/" - ], - "description": "Our work falls under 3 buckets: Subgraph development - We've built standardized subgraphs for most of the top Optimism projects. Data dashboards - Charting TVL, trading volume, revenue, liquidity added/removed from both the macro level and on an individual pool basis. Governance reporting - Breaking down governance structures and looking at voter/delegate analysis", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nThe open-source subgraph infrastructure improves the tooling available to facilitate a more robust developer community enabling them to create powerful tools. The data dashboards provide the community with more granular data sets to make more informed decisions. The governance reports give a clearer idea of the power dynamics of the DAO", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nMessari has raised $60m in venture funding, however, our Protocol Services arm is a separate unit from the revenue generating Messari Enterprise. The entirety of our work is publicly available and therefore not monetized through any paywall, so it is solely funded through project grants to cover the research, data science, engineering, and business efforts to make this work possible.", - "team_size": "150", - "address": "0x47A6a1B6492B6dF811606B8294A02b4268e86dAD", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x47A6a1B6492B6dF811606B8294A02b4268e86dAD", - "project_pathname": "0x47A6a1B6492B6dF811606B8294A02b4268e86dAD", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_messari_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Michael Vander Meiden", - "socials": [ - "https://twitter.com/vander_meiden", - "https://youtu.be/Tz5BMaFKK5w" - ], - "description": "My work for the Optimism Collective falls into two categories: * 1st is my volunteer contributions to Optimism Governance, mainly planning, hosting, and recapping the bi-weekly governance calls. * 2nd is my youtube channel, 'The Blockchain Guy', making hype-free & high-quality educational content focused on the Optimism and Ethereum ecosystems.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\n* Through the bi-weekly governance calls, I have created a welcoming, open, and productive space for high-quality governance discussion. These calls have been a multiplier for the quality & speed of iteration for OP governance. * My educational videos are the highest quality Optimism-focused videos on youtube. Videos topics include Optimism Governance, Bedrock, EIP-4844 & protocol deep dives.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nFor the last 2 years I have been surviving using *savings* from my last web2 job along with minor supplementation from part-time poker, hackathon winnings, and YouTube. * Poker: ~$6,000 * Web3 Hackathons: ~$5,000 * Youtube: $1,477 Doing well in this round of RPGF will allow me to double down on the things I care about most: high quality educational content & helping the Optimistic Vision succeed.", - "team_size": "Just me. Everything I do is a team of one. Research, planning, filming & editing for the videos is all done 100% by myself. Same goes for planning, hosting, & summarizing the governance calls. One thing I hope to do with RPGF funds is to hire a video editor so that I can increase the quantity & quality of my educational content.", - "address": "0x6EdA5aCafF7F5964E1EcC3FD61C62570C186cA0C", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x6EdA5aCafF7F5964E1EcC3FD61C62570C186cA0C", - "project_pathname": "0x6EdA5aCafF7F5964E1EcC3FD61C62570C186cA0C", - "optimismAddressFound": true, - "optimismBalanceEth": 0.42782013882310377, - "github_data": [] - }, - { - "project": "CANDIDE Wallet", - "socials": [ - "https://twitter.com/candidewallet", - "https://github.com/candidelabs", - "https://candidewallet.com/" - ], - "description": "CANDIDE is an open-source smart contract wallet based on ERC-4337, the account abstraction standard for censorship resistant contract wallets. It supports social recovery, sponsored transactions for gasless/ERC-20 based payments, and batched transactions for one click dapp experiences.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nThe open-source code for the wallet includes mobile-app client, safe-4337 compatible contracts, and a unique account recovery module along with its interface. The infrastructure that powers the wallet includes a simple bundler & paymaster for sponsored transactions. CANDIDE-4337 implementation have been used as a reference for many teams building Account Abstraction wallets and applications", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nCANIDIDE Wallet received a grant from the Token House in Phase 1. It\u2019s up to the Citizens\u2019 House badgeholders to decide if their impact from what they\u2019ve built has provided more public good than they had received in funding.", - "team_size": "3 core contributors", - "address": "oeth:0xf508311867EFdC50cf36B06EC95E0EEdb22", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xC2842A7653b9c2272F424a18DFf468C32d1f874D", - "project_pathname": "0xC2842A7653b9c2272F424a18DFf468C32d1f874D", - "optimismAddressFound": false, - "optimismBalanceEth": 0, - "github_data": [ - "data/github/https:__github.com_candidelabs_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Layer 2 Weekly Roundup", - "socials": [ - "https://twitter.com/daddysether", - "https://layer2roundup.substack.com/" - ], - "description": "The Layer 2 Weekly Roundup is an educational weekly newsletter that provides a comprehensive roundup comprised of the most important user and developer updates from across Ethereum's Layer 2 ecosystem. The Layer 2 Weekly Roundup is a public good that is home to over 500 subscribers who utilize this resource to source high quality information from across multiple Layer 2 scaling protocols.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nThis newsletter supports the OP stack by communicating high quality user and developer updates to the Optimism community, saving an immense amount of time that would otherwise require hours of research each week. These weekly roundups are especially useful to newer members of the crypto community who want to remain updated on the latest happening from across Ethereum's Layer 2 ecosystem.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nRight now the Layer 2 Weekly Roundup is run primarily as a public good for the purpose of providing free education to members of the Ethereum community. The Weekly Roundup does not generate any revenue as it is not currently sponsored, and is entirely free of charge. I sustain myself through my current full time role which is as a Community Manager at Scroll.", - "team_size": "The Layer 2 Weekly Roundup is a humble team of one :)", - "address": "0xd63f3C8898673717f26C011597e0a613CAb6D982", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x24b0529c7226AE66968B9A8b521b266A2cA4a898", - "project_pathname": "0x24b0529c7226AE66968B9A8b521b266A2cA4a898", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [] - }, - { - "project": "Web3 Data Degens", - "socials": [ - "https://twitter.com/andrewhong5297", - "https://github.com/andrewhong5297", - "https://web3datadegens.substack.com/" - ], - "description": "Making web3 data accessible for everyone.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nI help train wizards and bring publicity/awareness to all EVM chains, with Optimism being one of our main partners.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nDune Analytics employs me.", - "team_size": "1", - "address": "0x2Ae8c972fB2E6c00ddED8986E2dc672ED190DA06", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x2Ae8c972fB2E6c00ddED8986E2dc672ED190DA06", - "project_pathname": "0x2Ae8c972fB2E6c00ddED8986E2dc672ED190DA06", - "optimismAddressFound": true, - "optimismBalanceEth": 0.4687461129225868, - "github_data": [ - "data/github/https:__github.com_andrewhong5297_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Infinity Wallet & Web3 Browser", - "socials": [ - "https://twitter.com/InfinityWallet", - "https://infinitywallet.io/%20(currently%20in%20the%20process%20of%20a%20complete%20website%20update%20to%20demonstrate%20all%20the%20latest%20features)" - ], - "description": "Infinity Wallet is the first all-in-one non-custodial wallet ecosystem and Web3 browser of its kind on desktop ('a Super Wallet'), launched in 2019, and supporting hundreds of thousands of users. Not a browser extension, but a complete standalone desktop application providing a one-stop solution for seamless access and usability of DeFi, NFTs, cross-border payments and Web3 applications.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWe support the OP ecosystem and devs by providing a complete interface for onboarding and usage of OP and OP applications. Bringing a unique new way to access & interact with the OP ecosystem, in our 1st of its kind Wallet & Web3 Browser with DApp store. Enabling developers to leverage our free to use infrastructure to deploy & grow OP applications for use in a more natural and user friendly way.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nInfinity Wallet has never raised outside funding and is a self funded project by members of the team, while being free to use. Infinity Wallet has possible future revenue streams through the many services we offer, while remaining free to use at its core. However at the moment our main focus is on building out the Infinity Wallet further to continue to provide users with the ultimate experience.", - "team_size": "We are a team of 7 members. Additional information can be found in our information deck here https://infinitywallet.io/docs/Infinity%20Wallet%20Deck.pdf", - "address": "0xb7D6937F3aa9E09817C045b7d5b5Fb5064370671", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xb7D6937F3aa9E09817C045b7d5b5Fb5064370671", - "project_pathname": "0xb7D6937F3aa9E09817C045b7d5b5Fb5064370671", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [] - }, - { - "project": "Optimism Prices Contracts", - "socials": [ - "https://github.com/ethzoomer/optimism-prices", - "https://github.com/ethzoomer/optimism-prices" - ], - "description": "A set of Optimism-unique smart contracts that can price any ERC20 asset that exists in a liquidity pool on Optimism, completely replacing the need for centralized price APIs. Supports pricing that requires complex routes with many hops, supports non-standard ERC20 implementations and non-standard AMM curves, and allows for fetching the prices of hundreds of tokens in a single RPC call.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nOptimism Prices Contracts are not only decentralized/trustless, but a superior solution than centralized APIs. Some of the largest Optimism dapps solely use Optimism Prices for pricing data; they no longer need to shell out cash for centralized pricing APIs, or pray that Coingecko's API is able to price a brand new token that appeared on the chain, instead they can merely execute a single RPC call", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nThe Optimism Prices Contracts team does not have any funding or revenue, and by design the product will always be an open source public good. To sustain ourselves personally, we both work as full stack developers within the Optimism ecosystem.", - "team_size": "Two team members: ZoomerAnon - smart contract developer, Meowmeow - smart contract developer. The development of our contracts is 100% open source, so anybody can always contribute with a pull request on Github. We frequently take feedback from teams that use the contracts in prod to decide what new features to focus on - for example, the LP reserves caching system is a result of this feedback.", - "address": "0x82D54397B88CE80Ea2Df9aD049213ACb47dc2523", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x82D54397B88CE80Ea2Df9aD049213ACb47dc2523", - "project_pathname": "0x82D54397B88CE80Ea2Df9aD049213ACb47dc2523", - "optimismAddressFound": true, - "optimismBalanceEth": 14.692559342826275, - "github_data": [ - "data/github/https:__github.com_ethzoomer_optimism-prices_events_2022-07-01_2023-03-01.json", - "data/github/https:__github.com_ethzoomer_optimism-prices_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Umbra", - "socials": [ - "https://twitter.com/UmbraCash", - "https://github.com/ScopeLift", - "https://app.umbra.cash/" - ], - "description": "Umbra is a stealth address protocol for EVM networks. Umbra enables privacy preserving payments where the receiver's identity is not revealed. Umbra is simple, low gas solution for getting paid privately, that's been in development for nearly 3 years.", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nUmbra was deployed on the Optimism network shortly after it became possible to do so. We recently added support for stablecoins. It has thousands of users on Optimism who have transacted millions in value. Umbra is a public-goods protocol that anyone can integrate with or build on. We believe payments are an important usecase for low-fee networks like Optimism.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nUmbra has been funded only by grants, including from the EF, MolochDAO, and Gitcoin rounds.", - "team_size": "Umbra is built by ScopeLift, a six person team of EVM experts that has contributed to many projects in the Ethereum ecosystem.", - "address": "0x5C04E7808455ee0e22c2773328C151d0DD79dC62", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x5C04E7808455ee0e22c2773328C151d0DD79dC62", - "project_pathname": "0x5C04E7808455ee0e22c2773328C151d0DD79dC62", - "optimismAddressFound": true, - "optimismBalanceEth": 0.01710102206413176, - "github_data": [ - "data/github/https:__github.com_ScopeLift_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Cryptoversidad", - "socials": [ - "https://twitter.com/cryptoversidad", - "https://www.youtube.com/@Cryptoversidad" - ], - "description": "Cryptoversidad is an organization that educates people about web3 so that they can use, contribute and build with web3 tools. Our mission is to accelerate the masive adoption of web3, and we believe that educating people about web3 values and tools will have a positive impact on society. We\u2019ve published educational YT videos, hosted online events and we're in the process of developing a fullcourse", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWe support the development and usage of the OP Stack through our educational content on YouTube where we covered various Layer 2 concepts: Blockchain trilemma, rollups, Layer, Optimism, Zk-rollups and Danksharding. In addition, we hosted more than 3 online events about scalabilty, modularity and rollups. Lastly, we did a IRL workshop on how to use L2 and a live talk about Danksharding", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nCurrently, we are funding our actions through a small grant we received from the Ethereum Foundation and from the AaveDAO. Although, we don't have a consisten stream of revenue/funding yet.", - "team_size": "Our team is composed of 6 awesome people: Diego Mares: Founder. Ben Mares: Co-Founder and advisor. Julio Campos: Grants. Ariel C\u00e1rdenas: Researcher Daniel Puro: Editor and animator. Carolina Rodriguez: Community Manager and social media manager.", - "address": "0x281BA4E9B7e28982d6CB53EE3836865f1453e12F", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x281BA4E9B7e28982d6CB53EE3836865f1453e12F", - "project_pathname": "0x281BA4E9B7e28982d6CB53EE3836865f1453e12F", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [] - }, - { - "project": "Orbiter Finance", - "socials": [ - "https://twitter.com/Orbiter_Finance", - "https://github.com/Orbiter-Finance", - "https://www.orbiter.finance/" - ], - "description": "Orbiter Finance is a decentralised cross-rollup bridge that aims to offer infrastructure at Layer 2 and permits instant, low-cost transactions of Ethereum-native assets. We support cross-rollup transfers among Ethereum, Optimism, StarkNet, zkSync, Loopring, Arbitrum, Arbitrum Nova, Polygon, BNB Chain, ZKSpace, Immutable X, dYdX, Metis and Boba.", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\n1. Orbiter has increased OP's customer base by providing rapid and cheap cross-rollup tx services. Orbiter-X contract has been deployed on OP to facilitate cross-rollups tx. 2. SPV contract in Orbiter system enables developers from OP to prove the validity of transactions. 3. L2 data on Orbiter provides developers from OP with comprehensive user and dapp data analysis.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nEquity Fund initially financed Orbiter team. The team is financially supported by the transfer fee generated by Orbiter bridge. In May 2022, fund from angle fundraising were used for team expansion and product development. Over the last year and a half, Orbiter has supported 1.39m tx with up to a total tx amount of $500m, generating $2.37m in revenue.", - "team_size": "We are a tech-driven team consisting of 18 core members, of which 13 are developers, the rest are product, marketing, and operations team members.", - "address": "0x10C7EEbf2fF90807CA24347cD9c7d4a42345D583", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xd923CA098dBBFb0d24677a3150fa3aA97be461b5", - "project_pathname": "0xd923CA098dBBFb0d24677a3150fa3aA97be461b5", - "optimismAddressFound": true, - "optimismBalanceEth": 0.006097007605370432, - "github_data": [ - "data/github/https:__github.com_Orbiter-Finance_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Chainlist", - "socials": [ - "https://github.com/DefiLlama/chainlist", - "https://chainlist.org/" - ], - "description": "Chainlist tracks all public RPCs available for each EVM network, along with their latency, blockheight and the privacy policy of the provider, which we summarize into easy-to-compare snippets. This allows users to switch networks/RPCs safely and to maintain privacy without having to spend hours sifting through legal docs.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\n- Decentralizes RPC infra for Optimism: without it most people would just use the RPC provided by optimism's team to avoid having to search and vet other rpcs - Improves onboarding UX for Optimism users by allowing them to add Optimism to their wallet safely and quickly - Makes evaluation of RPCs' privacy policies and performance much simpler and faster for users (otherwise this could take days)", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nFunded through donations and self-funding.", - "team_size": "It doesn't have a fixed team, most work on it is handled by 3 people, but this is highly flexible.", - "address": "0xAEcaeDc21C3ea0D84C596C126E2FD2e51E54D274", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x40bbF4468495197b919591Dae8cb5d3fE2F52e7E", - "project_pathname": "0x40bbF4468495197b919591Dae8cb5d3fE2F52e7E", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_DefiLlama_chainlist_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Solhint", - "socials": [ - "https://twitter.com/protofire", - "https://github.com/protofire", - "https://protofire.io/" - ], - "description": "Solhint is a Solidity linter. A tool that helps solidity devs to write standardized smart contracts code, taking care of code quality, order, readability, style guides, preventing known bugs, and giving security alerts. Has been a pretty popular tool within the Ethereum community. It is also an open source tool considered a public good in the ecossystem.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nProtofire has developed and open sourced Solhint, that is a useful tool that helps solidity devs to write standardized smart contracts code, taking care of code quality, order, readability, style guides, preventing known bugs, and giving security alerts. Here you can check the level of trust of the community in Solhint: https://npmtrends.com/ethlint-vs-solhint-vs-solium", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nProtofire works both with partnership agreements and grants, receiving funds to pay for engineer salaries, expenses, and also distributing most of the value captured to its members in the form of shares on treasures containing native tokens of networks and protocols we serve. Most agreements are based on the number of hours dedicated by our members.", - "team_size": "Protofire DAO is a member-owned protocol which attracts, builds, and retains engineering teams for protocols and DAOs, currently composed of 70+ engineers working for 10+ DAOs.", - "address": "0x5fC34D03cFdf145Db5f3c5B5558e39a4164AAa30", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x5fC34D03cFdf145Db5f3c5B5558e39a4164AAa30", - "project_pathname": "0x5fC34D03cFdf145Db5f3c5B5558e39a4164AAa30", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_protofire_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "EIP-5164 / PoolTogether Inc", - "socials": ["https://github.com/pooltogether"], - "description": "PoolTogether Inc builds tooling to support the PoolTogether protocol. PoolTogether is a protocol for no loss prize savings on Optimism. It's one of the most popular DeFi protocols enabling a simple, secure, and \"no loss\" on ramp for people to being using DeFi.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\n1. PoolTogether Inc developed EIP 5164, a cross-chain execution interface. This improves the OP Stack by by enabling builders to use a common interface to send messages from Ethereum to Optimism through the native bridge. https://eips.ethereum.org/EIPS/eip-5164 2. The PoolTogether protocol smart contracts are being leveraged by other builders on the OP stack: https://tinyurl.com/7rhdmjky", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nPoolTogether Inc received two rounds of seed stage venture funding. The first in October of 2019 and the second in October of 2020. The sum total of this rounds is $2.5 million. Since October 2020, PoolTogether has received no venture funding and been funded exclusively by paid work and grants. As of today, paid work and grants constitute all of our funding.", - "team_size": "5", - "address": "oeth:0xfB0dADb835fAdE151aBf6780BeAfB12FC5B", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x0a09cd09B0107Bb98a83f211704F036ECa94B92e", - "project_pathname": "0x0a09cd09B0107Bb98a83f211704F036ECa94B92e", - "optimismAddressFound": false, - "optimismBalanceEth": 0, - "github_data": [ - "data/github/https:__github.com_pooltogether_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Vyper", - "socials": [ - "https://twitter.com/vyperlang", - "https://github.com/vyperlang/", - "https://vyperlang.org/" - ], - "description": "Vyper is a contract-oriented, pythonic programming language that targets the Ethereum Virtual Machine (EVM)", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nThe public good is a means of expression (language), compiler and associated tooling for writing smart contracts that can be deployed on Optimism.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nveFunder grant from Curve DAO", - "team_size": "1 full time + 2-3 community contributors who help out as they have bandwidth", - "address": "0xAbfA48BCc0F96Fc70be7a4156b0a74Ea350167fD", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xAbfA48BCc0F96Fc70be7a4156b0a74Ea350167fD", - "project_pathname": "0xAbfA48BCc0F96Fc70be7a4156b0a74Ea350167fD", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_vyperlang__events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "donnoh", - "socials": [ - "https://twitter.com/donnoh_eth", - "https://github.com/lucadonnoh", - "https://lucadonnoh.github.io/" - ], - "description": "sup! I'm a MSc CS student at University of Bologna focused on scaling blockchains. In April 2022 I created the scalability.guide blog about scaling technologies, with articles such as \"Optimism Bedrock vs Arbitrum Nitro: Deposits\" and \"Exploring the blobspace\". In October 2022 I graduated with a CS bachelor's thesis on a comparison and analysis between Optimism Bedrock and StarkNet.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nMy work supports the development and usage of the OP stack by analyzing the technical aspects of the protocol and making them more accessible: for example, the Bedrock vs Nitro article sparked a very interesting discussion on CT about forced inclusion delays. Furthermore, my thesis about Bedrock vs StarkNet had some academic interest and will be discussed in a DLT workshop with other universities.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nIn 2022 I received a grant from StarkWare and won a prize during the ETHGlobal hackathon in Amsterdam.", - "team_size": "1", - "address": "0x33d66941465ac776c38096cb1bc496c673ae7390", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x33D66941465ac776C38096cb1bc496C673aE7390", - "project_pathname": "0x33D66941465ac776C38096cb1bc496C673aE7390", - "optimismAddressFound": false, - "optimismBalanceEth": 0, - "github_data": [ - "data/github/https:__github.com_lucadonnoh_events_2022-07-01_2023-03-01.json", - "data/github/https:__lucadonnoh.github.io__events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Optimism Support NERDs Collection", - "socials": [ - "https://docs.google.com/spreadsheets/d/1mLNltubxm2YdNYDdiMZTyiFQm_yzTfrbqTp2zjH6rlk/edit?usp=sharing" - ], - "description": "The NERD program provides human to human support on the Optimism Discord. They report spam and scams, ensure questions get answered and do so in a friendly manner. They flag issues and bugs to the team, helping the Optimism community stay safe, smart, and learn about the project. This program has been running for just over a year. They have answered hundreds of user questions while maintaining high answer satisfaction, with an average support rating of 4.75/5. To find the full list of NERDs and the weighting of their contributions click on the website link at the top of the profile \u2b06\ufe0f", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nThe NERD program allows new users to easily orient themselves in the ecosystem, and provide a friendly introduction to the Optimism vision and values. They are an invaluable connection between the team and community, often acting as the bridge for feedback and issues. They have done so on a voluntary basis and as such their impact far outweighs their profit.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWith the exception of the super-NERDs (who have been removed from this list) the NERDs run on a voluntary basis.", - "team_size": "This collection totals 35 members. There are three different NERD roles included in this collection. These groups have been weighted differently based on their contributions. The 6 Alumni NERDs were instrumental in getting the Optimism community to the point they are now. The 12 NERDs-in-training are upcoming NERDs who are finding their footing in the NERD support world. Finally, the 17 support-NERDs run the show. They do all of the user support and vibe setting described above, as well as mentoring the upcoming NERDs.", - "address": null, - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/support-nerds", - "project_pathname": "support-nerds", - "optimismAddressFound": false, - "optimismBalanceEth": 0, - "github_data": [] - }, - { - "project": "OPCraft & MUD (Lattice)", - "socials": [ - "https://twitter.com/latticexyz", - "https://github.com/latticexyz", - "https://lattice.xyz/" - ], - "description": "Lattice is facilitating complex on-chain projects with MUD (https://mud.dev): an application framework for Ethereum & Autonomous Worlds (https://shortest.link/autonomous) MUD helps developers be more ambitious on-chain: using the OP Stack and MUD, we built OPCraft \u2014 an on-chain Voxel Game (https://shortest.link/opcraft) \u2014 and we enabled dozens of team to push the envelope of Dapps. see below:", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nOPCraft was the first app on the OP Stack. In 2 weeks, it saw 3.5m TX (~2x of Bedrock testnet) and helped uncover various bugs in the Stack MUD is OSS and is used to build various projects that run on Optimism/OP Stack, including Words3, an on-chain infinite scrabble and Asphodel, an on-chain MMO. 3 months in, dozens of team are working full time with MUD and planning to ship on OP(mainnet/stack)", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nLattice is 100% grant funded by 0xPARC Foundation, which is itself funded by the EF, Gitcoin, and more Lattice has no revenue and all of our output is open-source (https://github.com/latticexyz) Lattice did not receive any revenue ($OP nor cash) for its development of OPCraft and MUD. We believe in mutualism and decentralization over profits and have turned down investments from Tier 1 VC", - "team_size": "We are a full-time team of 9, including six engineers and three artists and operators", - "address": "0xFb74562ec4e55c4BE2800b79a60e10ab6175Fa3a", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xD8ce5Ae15E2A9C8528FDce195AD43015782C5079", - "project_pathname": "0xD8ce5Ae15E2A9C8528FDce195AD43015782C5079", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_latticexyz_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "DeFi Library", - "socials": [ - "https://twitter.com/LibraryDefi", - "https://defilibrary.substack.com/" - ], - "description": "DeFi Library is a free source of information about DeFi, Ethereum, Rollups, Bridges, and Modular Blockchains for the Turkish community. For the last three years, it has become one of the most trusted sources for technical and non-technical information in Turkish. Turkey has a strong community (one of the largest communities) so it\u2019s essential to provide trustable information in the native language", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nDeFi Library published more that 10 research piece (technical & not technical) and video tutorials about Optimism. Since Turkish community has a language barrier to reach comprehensive information, DeFi Library helped them to overcome this. Thousands of people learn more about Optimism, how to benefit from ecosystem, technical stack, tokenomics and future plans. Onboarded thousands to ecosystem.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nDeFi Library is a free source of information. It has no recurring revenue.", - "team_size": "1 Person", - "address": "0x4e3D9399C28c724293dd545225Ec843Ac4c9e953", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x4e3D9399C28c724293dd545225Ec843Ac4c9e953", - "project_pathname": "0x4e3D9399C28c724293dd545225Ec843Ac4c9e953", - "optimismAddressFound": true, - "optimismBalanceEth": 0.023708657342348664, - "github_data": [] - }, - { - "project": "OpenZeppelin", - "socials": [ - "https://twitter.com/OpenZeppelin", - "https://github.com/openzeppelin", - "https://openzeppelin.com/" - ], - "description": "OpenZeppelin provides security products to build, automate, and operate decentralized applications. We also protect leading organizations by performing security audits on their systems and products.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nOpenZeppelin Contracts provide a set of standardized smart contracts that support OP ecosystem deployment of ERC20/ERC721 tokens, contract upgradability, utilities for bridging cross-chain messages (incl. Optimism), and decentralized governance. Version 4.9 of the Contracts library will feature a new version of Governor that will support operating with timestamps instead of block numbers.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nThe company supports the project with revenue from security services and other licensed products, and with grants from other ecosystems.", - "team_size": "87", - "address": "0x41f89516DbFDfF2A902AdD2E141C3c22b561BFBc", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x6084fBE2Aa96Bb131D6Bc7Bd3BE786882cfA250F", - "project_pathname": "0x6084fBE2Aa96Bb131D6Bc7Bd3BE786882cfA250F", - "optimismAddressFound": true, - "optimismBalanceEth": 0.000251630573271048, - "github_data": [ - "data/github/https:__github.com_openzeppelin_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Otterscan", - "socials": [ - "https://twitter.com/otterscan", - "https://github.com/wmitsuda/otterscan", - "https://otterscan.io/" - ], - "description": "Otterscan is a self-hosted, fast, local, private, block explorer. It has a very small footprint, does not require installing additional DB, middleware, etc. It works together with your Erigon node. It relies only on onchain data and offline data sources. All custom information it needs from Erigon is available as custom APIs, so other dapp can make use of them too.", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nOptimism will soon support Erigon as an execution client (that is public information) and when that happens, all Optimism users will benefit from having Otterscan as a self-hosted block explorer.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe receive a small recurrent grant from Erigon team (enough to maintain 1 person team) and we have a gitcoin grant that help to cover extra expenses (buy test hardware, attend conferences, etc.) There are no investors or companies backing the project.", - "team_size": "1 person - Willian Mitsuda", - "address": "0x43a0744e8a1A63C481aaDD5CEA12833D6976F851", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xd31b671F1a398B519222FdAba5aB5464B9F2a3Fa", - "project_pathname": "0xd31b671F1a398B519222FdAba5aB5464B9F2a3Fa", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_wmitsuda_otterscan_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Optimism Monorepo Dependencies Collection", - "socials": [ - "https://github.com/ethereum-optimism/optimism", - "https://oplabs.notion.site/Optimism-Monorepo-dependencies-collection-PUBLIC-175d71a2b0654f95970b3b8b6cdbb047" - ], - "description": "This collection consists of 100 open source software projects that are essential dependencies of the Optimism tech stack. This software is critical to the success of the OP Stack. You can find the full list of projects, and the methodology with which they were selected, by clicking on the website link at the top of the profile page \u2b06\ufe0f", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nFunding these dependencies is important for several reasons. First, the success of the Optimism platform depends on the continued development and maintenance of these projects. Second, these projects are public goods that benefit the broader software development community, not just Optimism, and not just crypto. Third, by funding these dependencies through RetroPGF, we can ensure that the development and maintenance of these projects remains sustainable over the long term.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nYou can find the full list of projects by clicking on the website link at the top of the profile page \u2b06\ufe0f", - "team_size": "All rewards will be split evenly between the 100 projects in the collection.", - "address": null, - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/monorepo-dependencies", - "project_pathname": "monorepo-dependencies", - "optimismAddressFound": false, - "optimismBalanceEth": 0, - "github_data": [ - "data/github/https:__github.com_ethereum-optimism_optimism_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Scry", - "socials": [ - "https://twitter.com/ScryProtocol", - "https://github.com/ScryProtocol", - "https://scry.finance/" - ], - "description": "Scrys Open Oracle Frameworks an infrastructure for oracles for developers to access external data in a fully permissionless and decentralized way. The infrastructure allows devs to self deploy high scale oracles for any API with the contracts, nodes and front end all ready to use in <15m. This allows devs to create oracles using their own reputable signers in their communities. Uniswap for data.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nOptimism is severly underserved by other oracles with not even 50 feeds by the largest oracle providers, while Scry enables >200 feed updates with just 1 tx. These feeds also allow new capibilities such as onchain historical lookup for feeds at any timestamp, no code deployment and feed management. New feeds can be deployed in <60s. The tools are completely free, open source and can used by anyone", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nAtm the project has been self funded with a current expense personally to about $300k. The project atm has had no funding but we are hoping grants can help to create ways for us to recover costs, by showing how good the tools that weve made rather than asking for funds for ideas. We are looking at a freemium model, whereby core tools are and always will be free with premium features for a fee.", - "team_size": "1. Just me. Have developed the node, contracts and fornt end, as well as docs. Have had help with contracts by a friend that's a dev but am the only person currently on the team. Highly recommend people check out the docs to get a full understanding for whats been built and the time and care that have spent. https://docs.scry.finance/", - "address": "0x9D31e30003f253563Ff108BC60B16Fdf2c93abb5", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x9D31e30003f253563Ff108BC60B16Fdf2c93abb5", - "project_pathname": "0x9D31e30003f253563Ff108BC60B16Fdf2c93abb5", - "optimismAddressFound": true, - "optimismBalanceEth": 0.2801585421235169, - "github_data": [ - "data/github/https:__github.com_ScryProtocol_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "BuidlGuidl", - "socials": [ - "https://twitter.com/buidlguidl", - "https://github.com/BuidlGuidl", - "https://buidlguidl.com/" - ], - "description": "A curated group of Ethereum builders creating products, prototypes, and tutorials to enrich the web3 ecosystem. We mentor developers and orgs through the SpeedRun and beyond.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWe prepare developers to build on Optimism with tools like Scaffold-Eth and educational material like SpeedRunEthereum.com! We are shipping forkable products like punkwallet and multisig(dot)lol that run on Optimism. We have even deployed experimental projects to Optimism like the onchain SVG NFT OE40s. (Did you know they have a built in public goods funding mechanism?)", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nAt first it was all of Austin Griffith's airdrops but now we are funded by grants from the ecosystem, primarily from the EF.", - "team_size": "Somewhere between 6 and 600 but it changes daily. We are streaming ETH to about 60 devs but even those streams can pause while they go work on other things.", - "address": "0xa81a6a910FeD20374361B35C451a4a44F86CeD46", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x34aA3F359A9D614239015126635CE7732c18fDF3", - "project_pathname": "0x34aA3F359A9D614239015126635CE7732c18fDF3", - "optimismAddressFound": true, - "optimismBalanceEth": 2.531816537605181, - "github_data": [ - "data/github/https:__github.com_BuidlGuidl_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Node Guardians", - "socials": [ - "https://twitter.com/nodeguardians", - "https://github.com/Nodeguardians", - "https://nodeguardians.io/" - ], - "description": "Node Guardians is an RPG that caters to seasoned Solidity devs. We provide over 60 hours of Solidity in the form of CTF & programming problems for free. We've built a custom pipeline to evaluate the users code and verify whether it meets certain criteria. Hackers can unlock soul-bound (off-chain) collectibles that represent their progress in the game.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nGiven that the OVM is EVM-compatible, we're providing free resources for Optimism builders to challenge their programming skills, learn and eventually deliver safer / more sophisticated code.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nStaking commissions : We run validators on PoS chains (Cosmos Hub - Osmosis - Axelar etc) and apply to delegation programs. Grants Strategic Partnerships : https://twitter.com/StarkWareLtd/status/1616066486803505154 Organising developer conferences & hackathons : StarkNetCC was bootstrapped by Node Guardians (& Onlydust) https://www.starknet.cc/", - "team_size": "10 full-time + part-time contributors", - "address": "0x6ef87E0Aaadb2c3d07fD98a098Af5FaD0aD45811", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x6ef87E0Aaadb2c3d07fD98a098Af5FaD0aD45811", - "project_pathname": "0x6ef87E0Aaadb2c3d07fD98a098Af5FaD0aD45811", - "optimismAddressFound": true, - "optimismBalanceEth": 0.000607194034925801, - "github_data": [ - "data/github/https:__github.com_Nodeguardians_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Revolte", - "socials": [ - "https://twitter.com/IrruptionLab", - "https://github.com/pgrandne/", - "https://revolte.app/" - ], - "description": "Join the Web3 revolution with Revolte! Our adventure game introduces users to the world of blockchain, wallets, tokens, and more, with mandatory tasks like wallet installation to guide players through the story. Explore real Web3 applications on Optimism and experience the potential of this transformative technology.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nOur adventure game educates and onboards Web2 users to Web3. Revolte drives adoption of the Optimism network, increasing accessibility to Web3 and providing a public good. With each subsequent chapter, we introduce new Web3 applications and protocols to showcase the endless possibilities of the technology. By fostering an inclusive and informed community, we contribute to advancing Web3 technology", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe're currently self-funded, but hope to receive funding from Optimism's RPGF to continue development. Our Business Model includes partnering with protocols (and grants) to onboard new users through our adventure game. This mutually beneficial arrangement allows us to continue developing our project while offering protocols a new and effective way to reach new users.", - "team_size": "We are currently a team of 2. With the funding from Optimism's RPGF, we plan to expand our team and professionalize our platform's UX/UI. It will allow us to create new adventures more frequently and secure partnerships with blockchain protocols to make our platform economically sustainable. We also plan to bring on a scenario writer and a game level designer to enrich the game mechanics.", - "address": "0x1a2b8bd408413179524e3e61FfA1378b7b7688D5", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xAC4DDaf8FBfFba0f1e8c7619720335FD4f03EaCD", - "project_pathname": "0xAC4DDaf8FBfFba0f1e8c7619720335FD4f03EaCD", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_pgrandne__events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "eth.limo", - "socials": [ - "https://twitter.com/eth_limo", - "https://github.com/ethlimo", - "https://eth.limo/" - ], - "description": "eth.limo is a privacy-preserving ENS gateway, enabling users to access Ethereum-native dApps and content. LIMO represents a shift in dweb adoption by providing an alternative means of accessing ENS resolvable content. LIMO takes public gateway services a step further by enforcing strong privacy guarantees such as never logging IP addresses or engaging in TCP fingerprinting.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nCurrently eth.limo is the only ENS gateway that utilizes CCIP read enabling users to securely & reliably read retrieved data offchain and cross chain. Users can create and manage name records on Optimism at a much lower cost increasing adoption I.E.Optinames.eth. Kwenta which is a synthetics futures exchange also utilizes eth.limo for it's main website which trades entirely on Optimism.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\neth.limo primarily funds itself via: Ethereum Foundation grants ENS grants Gitcoin grants There is no revenue at the moment since our service is a free public good. We're looking at ways to offer monetized features to users and projects but access to the gateway will always be free.", - "team_size": "2 full time employees 2 part time contractors", - "address": "0xB352bB4E2A4f27683435f153A259f1B207218b1b", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xB352bB4E2A4f27683435f153A259f1B207218b1b", - "project_pathname": "0xB352bB4E2A4f27683435f153A259f1B207218b1b", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_ethlimo_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Cannon", - "socials": [ - "https://github.com/usecannon/cannon", - "https://usecannon.com/" - ], - "description": "Cannon is an 'Infrastructure as Code' tool (like Terraform) for Foundry and Hardhat. Users generate Cannonfiles instead of deploy scripts for a declarative approach to managing protocols, including upgrades and configuration. Deployment information can be shared on the registry (hosted on Ethereum and IPFS) to be used in other Cannonfiles and run for local testing and development.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nCannon has already been used to deploy thousands of lines of code to Optimism and its testnet. As the modularity of the OP Stack will allow for the creation of more L2s and L3s, the ability to manage protocol deployments, upgrades, and configurations across many chains will become increasingly necessary. Cannon makes it trivial to scale protocol deployment across an arbitrary number of chains.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nThe project is being incubated alongside the development of Synthetix V3, as we've needed to develop more generalized tooling based on lessons learned from maintaining the current version of Synthetix. Outside of a small prize from the ETH Denver 2022 Hackathon, where the project was conceived, the project has received no funding or revenue.", - "team_size": "Daniel Beal, Noah Litvin, Mat\u00edas Lescano", - "address": "0x07Aeeb7E544A070a2553e142828fb30c214a1F86", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x07Aeeb7E544A070a2553e142828fb30c214a1F86", - "project_pathname": "0x07Aeeb7E544A070a2553e142828fb30c214a1F86", - "optimismAddressFound": true, - "optimismBalanceEth": 0.29103241852241823, - "github_data": [ - "data/github/https:__github.com_usecannon_cannon_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "EIP-4844 Contributors Collection", - "socials": [ - "https://oplabs.notion.site/EIP4844-Contributors-Collection-PUBLIC-8b8b89e744b944c1a5a5749314669e88" - ], - "description": "This nomination is for a collection of contributors to EIP4844. EIP-4844 introduces a new kind of transaction type to Ethereum which accepts 'blobs' of data to be persisted in the beacon node for a short period of time. These changes are forwards compatible with Ethereum's scaling roadmap, and blobs are small enough to keep disk use manageable. EIP-4844 is project-neutral and being developed 100% in the open by a wide mix of developers across different teams, this collection aims to reward that network of contributors. To find the list of contributors and the weighting of their contribution click on the website link at the top of the profile \u2b06\ufe0f", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nData blobs introduced by EIP4844 enable rollups like Optimism mainnet and other rollups built on the OP Stack to grow 100x in capacity. This means that EIP4844 plays a crucial role in enabling the scalability of the OP Stack and supporting its development and usage.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nThis collection is made up of individual contributors, you can find the list of contributors and the weighting of their contribution click on the website link at the top of the profile \u2b06\ufe0f", - "team_size": "Data blobs introduced by EIP4844 enable rollups like Optimism mainnet and other rollups built on the OP Stack to grow 100x in capacity. This means that EIP4844 plays a crucial role in enabling the scalability of the OP Stack and supporting its development and usage.", - "address": null, - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/eip-4844", - "project_pathname": "eip-4844", - "optimismAddressFound": false, - "optimismBalanceEth": 0, - "github_data": [] - }, - { - "project": "Lighthouse", - "socials": [ - "https://twitter.com/sigp_io", - "https://github.com/sigp", - "https://lighthouse.sigmaprime.io/" - ], - "description": "Lighthouse is an Ethereum consensus client that connects to other Ethereum consensus clients to form a resilient and decentralized proof-of-stake blockchain. It is one if the most used Ethereum consensus clients, focused on performance and security. It is free and open source with the most permissive license we could find (Apache 2.0).", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWe contribute to and build the Ethereum core protocol. As the vision of the Ethereum protocol is to support all layer 2's we actively work towards facilitating this vision through research and development. The current direct support to the OP stack we are actively helping with is the design and development of EIP4844 which aims to significantly reduce costs for all layer 2s including Optimism.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe are solely funded via grants. We receive grants from the Ethereum foundation, gitcoin grants and public donations.", - "team_size": "The current team size is 12.", - "address": "0x0ad5d3975258776cF81b9dcbe6fF4ed0Ae82b29e", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x59cc06BF5CF5e07790432599060B7D402F9d2cA8", - "project_pathname": "0x59cc06BF5CF5e07790432599060B7D402F9d2cA8", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_sigp_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Layer2DAO", - "socials": [ - "https://twitter.com/TheLayer2DAO", - "https://github.com/layer2dao", - "https://docs.layer2dao.org/" - ], - "description": "Layer2DAO is expanding the Ethereum L2 ecosystem and boosting L2 ecosystem projects. The DAO is using its treasury to invest and partner with high-impact L2 protocols and ecosystem plays, serving as a diversified treasury for DAO members looking to gain exposure to the L2 ecosystem growth.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nL2DAO has on-boarded many new users to the Ethereum Layer 2 ecosystem, and specifically Optimism through NFT projects and the OPIncubator program. The DAO has created multiple NFT collections on Optimism (both free and paid), and with new data reporting that the gateway to web3 is likely to be NFTs, Layer2DAO will continue to play a strong role in advocating for and growing the Optimism ecosystem.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nThe project was bootstrapped and has built a treasury through token sales, NFT sales and commissions, and liquidity provisioning.", - "team_size": "5 core team members.", - "address": "0xaF5a0068f5465260A1a88A6264D0dcE4469609CF", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x062a07cBf4848fdA67292A96a5E02C97E402233F", - "project_pathname": "0x062a07cBf4848fdA67292A96a5E02C97E402233F", - "optimismAddressFound": true, - "optimismBalanceEth": 9.962052819400398, - "github_data": [ - "data/github/https:__github.com_layer2dao_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Smock", - "socials": [ - "https://twitter.com/DeFi_Wonderland", - "https://github.com/defi-wonderland/smock", - "https://defi.sucks/" - ], - "description": "Smock is the Solidity mocking library. It is installed as a Hardhat plugin which can be used to create mock Solidity contracts entirely in JavaScript (or TypeScript!). With Smock, writing tests for smart contracts becomes incredibly easy, improving the ecosystem's security. First built by Optimism in March 2021 and later, in July 2021, Wonderland took the mission to rewrite it in a scalable way", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWith our improvements, Smock has become the de facto Solidity mocking library. Its use has been extended among Optimism and solidity developers in all EVM chains, and we\u2019re proud of reaching 17 releases, dependency in 795 repositories & 279 stars in GitHub. Smock usage can be found all over the main Optimism Repository and in many other protocols currently deployed in Optimism.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nSince July 2021, DeFi Wonderland has been covering all of the costs related to Smock development. This includes both dedicating time of DeFi Wonderland\u2019s developers, and funding bounties in DeWork in order to further incentivize community development.", - "team_size": "Smock has been a joint effort by DeFi Wonderland, Optimism, and external contributors. The detailed list can be found [here](https://github.com/defi-wonderland/smock/graphs/contributors). - DeFi Wonderland: 0xGorilla, wei3erHase, 0xOneTony - Optimism: smartcontracts - External contributors: Tonykogias, 5h4z4mm, eugenioclrc", - "address": "0x4f2188dfD474E502Ea67D09bE3E58b761B6AEEB7", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x3B1E17b3FC8B2B2c5FBb995Fb3E1dE95a4D7cF7D", - "project_pathname": "0x3B1E17b3FC8B2B2c5FBb995Fb3E1dE95a4D7cF7D", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_defi-wonderland_smock_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Dapp-Learning", - "socials": [ - "https://twitter.com/Dapp_Learning", - "https://github.com/Dapp-Learning-DAO" - ], - "description": "We are designed for developers to step into blockchain DAPP development, where they can learn **DeFi, NFT, DAO, CRYPTO** projects. We hope we could not only give junior developers a feasible and easy-to-use blockchain **DAPP** learning roadmap, but also present advanced developers with a platform for communication and cooperation.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWe have a tutorial to teach developers how get started OP dapp. https://github.com/Dapp-Learning-DAO/Dapp-Learning/tree/main/basic/28-optimism-layer2 And we are planing to invite experts to technique sharing about OP(Underlying principles and dapp development).", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe are an non-profit organization. We are sponsered by Ethereum Foundation. We also accept donation from some famous organization like Loorpring, Scroll, Hashkey, SNZ. What's more we also have an gitcoin grant to accept donation.", - "team_size": "8 core contributors", - "address": "0x1F7b953113f4dFcBF56a1688529CC812865840e1", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x1F7b953113f4dFcBF56a1688529CC812865840e1", - "project_pathname": "0x1F7b953113f4dFcBF56a1688529CC812865840e1", - "optimismAddressFound": true, - "optimismBalanceEth": 0.04954102448388358, - "github_data": [ - "data/github/https:__github.com_Dapp-Learning-DAO_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "0xPARC", - "socials": [ - "https://twitter.com/0xparc", - "https://github.com/0xparc", - "https://0xparc.org/" - ], - "description": "The 0xPARC Foundation promotes application-level innovation on Ethereum. Our primary areas of focus are: - Cryptography: ZK, MPC, and more. - Autonomous Worlds: funding projects like Lattice, Dark Forest, DFDAO, etc - Education: we organize learning residencies, hackathons, and conferences on ZK and AW. 0xPARC funds infrastructure work, research, and groups that would otherwise be underfunded.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\n0xPARC funded an exploration on aggregating ECDSA signatures in order to make optimistic rollups cheaper (https://shortest.link/ecdsa). We put together educational material for ZK (http://learn.0xparc.org/) and an advanced course on ZK at MIT: https://zkiap.com/. We developed core ZK libraries like ecne, zkRepl, and more. These OSS tools will accelerate proof diversity on the OP Stack.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\n0xPARC has no revenue and doesn't hold shares in any of the project we support. It is funded by the Ethereum Foundation, Gitcoin, Gather Town, Gnosis Chain, ETH Global, and some anonymous funders.", - "team_size": "0xPARC has a team of 7 full-time people.", - "address": "0x5401745963974c22F8f8254a2A904Ea5f54ddc22", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x5401745963974c22F8f8254a2A904Ea5f54ddc22", - "project_pathname": "0x5401745963974c22F8f8254a2A904Ea5f54ddc22", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_0xparc_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "WTF Academy", - "socials": [ - "https://twitter.com/WTFAcademy_", - "https://github.com/AmazingAng", - "https://wtf.academy/" - ], - "description": "WTF Academy is a web3 open-source university for developers, aiming to onboard 10,000 developers to web3. We provide free and open-source tutorials, tests, and certificates for developers. 1. WTF Solidity (6,000 stars): https://github.com/AmazingAng/WTF-Solidity 2. WTF Ethers (1,200 stars): https://github.com/WTFAcademy/WTF-Ethers 3. Education platform: https://wtf.academy", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWe provide open-source, free, and community-reviewed tutorials on Solidity and Ethers.js in Chinese and English. After learning, developers can seamlessly build projects on Optimism.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe sustain ourselves on community donations and grants. Sources of funding: 1. Ethereum Foundation 2. Gitcoin Grant Round 3. Starkware", - "team_size": "~100 contributors", - "address": "0x25df6DA2f4e5C178DdFF45038378C0b08E0Bce54", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x25df6DA2f4e5C178DdFF45038378C0b08E0Bce54", - "project_pathname": "0x25df6DA2f4e5C178DdFF45038378C0b08E0Bce54", - "optimismAddressFound": true, - "optimismBalanceEth": 0.023271896921406635, - "github_data": [ - "data/github/https:__github.com_AmazingAng_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Multicall3", - "socials": [ - "https://twitter.com/msolomon44", - "https://github.com/mds1", - "https://github.com/mds1/multicall" - ], - "description": "Multicall3 aggregates results from multiple contract calls. This reduces the number of JSON RPC requests that need to be sent, which is especially useful if using remote nodes like Infura. This can significantly improve performance and reduce RPC usage. It also guarantees that all returned data is from the same block (i.e. an atomic read) to ensure consistency and accuracy of fetched data.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\n- Multicall3 solves developers problems around performance, atomicity, & simplicity - Multicall3 is used by core tooling such as wagmi, ethers-rs, DefiLlama, and countless sites/apps - I manage deploys to ensure it's deployed to the same address on all chains, even if gas metering differs\u2014any fork of the OPStack can have Multicall3 deterministically deployed then plug into existing tooling/infra", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nI work at ScopeLift, and maintain Multicall3 in my free time. I don't currently have any sources of funding or revenue for my work on Multicall3.", - "team_size": "1", - "address": "0x60A5dcB2fC804874883b797f37CbF1b0582ac2dD", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x60A5dcB2fC804874883b797f37CbF1b0582ac2dD", - "project_pathname": "0x60A5dcB2fC804874883b797f37CbF1b0582ac2dD", - "optimismAddressFound": true, - "optimismBalanceEth": 0.6063038052924812, - "github_data": [ - "data/github/https:__github.com_mds1_events_2022-07-01_2023-03-01.json", - "data/github/https:__github.com_mds1_multicall_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Clique", - "socials": [ - "https://twitter.com/Clique2046", - "https://github.com/CliqueOfficial", - "https://clique.social/" - ], - "description": "Clique builds a new type of primitives, identity oracles, that bring web2 user behavior and identity data on-chain. Establishing more robust reputation and identity systems on-chain, and bridging the gap between value-creating activities in web2 and incentive distribution in web3. We use advanced cryptographic tools like ZKP, TEE, and MPC to design modular privacy-preserving pipelines.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWe plan to use the OP AttestationStation to integrate with our identity oracles and supply off-chain and on-chain user identity information to OP addresses. These attestations can be used for Sybil resistance (e.g. for retroPGF/quadratic funding), directional incentives, and powering a more sophisticated set of dApps, like undercollateralized lending, on-chain social apps, etc.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nClique raised a seed $3m round previously in April of 2022. Our investors include top participants from web2 and web3, including GGV, Qiming Ventures, AllianceDAO, SevenX, and others. We also have revenue from deals with major creative studios (e.g. Sony Music, Fonco Studios, AP Studios), for using our identity oracles in their NFTs. These projected revenues are expected to be realized in Q2 2023", - "team_size": "15 full-time employees. 80% of the team comprises developers with an average of 12+ years of production experience (Ex-Citibank, Bybit, etc), and cryptography researchers from various grad/Ph.D. programs (Tsinghua/Max Planck Institute, etc.).", - "address": "0x003eB864477C8858BEC0916E23785AcA46f6ba34", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x0B27BFb649919bE208F62244E4a09A41b0f962D0", - "project_pathname": "0x0B27BFb649919bE208F62244E4a09A41b0f962D0", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_CliqueOfficial_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "JiffyScan", - "socials": ["https://github.com/jiffy-labs", "https://www.jiffyscan.xyz/"], - "description": "JiffyScan is the first (and only) block explorer built for EIP-4337 confirming transactions. It shows the transactions as per the new entities introduced: userOp, Bundle, Bundler, Entrypoint, etc. This is needed for the wallets which will onboard users leveraging this new Smart Contract Wallet standard. PS: Candide Wallet is launching on Optimism and we will support its adoption.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nEThInfinitsm's entrypoint contract is currently undergoing an audit. A number of dedicated folks are building wallets to support this new standard (including Candide launching on Optimism). For this stack, users can visit a missing user-friendly explorer to verify the transactions and understand them better across different entities. JiffsyScan gives this explorer interface to the community.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nThe team is completely bootstrapped and has been sustaining itself by relying on hackathon winnings for the past few months to get by. Since the explorer interface is public goods, we're now seeking grants to continue building the product and get more developers to help us improve the platform.", - "team_size": "We're currently a team of three people. Aditya Agarwal - Product Manager & Associate Developer Gautam Sabhahit - Lead Developer M\u0101rti\u0146\u0161 Zemlickis - Designer We want to onboard the following if we manage to receive grants: 1 Front End Engineer to Work on the Interface and add new views 1 Backend Engineer to help build the API stack and call data decoding stack", - "address": "0xdd347ad6aA6D26ae6840ed3574E6Ce4b0E002066", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x3b036793Ea6dD8D9b352847f32818FA253eB759d", - "project_pathname": "0x3b036793Ea6dD8D9b352847f32818FA253eB759d", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_jiffy-labs_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Sourcify", - "socials": [ - "https://twitter.com/SourcifyEth", - "https://github.com/ethereum/sourcify", - "https://sourcify.dev/" - ], - "description": "Sourcify is a decentralized and open-sourced contract verification service. It leverages and fosters the adoption of Solidity\u2019s contract metadata and 'full verification' of contracts. The contract repository is publicly served on IPFS. Through the metadata and the NatSpec docs of the contract, Sourcify aims to enable human-readable transactions for Ethereum users instead of bytes and hex strings", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nSourcify supports numerous EVM chains, including Optimism mainnet and testnets. Smart contracts on Optimism can be verified with Sourcify and will be available publicly.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nSourcify was part of the Solidity team. Now operates a separate team under the Ethereum Foundation.", - "team_size": "- Kaan Uzdogan - Marco Castignoli", - "address": "0x1d113337e485e232d39d2d883031705ade37b576", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xAA6042aa65eb93C6439cDaeBC27B3bd09c5DFe94", - "project_pathname": "0xAA6042aa65eb93C6439cDaeBC27B3bd09c5DFe94", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_ethereum_sourcify_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "NiceNode", - "socials": [ - "https://twitter.com/NiceNodeApp", - "https://github.com/NiceNode", - "https://nicenode.xyz/" - ], - "description": "NiceNode aims to provide an easy set up to run an Ethereum node in no-time on every modern computer without any technical knowledge. By running a node you become part of a global movement to decentralize a world of information. NiceNode is being designed to easily support new node types such as layer 2 and web3 nodes. It is FOSS and available on Mac, Windows, and Linux.", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nNiceNode will support nodes that implement the OP Stack\u2019s op-node. Users can run an op-node, change it settings, and monitor its status and usage. NiceNode can display output of the op-node\u2019s RPC as defined in the Rollup node spec. Implementation will initially support Optimism\u2019s node following smartcontract\u2019s 'simple-optimism-node' and then support other implementations.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nNiceNode is entirely community supported through grants and donations. We have received grants from EthStaker, Gitcoin, CityDAO, and the Ethereum Foundation\u2019s Ecosystem Support Program. There is currently no revenue.", - "team_size": "We have primarily 3 core contributors", - "address": "0x9cce47E9cF12C6147c9844adBB81fE85880c4df4", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x9cce47E9cF12C6147c9844adBB81fE85880c4df4", - "project_pathname": "0x9cce47E9cF12C6147c9844adBB81fE85880c4df4", - "optimismAddressFound": true, - "optimismBalanceEth": 0.02, - "github_data": [ - "data/github/https:__github.com_NiceNode_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Ospace Project", - "socials": [ - "https://twitter.com/Ospaceproject", - "https://github.com/Ospaceproject", - "https://linktr.ee/ospaceproject" - ], - "description": "The Ospace project started its activity in May 2022 as an NFT project on the Optimism chain. Our first collection was Oliens which was launched as a free mint on Quix launched on 9th of july 2022 & it quickly got sold out. Oliens has added new unique users to Optimism chain because of its Art and free mint launch and it continued to reach +3.2K trades & more than 47 ETH volume.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\n1) Develop a mini game via createra tools and platform 2) Launching a new platform which support talented artists and buy their nft collections and drop em to op community as free mint every month 3) Creating weekly Quests and Tasks via crew3/twitter/discord & reward users with OP Tokens. *more details: https://gov.optimism.io/t/tooling-utilities-nominations-for-rpgf2/4639/61?u=ospace", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe are an nft project and our sources of funding are : - Loyalty of our collections trades - Selling our NFTs", - "team_size": "We have 5 members in our team, 2 artists, 2 social managers and 1 developer.", - "address": "0x941D8Cd7378432Bc4952bA0Dcc9e120C18C92975", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x941D8Cd7378432Bc4952bA0Dcc9e120C18C92975", - "project_pathname": "0x941D8Cd7378432Bc4952bA0Dcc9e120C18C92975", - "optimismAddressFound": true, - "optimismBalanceEth": 0.003341115274589523, - "github_data": [ - "data/github/https:__github.com_Ospaceproject_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Giveth", - "socials": [ - "https://twitter.com/Givethio", - "https://github.com/Giveth", - "https://giveth.io/" - ], - "description": "Giveth is a donation platform built on Ethereum, rewarding and empowering those who give to projects, to society, and to the world. We are building a business model that provides value in the nonprofit sector and public goods. We were founded in 2016 and have a core team consisting of ~20 with 50+ regular Giveth contributors, including many well-known names in the space.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWe would like to add our Donation Application (https://giveth.io 4) to the Optimism chain so that every project on Giveth can raise funds with Optimism. On our DApp, 100% of donations go directly to the project and Donors to verified projects are rewarded with GIVbacks. Making a project to raise funds with Giveth is simple and permissionless.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nDonations and grants.", - "team_size": "Around 70 contributors of well-known names in the space. Our team is structured: DAO and governance, communications & marketing, GIVeconomy, verification team, development & design.", - "address": "0x4D9339dd97db55e3B9bCBE65dE39fF9c04d1C2cd", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xDCfe20E6C1d14c26930a28B1f92fB981CDa26884", - "project_pathname": "0xDCfe20E6C1d14c26930a28B1f92fB981CDa26884", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_Giveth_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Gov", - "socials": [ - "https://twitter.com/w3hc8", - "https://github.com/w3hc", - "https://github.com/w3hc/gov" - ], - "description": "Gov is a DAO framework built with Open Zeppelin\u2019s Governor contract in combination with NFTs. It provides a retroactive funding tool that fits the needs of everyday people. We recently deployed the first pilot to OP Mainnet (the Web3 Hackers Collective) and we\u2019re getting ready to launch more pilots in the coming weeks. We just released the beta version and the Next.js UI is currently under dev.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nAs a free software, Gov is available for anyone to use. Our next step is to launch five different pilots: we want to focus quasi-exclusively on the impact evaluation process of each proposal. We\u2019re inviting orgs, neighborhoods, stewards of the commons, collectives, and all communities to create their own DAO on Optimism. We will accompany them wether they're crypto-savvy or not.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nSo far, the project never received any funding. We developed the project on our free time because we're convinced that DAOs will dramatically improve the way we take collective decisions at each and every levels of our societies.", - "team_size": "Gov is developed and maintained by the Web3 Hackers Collective (W3HC). The W3HC was recently founded by Julien B\u00e9ranger, Olivier Fernandez and Bertrand Juglas. Julien B\u00e9ranger is working on the topic of DAOs for almost 10 years now. Along with two fellow hackers he won the Core DAO tech 1st prize of the DAO Global Hackathon 2022 with a project called Concord, a DAO within Discord.", - "address": "0xa30189949cD8F662582b10eB6E353374419EDf67", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xa30189949cD8F662582b10eB6E353374419EDf67", - "project_pathname": "0xa30189949cD8F662582b10eB6E353374419EDf67", - "optimismAddressFound": true, - "optimismBalanceEth": 1.089263985794e-6, - "github_data": [ - "data/github/https:__github.com_w3hc_events_2022-07-01_2023-03-01.json", - "data/github/https:__github.com_w3hc_gov_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Proof of Integrity", - "socials": [ - "https://twitter.com/proof_integrity", - "https://www.proofofintegrity.org/" - ], - "description": "Proof of Integrity offers #aPRENDOcripto, an educational program that provides blockchain and personal finance training to vulnerable sectors. It consists of 4 workshops with practical and theoretical content, and hands-on experience w/decentralized tech. We aim to bring the benefits of blockchain tech to underprivileged communities. Last year 8 editions were made in Argentina and plan 26 for 2023", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWe included the OP stack in our curriculum because it offers an affordable way to use blockchain. This is crucial for underprivileged communities, who require low transactional costs to have real access to the benefits of blockchain. Photos: https://bit.ly/OP-media Our program provides a valuable public good by spreading awareness and empowering vulnerable individuals to benefit from Optimism.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe are a non-profit that has secured funding from Gitcoin Grants (45k DAI), an Ethereum Foundation Grant (18k DAI), and Devcon's QFunding (60k DAI). We do not have any guaranteed funding for the future. We launched last year exclusively in Buenos Aires city (130 graduates), however, we plan to expand our reach to all of Latin America, which will require a significant increase in funding.", - "team_size": "We have a paid management team of six which includes an Executive Director, Territory and Logistics Manager, Volunteer Manager, Communications Manager, Content Manager, and CM. In addition, we benefit from the support of volunteers who share our vision, including programmers, impact measurement experts, communicators, social workers, and cryptocurrency enthusiasts.", - "address": "0x75DeD588d2a4734D0a61B9953A3C4e6C6D00AbC4", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xf21b24E6D87C7e5dEC3e419551829F6B39dBB807", - "project_pathname": "0xf21b24E6D87C7e5dEC3e419551829F6B39dBB807", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [] - }, - { - "project": "Fractal Visions", - "socials": [ - "https://twitter.com/Fractal_Visions", - "https://fractalvisions.art/" - ], - "description": "Fractal Visions market is an Optimism centric platform intended to house core native ecosystem NFT collections from select artists. Users evolve into committee members for our future DAO voting structure related to the NFT market & FV Public Goods Funding mechanism. Expanding into a high level niche category art & music marketplace as we curate artists who align with the impact over profit ethos.", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nFractal Visions main focus is now PUBLIC GOODS & plays an integral part of the Optimism ecosystem by utilizing blockchain scaling technology. Constantly expanding our user base & key partners within our own network. Nine of our NFT projects donate directly to the Retropgf.eth address & we will expand this aspect with the Fractal Visions Public Goods Fund as a creative iteration of the OP Stack..\ud83d\udd34", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\n1. OP Gov PROFIT = 3000 $OP Token from my participation in the NFT & Gaming committee. IMPACT = 100% of these funds were paid to our development team. 2. OP Airdrop #2 PROFIT = 1000 $OP Token total from Optimism. IMPACT = 100% of these funds were paid to our development team. 3. Free Mints & NFT Sales https://dune.com/arabianhorses/fractal-nft-ecosystem Dune analytics reflect on chain metrics", - "team_size": "We just hired on an additional smart contract developer making the core team five people. https://fractal-visions.gitbook.io/internal-wiki/team/core-team Our next stage will be onboarding a few international moderators to help with Q & A. If we receive funding from RPG, the money will help to pay for further tooling & a portion will go towards the FVPGF.ETH aka Fractal Visions Pubic Goods Fund.", - "address": "0xC4FC57Dedd2463314A3fD2DBadB86B4404C257e5", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xC4FC57Dedd2463314A3fD2DBadB86B4404C257e5", - "project_pathname": "0xC4FC57Dedd2463314A3fD2DBadB86B4404C257e5", - "optimismAddressFound": true, - "optimismBalanceEth": 0.010767017744217825, - "github_data": [] - }, - { - "project": "GasHawk", - "socials": ["https://twitter.com/gashawkio", "https://gashawk.io/"], - "description": "GasHawk enables free, automated, and non-custodial savings of up to 95% on Ethereum transaction fees.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nGasHawk provides a non custodial, automated, transaction manager focused on gas savings that can be used by end users, contract deployers, institutions and projects building on the OP Stack. We have already integrated with multiple apps in the ecosystem. We also researched a solution for Optimism's sequencer address as well: https://dhannum8.mirror.xyz/jfTJHSfPyRbO2_alyTsrZnkW_kk56llj7KKKjZGiGck", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe are currently a public good and do not charge users for use of our service or take any % of the amount we save. We are currently self funded and have recently won a ENS Public Goods grant (1 ETH that we are reimbursing back to the community) https://ensgrants.xyz/rounds/17 https://twitter.com/gashawkio/status/1621183115283644417?s=20", - "team_size": "2 Dan Hannum (CEO) Daniel Pfeffer (CTO)", - "address": "0x44F00C29a0b8514D017ac20fBDb0AA5078b860cE", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xC1FDB60CFB2FbbD6EDc9b445D9B508Da2dBF2c9b", - "project_pathname": "0xC1FDB60CFB2FbbD6EDc9b445D9B508Da2dBF2c9b", - "optimismAddressFound": true, - "optimismBalanceEth": 0.009806862036247192, - "github_data": [] - }, - { - "project": "Foundry", - "socials": ["https://twitter.com/gakonst", "https://github.com/gakonst"], - "description": "See: https://gov.optimism.io/t/tooling-utilities-nominations-for-rpgf2/4639/15?u=jonas", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nBy funding Foundry, we'll be able to continue supporting the ecosystem of contributors working on it. ultimately, valuable projects of OP are going to be deployed using Foundry", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nFoundry & other OSS projects are funded by Paradigm", - "team_size": "6", - "address": "0x4BAa1fcAe9Ba8F9e1247b5CFD71e2463e85b2284", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x4BAa1fcAe9Ba8F9e1247b5CFD71e2463e85b2284", - "project_pathname": "0x4BAa1fcAe9Ba8F9e1247b5CFD71e2463e85b2284", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_gakonst_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "GiveStation", - "socials": [ - "https://twitter.com/GiveStation", - "https://github.com/givestation", - "https://givestation.org/" - ], - "description": "What is GiveStation ? A multi-chain Give-To-Earn grant platform where contributors get rewarded for funding public goods, ideas and projects in web3.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nThe goal of this step is to keep incentivizing the growth momentum on Optimism while tapering off special incentives. 21,000 of the allocated tokens will be distributed over a period of 19 weeks at the rate of 500 tokens per week to all users who donated to Optimism projects on the grants page. After the agreed time is reached, token distribution can be re-evaluated.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nFunding sources: 1. Gitcoin grants - https://gitcoin.co/grants/1599/givestation 2. https://giveth.io/project/givestation-0 3. Private funding from team - $20,000 Revenue: 1. We charge 2% on each project that gets contributions on GiveStation 2. GiveBridge - we charge 1% on every transactions carried out on GiveBridge 3. We host hackthons for other projects. Funds Requested: 21,000 OP", - "team_size": "GiveStation is a team of 4.", - "address": "0x4243CFB8D5cEfA0087E3cf8E9aeA86e6ec38E0D9", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x96Cd3AC1e5c2E4FB021B97dA3a6D57e8e665EDc3", - "project_pathname": "0x96Cd3AC1e5c2E4FB021B97dA3a6D57e8e665EDc3", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_givestation_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "CryptoStats", - "socials": [ - "https://twitter.com/cryptofeesinfo", - "https://github.com/crypto-stats", - "https://cryptofees.info/" - ], - "description": "CryptoStats is a project focused on making trustworthy blockchain data open and accessible to all. In addition to maintaining an extensive library of data metrics, CryptoStats operates a number of popular info-sites, such as CryptoFees.info, L2Fees.info, and more.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nCryptoStats provides data about many faucets of the blockchain ecosystem, including Optimism and the rest of Ethereum\u2019s rollup ecosystem. On our most popular site, CryptoFees.info, we display the fee revenue collected by Optimism: One of our other popular sites, L2Fees.info, shows data such as the current transaction fees on L2s like Optimism, as well as how much", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nCryptoStats operates purely as an open-source public-good. It is primarily funded by public goods initiatives like Gitcoin and Optimism RPGF. Additionally, the project has received grants for building new features, and now receives some revenue from the sponsorship ads placed on the sites.", - "team_size": "3 core team members, plus contractors", - "address": "0x69aa21403244889832609963B0028e337a834953", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x69aa21403244889832609963B0028e337a834953", - "project_pathname": "0x69aa21403244889832609963B0028e337a834953", - "optimismAddressFound": true, - "optimismBalanceEth": 0.009635873827168892, - "github_data": [ - "data/github/https:__github.com_crypto-stats_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Basic course in crypto literacy", - "socials": ["https://twitter.com/bccourse", "https://twitter.com/bccourse"], - "description": "The project proposes participating in the Basic Course in Crypto Literacy and Blockchain to meet the increasing demand for quality information on virtual assets in Ukraine. The course aims to create more virtual asset professionals and offer practical education. Platform based on real industry tasks with necessary theory and automation will provide accessible, practical, and automated learning.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nThe course consists of 4 modules, in each module all assignments are compulsory and the student cannot complete the module without completing them. Optimism is found in 2 modules: 1 - optimistic rollups 2 - blockchain, ethics of the public good, decentralized applications. Materials consist of videos, lesson texts, tests and case studies. Atlantis guys will record short videos on relevant topics.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe have a list of edu partners and sponsors who contributed to the creation of the product: WhiteBIT, Filecoin Foundation for the Decentralized Web, Aragon, Zapper.fi, Safe, Optimism, zkSync. The project is 100% non-profit, free, and accessible for anybody", - "team_size": "15", - "address": "0x95Bef08E39d14Ce747877857C6F348897275c123", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xff95a2f9bf8fe8019d1f705B5b1e3cb8a8F223C0", - "project_pathname": "0xff95a2f9bf8fe8019d1f705B5b1e3cb8a8F223C0", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [] - }, - { - "project": "RareSkills", - "socials": [ - "https://twitter.com/RareSkills_io", - "https://github.com/rareSkills", - "https://rareskills.io/" - ], - "description": "RareSkills focuses on providing intermediate to advanced blockchain developer training. Although we provide a web2 to web3 bootcamp, our primary focus is curating advanced material for Solidity engineers. Examples of topics we teach include advanced testing techniques such as fuzzing and mutation testing, elliptic curve math, zero knowledge proofs, DeFi mathematics, and assembly programming.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWe provide a significant amount of free or cheap web3 developer education material. The one we were nominated for was our gas puzzles (https://github.com/RareSkills/gas-puzzles) which helps developers understand the relationship between Solidity code and gas cost. Course here: https://www.udemy.com/course/advanced-solidity-understanding-and-optimizing-gas-costs", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe earn money through tuition payments for our education program.", - "team_size": "5", - "address": "0x4879DF2Ba195a69C178133F44E278c0f64797Ca5", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x4879DF2Ba195a69C178133F44E278c0f64797Ca5", - "project_pathname": "0x4879DF2Ba195a69C178133F44E278c0f64797Ca5", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_rareSkills_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Pairwise", - "socials": [ - "https://twitter.com/Generalmagicio", - "https://github.com/GeneralMagicio/budget-boxes", - "https://pairwise.generalmagic.io/" - ], - "description": "Say goodbye to endless forum scrolling and hello to easy, efficient and fun community signaling with Pairwise! Our open-source, snapshot-style voting dapp, based on the big brain algorithm research out of Colony in 2018, offers a fast-paced and intuitive experience, perfect for the next generation of DAOs. Join us in revolutionizing governance with the power of algorithms.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nPairwise will benefit the Optimism ecosystem by providing a more engaging and user-friendly community signaling mechanism. By using the Tinder-style UX, Pairwise aims to increase community engagement in governance, leading to a more informed and efficient ecosystem.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nGeneral Magic plans to develop Pairwise, and maintain it. We're seeking funding from various communities to support this public good, as it will benefit the ecosystem. Any extra funding in the budget will be used to improve UX/UI or even work on new milestones after the product is launched.", - "team_size": "Pairwise is a project built by General Magic with a lot of support from rockstar DAO OGs. @VitorMarthendal is the project lead with design by @markoprljic and @thegrifft 2 as the product owner. @mathsguy, @kronosapiens, @gichiba @AAbugosh, @ZeptimusQ, and the Giveth community are all supporting the effort as well.", - "address": "0xc8d65e1bd67f16522e3117b980e1c9d2caeb9dc3", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x4d5Dd4d81D773c05cE27AbA03e2f3E346c3F8E54", - "project_pathname": "0x4d5Dd4d81D773c05cE27AbA03e2f3E346c3F8E54", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_GeneralMagicio_budget-boxes_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Crate-Crypto", - "socials": ["https://github.com/kevaundray", "https://the.dev/"], - "description": "Cryptography is hard. Crate-Crypto was originally built because I wanted to build proof of concepts of cutting edge cryptogrpahy protocols, so that companies/researchers could use it to validate their ideas quicker. This is how Noir a zk programming language was born. The main usecase right now is for implementations for projects like 4844 and verkle tries.", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nI have been working on the cryptography for EIP-4844 which will be used by optimism and other L2s. Currently I am working on the golang implementation which will be used by Geth and Prysm. I wrote a TLDR here of my journey and contributions to 4844: https://hackmd.io/@6iQDuIePQjyYBqDChYw_jg/rk9dSn2Yj I plan to publish it as a blogpost, which is why it reads the way it does.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nI have two sources of funding: - Ethereum foundation: I am contracted to build the cryptography for verkle tries in Rust,Golang,Python and javascript (via bindings). - Aztec protocol: I am the author and lead of the zero knowledge programming language called Noir.", - "team_size": "1", - "address": "0x90B005a9C7B19E1E962178deA63c1becc409B90f", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x90B005a9C7B19E1E962178deA63c1becc409B90f", - "project_pathname": "0x90B005a9C7B19E1E962178deA63c1becc409B90f", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_kevaundray_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Questbook", - "socials": [ - "https://twitter.com/questbookapp", - "https://github.com/questbook", - "https://questbook.app/" - ], - "description": "Questbook is a decentralized grant management platform. The platform is open-sourced, on-chain, and deployed on Optimism. Using the tool, - Grant managers have facilitated grants worth $2.1M. - 1500+ Builders have applied for various grants, reported milestones and funding, and received feedback. - The entire lifecycle for every grant proposal is transparent for the community to view.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nQuestbook has accelerated the growth of the Web3 ecosystem as well as the OP Stack by enabling protocols to give out grants to competent builders in a transparent manner, We are also pushing the boundaries on moving processes away from centralized servers to on-chain alternatives. All our data is stored on decentralized storage while all business logic is executed client-side or on-chain(OP).", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe\u2019re a Series A YC Backed company, so we\u2019re backed by venture capital. We have raised $9.2mn.", - "team_size": "We are a team of 20; 13 engineers, 7 design and growth.", - "address": "0x89Ce0f71D7387a580c6C07032f74f393a65d77F4", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x45755F5e7d3b1cdB1AaF1Fe786c415e47Bed2f43", - "project_pathname": "0x45755F5e7d3b1cdB1AaF1Fe786c415e47Bed2f43", - "optimismAddressFound": true, - "optimismBalanceEth": 0.43738124774294457, - "github_data": [ - "data/github/https:__github.com_questbook_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "jordanmmck", - "socials": [ - "https://twitter.com/jordanmmck", - "https://github.com/jordanmmck", - "https://youtube.com/@jordanmmck" - ], - "description": "I make deep-dive video explainers on complex topics within the Ethereum space. With every video I try to completely understand the topic I am studying, then condense that understanding down to diagrams and images that convey the concept in a simple way. I strive to produce videos with high production value, detailed and accurate diagrams, and a compelling delivery.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nMy goal is to help people deeply understand Ethereum and its ecosystem. My videos are not made for mass-appeal, but for builders and creators \u2014 the people that I hope will help us build a new world with this technology. I've done videos on L2 scaling with a focus on ZK roll-ups, but I would love to do a video specifically on optimistic roll-ups and the Optimism ecosystem.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nDuring the first half of last year I was doing videos full-time and living off my savings. Now I've had to return to software development contract work to sustain myself, so the videos have been put on hold. I'm now trying to work on the videos on evenings and weekends, while still working my day job. Last year I received a small grant from Starkware to support my videos.", - "team_size": "Just me.", - "address": "0x29FF795B015652EdFB9883bB83B3E9bE3c207e62", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x2B1Bfc5dCD4E21CeAA5F512e350b00c585dAE894", - "project_pathname": "0x2B1Bfc5dCD4E21CeAA5F512e350b00c585dAE894", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_jordanmmck_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Odos", - "socials": ["https://twitter.com/odosprotocol", "https://odos.xyz/"], - "description": "Odos Smart Order Routing (SOR) is a patented Automated Market Maker (AMM) path finding algorithm, which aggregates decentralized exchanges (DEX) and finds optimal routes for cryptocurrency token swaps. Odos enables retail and institutional traders to benefit from savings over any single DEX and even other aggregators when converting one or several cryptocurrency tokens into other asset(s).", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWe are tightly integrated with the entire Optimism DeFi ecosystem, driving volume/usage to the protocols that provide the most value to their users. To our users, we provide the best rates for the swaps they execute. Odos is also participating in Optimism Governance via the protocol delegation program.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nOur primary source of funding is a seed round we raised a year ago. We currently also make a small amount of revenue off of swap positive slippage, but this is a very small amount in order to not compromise the rates we provide to users.", - "team_size": "We currently have 3 core developers and 2 core operations people, with some part time contractors also working on the project. However, we would like to significantly expand the team this year to build more Odos offerings.", - "address": "0x9Ff6e05e9c5f4E2f5ed8FD771C98E0c07E933b85", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xF86BaD4E03D731de4d67B4f3943743f0B4C2084c", - "project_pathname": "0xF86BaD4E03D731de4d67B4f3943743f0B4C2084c", - "optimismAddressFound": true, - "optimismBalanceEth": 0.8709148920017648, - "github_data": [] - }, - { - "project": "Optimism en Espa\u00f1ol", - "socials": ["https://twitter.com/OptimismESP"], - "description": "Optimism Espa\u00f1ol is a collaborative, open and non-profit community dedicated to promoting the adoption of Optimism by disseminating information about its technology, ecosystem and governance processes in Spanish. Our goal is to reach all Latin American citizens and Spanish speakers in general, so that they can learn about the benefits of this Ethereum scaling solution.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWe have given talks and translated articles into Spanish about OP Stack to reach Latin American developers, for example: > Workshop OPstack - ETHLATAM - +150 participants (Bogot\u00e1): https://youtu.be/0Nf8SKikDWA > Spanish translation of the +15 articles > 9 community calls and more than 20 Twitter Spaces More information here: https://gov.optimism.io/t/education-nominations-for-rpgf2/4640/89", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe received 4700 OP tokens from DeFi LATAM, the community where Optimism en Espa\u00f1ol was born Our project has no revenue because our content is conceived as a public good and does not sell anything to users.", - "team_size": "11 members working in different topics like: > Design (2 members) > Research & Proposals (5 members) > Content (2 members) > Community (2 members)", - "address": "0xEfc42814bebfCF02e56856988daf7D80F2b7fbb7", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x61d10BFDa1aa5010795985FD9a49F21Fb7570982", - "project_pathname": "0x61d10BFDa1aa5010795985FD9a49F21Fb7570982", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [] - }, - { - "project": "Web3j", - "socials": [ - "https://twitter.com/web3labs", - "https://github.com/web3j", - "https://www.web3labs.com/web3j-sdk" - ], - "description": "Web3j is the JVM integration library for EVM blockchains. It provides similar functionality to web3.js + Truffle in that supports the development, testing and deployment of Solidity contracts for the Java and Android platforms. The following deck provides a lot of background about the library https://4968969.fs1.hubspotusercontent-na1.net/hubfs/4968969/Web3j%20overview%20June%202022.pdf.", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nAs Optimism grows, there are like to be more JVM users, and they will in all likelihood be using Web3j to do this, as there is no other equivalent library for the JVM and Ethereum. We will endeavour to ensure that Web3j works with the Optimism stack.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nEthereum Foundation Grants and some profits from Web3 Labs are used to help fund the development.", - "team_size": "We have a couple of staff members working full-time on Web3j, this is primarily due to the EFs latest grant which covers the team for a couple of years.", - "address": "0xe8a17e2f1bd4bFcBfBecb8a90be08780949a0cac", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xe8a17e2f1bd4bFcBfBecb8a90be08780949a0cac", - "project_pathname": "0xe8a17e2f1bd4bFcBfBecb8a90be08780949a0cac", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_web3j_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Guild", - "socials": [ - "https://twitter.com/guildxyz", - "https://github.com/agoraxyz/guild.xyz", - "https://guild.xyz/" - ], - "description": "Guild is an infrastructure for platformless memberships and community building. Built around the Guild Model (requirements, roles, rewards), anyone can create modular memberships based on composable on-chain and off-chain data. These can be used to gate off-chain rewards (access to Discord, Telegram, Google folders & files, Github), on-chain rewards (POAP), or custom applications (via our SDK).", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWe have integrated Optimism among the first chains and onboarded over 100 communities from the OP ecosystem. We were launch partners in OP AttestationStation, enabling attestations to be used as requirements.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe bootstrapped Guild to 20 team members, and then raised a community round, with 70+ builders, DAOs and investors participating", - "team_size": "25", - "address": "0xa934b56be3eC0bDdfA8BFD1cb141E66d1bBd0F69", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xab12931a2c0C519a62794C24105E2f66eE35CFE7", - "project_pathname": "0xab12931a2c0C519a62794C24105E2f66eE35CFE7", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_agoraxyz_guild.xyz_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Protocol Guild", - "socials": [ - "https://twitter.com/ProtocolGuild", - "https://github.com/protocolguild", - "https://protocol-guild.readthedocs.io/en/latest/" - ], - "description": "The Protocol Guild helps Ethereum's ecosystem + community fund core protocol development: a foundational Public Good for all. The Guild curates a weighted membership registry of ~128 active contributors, which anyone can donate to via a single Ethereum address. Donations are vested to members over time, creating long-term stewarding incentives. Learn more: https://bit.ly/PG-docs", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nAs a rollup, Optimism will leverage Ethereum for settlement & security assurances, as well as new scaling mechanisms like proto-danksharding (EIP-4844). These will reduce rollup user fees while broadening access to Ethereum\u2019s trust assurances. \ud83c\udf10 The median Protocol Guild member has been active for ~3 years in protocol maintenance and improvements, including the work mentioned above.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nJust as Ethereum doesn't allocate a % of block rewards to fund Public Goods, the Protocol Guild doesn't have a native source of funding. To help bootstrap PG and its 1 year Pilot, a number Ethereum-based projects provided ~$10mm in funding last year: vesting directly to individuals. Mid Pilot update: https://bit.ly/mid-Pilot-update All finances, onchain & real-time: https://bit.ly/PG-dashboard", - "team_size": "128 members, 22 teams: https://bit.ly/PG-members Clients, Infra: EthereumJS, Erigon, Geth, Hyperledger Besu, Lighthouse, Lodestar, Nethermind, Nimbus, Portal Network, Prysm, Solidity, Teku Research: EF Research, Ipsilon, Privacy & Scaling Explorations (PSE), Robust Incentives Group (RIG), TXRX Coordination, Support: EF Security, EF Protocol Support, EF Testing, EF DevOps, Ethereum Cat Herders", - "address": "0x42a43f000adc215af8B1896Ed09C2d1B0f81cDfB", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x4C0a466DF0628FE8699051b3Ac6506653191cc21", - "project_pathname": "0x4C0a466DF0628FE8699051b3Ac6506653191cc21", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_protocolguild_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "thesleeper.eth Thai OP contents", - "socials": ["https://twitter.com/aka_steppenwolf"], - "description": "My name is Amin from Thailand. I have been creating original content in Thai based on Optimism's blogs&tweets (incl. from the core team) since June 2022 Optimism community is growing bigger I want to fill my part by making Optimism communication more User-friendly for local new users & devs, which I think it will attract them to join & create new possibilities for Optimism", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nOptimism bedrock is a new and breakthrough tech, so I want to present it from various angles which are relatable to inspire Thai developers. ie. gaming or crazy fun project like lattice and many more.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nMy full-time job is as a copywriter in the advertising business.", - "team_size": "1", - "address": "0x00409fC839a2Ec2e6d12305423d37Cd011279C09", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x00409fC839a2Ec2e6d12305423d37Cd011279C09", - "project_pathname": "0x00409fC839a2Ec2e6d12305423d37Cd011279C09", - "optimismAddressFound": true, - "optimismBalanceEth": 0.39621533904563666, - "github_data": [] - }, - { - "project": "Ante", - "socials": [ - "https://twitter.com/AnteFinance", - "https://github.com/antefinance", - "https://ante.finance/" - ], - "description": "Ante is a protocol framework that allows anybody to create on-chain guarantees for any smart contract system. Ante tests can be written to test any on-chain condition with payouts handled without any third parties. With enough coverage and tests on a given project, a decentralized and visual trust can then be gathered on that respective project.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWhile we are blockchain agnostic, we hope to be used on Optimism to allow users easier insight into projects and what confidence the broader community has in the project. This will garner trust in projects and allow users to know what projects are more trustworthy.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe currently have minimal revenue, mainly from interest, and have been funding R&D through a pre-seed and seed round closed last year with some VC firms and angel investors.", - "team_size": "<10 Team Members", - "address": "0xa5b4f91FDE4E35Be891eA97C47D1052D8a4D75f7", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xa5b4f91FDE4E35Be891eA97C47D1052D8a4D75f7", - "project_pathname": "0xa5b4f91FDE4E35Be891eA97C47D1052D8a4D75f7", - "optimismAddressFound": true, - "optimismBalanceEth": 0.9986784122858692, - "github_data": [ - "data/github/https:__github.com_antefinance_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Esteroids", - "socials": [ - "https://twitter.com/e_steroids", - "https://github.com/esteroids/", - "https://esteroids.eth.limo/" - ], - "description": "Esteroids (esteroids.eth) is a search engine for .eth websites. Esteroids indexes ENS+IPFS websites (called .eth websites), makes them searchable, and highlights the main ones. While the .eth web previously offered a variety of .eth websites, it lacked the tools to collect, explore and showcase them. We launched Esteroids in April 2021 in order to give .eth websites a dedicated search engine.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nEsteroids is a useful tool to discover dApps with a .eth website interface built on top of Optimism. Every Optimism dApp using a decentralized website as an interface is indexed by Esteroids. So far Esteroids was the only place to track and collect them all. Additionally, Esteroids established and led the .eth websites subgroup in ENS DAO in Q1-Q4 2022.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nEsteroids sustain itself via contributions and grants. Our funding so far came from: - Open Grant Application for IPFS https://github.com/filecoin-project/devgrants/issues/357 - Gitcoin contributions.", - "team_size": "The core team is two people, the founders, Neiman and Tomer Leicht, both work on it full-time. We employed another person in 2022 for community building but had to let her go at the end of the year due to budget restrictions.", - "address": "0xD8228a0bE7322834101B1a5DA62CfBa28BD810C8", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xc967dEdcF086b7FE1eAB492F2EB2b74F1E5947b8", - "project_pathname": "0xc967dEdcF086b7FE1eAB492F2EB2b74F1E5947b8", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_esteroids__events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "LlamaFolio", - "socials": ["https://github.com/llamafolio", "https://llamafolio.com/"], - "description": "Open source, permissionless, privacy conscious. A portfolio tracker, the llama way!", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nLlamaFolio offers public portfolio analytics to Optimism users", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nSelf funding", - "team_size": "7", - "address": "0x2cd0ac587Fc0E6FBcF8A47A449971649E7dab835", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x2cd0ac587Fc0E6FBcF8A47A449971649E7dab835", - "project_pathname": "0x2cd0ac587Fc0E6FBcF8A47A449971649E7dab835", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_llamafolio_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Praise", - "socials": [ - "https://twitter.com/givepraise", - "https://github.com/givepraise/praise", - "https://givepraise.xyz/" - ], - "description": "Praise is a community intelligence system that promotes active participation and collaboration through peer recognition and rewards. We help communities become more intelligent, productive and inclusive by providing a simple way for community members to acknowledge, praise and reward each other\u2019s contributions.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nAfter Praise is integrated into the Optimism ecosystem, it will increase engagement and productivity within the community by recognizing and rewarding contributions. The implementation of a comprehensive community intelligence, reputation, and rewards system through Praise can also foster a culture of cooperation, gratitude, and growth.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nThe Praise is currently funded and supported by General Magic and Common Stack. General Magic provides services and product development to Impact DAOs, with a proven track record of success. However, to become independent and further develop Praise, the team is seeking an OP grant.", - "team_size": "Praise is a project built by General Magic with a lot of support from rockstar DAO OGs. @kristoferlund and @justina are the project leads with design by @markoprljic, development by @nebsaas, @Vyvy_viM, @mhmdksh and @thegrifft as the product owner. @anamarie_com, @AAbugosh, @ZeptimusQ, and Giveth, Commons Stack and the Token Engineering Commons are all supporting the effort as well.", - "address": "0x0B7246eF74Ca7b37Fdc3D15be4f0b49876622F95", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xE2d2Ac26Cb9dE9a8BBc6d2698CC40b154fAc920d", - "project_pathname": "0xE2d2Ac26Cb9dE9a8BBc6d2698CC40b154fAc920d", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_givepraise_praise_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Forta", - "socials": [ - "https://twitter.com/FortaNetwork", - "https://github.com/forta-network", - "https://forta.org/" - ], - "description": "Forta is a real-time detection network for security monitoring of blockchain activity. Forta comprises a decentralized network of independent node operators that scan all transactions and block-by-block state changes for outlier transactions and threats. Developers can build detection bots (piece of script that monitors the activity) and machine learning models, and run them on the network.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nForta has been scanning Optimism since Q1 2022. There are 296 nodes that are uniquely monitoring Optimism, running 88 bots in total that are watching generic activity, as well as protocols (eg. Perpetual) Many of these bots are watching generic attacks in the chain. For example, the Attack-detector-feed combines over 80 bots to identify patterns and alert when an exploit event is taking place.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nForta raised US$23 million in July 2021 in a round led by a16z, which included other notable backers such as Blockchain Capital, Blue Yard and Coinbase Ventures, among others. Forta is currently free, and anyone can subscribe to alerts, or deploy detection bots, without any cost.", - "team_size": "The Forta Foundation has 9 full-time staff members, focused on project management, marketing, finance and operations as well as coordinating core developers and the community.", - "address": "0x516D34d147DDa218cbEC1EADA374ca2ceC1a6e93", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xD5Abb5086E5d18b6BdB8F0943b7786f2a0Af7Df2", - "project_pathname": "0xD5Abb5086E5d18b6BdB8F0943b7786f2a0Af7Df2", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_forta-network_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Agora", - "socials": [ - "https://twitter.com/nounsagora", - "https://github.com/voteagora/agora", - "https://vote.optimism.io/" - ], - "description": "Agora builds governance public infrastructure that provides transparency, accessibility, and fine-grained control for delegates and builders. We started helping Optimism transition to on-chain voting by deploying its governance contract, and building its voting portal. Next we will refine the contract, keep improving the portal and create new governance modules that any OP project can use.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nOur app & contract are open source and MIT-licensed for any builder to leverage. Additionally, we'll ship a 1 click deploy governance package for DAOs on OP. By making best-in-class governance contracts & applications accessible to all, we will radically increase accountability, transparency and decentralization for all projects in the Collective without trading off accessibility and ease of use.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nToday, our primary source of funding comes from project revenue from DAOs and Foundations. We hope to stay sustainable and remain independent by delivering value and being rewarded by ecosystems. We have not raised an institutional round, but we have a bit of friends & family funding to cover expenses and keep our team afloat during market up and downs.", - "team_size": "Team consists of 5 people right now. We also have a community of supporters and contractors who has helped contribute to various projects from time to time.", - "address": "oeth:0x3a153B0608a87a4BdD4F7Afa90670110d4C", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xFdFC6E1BbEc01288447222fC8F1AEE55a7C72b7B", - "project_pathname": "0xFdFC6E1BbEc01288447222fC8F1AEE55a7C72b7B", - "optimismAddressFound": false, - "optimismBalanceEth": 0, - "github_data": [ - "data/github/https:__github.com_voteagora_agora_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Teku", - "socials": [ - "https://twitter.com/Teku_ConsenSys", - "https://github.com/ConsenSys/teku" - ], - "description": "Teku is an Ethereum consensus client, fully open source and Apache 2 licensed. Teku has been in production on the beacon chain since genesis and contributes significantly to client-diversity on the consensus layer, which is vital for the security and safety of layer 2 solutions built on Ethereum.", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nThe Teku team has been working hard to implement and improve EIP-4844, the key enabler for highly scalable roll-ups such as Optimism. In addition, the initial work on the C-KZG library that provides the cryptographic interface for EIP-4844 was done by a Teku team member. This will likely be used by several of the consensus and execution clients, as well as roll-up operators.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nAll work on Teku to date has been fully funded by ConsenSys. Teku has never received external grant funding. Teku participates in the Ethereum Foundation's client incentive program. Only post-Merge transaction fee revenue from that is currently available to us, amounting to 8.1055 ETH to date.", - "team_size": "Eight, comprising seven full time developers plus a product manager.", - "address": "0xFF7B65dDc2Ffb7f6AC527b4C2F048946B3A5eaF3", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xFF7B65dDc2Ffb7f6AC527b4C2F048946B3A5eaF3", - "project_pathname": "0xFF7B65dDc2Ffb7f6AC527b4C2F048946B3A5eaF3", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_ConsenSys_teku_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Safe (previously Gnosis Safe)", - "socials": [ - "https://twitter.com/safe", - "https://github.com/safe-global", - "https://gnosis-safe.io/" - ], - "description": "Safe is a programmable wallet that enables users to control their digital assets with granular permissions. Safe stores >40 billion USD worth of digital assets today. Its flagship solution is a multi-sig based smart contract wallet that requires a predefined number of signatures to confirm transactions to prevent unauthorized access to the assets stored.", - "category": "Infrastructure", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nNOTE: All OP funds received in this RPGF will be used for Safe<>OP incentivisation programs Gnosis Safe is a non-custodial wallet solution. The Safe solution itself has become the de-facto account of choice for DAOs and many crypto projects. The open source contracts are public-good and battle-tested, as there have been no critical security incidents since Safe solution was deployed in 2018.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nNOTE: All OP funds received in this RPGF will be used for Safe<>OP incentivisation programs. Funding - https://safe.mirror.xyz/zMPp8uqZpxKgeXotSFv76bd2G8lJTmghH1FDWFm604c Revenue - currently none, future value will be decided by the Safe token holders, https://dune.com/safe/token.", - "team_size": "45+ core contributors. 11,197 SAFE token holders.", - "address": "oeth:0x3EDf6868d7c42863E44072DaEcC16eCA280", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x9F87C1aCaF3Afc6a5557c58284D9F8609470b571", - "project_pathname": "0x9F87C1aCaF3Afc6a5557c58284D9F8609470b571", - "optimismAddressFound": false, - "optimismBalanceEth": 0, - "github_data": [ - "data/github/https:__github.com_safe-global_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Chaineye", - "socials": [ - "https://twitter.com/BiteyeCN", - "https://github.com/DeFiEye", - "https://chaineye.tools/" - ], - "description": "ChainEye aims to build world-leading free and open-source analytical tools. Currently, it has the following core functions 1. Optimism on-chain Map 2. Bridge comparison 3. Stablecoin dashboard 4. RPC list 5. Gas monitor 6. Web3 security (coming) Launched in Q4 2021, Chaineye has over 100k user visits. It is incubated by the leading Web3 research community Biteye with 200K+ members in Asia.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nOur tools support OP usage. For example, \"Optimism on-chain Map\" helps users to better explore opportunities in OP. \"Bridge comparison\" has directed over 10K+ asset transfers to Optimism. \"RPC list\" finds best RPC node for Optimism. \"Gas monitor\" finds gas usage hour distribution in OP. In addition, Biteye community educates users about optimism(300K+ views for 10+ OP related articles)", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nOur project is public good, so we do not have revenues from customers. Our funding comes from community donations and Gitcoin match partners. We participated in Gitcoin rounds 13,14,15 and alpha round. In terms of donation amount and number of donors, we are consistently ranked in top20 among all Gitcoin grants.", - "team_size": "We have a team size of 6 people including engineers, product manager and community manager. Our developers come from top tech companies such as Google, Microsoft, Bloomberg etc and have a track record of building public good products with high impacts.", - "address": "0xE6D7b9Fb31B93E542f57c7B6bfa0a5a48EfC9D0f", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x112E372bb5EC17c1ea6b1d679EA72aFBD2A94404", - "project_pathname": "0x112E372bb5EC17c1ea6b1d679EA72aFBD2A94404", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_DeFiEye_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "diligit", - "socials": ["https://twitter.com/diligitSP"], - "description": "I am in love with math, architecture, art, psychology and sociology. Optimism is a collective that reflects everything I am passionate about, which has allowed me to improve my knowledge while becoming the person who offers this knowledge to the Optimism community.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nAs a Support-Nerd I helped the Optimism Collective with answers and support about everything around Optimism, and Optimism continue to be coolest and kindest community. Some stats at the moment: 18000+ posts on the OP server 44%+ percentage of all closed live-support threads. Disclaimer: As a badgeholder I have asked to be excluded from the collections to avoid any conflict of interest in voting.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\n-", - "team_size": "1. diligit", - "address": "0x25a2dF1d1310da75e8BC115cc797673E777B7e27", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x25a2dF1d1310da75e8BC115cc797673E777B7e27", - "project_pathname": "0x25a2dF1d1310da75e8BC115cc797673E777B7e27", - "optimismAddressFound": true, - "optimismBalanceEth": 0.005752805145767984, - "github_data": [] - }, - { - "project": "Rollup Economics Dashboard", - "socials": [ - "https://twitter.com/0xKofi", - "https://dune.com/niftytable/rollup-economics" - ], - "description": "This dashboard breaks down the on-chain revenues (txn fees), costs (posting data to L1) and raw materials (L1 calldata, usage metrics .etc) of rollups. It currently includes data on Optimism, Arbitrum, Aztec, Starknet, zksync, and Loopring.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nThe dashboard is a data-driven resource for learning about the health of rollup economies, including that of Optimism, and has 140+ stars on Dune.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nI do freelance on-chain data analysis work for different projects.", - "team_size": "1", - "address": "0x701E37643DADa13DE79e66A74E7d6187FC48faD2", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x701E37643DADa13DE79e66A74E7d6187FC48faD2", - "project_pathname": "0x701E37643DADa13DE79e66A74E7d6187FC48faD2", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [] - }, - { - "project": "RainbowKit Login for WordPress", - "socials": [ - "https://twitter.com/davisshaver", - "https://github.com/davisshaver", - "https://wp-rainbow.davisshaver.com/" - ], - "description": "RainbowKit Login for WordPress is a full-featured, open source, and easy to use integration layer that empowers builders to leverage the composability of Ethereum and L2s on a WordPress site. The project prioritizes extensible, test-driven, and secure code. https://wordpress.org/plugins/rainbowkit-login-web3-integration-for-sign-in-with-ethereum/ https://github.com/davisshaver/wp-rainbow", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nWordPress powers a huge chunk of the web. Unlocking integrations between WordPress and web3 represents a major opportunity for usage. RainbowKit Login supports Sign-In With Ethereum and token-gating/role mapping with the Optimism network. By providing the rails for integrating Optimism and WordPress, RainbowKit Login helps builders build and use applications on the OP Stack.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nPreviously, the project received a retroactive grant from the SIWE Community Server for its work at implementing the Sign-In With Ethereum standard for WordPress. The project has also received feature requests from third-parties which were developed at below-market rates in order for the resulting code to be open sourced. RainbowKit Login is an open source project released under GPL v2 or later.", - "team_size": "RainbowKit Login is built in public by a single developer in collaboration with the communities that the plugin serves \u2013 WordPress users, ENS adopters, and the whole web3 universe. Specifically, I have sought feedback from the ENS DAO and SIWE Community Server and can point to features like the plugin's ENS text records sync which are a direct result of those collaborations.", - "address": "0x0F9Bd2a9E0D30f121c525DB5419A07b08Fce8440", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x0F9Bd2a9E0D30f121c525DB5419A07b08Fce8440", - "project_pathname": "0x0F9Bd2a9E0D30f121c525DB5419A07b08Fce8440", - "optimismAddressFound": true, - "optimismBalanceEth": 0.000758615782756856, - "github_data": [ - "data/github/https:__github.com_davisshaver_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "TE Academy", - "socials": [ - "https://twitter.com/tokengineering", - "https://tokenengineering.net/" - ], - "description": "The Token Engineering Academy's (TEA) mission is to establish rigorous #tokenengineering & fully leverage the potential of token economies. We help crypto projects find experts and foster the development of open-source knowledge and tools. Our own community\u2019s value flows are based on proofs of knowledge, skills and achievements that are represented by account-bound NFTs - on the Optimism Network", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\n1) 500+ account-bound NFT certifications minted since Nov '22, Otterspace.xyz beta users (EIP-4973), awareness and opportunities to build on Optimism NFTs. 2) 1800+ students enrolled in our free [non-rivalrous] online education [non-exclusionary] launched Oct \u201822. 3) Powering open-source tool development in the token engineering sector, like cadcad.org, or TokenSPICE", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\n- Sponsorships & Grants (300K+ raised) - Donations (Gitcoin Grants and TEC, 100K+ raised) - Student fees (content for free, pay for proofs, plus scholarships for talents). Optimisms RetroPGF will allow us to offer scholarships to talents and maintain diversity (today study groups in 14 languages, 21 time zones).", - "team_size": "Core team: 4 Educators/Course Creators: 8 (project-based) Volunteers: 30+", - "address": "0xA26d6AEB775a9528c012B748ACe66E3B0FD574cE", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x3b067Af83F540cB827825a6Ee5480441a4237E77", - "project_pathname": "0x3b067Af83F540cB827825a6Ee5480441a4237E77", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [] - }, - { - "project": "Across Protocol", - "socials": [ - "https://twitter.com/AcrossProtocol", - "https://github.com/across-protocol", - "https://across.to/" - ], - "description": "Across is a cross-chain bridge for L2s and rollups secured by UMA's optimistic oracle. It is optimized for capital efficiency with a single liquidity pool, a competitive relayer landscape, and a no-slippage fee model.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nOptimism's canonical bridge has a 7 day withdrawal period, which can be a real deterrent to potential new users. Across is breaking down this barrier to entry by giving users access to a bridge that is nearly instantaneous and nearly free to use. We play a role in a critical landscape and offer top tier security to Optimism users. Across has facilitated over $140 million in transfers to Optimism.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nCurrently Across is sustained by the Risk Labs foundation, which covers all of the operational costs of the protocol. In order to maximize the experience for bridge users AND LPs, the protocol does not currently generate revenue for the treasury. The bridge landscape is extremely competitive, and it's important to us to stay focused on users.", - "team_size": "Risk Labs has a total of 33 team members who work on UMA and Across. Because Across is built on top of UMA, there is a fair amount of overlap and collaboration between teams.", - "address": "oeth:0xfd0CF79C568c08b78484F2D165eB8c7f569", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x33DB27C21E0f7a2f3351A4C6DDceDFB9F713410b", - "project_pathname": "0x33DB27C21E0f7a2f3351A4C6DDceDFB9F713410b", - "optimismAddressFound": false, - "optimismBalanceEth": 0, - "github_data": [ - "data/github/https:__github.com_across-protocol_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "IC3", - "socials": [ - "https://twitter.com/initc3org", - "https://github.com/initc3", - "https://www.initc3.org/" - ], - "description": "IC3 is an initiative of researchers at Carnegie Mellon University, Cornell University, Cornell Tech, EPFL, ETH Zurich, UC Berkeley, University College London, UIUC and the Technion. IC3 leads multidisciplinary research and members publish peer reviewed research in many areas of blockchain systems relevant to the functioning and future of the OP Stack.", - "category": "Education", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nIC3 produces open source academic research that has informed development of the OP Stack. Areas of research have included oracles, NFTs, ordering protocols, consensus, governance, rollups, privacy, and more. All research funded by IC3 is open source. IC3 produces research blog posts, papers, and hosts research events (see all at https://www.initc3.org/).", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nIC3 is sustained with charitable gifts from companies and foundations that give money to support blockchain research. It is a nonprofit organization based at Cornell University.", - "team_size": "5 IC3 staff members employed by IC3 4 IC3 directors, 12 faculty members, and 60+ PhD students (eligible for IC3 funding to produce open source research)", - "address": "Placeholderher", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xBF430a49C4d85AeeD3908619D5387A1fbF8E74A9", - "project_pathname": "0xBF430a49C4d85AeeD3908619D5387A1fbF8E74A9", - "optimismAddressFound": false, - "optimismBalanceEth": 0, - "github_data": [ - "data/github/https:__github.com_initc3_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Synpress", - "socials": [ - "https://twitter.com/synpress_", - "https://github.com/drptbl", - "https://github.com/Synthetixio/synpress" - ], - "description": "Synpress is e2e testing framework based on Cypress.io and playwright with support for metamask. It's a pioneer tool in web3 e2e testing with potential to evolve into a decentralized network of test runners (and CI provider) in future. It\u2019s currently used by multiple different projects on Optimism network (~140 repos on Github): https://github.com/Synthetixio/synpress/network/dependents", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nSupporting a project like this is super beneficial to Optimism, as it ensures that developers apps on Optimism are properly tested and that time is used wisely (as manual testing is beyond painful). Jakub have worked 1:1 with devs across Optimism to support them in using Synpress, and he would like to continue developing the project by expanding the scope and features of the tool.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nSynpress is fully open-source project without funding and revenue.", - "team_size": "1; Jakub@Synthetix.", - "address": "0x7b57c388e6149b5c197B925037602d5B6bafFbCc", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xd35E119782059A27FEAd4EddA8B555f393650BC8", - "project_pathname": "0xd35E119782059A27FEAd4EddA8B555f393650BC8", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_drptbl_events_2022-07-01_2023-03-01.json", - "data/github/https:__github.com_Synthetixio_synpress_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Revoke.cash", - "socials": [ - "https://twitter.com/RevokeCash", - "https://github.com/RevokeCash", - "https://revoke.cash/" - ], - "description": "Revoke.cash is a suite of web3 security tools. It offers a dashboard to manage token and NFT allowances on Optimism and 30+ other chains. It also provides a browser extension that warns users when they are about to perform potentially harmful actions, such as approvals or NFT listings.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nBy providing these services, users of Optimism and other supported chains enjoy more security while transacting on-chain and interacting with other applications on Optimism.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nAt this time the only funding Revoke.cash receives is through Gitcoin Grants.", - "team_size": "The team consists only of me, Rosco Kalis.", - "address": "0xe126b3E5d052f1F575828f61fEBA4f4f2603652a", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xe126b3E5d052f1F575828f61fEBA4f4f2603652a", - "project_pathname": "0xe126b3E5d052f1F575828f61fEBA4f4f2603652a", - "optimismAddressFound": true, - "optimismBalanceEth": 4.406374932541299, - "github_data": [ - "data/github/https:__github.com_RevokeCash_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "wagmi", - "socials": [ - "https://twitter.com/wagmi_sh", - "https://github.com/wagmi-dev", - "https://wagmi.sh/" - ], - "description": "wagmi is a collection of React Hooks containing everything you need to start working with Ethereum. It\u2019s used at organizations like ENS, Sushi, LooksRare, WalletConnect, Stripe Crypto, and Gitcoin. wagmi makes it easy to \"Connect Wallet,\" display ENS and balance information, sign messages, interact with contracts, and much more \u2014 all with caching, request deduplication, and persistence.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nwagmi makes it incredibly easy to use Optimism. Simply import the Optimism chain, add to your wagmi Client, and you can start reading/writing data! wagmi is a foundational tool for the frontend crypto ecosystem and the Collective. In fact, this very site (and form) uses wagmi when you connect your wallet, claim the airdrop, mint a NFT, and more.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nThrough contributions from our sponsors via GitHub Sponsors (https://github.com/sponsors/wagmi-dev), Gitcoin, and direct fiat/crypto donations.", - "team_size": "2 - https://twitter.com/awkweb - https://twitter.com/jakemoxey", - "address": "0xd2135CfB216b74109775236E36d4b433F1DF507B", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xd2135CfB216b74109775236E36d4b433F1DF507B", - "project_pathname": "0xd2135CfB216b74109775236E36d4b433F1DF507B", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_wagmi-dev_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "0xSplits", - "socials": [ - "https://twitter.com/0xSplits", - "https://github.com/0xSplits", - "https://0xsplits.xyz/" - ], - "description": "0xSplits is a suite of smart contracts & tools that allows devs and end users to securely and efficiently share onchain revenue. Our current offerings include splits (immutable, mutable, & liquid), waterfalls (preference stacks), and vests (multi-stream, single beneficiary) as well as the accompanying subgraphs, sdk, & UI.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\n0xSplits makes it easy to reward collaboration onchain. We\u2019ve been used by collectives (e.g. protocol guild, songcamp), DAOs (e.g. airswap, bankless, nouns), applications (e.g. sound, superrare, heds, decent, bonfire, arpeggi), and devs (e.g. quantum, props) to power payments. Our open source & free-to-use ecosystem has distributed over $25M to 4K+ unique accounts on several chains including OP.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe have no revenue & are currently reliant on venture capital.", - "team_size": "3", - "address": "0x9ebC8E61f87A301fF25a606d7C06150f856F24E2", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x9ebC8E61f87A301fF25a606d7C06150f856F24E2", - "project_pathname": "0x9ebC8E61f87A301fF25a606d7C06150f856F24E2", - "optimismAddressFound": true, - "optimismBalanceEth": 0.9920998081802628, - "github_data": [ - "data/github/https:__github.com_0xSplits_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "Flipside Crypto", - "socials": [ - "https://twitter.com/flipsidecrypto", - "https://github.com/FlipsideCrypto", - "https://flipsidecrypto.xyz/" - ], - "description": "Flipside Crypto has worked alongside the OP Labs team to make Optimism data more accessible and help bootstrap Optimism\u2019s ecosystem-wide attestation / identity efforts. The data tables, SDK, API, and other core services are offered as free public goods - enabling the creation of a wide range of products and tools for Optimism. Flipside is also an active and devoted OP delegate.", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nData & Analytics Suite - Core Optimism data tables (blocks, transactions, event logs, & traces) - Data entirely backfilled, tables updated every 2 hours, ingested every 15 mins Software - API, SDK, and data viz studio - ShroomDK - an API key NFT mint pulling industry-leading blockchain data - Snowflake Data Shares Governance & Attestation Apps - OP Governance Dashboard - The Optimist Score", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nWe sustain ourselves through the following efforts: Community Analytics Programs Fundraising Grants And lastly, retroactive funding like this! It allows us to keep our data free & open.", - "team_size": "Flipside Crypto is a team of 80 full-time employees. Our programs support a growing community of over 25,000 analysts.", - "address": "0x1ef753934C40a72a60EaB12A68B6f8854439AA78", - "banner": false, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0x62a43123FE71f9764f26554b3F5017627996816a", - "project_pathname": "0x62a43123FE71f9764f26554b3F5017627996816a", - "optimismAddressFound": true, - "optimismBalanceEth": 0.02953179445127572, - "github_data": [ - "data/github/https:__github.com_FlipsideCrypto_events_2022-07-01_2023-03-01.json" - ] - }, - { - "project": "hardhat-deploy", - "socials": [ - "https://twitter.com/wighawag", - "https://github.com/wighawag", - "https://github.com/wighawag/hardhat-deploy" - ], - "description": "A Hardhat Plugin For Replicable Deployments And Easy Testing This hardhat plugin adds a mechanism to deploy contracts to any network, keeping track of them and replicating the same environment for testing. It also adds a mechanism to associate names to addresses, so test and deployment scripts can be reconfigured by simply changing the address a name points to plus many more features...", - "category": "Tooling and utilities", - "public_goods": "How do you support development and usage of the OP Stack? What public good do you provide to the Collective?\nAs a tool useful for any contract development, it should be helpful for the OP Stack. The public good is the ability to deploy contract on multiple network and keeping track of them, plus many more feature this tool provide. All of it open-source.", - "sustainability": "How do you sustain yourself? Please list sources of funding and revenue\nApart from hardhat-deploy, I work on other tool especially focused on on-chain games which I have been developing since 2019. For some of these tools (which are open source) I received grants from 0xParc This include : https://github.com/conquest-eth/ethereum-indexer hardhat is also part of gitcoin rounds", - "team_size": "1", - "address": "0xF0D7a8198D75e10517f035CF11b928e9E2aB20f4", - "banner": true, - "logo": true, - "project_link": "https://app.optimism.io/retropgf-discovery/0xF78cD306b23031dE9E739A5BcDE61764e82AD5eF", - "project_pathname": "0xF78cD306b23031dE9E739A5BcDE61764e82AD5eF", - "optimismAddressFound": true, - "optimismBalanceEth": 0.0, - "github_data": [ - "data/github/https:__github.com_wighawag_events_2022-07-01_2023-03-01.json", - "data/github/https:__github.com_wighawag_hardhat-deploy_events_2022-07-01_2023-03-01.json" - ] - } -] diff --git a/utils/optimism/data/optimism_project_data.yaml b/utils/optimism/data/optimism_project_data.yaml deleted file mode 100644 index b1c5e6e..0000000 --- a/utils/optimism/data/optimism_project_data.yaml +++ /dev/null @@ -1,1753 +0,0 @@ -projects: -- name: Layer 2 Landscape - description: Technically this nomination is for the the Truffle Optimism Box, - which allows developers to use boilerplate to create Optimism dapps. This - educational tool led to my broader effort to spread information about the - Layer 2/Scaling ecosystem's development via my Twitter account (@bitsplaining), - w/ a weekly educational thread, for which I'd like to accept this nomination. - repos: - - name: fainashalts - url: https://github.com/fainashalts - - name: truffle-box - url: https://github.com/truffle-box/optimism-box - ledgers: - - address: '0x7a48A728d9Fd2d5a55c545c4378E5bA909349E90' - name: Wallet -- name: EthereansOS - description: "Ethereans is a decentralized nation that uses secure DeFi routines\ - \ for seamless transactions, self-sovereign on-chain governance with granular\ - \ control over its resources, and specialized assets that are interoperable\ - \ across marketplaces and DEX\u2019s. Everything in the nation is powered\ - \ by generalized smart contract factories built on EthereansOS." - repos: - - name: EthereansOS - url: https://github.com/EthereansOS - ledgers: - - address: '0xdc0090f8aDD5DB06De0897A54e753af143668668' - name: Wallet -- name: "\U0001F40D snekmate" - description: "\U0001F40D snekmate are state-of-the-art, highly opinionated, hyper-optimised\ - \ and secure Vyper smart contract building blocks. Or in other words, it's\ - \ the OpenZeppelin version for Vyper." - repos: - - name: pcaversaccio - url: https://github.com/pcaversaccio - ledgers: - - address: '0x07bF3CDA34aA78d92949bbDce31520714AB5b228' - name: Wallet -- name: Gitcoin - description: For the past 5 years Gitcoin has been focused on building and funding - digital public goods. By popularizing these concepts, it's helped spark a - trend across the industry of giving back and supporting Ethereum developers. - Through its implementation of quadratic funding specifically, it's helped - fund projects like ethers.js, Hardhat, POAP, Prysm, and even Optimism itself. - repos: - - name: gitcoinco - url: https://github.com/gitcoinco - ledgers: - - address: '0xc92D76E01BD4e7CE25819c94FC6c3aea7b2Cd155' - name: Wallet -- name: Kernel - description: 'Kernel is peer-to-peer learning environment, growing one block at - a time. Traditionally, each block accommodates 250 individuals and runs for - 8 weeks. In two years, and after 7 Kernel blocks, there are: - 1,800 Kernel - fellows (see more here: https://www.kernel.community/en/love) - 470 Kernel - "adventures": web3 projects, protocols, writings & research - 70+ Kernel projects - who have raised $1MM' - repos: - - name: kernel-community - url: https://github.com/kernel-community/ - ledgers: - - address: '0x7DAC9Fc15C1Db4379D75A6E3f330aE849dFfcE18' - name: Wallet -- name: 'ERC-5560: Redeemable NFTs' - description: The EIP-5560 (Redeemable NFTs) adds a redeem function to EIP-721. - It can be implemented when an NFT issuer wants his/her NFT to be redeemed - for a physical object. An increasing amount of NFT issuers such as artists, - fine art galeries, auction houses, brands and others want to offer a physical - object to the holder of a given NFT. This standard allows EIP-721 NFTs to - signal reedemability. - repos: - - name: ATO-nft - url: https://github.com/ATO-nft - ledgers: - - address: '0x5874D5D530D1f969FD962579c445A0f3A8682D48' - name: Wallet -- name: Solady - description: Highly-optimized Solidity snippets. - repos: - - name: Vectorized - url: https://github.com/Vectorized - ledgers: - - address: '0x1F5D295778796a8b9f29600A585Ab73D452AcB1c' - name: Wallet -- name: Bankless Academy - description: Bankless Academy has been providing a growing range of free-to-access - education packets for over a year - featuring tight writing & infographics, - quizzes, and on-chain quests with proof-of-knowledge badges. Our mission is - to continue Public Good operations on Ethereum, building w/ communities like - Gitcoin Passport, Mintkudos and Optimism, and developing community content - via our Writers Cohorts. - repos: - - name: didierkrux - url: https://github.com/didierkrux - ledgers: - - address: '0xbFBceA2a72Bc2e62E967fA0c79458dD507708469' - name: Wallet -- name: Slither - description: Slither is a Solidity static analysis framework written in Python. - It runs a suite of vulnerability detectors, prints visual information about - contract details, and provides an API to easily write custom analyses. Slither - enables developers to find vulnerabilities, to enhance their code comprehension, - and to quickly prototype custom analyses. - repos: - - name: montyly - url: https://github.com/montyly - - name: crytic - url: https://github.com/crytic/slither - ledgers: - - address: '0xc44F30Be3eBBEfdDBB5a85168710b4f0e18f4Ff0' - name: Wallet -- name: Eneagon by zenbit.eth - description: A prefiltering platform for RPGF, based on the bicameral governance - model from Optimism. Developers are able to mint PG Projects as NFTs and set - multiple development stages to be retroactively funded. These stages are tracked - from GitHub milestones, any user can get rewards by donating to these, while - stakeholders can mint SBT to evaluate the progress and deliver funds after - completing each stage. - repos: - - name: zenbitETH - url: https://github.com/zenbitETH/eneagon - ledgers: - - address: '0xeCB4C1245665e8A1F43826355aaB0Dd6bF336e05' - name: Wallet -- name: Pocket Network - description: Pocket Network is a decentralized web3 infrastructure provider focused - on optimizing the developer experience with scalable, reliable, fast, and - privacy-centric services. As of writing this, in the past 24 hours, Pocket - Network has served 1.4B requests across 25 networks. This traffic is served - by over 150 independent 3rd party node operators on a mix of bare-metal and - cloud providers. - repos: - - name: pokt-network - url: https://github.com/pokt-network - ledgers: - - address: '0x5F1Feefc4BB7a414096cCF070BeEF94da8Ff88A6' - name: Wallet -- name: Quark ID - description: Quark ID is a digital trust protocol that implements a new security - framework for the creation and management of digital identities and all their - credentials in a decentralized way, using asymmetric cryptography and the - immutability of blockchain to create trust in a digital world. Open standards - SSI protocol Multichain Interoperable Off-chain private data Autonomous governance - Public/private ecos - repos: - - name: Quark-id - url: https://github.com/Quark-id - ledgers: - - address: '0x98c72aFaA2797cb194433de46Fe9E3ceF39F7a53' - name: Wallet -- name: ETHGlobal - description: 'ETHGlobal is the largest developer focused community in Ethereum. - Most known for their hackathons, ETHGlobal has run 50+ hackathons around the - world and online. To support builders at any point in their journey, ETHGlobal - builds products for its developer community''s success including: Hackathon - (online/in-person), Guides (self-directed education), Summits (online/in-person), - Jobs, and more.' - repos: - - name: ethglobal - url: https://github.com/ethglobal - ledgers: - - address: '0x336DEe4022d6CC2F95cfe9e0949B9E0EDDAC457D' - name: Wallet -- name: OP Dashboards by Springzhang - description: I created several dashboards for Optimism chain on Dune Analytics - platform. Some of them are quite popular. These dashboards are helpful for - users to know better about OP chain and for project team to understand their - users better from a public onchain data perspective. - repos: - - name: springzh - url: https://github.com/springzh - ledgers: - - address: '0xdbE38D1d3631a04875d3FAd945D0dFcb2C20f91c' - name: Wallet -- name: EthernautDAO - description: We are a developer's bridge from web2 to web3. We pair senior solidity - devs with senior web2 devs for a 2-month crash course to expand the blockchain - teams. We also started the distribution of a soulbond token called EXP on - optimism to have an on-chain attestation of developer contributors. - repos: - - name: ethernautdao - url: https://github.com/ethernautdao - ledgers: - - address: '0x2431BFA47bB3d494Bd720FaC71960F27a54b6FE7' - name: Wallet -- name: Prettier Solidity - description: Prettier Solidity is a Prettier plugin for formatting Solidity code. - It's the de-facto formatter for the Solidity language, used by multiple projects - including Optimism itself. - repos: - - name: prettier-solidity - url: https://github.com/prettier-solidity - ledgers: - - address: '0xFc756d8632A19CEbd76560CE0A6967279E32131b' - name: Wallet -- name: delegation.tools - description: 'delegation.tools allows you to see who you are delegating your OP - to, and to change delegate in a couple of clicks. It was created shortly after - the OP token was launched: there was some confusion on how to change delegate - after completing all the steps in the airdrop process, so I made delegation.tools - to make the process as easy as possible.' - repos: - - name: DanieleSalatti - url: https://github.com/DanieleSalatti - ledgers: - - address: '0xA47669cBc53985333423e4d3D00188f4049fB695' - name: Wallet -- name: ITU Blockchain - description: ITU Blockchain is the first and largest university blockchain community - established in Turkey. The mission of ITU Blockchain is primarily to increase - blockchain literacy and awareness in its geography and to educate its community - to develop qualified projects. With its nearly 3000 members, it organizes - face-to-face and online educations and events every year. - repos: - - name: itublockchain - url: https://github.com/itublockchain - ledgers: - - address: '0xBEC643BD5b7F5e9190617CA4187ef0455950C51C' - name: Wallet -- name: Frame - description: Frame is a web3 platform that creates a secure, system-wide interface - to your chains and accounts, giving any browser, command-line, or native application - the ability to access web3. Our routing architecture, Omnichain, simplifies - the user experience by eliminating the concept of "being on a chain" and allowing - dapps to route requests to any of the user's available chains in parallel. - repos: - - name: floating - url: https://github.com/floating/frame - ledgers: - - address: '0x7c929EfA9a8A2A1524BA90aBc2B70801413fFD4c' - name: Wallet -- name: Blobscan - description: Blobscan is the first EIP4844 Blob Transaction explorer, a web-based - application that offers a seamless experience for navigating and indexing - blob data. The explorer will have data gas metrics to help users understand - the costs associated with this new transaction type, blob data decoding for - each rollup, and an API to manipulate blobs. - repos: - - name: Blobscan - url: https://github.com/Blobscan - ledgers: - - address: '0xd228A0054246577d9c6F978d11Ab9405AE566c5D' - name: Wallet -- name: Rigoblock - description: Rigoblock is a fully open source and free to use smart contracts - protocol that facilitates the interaction with DeFi applications and the organization - of tokens and group of token holders in smart wallets. It has been live on - Optimism since November 2022. Rigoblock liquidity has generated more than - 50MM USD token swap volume on Ethereum mainnet. - repos: - - name: RigoBlock - url: https://github.com/RigoBlock - ledgers: - - address: '0x080f08076e8EAdC66006C3CbFEd28a34918A1fA6' - name: Wallet -- name: Akula - description: Fastest Ethereum node ever built - repos: - - name: akula-bft - url: https://github.com/akula-bft - ledgers: - - address: '0x9d6d3b09F8AC8615805bd82e53B80D956F451CFa' - name: Wallet -- name: Optinames | ENS on Optimism - description: Hello, Badgeholders. What are Optinames? Optinames are tradable and - transferable sub-domains deployed on Optimism that are fully integrated with - the Ethereum Name Service (ENS). They can be resolved on popular web3 wallets - i.e Coinbase Wallet by utilizing an off-chain ENS resolver. We built the Optinames - toolset to enable anyone to easily and cheaply create ENS subdomain-based - communities. - repos: - - name: stevegachau - url: https://github.com/stevegachau/optimismresolver - ledgers: - - address: '0x1D7b8D3c6c896d7eB4f9118Ea377C359073d4083' - name: Wallet -- name: Solidity - description: Solidity is a statically-typed curly-braces programming language - designed for developing smart contracts that run on Ethereum. - repos: - - name: ethereum - url: https://github.com/ethereum/solidity - ledgers: - - address: '0xF0F1eF973C7Ae51Ef7ae917812932569100956ae' - name: Wallet -- name: Rust-cannon-template - description: The Rust Cannon template is a starting point for developers who want - to build and experiment with the provable execution layer of the OP stack. - It makes it simple to compile Rust code to MIPs with helpers to read inputs, - write outputs and access the pre-image oracle. The results of the execution - of this code can be fraud-proven on-chain using the OP stack challenge game - Solidity contracts. - repos: - - name: willemolding - url: https://github.com/willemolding - - name: willemolding - url: https://github.com/willemolding/rust-cannon-template - ledgers: - - address: '0xc0017405E287476443Ab1B342B86f2ea92Ef9F73' - name: Wallet -- name: Small Brain Games - description: "Small Brain Games is focused on quickly iterating on casual games.\ - \ These games: 1. Are open source and fully on-chain 2. Strive to be accessible\ - \ to anybody\u2013not just crypto-native users 3. Are about persistence and\ - \ composability (less so than ownership) We've launched Words3, a fully on-chain\ - \ word game on Optimism. We have 2 more games queued up for Q1 2023." - repos: - - name: smallbraingames - url: https://github.com/smallbraingames - ledgers: - - address: '0xc152Cc22488f1383E675f5738dF9a4244fB113a5' - name: Wallet -- name: Blockscout - description: 'Blockscout is the first fully-featured open-source blockchain explorer - available for use by any EVM chain. Blockscout currently supports 120+ different - chains. We are currently working on 2.0 version: https://docs.blockscout.com/about/roadmap/blockscout-2.0 - WIP: https://eth-goerli.blockscout.com/ OP instances will be among the first - where 2.0 will be deployed in Q2 this year.' - repos: - - name: blockscout - url: https://github.com/blockscout - ledgers: - - address: '0x242ba6d68FfEb4a098B591B32d370F973FF882B7' - name: Wallet -- name: blst by Supranational - description: blst is a BLS12-381 signature library focused on performance and - security. The library has undergone security audits and formal verification, - and supports assembly backends for x86 and ARM platforms. Currently blst is - used by all of the Eth2 / Ethereum consensus clients (Prysm, Lighthouse, Teku, - Nimbus, and Lodestar). blst is a critical component for enabling scalability - and performance of PoS. - repos: - - name: supranational - url: https://github.com/supranational - ledgers: - - address: '0x0a6CD04Ca9Ce730c709276C6868D9F2C4D9Ef1D6' - name: Wallet -- name: Women Biz - Optimism education - description: "Would you like to help us impact more women? Our next project is\ - \ focused on carrying out free courses that open the doors to Web 3, even\ - \ if they don\u2019t know anything about this world. We want at least 10 women\ - \ from different cities outside of Lima participating. Block 1: Introduction\ - \ to web 3 - I Block 2: Basic concepts about metaverse, networks, smart contracts,\ - \ tokens. Block3: Specialization" - repos: - - name: womenbiz - url: https://github.com/womenbiz - ledgers: - - address: '0x0693401dF5CbAE158be6bbAdDD69d52283a8076E' - name: Wallet -- name: Attestation Station Interface - description: This project provides a no-code solution for builders and community - members to directly interact with the AttestationStation smart contract. - repos: - - name: sbvegan - url: https://github.com/sbvegan - ledgers: - - address: '0x5EfF4B8c042AA6003cBDA6E32C4aA23657d3b6AF' - name: Wallet -- name: Sugar - description: Sugar makes Velodrome devs life sweeter Sugar was born as the need - to unify the 10+ contracts handling Velodrome into an easy to use interface - with full access to the normalized dataset representing the real-time state - of our protocol. - repos: - - name: stas - url: https://github.com/stas - - name: velodrome-finance - url: https://github.com/velodrome-finance/sugar/ - ledgers: - - address: '0x892Ff98a46e5bd141E2D12618f4B2Fe6284debac' - name: Wallet -- name: Boardroom - description: Boardroom is a comprehensive and user-friendly governance dashboard - helping increase participation in voting and decision-making in DAOs. It allows - token holders, from institutions to contributors, to influence the direction - of their projects by making faster, smarter, and more informed governance - decisions. The Governance API makes this data accessible to any stakeholder - or developer. - repos: - - name: boardroom-inc - url: https://github.com/boardroom-inc - ledgers: - - address: '0xF6a4475a006b28b9996c92bEE27DEEDc38032cDe' - name: Wallet -- name: Nethermind - description: "Nethermind is a team of world-class builders and researchers. We\ - \ empower enterprises and developers worldwide to access and build upon the\ - \ decentralized web. Our work touches every part of the Web3 ecosystem, from\ - \ our Nethermind node to fundamental cryptography research and application-layer\ - \ protocol development. We\u2019re passionate builders solving Ethereum\u2019\ - s most difficult challenges." - repos: - - name: NethermindEth - url: https://github.com/NethermindEth - ledgers: - - address: '0xbc11295936aa79d594139de1b2e12629414f3bdb' - name: Wallet -- name: Perpetuals Dune Abstraction - description: The perpetuals trading abstraction on Dune standardizes the trading - data amongst all the perpetuals trading platforms on Optimism and makes them - all accessible in a single table, called perpetuals.trades. The primary goal - is to help analysts and builders alike in gaining a deep understanding of - the perpetuals market and in building tools related to the data being surfaced. - repos: - - name: RplusT - url: https://github.com/RplusT - ledgers: - - address: '0x08290908a251119a1C75bb9C36A7A41e9BF2f1E3' - name: Wallet -- name: DexKit - description: 'We offer no code solutions for (digital) artists, collectors and - crypto projects, allowing them to deploy crypto focused websites. Clients - that use our white label tool can customize everything within the app: look - and feel, fees, customize pages, add custom domains, among others. This specific - tool is a CMS focused on crypto content. We also provide a collection wizard - powered by AI.' - repos: - - name: DexKit - url: https://github.com/DexKit - ledgers: - - address: '0x5265Bde27F57E738bE6c1F6AB3544e82cdc92a8f' - name: Wallet -- name: Remix Project - description: The Remix Project is a rich toolset including Remix IDE, a comprehensive - smart contract development tool available for web and desktop. Remix Plugin - Engine and Remix Libraries are low-level tools for wider use. Remix IDE can - be used for the entire journey of contract development by users of any knowledge - level and as a learning lab for teaching and experimenting with Ethereum. - repos: - - name: ethereum - url: https://github.com/ethereum/remix-project - ledgers: - - address: '0x2ba1aebA3fBd69aa74944F17326Bfdc229fD986E' - name: Wallet -- name: Nested - description: The crypto world suffers from general over-complication and unbearable - user experience that dissuade people from getting involved. Nested is a crypto - trading/investing platform that breaks that trend by revolutionizing the accessibility - to web3 in a way that is unprecedentedly simple, social and safe. - repos: - - name: NestedFi - url: https://github.com/NestedFi - ledgers: - - address: '0xf944069B489F1ebfF4C3C6a6014d58cBEf7C7009' - name: Wallet -- name: RadicalxChange Foundation - description: "RadicalxChange (RxC) is a global movement for next-generation political\ - \ economies. We\u2019re committed to advancing plurality, equality, community,\ - \ an decentralization through upgrading democracy, markets, the data economy,\ - \ the commons, and identity. Founded by economist Glen Weyl in 2018, the RadicalxChange\ - \ Foundation is a 501(c)(3) nonprofit dedicated to advancing the RxC movement." - repos: - - name: RadicalxChange - url: https://github.com/RadicalxChange - ledgers: - - address: '0x3945D766185E2264900C84faC10958B3619C2bD4' - name: Wallet -- name: "Blocktrend (\u5340\u584A\u52E2)" - description: 'Blocktrend is a Taiwan-based independent media that focuses on blockchain - and Web3. We have been publishing original and explanatory articles and podcasts - since 2017 to help readers understand Web3 in a simple and easy-to-understand - way and encourage them to gain hands-on experience. Blocktrend have produced - over 500 articles and 200 podcast interviews to date, ranking #1 on Apple - Podcast in TW.' - repos: - - name: astro-hsu - url: https://github.com/astro-hsu - ledgers: - - address: '0x36F322fC85B24aB13263CFE9217B28f8E2b38381' - name: Wallet -- name: Nimbus - description: "Nimbus is a client implementation for both Ethereum\u2019s consensus\ - \ layer and execution layer that strives to be as lightweight as possible\ - \ in terms of resources used. This allows it to perform well on embedded systems,\ - \ embedded devices \u2013 including Raspberry Pis and mobile devices." - repos: - - name: status-im - url: https://github.com/status-im/ - ledgers: - - address: '0x4F0E571C956d54658FD9eBee5e5B4279eB5e765a' - name: Wallet -- name: Erigon - description: Erigon is an implementation of Ethereum (execution client), on the - efficiency frontier. Archive Node by default. - repos: - - name: ledgerwatch - url: https://github.com/ledgerwatch - ledgers: - - address: '0x9D20893054afC4A74b856089c44F9A09d1C38Db0' - name: Wallet -- name: Ethers - description: Ethers is a complete and compact library for Ethereum and related - chains, providing all functionality required for dapps, wallets and any other - utilities and scripts. It is widely used throughout the community and is a - dependency for a large portion of the ecosystem with over 4 million npm downloads - monthly. - repos: - - name: ricmoo - url: https://github.com/ricmoo - ledgers: - - address: '0x8ba1f109551bD432803012645Ac136ddd64DBA72' - name: Wallet -- name: raise_exception (rotate.eth) - description: I am an independent researcher assisting crypto-native communities - separate genuine users from Sybil attacks. This involves raising awareness, - informing communities about ongoing attacks against them, providing advice - & developing custom tools. I perform in-depth analysis of on-chain data, often - identifying & visualising clusters of related addresses. - repos: - - name: rotate-eth - url: https://github.com/rotate-eth - ledgers: - - address: '0x400aBc3DAE98Ec5aEEF2681b40D4CEd0A5aff934' - name: Wallet -- name: MarcoV (Optimism Dashboards) - description: 'Using Dune Analytics (and other analytics platforms), i surface - data about the Optimism ecosystem. On a overall level, but also on in-depth - on projects, to provide insights on users, transactions, volume, earnings - etc. Examples are: - https://dune.com/Marcov/Optimism-Ethereum - https://dune.com/Marcov/Optimism-After-Bridge - - https://dune.com/Marcov/OP-Optimism' - repos: - - name: MarcoVugts - url: https://github.com/MarcoVugts - ledgers: - - address: '0x283266045Ab2aB0793a62CADC21D55f685636Ae0' - name: Wallet -- name: rotki - description: rotki is an open source portfolio tracking, analytics & accounting - tool that protects your privacy. The mission of rotki is to bring transparency - for crypto through the use of open source. Unlike virtually every other competing - service which consists of closed source SaaS onto which you are forced to - hand over all your financial data, with rotki your data is stored encrypted - locally. - repos: - - name: rotki - url: https://github.com/rotki - ledgers: - - address: '0x9531C059098e3d194fF87FebB587aB07B30B1306' - name: Wallet -- name: WakeUp Labs - description: WakeUp Labs is a start-up that aims to lower the barriers for the - integration of web3 features into web2 businesses and projects. The company - provides a platform that enables developers, without previous blockchain experience, - to integrate web3 features with ease and speed by offering REST APIs for straightforward - integration. It offers full compatibility with the Optimism blockchain and - others. - repos: - - name: wakeuplabs - url: https://github.com/wakeuplabs - ledgers: - - address: '0xab4f5A7fcd1Bb66C8c5f01bB77F6142759f46107' - name: Wallet -- name: geth - description: Geth (go-ethereum) is a Go implementation of Ethereum - a gateway - into the decentralized web. Geth has been a core part of Ethereum since the - very beginning. Geth was one of the original Ethereum implementations making - it the most battle-hardened and tested client. - repos: - - name: ethereum - url: https://github.com/ethereum/go-ethereum - ledgers: - - address: '0x21539334f45Ac41Bd10789942b744a18a4775d6d' - name: Wallet -- name: ChugSplash - description: 'Dev tool for securely deploying and upgrading smart contracts. ChugSplash - spun out of OP Labs, where it was designed for Optimism''s deployments. Key - features: -Define deployments/upgrades declaratively (5-10x less code than - deployment scripts) -Consistent addresses across networks via Create2 -Fully - deterministic and atomic -Approve upgrades with a single tiny txn -Automatic - Etherscan verification' - repos: - - name: chugsplash - url: https://github.com/chugsplash/chugsplash - - name: chugsplash - url: https://github.com/chugsplash/chugsplash - ledgers: - - address: '0x6D308C0535FA135516a2A0c493001e62088B065D' - name: Wallet -- name: Hyperledger Besu - description: Hyperledger Besu is an open-source Java implementation of Ethereum's - EL. Built initially for enterprise adoption, Besu has private and permissioning - features. It's an actively developed Mainnet client. Besu has helped in shaping - standards & core development since its beginning as Pantheon. Besu's unique - Bonsai tries maintain the lowest storage requirements on Mainnet and it has - a stand-alone EVM. - repos: - - name: hyperledger - url: https://github.com/hyperledger/besu - ledgers: - - address: '0xAb7A08Be21dFEcd4c9902995F3e30A2659b564E1' - name: Wallet -- name: Lodestar - description: Lodestar is a Typescript ecosystem for Ethereum consensus, developed - by ChainSafe Systems. Our flagship product is our production-capable beacon - chain and validator client. In addition, we maintain public repositories of - useful tools for public use. Some of these libraries include BLS, SSZ, Discv5, - Gossipsub, and Noise. - repos: - - name: ChainSafe - url: https://github.com/ChainSafe/lodestar - ledgers: - - address: '0xc8F9f8C913d6fF031c65e3bF7c7a51Ad1f3a86E5' - name: Wallet -- name: Commons Stack - description: "Commons Stack builds 'Commons', tokenized communities supporting\ - \ public goods. To achieve this, years of research have gone into developing\ - \ cultural frameworks that reinforce Ostrom\u2019s principles of governing\ - \ commons, novel tools such as the Augmented Bonding Curve, Conviction Voting\ - \ & Praise reward system, and a radically inclusive methodology (Collaborative\ - \ Economics) for launching a Commons." - repos: - - name: commons-stack - url: https://github.com/commons-stack/ - ledgers: - - address: '0x8110d1D04ac316fdCACe8f24fD60C86b810AB15A' - name: Wallet -- name: L2BEAT - description: L2BEAT is an Ethereum Layer Two (L2) scaling analysis and research - website. We compare Ethereum L2s by monitoring their usage & TVL-related metrics, - verifying their documentation against the source code, and manually assessing - associated risks. We have created a risk framework for L2s and bridges, along - with open-source monitoring tools that check for changes in their smart contracts' - parameters. - repos: - - name: l2beat - url: https://github.com/l2beat/l2beat - ledgers: - - address: '0xeA78912803bE5E356EaC2b8e127D4BA87230A48e' - name: Wallet -- name: MerkleTreeJS - description: MerkleTreeJS is a TypeScript NPM package to construct merkle trees, - generate proofs, and verify roots and proofs. - repos: - - name: merkletreejs - url: https://github.com/merkletreejs - ledgers: - - address: '0x358fdcCDE25e0aae7fBA01F088Da89b08aBF61DB' - name: Wallet -- name: BwareLabs - description: BwareLabs is a web3 infrastructure company providing decentralized - RPC/WSS APIs, validator, indexing and bridge operator services. Our core objective - is to improve the developer experience within a blockchain ecosystem. Blast - is our main product, which is a decentralized API platform with support for - 18 networks currently. From there developers can get easy access to RPC and - WSS endpoints. - repos: - - name: bwarelabs - url: https://github.com/bwarelabs - ledgers: - - address: '0xb8950c47E8B9e539601cB47A167DE8bf4Cb1289E' - name: Wallet -- name: Keccak hashing - description: The Keccak project started in 2008 for the development of the Keccak - hash function, winner of SHA3 competition and used in Ethereum. The project - is a multi discipline effort of cryptography, software and hardware development. - All the developments are open source, no patents and several incentives for - 3rd party security analysis. The project is still active for providing improved - implementations - repos: - - name: XKCP - url: https://github.com/XKCP/XKCP - ledgers: - - address: '0x399aA07a970ea3711d002566cafDBe021f9DD0E8' - name: Wallet -- name: Ipsilon - description: Ipsilon is a research team focusing on the execution environment - of Ethereum (aka the EVM or any future versions of it). We provide analysis - and implementation of own and third party proposals (i.e. new EIPs proposing - changes to the EVM), provide tooling (evmc, evmone, fizzy), and support existing - teams (e.g. Solidity, go-ethereum, Silkworm, Erigon) with implementation and - analysis. - repos: - - name: ipsilon - url: https://github.com/ipsilon - ledgers: - - address: '0xF96Aa4A25fDe246d9dD498B145F52Fab0eAd29f3' - name: Wallet -- name: dm3 protocol - description: "The project consists of 3 parts: Optimism-Resolver: a trustless\ - \ resolver for ENS utilizing CCIP. The verification is done using Merkle-proofs\ - \ for all used slots. dm3 \u2013 web3 messaging protocol: a lean messaging\ - \ protocol with focus on e2ee, decentralization, scalability, and interoperability.\ - \ dm3 embedded components: messaging components to embed in dApps to add interoperable\ - \ messaging to dApps." - repos: - - name: corpus-io - url: https://github.com/corpus-io/Optimism-Resolver - ledgers: - - address: '0x11Ee133A1408FE2d7c62296D7eB33F234b774503' - name: Wallet -- name: Polynya - description: I write a blog and twitter profile about a variety of topics related - to blockchain - scalability, sustainability, economics etc, and participate - in various rollups-related research/discussion venues. I'm also a delegate - for the Optimism Collective Token House and badgeholder-elect for the Citizen - House. - repos: - - name: apolynya - url: https://github.com/apolynya - ledgers: - - address: '0x429F9aDA43e9F345CbB85EC88681BB70Df808892' - name: Wallet -- name: L2planet - description: Layer 2 Planet is a research community that develops various products. - Initially, we focused on a bi-weekly newsletter covering Layer 2 solutions. - Now, we have a dApp store on our website. Going forward, our aim is to increase - website traffic and provide more technical educational resources about Layer2 - solutions and taking a role on big adaption. - repos: - - name: l2planet - url: https://github.com/l2planet - ledgers: - - address: '0x40170fA69481D9B197e226E63317B49dB3c2db02' - name: Wallet -- name: "\u26A1\uFE0FTurboETH - Web3 Build System" - description: "\u26A1\uFE0FTurboETH is a Web3 Build System; designed to make building\ - \ Web3 applications fast. Tightly integrated with WAGMI/SIWE, TurboETH template\ - \ teaches developers how to build production ready Web3 applications by example.\ - \ With 1-click deploy to Vercel going from `hypothesis > prototype > application`\ - \ has never been easier. Soon a TurboCLI too => twitter.com/KamesGeraghty/status/1626182766218907654" - repos: - - name: kamescg - url: https://github.com/kamescg - ledgers: - - address: '0x761d584f1C2d43cBc3F42ECd739701a36dFFAa31' - name: Wallet -- name: CryptoZombies - description: CryptoZombies is an interactive school that teaches you all things - technical about blockchains. It teaches students to write smart contracts - by making their own crypto-collectibles game. - repos: - - name: CryptozombiesHQ - url: https://github.com/CryptozombiesHQ/cryptozombie-lessons - ledgers: - - address: '0xbb105E3c6D6406A3F0aAB98cD8D0E3a127bD6436' - name: Wallet -- name: TypeChain - description: dETH is organization focused on improving Ethereum Developer Experience. - * TypeChain - generates TypeScript typings for Ethereum smart contacts, * - dETH Code - is Visual Studio Code for reading smart contracts, * dETH Tools - - a set of small tools useful for smart contract engineers, - repos: - - name: dethcrypto - url: https://github.com/dethcrypto - - name: dethcrypto - url: https://github.com/dethcrypto - ledgers: - - address: '0x4d2F0Efdb2AD1d709d8522E7b5aa9f5181563617' - name: Wallet -- name: Hop Protocol - description: Hop Protocol is a modular stack for building cross-chain applications - within the Ethereum ecosystem. To date, the Hop Token Bridge has bridged over - $3.4B across Ethereum, Ethereum rollups, and adjacent chains. With our initial - OP grant, Hop pioneered a fee refund program enabling users to recoup 80% - of onboarding costs while gaining ownership in the Optimism network. - repos: - - name: hop-protocol - url: https://github.com/hop-protocol - ledgers: - - address: oeth:0xC988107688b750dee6237B85A3ca49ba0a6 - name: Wallet -- name: Launchifi - description: Launchifi is a blockchain platform that enables you to launch anything - to the blockchain without coding. The platform provides a secure, multi-chain - compatible, and gas-optimized solution for deploying smart contracts. Pre-built - contracts, advanced setups, and industry-leading integrations are available. - Contracts that we currently include are tokens, NFTs, Staking, Auctions, and - LP Tokens. - repos: - - name: Launchifi - url: https://github.com/Launchifi/ - ledgers: - - address: '0x64249ED5Ef7a004d268A508092851e987482a175' - name: Wallet -- name: Flexible Voting - description: Flexible Voting is an extension to the widely used OpenZeppelin DAO - Governor that enables powerful new voting patterns for voting through client - contracts. This new building block allows arbitrary delegate contracts to - be developed which can unlock all kinds of new use cases. - repos: - - name: ScopeLift - url: https://github.com/ScopeLift - ledgers: - - address: '0x5C04E7808455ee0e22c2773328C151d0DD79dC62' - name: Wallet -- name: NFTEarth - description: NFTEarth is an NFT marketplace for buying and selling NFTs on L2. - In addition to being a marketplace, the protocol has a native token, $NFTE, - and is building out the NFTEarth "NFT Hub" - which aims to server as a one-stop-shop - for NFT creators, collectors, and DAOs looking to generate NFT art, deploy - and manage contracts, and create allowlists as well as Mint embeds for their - NFTs. - repos: - - name: NFTEarth - url: https://github.com/NFTEarth - ledgers: - - address: '0x78ED254b9c140c1A2BE10d2ad32C65b5f712f54b' - name: Wallet -- name: "Filosof\xEDa C\xF3digo" - description: "Filosof\xEDa C\xF3digo is a YouTube channel that explains step by\ - \ step how to program Smart contracts in Solidity. It also includes explanatory\ - \ videos on Ethereum and L2 scalability. In addition accompanies each video\ - \ detailed programming articles on Solidity, all information is available\ - \ and free. Key Stats: * Available Spanish, English and French * 50+ tutorials\ - \ * Video + Blog articles" - repos: - - name: FilosofiaCodigo - url: https://github.com/FilosofiaCodigo - ledgers: - - address: '0xb6F5414bAb8d5ad8F33E37591C02f7284E974FcB' - name: Wallet -- name: Atlantis World - description: Atlantis World is an exploratory web3 social metaverse that transforms - everyday people into web3 super users, one fun & rewarding quest at a time. - repos: - - name: carlomigueldy - url: https://github.com/carlomigueldy - ledgers: - - address: '0x036C545Ae4f68059b4C83f7E3814429d4c73c089' - name: Wallet -- name: Infinitism (ERC-4337) - description: ERC-4337 standardizes account abstraction on all EVM chains without - the need for consensus-layer protocol changes. It defines a way to implement - and use account abstraction on EVM chains, with a focus on L2. Our goal is - to bring the 10X usability improvement that the ecosystem needs, to support - the next billion users. - repos: - - name: eth-infinitism - url: https://github.com/eth-infinitism - - name: eth-infinitism - url: https://github.com/eth-infinitism/account-abstraction - ledgers: - - address: '0x6A957e69A251D37CfD1F538F18EC1416FbdfA501' - name: Wallet -- name: DefiLlama - description: 'DefiLlama is an OpenSource project that tracks metrics for DeFi - protocols (TVL, volume, fees, revenue, treasury...) transparently, making - our data available for free to everybody. On top of that we''ve built: - LlamaPay, - a payments tool used by multiple optimism protocols such as Velodrome - LlamaSwap, - a dex meta-aggregator - our free price & metrics API and we maintain ChainList.' - repos: - - name: DefiLlama - url: https://github.com/DefiLlama - ledgers: - - address: '0x3754a10c1cA723961068B2653109E6201982Dd9c' - name: Wallet -- name: Otterspace - description: 'Otterspace develops easy-to-use tools for internet-native communities - to create & distribute Badges (non-transferable NFTs) on Optimism. Badges - enable communities to: 1. Increase member engagement via non-financial rewards - 2. Reduce manual workload & improve security via automated permission (e.g. - through Guild, CollabLand) 3. Implement on-chain, portable membership & reputation - models' - repos: - - name: otterspace-xyz - url: https://github.com/otterspace-xyz/ - ledgers: - - address: '0x2696170bf5fD36320c3932fd9e85fe5b798385FE' - name: Wallet -- name: OP Medicine - description: Enabling the bottom of pyramid through empowering pharma companies - and the medical eco-system to do medicine trial testing, clinical trials via - Optimism and Ethereum blockchain enabled EMTTRs (Electronic Medicine Trial - and Test Records as a Service), EHR and Radiology services. Developer Tools - to to build solutions in medicine, healthcare, improve transparency in drug - testing using Optimism tools. - repos: - - name: aspiringsecurity - url: https://github.com/aspiringsecurity/EMTTR - ledgers: - - address: '0x8dc640a257DE18857F8d24e1Ae2645F8bBa1E034' - name: Wallet -- name: EthereumETL - description: 'EthereumETL has been described as the most useful open-source project - for facilitating data science on Ethereum data. In addition, a BigQuery Ethereum - dataset published together with Google using EthereumETL has already proved - useful for many companies and people: it empowers research and data science, - and enables data-driven applications development.' - repos: - - name: blockchain-etl - url: https://github.com/blockchain-etl/ethereum-etl - ledgers: - - address: '0x9fd0c742d81b6f08817f3ef11d09cb4a9f54ee5f' - name: Wallet -- name: hildobby's Dune dashboards - description: This project includes various Dune dashboards I have created as a - contribution to the Optimism ecosystem. I have also recently created an open - source wash trades filtering method that can be used on Optimism NFT trade - data. I intend to share more methods like this one going forward which will - be usable on Optimism data within Dune and open sourced so it can easily be - ported out of Dune. - repos: - - name: hildobby - url: https://github.com/hildobby - ledgers: - - address: '0x09a5943a6d10919571eE2C9F63380aEA747ECA97' - name: Wallet -- name: TrueBlocks - description: 'TrueBlocks creates a shared, naturally sharded index of addresses - for any EVM-based chain (including Optimism). This allows ultra-fast access - to the underlying chain data and runs 100% locally. The near-zero cost of - operation promotes a true public good. A video explainer is here: https://loom.com/share/fd75d19f1dc946498c4ea0344517c2c6. - For detailed info, see here: https://urlis.net/i98eydu0.' - repos: - - name: TrueBlocks - url: https://github.com/TrueBlocks/trueblocks-core - ledgers: - - address: '0x89D107a9F019B4DC5dCa227d991c89e4E7251Ff5' - name: Wallet -- name: Snapshot - description: Snapshot is a platform that enables decentralized autonomous organization - (DAO) governance. Snapshot provides a way for DAO members to cast votes on - proposals and make decisions collectively, without the need for a centralized - authority. By using Snapshot, DAOs can increase transparency and accountability - in their decision-making processes. - repos: - - name: snapshot-labs - url: https://github.com/snapshot-labs - ledgers: - - address: '0x3E87e5BCE4dEb09FeE5045EF15E18f873212E6A7' - name: Wallet -- name: "timdaub\u2019s work as ETH Magician" - description: Attestate is my bootstrapped online venture. Over a multi-year period, - I've been working on foundational technology that accelerates the vision of - blockchains as "attestable" knowledge graphs for permissions and credible - neutral data storage. I've paid out-of-pocket to travel to conferences, and - I've run workshops, done talks, and written standards. - repos: - - name: attestate - url: https://github.com/attestate - ledgers: - - address: '0x005241438caf3eacb05bb6543151f7af894c5b58' - name: Wallet -- name: BanklessDAO Projects - description: "BanklessDAO\u2019s mission is to create user-friendly onramps for\ - \ people to discover decentralized financial technologies through education,\ - \ media, and culture. To further that mission, BanklessDAO produces educational\ - \ content via its newsletters and Bankless Publishing on various crypto-related\ - \ topics, including Layer 2 scaling solutions such as Optimism. We also make\ - \ use of Mirror/OP functionality." - repos: - - name: BanklessDAO - url: https://github.com/BanklessDAO - ledgers: - - address: '0x745ce2Af76E9a6EBa65CC0cAcaa9eA109bB7FaBd' - name: Wallet -- name: Optimism DAppNode Package - description: This is a package I created that lets home users easily run an Optimism - node on their DAppNode. 3 clicks (and a few days while it syncs) will get - you a full node. It is now part of the official collection of packages in - the DAppStore. Funds will be used to allow me to dedicate more time getting - the package ready for the upcoming Optimism Bedrock update. A little funding - will go a long way here! - repos: - - name: DanieleSalatti - url: https://github.com/DanieleSalatti - - name: DanieleSalatti - url: https://github.com/DanieleSalatti/DAppNodePackage-optimism - ledgers: - - address: '0x523d007855B3543797E0d3D462CB44B601274819' - name: Wallet -- name: beaconcha.in - description: Beaconcha.in is an open source Ethereum explorer which makes the - beacon chain and execution layer accessible to non-technical users. In addition, - beaconcha.in provides an open source mobile app for iOS and android for validator - monitoring. - repos: - - name: beaconchain - url: https://github.com/beaconchain - ledgers: - - address: '0x9d4E94dB689Bc471E45b0a18B7BdA36FcCeC9c3b' - name: Wallet -- name: Gelato - description: "Gelato is Web3\u2019s decentralized backend empowering builders\ - \ to create augmented smart contracts that are automated, gasless and off-chain\ - \ aware on all major EVM-compatible blockchains. Gelato has already emerged\ - \ as the preferred choice for some of the most important Web3 projects and\ - \ is powering 200+ decentralized applications and handling tens of thousands\ - \ of transactions each day." - repos: - - name: gelatodigital - url: https://github.com/gelatodigital - ledgers: - - address: '0x01ea687Be2937D4Bfd9e302b8dbD3be8d9bDb14e' - name: Wallet -- name: Messari Protocol Services - description: 'Our work falls under 3 buckets: Subgraph development - We''ve built - standardized subgraphs for most of the top Optimism projects. Data dashboards - - Charting TVL, trading volume, revenue, liquidity added/removed from both - the macro level and on an individual pool basis. Governance reporting - Breaking - down governance structures and looking at voter/delegate analysis' - repos: - - name: messari - url: https://github.com/messari - ledgers: - - address: '0x47A6a1B6492B6dF811606B8294A02b4268e86dAD' - name: Wallet -- name: CANDIDE Wallet - description: CANDIDE is an open-source smart contract wallet based on ERC-4337, - the account abstraction standard for censorship resistant contract wallets. - It supports social recovery, sponsored transactions for gasless/ERC-20 based - payments, and batched transactions for one click dapp experiences. - repos: - - name: candidelabs - url: https://github.com/candidelabs - ledgers: - - address: oeth:0xf508311867EFdC50cf36B06EC95E0EEdb22 - name: Wallet -- name: Web3 Data Degens - description: Making web3 data accessible for everyone. - repos: - - name: andrewhong5297 - url: https://github.com/andrewhong5297 - ledgers: - - address: '0x2Ae8c972fB2E6c00ddED8986E2dc672ED190DA06' - name: Wallet -- name: Optimism Prices Contracts - description: A set of Optimism-unique smart contracts that can price any ERC20 - asset that exists in a liquidity pool on Optimism, completely replacing the - need for centralized price APIs. Supports pricing that requires complex routes - with many hops, supports non-standard ERC20 implementations and non-standard - AMM curves, and allows for fetching the prices of hundreds of tokens in a - single RPC call. - repos: - - name: ethzoomer - url: https://github.com/ethzoomer/optimism-prices - - name: ethzoomer - url: https://github.com/ethzoomer/optimism-prices - ledgers: - - address: '0x82D54397B88CE80Ea2Df9aD049213ACb47dc2523' - name: Wallet -- name: Umbra - description: Umbra is a stealth address protocol for EVM networks. Umbra enables - privacy preserving payments where the receiver's identity is not revealed. - Umbra is simple, low gas solution for getting paid privately, that's been - in development for nearly 3 years. - repos: - - name: ScopeLift - url: https://github.com/ScopeLift - ledgers: - - address: '0x5C04E7808455ee0e22c2773328C151d0DD79dC62' - name: Wallet -- name: Orbiter Finance - description: Orbiter Finance is a decentralised cross-rollup bridge that aims - to offer infrastructure at Layer 2 and permits instant, low-cost transactions - of Ethereum-native assets. We support cross-rollup transfers among Ethereum, - Optimism, StarkNet, zkSync, Loopring, Arbitrum, Arbitrum Nova, Polygon, BNB - Chain, ZKSpace, Immutable X, dYdX, Metis and Boba. - repos: - - name: Orbiter-Finance - url: https://github.com/Orbiter-Finance - ledgers: - - address: '0x10C7EEbf2fF90807CA24347cD9c7d4a42345D583' - name: Wallet -- name: Chainlist - description: Chainlist tracks all public RPCs available for each EVM network, - along with their latency, blockheight and the privacy policy of the provider, - which we summarize into easy-to-compare snippets. This allows users to switch - networks/RPCs safely and to maintain privacy without having to spend hours - sifting through legal docs. - repos: - - name: DefiLlama - url: https://github.com/DefiLlama/chainlist - ledgers: - - address: '0xAEcaeDc21C3ea0D84C596C126E2FD2e51E54D274' - name: Wallet -- name: Solhint - description: Solhint is a Solidity linter. A tool that helps solidity devs to - write standardized smart contracts code, taking care of code quality, order, - readability, style guides, preventing known bugs, and giving security alerts. - Has been a pretty popular tool within the Ethereum community. It is also an - open source tool considered a public good in the ecossystem. - repos: - - name: protofire - url: https://github.com/protofire - ledgers: - - address: '0x5fC34D03cFdf145Db5f3c5B5558e39a4164AAa30' - name: Wallet -- name: EIP-5164 / PoolTogether Inc - description: PoolTogether Inc builds tooling to support the PoolTogether protocol. - PoolTogether is a protocol for no loss prize savings on Optimism. It's one - of the most popular DeFi protocols enabling a simple, secure, and "no loss" - on ramp for people to being using DeFi. - repos: - - name: pooltogether - url: https://github.com/pooltogether - ledgers: - - address: oeth:0xfB0dADb835fAdE151aBf6780BeAfB12FC5B - name: Wallet -- name: Vyper - description: Vyper is a contract-oriented, pythonic programming language that - targets the Ethereum Virtual Machine (EVM) - repos: - - name: vyperlang - url: https://github.com/vyperlang/ - ledgers: - - address: '0xAbfA48BCc0F96Fc70be7a4156b0a74Ea350167fD' - name: Wallet -- name: donnoh - description: 'sup! I''m a MSc CS student at University of Bologna focused on scaling - blockchains. In April 2022 I created the scalability.guide blog about scaling - technologies, with articles such as "Optimism Bedrock vs Arbitrum Nitro: Deposits" - and "Exploring the blobspace". In October 2022 I graduated with a CS bachelor''s - thesis on a comparison and analysis between Optimism Bedrock and StarkNet.' - repos: - - name: lucadonnoh - url: https://github.com/lucadonnoh - ledgers: - - address: '0x33d66941465ac776c38096cb1bc496c673ae7390' - name: Wallet -- name: OPCraft & MUD (Lattice) - description: "Lattice is facilitating complex on-chain projects with MUD (https://mud.dev):\ - \ an application framework for Ethereum & Autonomous Worlds (https://shortest.link/autonomous)\ - \ MUD helps developers be more ambitious on-chain: using the OP Stack and\ - \ MUD, we built OPCraft \u2014 an on-chain Voxel Game (https://shortest.link/opcraft)\ - \ \u2014 and we enabled dozens of team to push the envelope of Dapps. see\ - \ below:" - repos: - - name: latticexyz - url: https://github.com/latticexyz - ledgers: - - address: '0xFb74562ec4e55c4BE2800b79a60e10ab6175Fa3a' - name: Wallet -- name: OpenZeppelin - description: OpenZeppelin provides security products to build, automate, and operate - decentralized applications. We also protect leading organizations by performing - security audits on their systems and products. - repos: - - name: openzeppelin - url: https://github.com/openzeppelin - ledgers: - - address: '0x41f89516DbFDfF2A902AdD2E141C3c22b561BFBc' - name: Wallet -- name: Otterscan - description: Otterscan is a self-hosted, fast, local, private, block explorer. - It has a very small footprint, does not require installing additional DB, - middleware, etc. It works together with your Erigon node. It relies only on - onchain data and offline data sources. All custom information it needs from - Erigon is available as custom APIs, so other dapp can make use of them too. - repos: - - name: wmitsuda - url: https://github.com/wmitsuda/otterscan - ledgers: - - address: '0x43a0744e8a1A63C481aaDD5CEA12833D6976F851' - name: Wallet -- name: Optimism Monorepo Dependencies Collection - description: "This collection consists of 100 open source software projects that\ - \ are essential dependencies of the Optimism tech stack. This software is\ - \ critical to the success of the OP Stack. You can find the full list of projects,\ - \ and the methodology with which they were selected, by clicking on the website\ - \ link at the top of the profile page \u2B06\uFE0F" - repos: - - name: ethereum-optimism - url: https://github.com/ethereum-optimism/optimism - ledgers: - - address: null - name: Wallet -- name: Scry - description: Scrys Open Oracle Frameworks an infrastructure for oracles for developers - to access external data in a fully permissionless and decentralized way. The - infrastructure allows devs to self deploy high scale oracles for any API with - the contracts, nodes and front end all ready to use in <15m. This allows devs - to create oracles using their own reputable signers in their communities. - Uniswap for data. - repos: - - name: ScryProtocol - url: https://github.com/ScryProtocol - ledgers: - - address: '0x9D31e30003f253563Ff108BC60B16Fdf2c93abb5' - name: Wallet -- name: BuidlGuidl - description: A curated group of Ethereum builders creating products, prototypes, - and tutorials to enrich the web3 ecosystem. We mentor developers and orgs - through the SpeedRun and beyond. - repos: - - name: BuidlGuidl - url: https://github.com/BuidlGuidl - ledgers: - - address: '0xa81a6a910FeD20374361B35C451a4a44F86CeD46' - name: Wallet -- name: Node Guardians - description: Node Guardians is an RPG that caters to seasoned Solidity devs. We - provide over 60 hours of Solidity in the form of CTF & programming problems - for free. We've built a custom pipeline to evaluate the users code and verify - whether it meets certain criteria. Hackers can unlock soul-bound (off-chain) - collectibles that represent their progress in the game. - repos: - - name: Nodeguardians - url: https://github.com/Nodeguardians - ledgers: - - address: '0x6ef87E0Aaadb2c3d07fD98a098Af5FaD0aD45811' - name: Wallet -- name: Revolte - description: Join the Web3 revolution with Revolte! Our adventure game introduces - users to the world of blockchain, wallets, tokens, and more, with mandatory - tasks like wallet installation to guide players through the story. Explore - real Web3 applications on Optimism and experience the potential of this transformative - technology. - repos: - - name: pgrandne - url: https://github.com/pgrandne/ - ledgers: - - address: '0x1a2b8bd408413179524e3e61FfA1378b7b7688D5' - name: Wallet -- name: eth.limo - description: eth.limo is a privacy-preserving ENS gateway, enabling users to access - Ethereum-native dApps and content. LIMO represents a shift in dweb adoption - by providing an alternative means of accessing ENS resolvable content. LIMO - takes public gateway services a step further by enforcing strong privacy guarantees - such as never logging IP addresses or engaging in TCP fingerprinting. - repos: - - name: ethlimo - url: https://github.com/ethlimo - ledgers: - - address: '0xB352bB4E2A4f27683435f153A259f1B207218b1b' - name: Wallet -- name: Cannon - description: Cannon is an 'Infrastructure as Code' tool (like Terraform) for Foundry - and Hardhat. Users generate Cannonfiles instead of deploy scripts for a declarative - approach to managing protocols, including upgrades and configuration. Deployment - information can be shared on the registry (hosted on Ethereum and IPFS) to - be used in other Cannonfiles and run for local testing and development. - repos: - - name: usecannon - url: https://github.com/usecannon/cannon - ledgers: - - address: '0x07Aeeb7E544A070a2553e142828fb30c214a1F86' - name: Wallet -- name: Lighthouse - description: Lighthouse is an Ethereum consensus client that connects to other - Ethereum consensus clients to form a resilient and decentralized proof-of-stake - blockchain. It is one if the most used Ethereum consensus clients, focused - on performance and security. It is free and open source with the most permissive - license we could find (Apache 2.0). - repos: - - name: sigp - url: https://github.com/sigp - ledgers: - - address: '0x0ad5d3975258776cF81b9dcbe6fF4ed0Ae82b29e' - name: Wallet -- name: Layer2DAO - description: Layer2DAO is expanding the Ethereum L2 ecosystem and boosting L2 - ecosystem projects. The DAO is using its treasury to invest and partner with - high-impact L2 protocols and ecosystem plays, serving as a diversified treasury - for DAO members looking to gain exposure to the L2 ecosystem growth. - repos: - - name: layer2dao - url: https://github.com/layer2dao - ledgers: - - address: '0xaF5a0068f5465260A1a88A6264D0dcE4469609CF' - name: Wallet -- name: Smock - description: Smock is the Solidity mocking library. It is installed as a Hardhat - plugin which can be used to create mock Solidity contracts entirely in JavaScript - (or TypeScript!). With Smock, writing tests for smart contracts becomes incredibly - easy, improving the ecosystem's security. First built by Optimism in March - 2021 and later, in July 2021, Wonderland took the mission to rewrite it in - a scalable way - repos: - - name: defi-wonderland - url: https://github.com/defi-wonderland/smock - ledgers: - - address: '0x4f2188dfD474E502Ea67D09bE3E58b761B6AEEB7' - name: Wallet -- name: Dapp-Learning - description: We are designed for developers to step into blockchain DAPP development, - where they can learn **DeFi, NFT, DAO, CRYPTO** projects. We hope we could - not only give junior developers a feasible and easy-to-use blockchain **DAPP** - learning roadmap, but also present advanced developers with a platform for - communication and cooperation. - repos: - - name: Dapp-Learning-DAO - url: https://github.com/Dapp-Learning-DAO - ledgers: - - address: '0x1F7b953113f4dFcBF56a1688529CC812865840e1' - name: Wallet -- name: 0xPARC - description: 'The 0xPARC Foundation promotes application-level innovation on Ethereum. - Our primary areas of focus are: - Cryptography: ZK, MPC, and more. - Autonomous - Worlds: funding projects like Lattice, Dark Forest, DFDAO, etc - Education: - we organize learning residencies, hackathons, and conferences on ZK and AW. - 0xPARC funds infrastructure work, research, and groups that would otherwise - be underfunded.' - repos: - - name: 0xparc - url: https://github.com/0xparc - ledgers: - - address: '0x5401745963974c22F8f8254a2A904Ea5f54ddc22' - name: Wallet -- name: WTF Academy - description: 'WTF Academy is a web3 open-source university for developers, aiming - to onboard 10,000 developers to web3. We provide free and open-source tutorials, - tests, and certificates for developers. 1. WTF Solidity (6,000 stars): https://github.com/AmazingAng/WTF-Solidity - 2. WTF Ethers (1,200 stars): https://github.com/WTFAcademy/WTF-Ethers 3. Education - platform: https://wtf.academy' - repos: - - name: AmazingAng - url: https://github.com/AmazingAng - ledgers: - - address: '0x25df6DA2f4e5C178DdFF45038378C0b08E0Bce54' - name: Wallet -- name: Multicall3 - description: Multicall3 aggregates results from multiple contract calls. This - reduces the number of JSON RPC requests that need to be sent, which is especially - useful if using remote nodes like Infura. This can significantly improve performance - and reduce RPC usage. It also guarantees that all returned data is from the - same block (i.e. an atomic read) to ensure consistency and accuracy of fetched - data. - repos: - - name: mds1 - url: https://github.com/mds1 - - name: mds1 - url: https://github.com/mds1/multicall - ledgers: - - address: '0x60A5dcB2fC804874883b797f37CbF1b0582ac2dD' - name: Wallet -- name: Clique - description: Clique builds a new type of primitives, identity oracles, that bring - web2 user behavior and identity data on-chain. Establishing more robust reputation - and identity systems on-chain, and bridging the gap between value-creating - activities in web2 and incentive distribution in web3. We use advanced cryptographic - tools like ZKP, TEE, and MPC to design modular privacy-preserving pipelines. - repos: - - name: CliqueOfficial - url: https://github.com/CliqueOfficial - ledgers: - - address: '0x003eB864477C8858BEC0916E23785AcA46f6ba34' - name: Wallet -- name: JiffyScan - description: 'JiffyScan is the first (and only) block explorer built for EIP-4337 - confirming transactions. It shows the transactions as per the new entities - introduced: userOp, Bundle, Bundler, Entrypoint, etc. This is needed for the - wallets which will onboard users leveraging this new Smart Contract Wallet - standard. PS: Candide Wallet is launching on Optimism and we will support - its adoption.' - repos: - - name: jiffy-labs - url: https://github.com/jiffy-labs - ledgers: - - address: '0xdd347ad6aA6D26ae6840ed3574E6Ce4b0E002066' - name: Wallet -- name: Sourcify - description: "Sourcify is a decentralized and open-sourced contract verification\ - \ service. It leverages and fosters the adoption of Solidity\u2019s contract\ - \ metadata and 'full verification' of contracts. The contract repository is\ - \ publicly served on IPFS. Through the metadata and the NatSpec docs of the\ - \ contract, Sourcify aims to enable human-readable transactions for Ethereum\ - \ users instead of bytes and hex strings" - repos: - - name: ethereum - url: https://github.com/ethereum/sourcify - ledgers: - - address: '0x1d113337e485e232d39d2d883031705ade37b576' - name: Wallet -- name: NiceNode - description: NiceNode aims to provide an easy set up to run an Ethereum node in - no-time on every modern computer without any technical knowledge. By running - a node you become part of a global movement to decentralize a world of information. - NiceNode is being designed to easily support new node types such as layer - 2 and web3 nodes. It is FOSS and available on Mac, Windows, and Linux. - repos: - - name: NiceNode - url: https://github.com/NiceNode - ledgers: - - address: '0x9cce47E9cF12C6147c9844adBB81fE85880c4df4' - name: Wallet -- name: Ospace Project - description: The Ospace project started its activity in May 2022 as an NFT project - on the Optimism chain. Our first collection was Oliens which was launched - as a free mint on Quix launched on 9th of july 2022 & it quickly got sold - out. Oliens has added new unique users to Optimism chain because of its Art - and free mint launch and it continued to reach +3.2K trades & more than 47 - ETH volume. - repos: - - name: Ospaceproject - url: https://github.com/Ospaceproject - ledgers: - - address: '0x941D8Cd7378432Bc4952bA0Dcc9e120C18C92975' - name: Wallet -- name: Giveth - description: Giveth is a donation platform built on Ethereum, rewarding and empowering - those who give to projects, to society, and to the world. We are building - a business model that provides value in the nonprofit sector and public goods. - We were founded in 2016 and have a core team consisting of ~20 with 50+ regular - Giveth contributors, including many well-known names in the space. - repos: - - name: Giveth - url: https://github.com/Giveth - ledgers: - - address: '0x4D9339dd97db55e3B9bCBE65dE39fF9c04d1C2cd' - name: Wallet -- name: Gov - description: "Gov is a DAO framework built with Open Zeppelin\u2019s Governor\ - \ contract in combination with NFTs. It provides a retroactive funding tool\ - \ that fits the needs of everyday people. We recently deployed the first pilot\ - \ to OP Mainnet (the Web3 Hackers Collective) and we\u2019re getting ready\ - \ to launch more pilots in the coming weeks. We just released the beta version\ - \ and the Next.js UI is currently under dev." - repos: - - name: w3hc - url: https://github.com/w3hc - - name: w3hc - url: https://github.com/w3hc/gov - ledgers: - - address: '0xa30189949cD8F662582b10eB6E353374419EDf67' - name: Wallet -- name: Foundry - description: 'See: https://gov.optimism.io/t/tooling-utilities-nominations-for-rpgf2/4639/15?u=jonas' - repos: - - name: gakonst - url: https://github.com/gakonst - ledgers: - - address: '0x4BAa1fcAe9Ba8F9e1247b5CFD71e2463e85b2284' - name: Wallet -- name: GiveStation - description: What is GiveStation ? A multi-chain Give-To-Earn grant platform where - contributors get rewarded for funding public goods, ideas and projects in - web3. - repos: - - name: givestation - url: https://github.com/givestation - ledgers: - - address: '0x4243CFB8D5cEfA0087E3cf8E9aeA86e6ec38E0D9' - name: Wallet -- name: CryptoStats - description: CryptoStats is a project focused on making trustworthy blockchain - data open and accessible to all. In addition to maintaining an extensive library - of data metrics, CryptoStats operates a number of popular info-sites, such - as CryptoFees.info, L2Fees.info, and more. - repos: - - name: crypto-stats - url: https://github.com/crypto-stats - ledgers: - - address: '0x69aa21403244889832609963B0028e337a834953' - name: Wallet -- name: RareSkills - description: RareSkills focuses on providing intermediate to advanced blockchain - developer training. Although we provide a web2 to web3 bootcamp, our primary - focus is curating advanced material for Solidity engineers. Examples of topics - we teach include advanced testing techniques such as fuzzing and mutation - testing, elliptic curve math, zero knowledge proofs, DeFi mathematics, and - assembly programming. - repos: - - name: rareSkills - url: https://github.com/rareSkills - ledgers: - - address: '0x4879DF2Ba195a69C178133F44E278c0f64797Ca5' - name: Wallet -- name: Pairwise - description: Say goodbye to endless forum scrolling and hello to easy, efficient - and fun community signaling with Pairwise! Our open-source, snapshot-style - voting dapp, based on the big brain algorithm research out of Colony in 2018, - offers a fast-paced and intuitive experience, perfect for the next generation - of DAOs. Join us in revolutionizing governance with the power of algorithms. - repos: - - name: GeneralMagicio - url: https://github.com/GeneralMagicio/budget-boxes - ledgers: - - address: '0xc8d65e1bd67f16522e3117b980e1c9d2caeb9dc3' - name: Wallet -- name: Crate-Crypto - description: Cryptography is hard. Crate-Crypto was originally built because I - wanted to build proof of concepts of cutting edge cryptogrpahy protocols, - so that companies/researchers could use it to validate their ideas quicker. - This is how Noir a zk programming language was born. The main usecase right - now is for implementations for projects like 4844 and verkle tries. - repos: - - name: kevaundray - url: https://github.com/kevaundray - ledgers: - - address: '0x90B005a9C7B19E1E962178deA63c1becc409B90f' - name: Wallet -- name: Questbook - description: Questbook is a decentralized grant management platform. The platform - is open-sourced, on-chain, and deployed on Optimism. Using the tool, - Grant - managers have facilitated grants worth $2.1M. - 1500+ Builders have applied - for various grants, reported milestones and funding, and received feedback. - - The entire lifecycle for every grant proposal is transparent for the community - to view. - repos: - - name: questbook - url: https://github.com/questbook - ledgers: - - address: '0x89Ce0f71D7387a580c6C07032f74f393a65d77F4' - name: Wallet -- name: jordanmmck - description: I make deep-dive video explainers on complex topics within the Ethereum - space. With every video I try to completely understand the topic I am studying, - then condense that understanding down to diagrams and images that convey the - concept in a simple way. I strive to produce videos with high production value, - detailed and accurate diagrams, and a compelling delivery. - repos: - - name: jordanmmck - url: https://github.com/jordanmmck - ledgers: - - address: '0x29FF795B015652EdFB9883bB83B3E9bE3c207e62' - name: Wallet -- name: Web3j - description: Web3j is the JVM integration library for EVM blockchains. It provides - similar functionality to web3.js + Truffle in that supports the development, - testing and deployment of Solidity contracts for the Java and Android platforms. - The following deck provides a lot of background about the library https://4968969.fs1.hubspotusercontent-na1.net/hubfs/4968969/Web3j%20overview%20June%202022.pdf. - repos: - - name: web3j - url: https://github.com/web3j - ledgers: - - address: '0xe8a17e2f1bd4bFcBfBecb8a90be08780949a0cac' - name: Wallet -- name: Guild - description: Guild is an infrastructure for platformless memberships and community - building. Built around the Guild Model (requirements, roles, rewards), anyone - can create modular memberships based on composable on-chain and off-chain - data. These can be used to gate off-chain rewards (access to Discord, Telegram, - Google folders & files, Github), on-chain rewards (POAP), or custom applications - (via our SDK). - repos: - - name: agoraxyz - url: https://github.com/agoraxyz/guild.xyz - ledgers: - - address: '0xa934b56be3eC0bDdfA8BFD1cb141E66d1bBd0F69' - name: Wallet -- name: Protocol Guild - description: 'The Protocol Guild helps Ethereum''s ecosystem + community fund - core protocol development: a foundational Public Good for all. The Guild curates - a weighted membership registry of ~128 active contributors, which anyone can - donate to via a single Ethereum address. Donations are vested to members over - time, creating long-term stewarding incentives. Learn more: https://bit.ly/PG-docs' - repos: - - name: protocolguild - url: https://github.com/protocolguild - ledgers: - - address: '0x42a43f000adc215af8B1896Ed09C2d1B0f81cDfB' - name: Wallet -- name: Ante - description: Ante is a protocol framework that allows anybody to create on-chain - guarantees for any smart contract system. Ante tests can be written to test - any on-chain condition with payouts handled without any third parties. With - enough coverage and tests on a given project, a decentralized and visual trust - can then be gathered on that respective project. - repos: - - name: antefinance - url: https://github.com/antefinance - ledgers: - - address: '0xa5b4f91FDE4E35Be891eA97C47D1052D8a4D75f7' - name: Wallet -- name: Esteroids - description: Esteroids (esteroids.eth) is a search engine for .eth websites. Esteroids - indexes ENS+IPFS websites (called .eth websites), makes them searchable, and - highlights the main ones. While the .eth web previously offered a variety - of .eth websites, it lacked the tools to collect, explore and showcase them. - We launched Esteroids in April 2021 in order to give .eth websites a dedicated - search engine. - repos: - - name: esteroids - url: https://github.com/esteroids/ - ledgers: - - address: '0xD8228a0bE7322834101B1a5DA62CfBa28BD810C8' - name: Wallet -- name: LlamaFolio - description: Open source, permissionless, privacy conscious. A portfolio tracker, - the llama way! - repos: - - name: llamafolio - url: https://github.com/llamafolio - ledgers: - - address: '0x2cd0ac587Fc0E6FBcF8A47A449971649E7dab835' - name: Wallet -- name: Praise - description: "Praise is a community intelligence system that promotes active participation\ - \ and collaboration through peer recognition and rewards. We help communities\ - \ become more intelligent, productive and inclusive by providing a simple\ - \ way for community members to acknowledge, praise and reward each other\u2019\ - s contributions." - repos: - - name: givepraise - url: https://github.com/givepraise/praise - ledgers: - - address: '0x0B7246eF74Ca7b37Fdc3D15be4f0b49876622F95' - name: Wallet -- name: Forta - description: Forta is a real-time detection network for security monitoring of - blockchain activity. Forta comprises a decentralized network of independent - node operators that scan all transactions and block-by-block state changes - for outlier transactions and threats. Developers can build detection bots - (piece of script that monitors the activity) and machine learning models, - and run them on the network. - repos: - - name: forta-network - url: https://github.com/forta-network - ledgers: - - address: '0x516D34d147DDa218cbEC1EADA374ca2ceC1a6e93' - name: Wallet -- name: Agora - description: Agora builds governance public infrastructure that provides transparency, - accessibility, and fine-grained control for delegates and builders. We started - helping Optimism transition to on-chain voting by deploying its governance - contract, and building its voting portal. Next we will refine the contract, - keep improving the portal and create new governance modules that any OP project - can use. - repos: - - name: voteagora - url: https://github.com/voteagora/agora - ledgers: - - address: oeth:0x3a153B0608a87a4BdD4F7Afa90670110d4C - name: Wallet -- name: Teku - description: Teku is an Ethereum consensus client, fully open source and Apache - 2 licensed. Teku has been in production on the beacon chain since genesis - and contributes significantly to client-diversity on the consensus layer, - which is vital for the security and safety of layer 2 solutions built on Ethereum. - repos: - - name: ConsenSys - url: https://github.com/ConsenSys/teku - ledgers: - - address: '0xFF7B65dDc2Ffb7f6AC527b4C2F048946B3A5eaF3' - name: Wallet -- name: Safe (previously Gnosis Safe) - description: Safe is a programmable wallet that enables users to control their - digital assets with granular permissions. Safe stores >40 billion USD worth - of digital assets today. Its flagship solution is a multi-sig based smart - contract wallet that requires a predefined number of signatures to confirm - transactions to prevent unauthorized access to the assets stored. - repos: - - name: safe-global - url: https://github.com/safe-global - ledgers: - - address: oeth:0x3EDf6868d7c42863E44072DaEcC16eCA280 - name: Wallet -- name: Chaineye - description: ChainEye aims to build world-leading free and open-source analytical - tools. Currently, it has the following core functions 1. Optimism on-chain - Map 2. Bridge comparison 3. Stablecoin dashboard 4. RPC list 5. Gas monitor - 6. Web3 security (coming) Launched in Q4 2021, Chaineye has over 100k user - visits. It is incubated by the leading Web3 research community Biteye with - 200K+ members in Asia. - repos: - - name: DeFiEye - url: https://github.com/DeFiEye - ledgers: - - address: '0xE6D7b9Fb31B93E542f57c7B6bfa0a5a48EfC9D0f' - name: Wallet -- name: RainbowKit Login for WordPress - description: RainbowKit Login for WordPress is a full-featured, open source, and - easy to use integration layer that empowers builders to leverage the composability - of Ethereum and L2s on a WordPress site. The project prioritizes extensible, - test-driven, and secure code. https://wordpress.org/plugins/rainbowkit-login-web3-integration-for-sign-in-with-ethereum/ - https://github.com/davisshaver/wp-rainbow - repos: - - name: davisshaver - url: https://github.com/davisshaver - ledgers: - - address: '0x0F9Bd2a9E0D30f121c525DB5419A07b08Fce8440' - name: Wallet -- name: Across Protocol - description: Across is a cross-chain bridge for L2s and rollups secured by UMA's - optimistic oracle. It is optimized for capital efficiency with a single liquidity - pool, a competitive relayer landscape, and a no-slippage fee model. - repos: - - name: across-protocol - url: https://github.com/across-protocol - ledgers: - - address: oeth:0xfd0CF79C568c08b78484F2D165eB8c7f569 - name: Wallet -- name: IC3 - description: IC3 is an initiative of researchers at Carnegie Mellon University, - Cornell University, Cornell Tech, EPFL, ETH Zurich, UC Berkeley, University - College London, UIUC and the Technion. IC3 leads multidisciplinary research - and members publish peer reviewed research in many areas of blockchain systems - relevant to the functioning and future of the OP Stack. - repos: - - name: initc3 - url: https://github.com/initc3 - ledgers: - - address: Placeholderher - name: Wallet -- name: Synpress - description: "Synpress is e2e testing framework based on Cypress.io and playwright\ - \ with support for metamask. It's a pioneer tool in web3 e2e testing with\ - \ potential to evolve into a decentralized network of test runners (and CI\ - \ provider) in future. It\u2019s currently used by multiple different projects\ - \ on Optimism network (~140 repos on Github): https://github.com/Synthetixio/synpress/network/dependents" - repos: - - name: drptbl - url: https://github.com/drptbl - - name: Synthetixio - url: https://github.com/Synthetixio/synpress - ledgers: - - address: '0x7b57c388e6149b5c197B925037602d5B6bafFbCc' - name: Wallet -- name: Revoke.cash - description: Revoke.cash is a suite of web3 security tools. It offers a dashboard - to manage token and NFT allowances on Optimism and 30+ other chains. It also - provides a browser extension that warns users when they are about to perform - potentially harmful actions, such as approvals or NFT listings. - repos: - - name: RevokeCash - url: https://github.com/RevokeCash - ledgers: - - address: '0xe126b3E5d052f1F575828f61fEBA4f4f2603652a' - name: Wallet -- name: wagmi - description: "wagmi is a collection of React Hooks containing everything you need\ - \ to start working with Ethereum. It\u2019s used at organizations like ENS,\ - \ Sushi, LooksRare, WalletConnect, Stripe Crypto, and Gitcoin. wagmi makes\ - \ it easy to \"Connect Wallet,\" display ENS and balance information, sign\ - \ messages, interact with contracts, and much more \u2014 all with caching,\ - \ request deduplication, and persistence." - repos: - - name: wagmi-dev - url: https://github.com/wagmi-dev - ledgers: - - address: '0xd2135CfB216b74109775236E36d4b433F1DF507B' - name: Wallet -- name: 0xSplits - description: 0xSplits is a suite of smart contracts & tools that allows devs and - end users to securely and efficiently share onchain revenue. Our current offerings - include splits (immutable, mutable, & liquid), waterfalls (preference stacks), - and vests (multi-stream, single beneficiary) as well as the accompanying subgraphs, - sdk, & UI. - repos: - - name: 0xSplits - url: https://github.com/0xSplits - ledgers: - - address: '0x9ebC8E61f87A301fF25a606d7C06150f856F24E2' - name: Wallet -- name: Flipside Crypto - description: "Flipside Crypto has worked alongside the OP Labs team to make Optimism\ - \ data more accessible and help bootstrap Optimism\u2019s ecosystem-wide attestation\ - \ / identity efforts. The data tables, SDK, API, and other core services are\ - \ offered as free public goods - enabling the creation of a wide range of\ - \ products and tools for Optimism. Flipside is also an active and devoted\ - \ OP delegate." - repos: - - name: FlipsideCrypto - url: https://github.com/FlipsideCrypto - ledgers: - - address: '0x1ef753934C40a72a60EaB12A68B6f8854439AA78' - name: Wallet -- name: hardhat-deploy - description: A Hardhat Plugin For Replicable Deployments And Easy Testing This - hardhat plugin adds a mechanism to deploy contracts to any network, keeping - track of them and replicating the same environment for testing. It also adds - a mechanism to associate names to addresses, so test and deployment scripts - can be reconfigured by simply changing the address a name points to plus many - more features... - repos: - - name: wighawag - url: https://github.com/wighawag - - name: wighawag - url: https://github.com/wighawag/hardhat-deploy - ledgers: - - address: '0xF0D7a8198D75e10517f035CF11b928e9E2aB20f4' - name: Wallet diff --git a/utils/optimism/data/yaml_convert.py b/utils/optimism/data/yaml_convert.py deleted file mode 100644 index 2c9d3b5..0000000 --- a/utils/optimism/data/yaml_convert.py +++ /dev/null @@ -1,33 +0,0 @@ -import json -import yaml -from urllib.parse import urlparse - -# read the JSON data from file -with open('optimism_project_data.json') as f: - data = json.load(f) - -# convert the JSON data to the desired YAML format -yaml_data = [] -for item in data: - yaml_item = { - 'name': item['project'], - 'description': item['description'], - 'repos': [], - 'ledgers': [ - {'address': item['address'], 'name': 'Wallet'}, - ], - } - for url in item['socials']: - parsed_url = urlparse(url) - if parsed_url.netloc == 'github.com': - owner = parsed_url.path.split('/')[1] - yaml_item['repos'].append({'name': owner, 'url': url}) - if not yaml_item['repos']: - print(f"No GitHub URL found for project {yaml_item['name']}. Skipping...") - continue - yaml_data.append(yaml_item) - -# write the YAML data to file -with open('optimism_project_data.yaml', 'w') as f: - yaml.dump({'projects': yaml_data}, f, sort_keys=False, indent=4) - diff --git a/utils/optimism/docker-start.sh b/utils/optimism/docker-start.sh deleted file mode 100644 index 30a436f..0000000 --- a/utils/optimism/docker-start.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -echo "===== BUILDING ====" && \ - docker build -t local/hypercerts-utils . && \ - echo "===== RUNNING =====" && \ - docker run --rm -it \ - --name hypercerts-utils \ - --env-file .env \ - -v "$PWD":/code \ - -w /code/ \ - local/hypercerts-utils diff --git a/utils/optimism/github_events.py b/utils/optimism/github_events.py deleted file mode 100644 index 50fa923..0000000 --- a/utils/optimism/github_events.py +++ /dev/null @@ -1,71 +0,0 @@ -import argparse -from dotenv import load_dotenv -import json -import os -import requests - - -load_dotenv() -GITHUB_KEY = os.environ['GITHUB_KEY'] -OUTPATH_DIR = "data/github/" -JSONDATA_PATH = "data/optimism_project_data.json" -PROJECTS = json.load(open(JSONDATA_PATH)) -START_DATE = "2022-07-01" -END_DATE = "2023-03-01" - - -def fetch_github_events(repo_name, start_date, end_date): - # Set up the GitHub API endpoint URL - endpoint_url = f"https://api.github.com/repos/{repo_name}/events" - - # Set up the query parameters - query_params = { - 'per_page': 100, # Maximum number of results per page - 'page': 1, # Start with the first page of results - 'since': start_date, # Only fetch events that occurred on or after this date - 'until': end_date # Only fetch events that occurred on or before this date - } - - # Set up the authentication headers using your GitHub API key - headers = {'Authorization': f'token {GITHUB_KEY}'} - - # Make a GET request to the GitHub API endpoint with the query parameters and authentication headers - response = requests.get(endpoint_url, params=query_params, headers=headers) - - # Create a list to store the fetched events - events = [] - - # Loop through all the pages of results until there are no more pages left - while response.ok: - # Extract the JSON response data - response_data = json.loads(response.text) - - # Add the events from the current page to the list - events.extend(response_data) - - # If there are more pages, fetch the next page of results - if 'next' in response.links: - response = requests.get(response.links['next']['url'], headers=headers) - else: - break - - # Write the fetched events to a JSON file - filename = f"{OUTPATH_DIR}{repo_name.replace('/', '_')}_events_{start_date}_{end_date}.json" - with open(filename, "w") as json_file: - json.dump(events, json_file, indent=4) - - print(f"Events fetched and written to file {filename}") - return filename - - -if __name__ == "__main__": - for project in PROJECTS: - data = [] - for social_link in project.get("socials"): - if "github" in social_link: - filename = fetch_github_events(social_link, START_DATE, END_DATE) - data.append(filename) - project.update({"github_data": data}) - - with open(JSONDATA_PATH, "w") as json_file: - json.dump(PROJECTS, json_file, indent=4) diff --git a/utils/optimism/links.txt b/utils/optimism/links.txt deleted file mode 100644 index 38fdfd1..0000000 --- a/utils/optimism/links.txt +++ /dev/null @@ -1,195 +0,0 @@ -https://app.optimism.io/retropgf-discovery/0x761d584f1C2d43cBc3F42ECd739701a36dFFAa31 -https://app.optimism.io/retropgf-discovery/0x07bF3CDA34aA78d92949bbDce31520714AB5b228 -https://app.optimism.io/retropgf-discovery/0x5401745963974c22F8f8254a2A904Ea5f54ddc22 -https://app.optimism.io/retropgf-discovery/0x9ebC8E61f87A301fF25a606d7C06150f856F24E2 -https://app.optimism.io/retropgf-discovery/0x33DB27C21E0f7a2f3351A4C6DDceDFB9F713410b -https://app.optimism.io/retropgf-discovery/0xFdFC6E1BbEc01288447222fC8F1AEE55a7C72b7B -https://app.optimism.io/retropgf-discovery/0x9d6d3b09F8AC8615805bd82e53B80D956F451CFa -https://app.optimism.io/retropgf-discovery/0x5eEeB9F8a2050533BBEd20F87d445Dcf309a5eA7 -https://app.optimism.io/retropgf-discovery/0xa5b4f91FDE4E35Be891eA97C47D1052D8a4D75f7 -https://app.optimism.io/retropgf-discovery/0x2117085E7e4eE35825A9C71bbE46AAd8c01789f3 -https://app.optimism.io/retropgf-discovery/0x036C545Ae4f68059b4C83f7E3814429d4c73c089 -https://app.optimism.io/retropgf-discovery/0x5EfF4B8c042AA6003cBDA6E32C4aA23657d3b6AF -https://app.optimism.io/retropgf-discovery/0xB30dD1198Feed1e22EC969f61EEd04cB75937adf -https://app.optimism.io/retropgf-discovery/0x958c20A43F5206F186B0195cCB61Acb724b2EE1E -https://app.optimism.io/retropgf-discovery/0xff95a2f9bf8fe8019d1f705B5b1e3cb8a8F223C0 -https://app.optimism.io/retropgf-discovery/0xd9ED89A0f4cfbC1be4b7b1aA744b5bd25ACA9979 -https://app.optimism.io/retropgf-discovery/0x8B93910594e2a09c30D7e97883f6d35d8772801d -https://app.optimism.io/retropgf-discovery/0xd7BDE01888B8A2a97924444009E31C8d8c2391F3 -https://app.optimism.io/retropgf-discovery/0x245cE6de47A5D44E5B73f923F1aDA4cc1688D22b -https://app.optimism.io/retropgf-discovery/0x36F322fC85B24aB13263CFE9217B28f8E2b38381 -https://app.optimism.io/retropgf-discovery/0x0a6CD04Ca9Ce730c709276C6868D9F2C4D9Ef1D6 -https://app.optimism.io/retropgf-discovery/0xc1a69F906Ce4366C0C77e0219b3132FeA0969231 -https://app.optimism.io/retropgf-discovery/0x6fF5723435b7dfC2371B57Fb5cB4c373E5995C78 -https://app.optimism.io/retropgf-discovery/0x34aA3F359A9D614239015126635CE7732c18fDF3 -https://app.optimism.io/retropgf-discovery/0xE0D76bDF0Dcf83685dc41570Dd4536649119D304 -https://app.optimism.io/retropgf-discovery/0xC2842A7653b9c2272F424a18DFf468C32d1f874D -https://app.optimism.io/retropgf-discovery/0x07Aeeb7E544A070a2553e142828fb30c214a1F86 -https://app.optimism.io/retropgf-discovery/0x112E372bb5EC17c1ea6b1d679EA72aFBD2A94404 -https://app.optimism.io/retropgf-discovery/0x40bbF4468495197b919591Dae8cb5d3fE2F52e7E -https://app.optimism.io/retropgf-discovery/0x4856e043a1F2CAA8aCEfd076328b4981Aca91000 -https://app.optimism.io/retropgf-discovery/0x0B27BFb649919bE208F62244E4a09A41b0f962D0 -https://app.optimism.io/retropgf-discovery/0xC5A756D63C5fe67b438acBE468aA62a52093fDEf -https://app.optimism.io/retropgf-discovery/0x6f9BB7e454f5B3eb2310343f0E99269dC2BB8A1d -https://app.optimism.io/retropgf-discovery/0x90B005a9C7B19E1E962178deA63c1becc409B90f -https://app.optimism.io/retropgf-discovery/0xEc087478B0bC2F1a18Ff01717e381f44B791114A -https://app.optimism.io/retropgf-discovery/0x69aa21403244889832609963B0028e337a834953 -https://app.optimism.io/retropgf-discovery/0x281BA4E9B7e28982d6CB53EE3836865f1453e12F -https://app.optimism.io/retropgf-discovery/0xbb105E3c6D6406A3F0aAB98cD8D0E3a127bD6436 -https://app.optimism.io/retropgf-discovery/0x1F7b953113f4dFcBF56a1688529CC812865840e1 -https://app.optimism.io/retropgf-discovery/0x4e3D9399C28c724293dd545225Ec843Ac4c9e953 -https://app.optimism.io/retropgf-discovery/0x3754a10c1cA723961068B2653109E6201982Dd9c -https://app.optimism.io/retropgf-discovery/0xA47669cBc53985333423e4d3D00188f4049fB695 -https://app.optimism.io/retropgf-discovery/0x5265Bde27F57E738bE6c1F6AB3544e82cdc92a8f -https://app.optimism.io/retropgf-discovery/0x25a2dF1d1310da75e8BC115cc797673E777B7e27 -https://app.optimism.io/retropgf-discovery/0x1d921dff757610FbDB0073479e12c0a07d382677 -https://app.optimism.io/retropgf-discovery/0x33D66941465ac776C38096cb1bc496C673aE7390 -https://app.optimism.io/retropgf-discovery/0xAA857AC645733FbF3105b0406417d35BA1576ff8 -https://app.optimism.io/retropgf-discovery/0x0a09cd09B0107Bb98a83f211704F036ECa94B92e -https://app.optimism.io/retropgf-discovery/eip-4844 -https://app.optimism.io/retropgf-discovery/0x04cc6b487566B1C821bEa04d7ac0d23CEDe05cC9 -https://app.optimism.io/retropgf-discovery/0x5874D5D530D1f969FD962579c445A0f3A8682D48 -https://app.optimism.io/retropgf-discovery/0x9D20893054afC4A74b856089c44F9A09d1C38Db0 -https://app.optimism.io/retropgf-discovery/0xcE36608441F24E2d5642932F2A511D98BBBC06A9 -https://app.optimism.io/retropgf-discovery/0xc967dEdcF086b7FE1eAB492F2EB2b74F1E5947b8 -https://app.optimism.io/retropgf-discovery/0xB352bB4E2A4f27683435f153A259f1B207218b1b -https://app.optimism.io/retropgf-discovery/0xdc0090f8aDD5DB06De0897A54e753af143668668 -https://app.optimism.io/retropgf-discovery/0xC0aC93ABb5539769Edac951D9EbD5BCbFB854b0f -https://app.optimism.io/retropgf-discovery/0x9FD0C742D81B6f08817F3eF11D09Cb4a9f54eE5f -https://app.optimism.io/retropgf-discovery/0x3B3980936707A8299AFb5424Fa807c1CBac37cCb -https://app.optimism.io/retropgf-discovery/0x8ba1f109551bD432803012645Ac136ddd64DBA72 -https://app.optimism.io/retropgf-discovery/0xe993486B257Cd1481aef74b3B909A2627Fc8d305 -https://app.optimism.io/retropgf-discovery/0xb6F5414bAb8d5ad8F33E37591C02f7284E974FcB -https://app.optimism.io/retropgf-discovery/0x57B02589d6e24203FC43e442ce9A4803E290293b -https://app.optimism.io/retropgf-discovery/0x8f5906963Ae276E1631EFA8Ff1a9CaE6499EC5E3 -https://app.optimism.io/retropgf-discovery/0x62a43123FE71f9764f26554b3F5017627996816a -https://app.optimism.io/retropgf-discovery/0xD5Abb5086E5d18b6BdB8F0943b7786f2a0Af7Df2 -https://app.optimism.io/retropgf-discovery/0x4BAa1fcAe9Ba8F9e1247b5CFD71e2463e85b2284 -https://app.optimism.io/retropgf-discovery/0xC4FC57Dedd2463314A3fD2DBadB86B4404C257e5 -https://app.optimism.io/retropgf-discovery/0x7c929EfA9a8A2A1524BA90aBc2B70801413fFD4c -https://app.optimism.io/retropgf-discovery/0xC1FDB60CFB2FbbD6EDc9b445D9B508Da2dBF2c9b -https://app.optimism.io/retropgf-discovery/0x587e9cbc67Af10a9d95F3e38836943667b331392 -https://app.optimism.io/retropgf-discovery/0x60AdC0F89a41AF237ce73554EDe170D733ec14E0 -https://app.optimism.io/retropgf-discovery/0x48A63097E1Ac123b1f5A8bbfFafA4afa8192FaB0 -https://app.optimism.io/retropgf-discovery/0x96Cd3AC1e5c2E4FB021B97dA3a6D57e8e665EDc3 -https://app.optimism.io/retropgf-discovery/0xDCfe20E6C1d14c26930a28B1f92fB981CDa26884 -https://app.optimism.io/retropgf-discovery/goerli -https://app.optimism.io/retropgf-discovery/0xa30189949cD8F662582b10eB6E353374419EDf67 -https://app.optimism.io/retropgf-discovery/0xab12931a2c0C519a62794C24105E2f66eE35CFE7 -https://app.optimism.io/retropgf-discovery/0x1F9E7984eDdb135ab6D6f354E229970bB332dCC4 -https://app.optimism.io/retropgf-discovery/0xF78cD306b23031dE9E739A5BcDE61764e82AD5eF -https://app.optimism.io/retropgf-discovery/0x09a5943a6d10919571eE2C9F63380aEA747ECA97 -https://app.optimism.io/retropgf-discovery/0x816a684f40b8B4B060A4Df7A10caD589Ef64E95e -https://app.optimism.io/retropgf-discovery/0xe4Eb51D709D22FE02C42F68A0483fa70A772e984 -https://app.optimism.io/retropgf-discovery/0xBF430a49C4d85AeeD3908619D5387A1fbF8E74A9 -https://app.optimism.io/retropgf-discovery/0xdb5781a835b60110298fF7205D8ef9678Ff1f800 -https://app.optimism.io/retropgf-discovery/0xb7D6937F3aa9E09817C045b7d5b5Fb5064370671 -https://app.optimism.io/retropgf-discovery/0xF96Aa4A25fDe246d9dD498B145F52Fab0eAd29f3 -https://app.optimism.io/retropgf-discovery/0xBEC643BD5b7F5e9190617CA4187ef0455950C51C -https://app.optimism.io/retropgf-discovery/0x3b036793Ea6dD8D9b352847f32818FA253eB759d -https://app.optimism.io/retropgf-discovery/0x2B1Bfc5dCD4E21CeAA5F512e350b00c585dAE894 -https://app.optimism.io/retropgf-discovery/0xFC10A71B1E7974401D840fd15ceBf08Ed7E115Cc -https://app.optimism.io/retropgf-discovery/0xD06CaC3a900Dd34FE9CCd32F15DCC75E2423b816 -https://app.optimism.io/retropgf-discovery/0xC728DEa8B2972E6e07493BE8DC2F0314F7dC3E98 -https://app.optimism.io/retropgf-discovery/0xa142aB9eab9264807A41F0E5cbDab877D204E233 -https://app.optimism.io/retropgf-discovery/0xf23F9C10D1559885dABEE67c59c4554E6152697b -https://app.optimism.io/retropgf-discovery/0x64249ED5Ef7a004d268A508092851e987482a175 -https://app.optimism.io/retropgf-discovery/0x7a48A728d9Fd2d5a55c545c4378E5bA909349E90 -https://app.optimism.io/retropgf-discovery/0x24b0529c7226AE66968B9A8b521b266A2cA4a898 -https://app.optimism.io/retropgf-discovery/0x062a07cBf4848fdA67292A96a5E02C97E402233F -https://app.optimism.io/retropgf-discovery/0x59cc06BF5CF5e07790432599060B7D402F9d2cA8 -https://app.optimism.io/retropgf-discovery/0x2cd0ac587Fc0E6FBcF8A47A449971649E7dab835 -https://app.optimism.io/retropgf-discovery/0x6Fa4C420E9567203Aa65eB38da5DBe361fD61ff2 -https://app.optimism.io/retropgf-discovery/0x283266045Ab2aB0793a62CADC21D55f685636Ae0 -https://app.optimism.io/retropgf-discovery/0x358fdcCDE25e0aae7fBA01F088Da89b08aBF61DB -https://app.optimism.io/retropgf-discovery/0x47A6a1B6492B6dF811606B8294A02b4268e86dAD -https://app.optimism.io/retropgf-discovery/0x4c6E3610a222E4518cc7ef3d8826Ee8640995c5C -https://app.optimism.io/retropgf-discovery/0x6EdA5aCafF7F5964E1EcC3FD61C62570C186cA0C -https://app.optimism.io/retropgf-discovery/monorepo-dependencies -https://app.optimism.io/retropgf-discovery/0x60A5dcB2fC804874883b797f37CbF1b0582ac2dD -https://app.optimism.io/retropgf-discovery/0x7b4c5F852AA6b44Bd01F9252C3F93Ae1aa1c63e9 -https://app.optimism.io/retropgf-discovery/0x0BE55326919F08Af4D14A42aAfb3B68F95738355 -https://app.optimism.io/retropgf-discovery/0xFED0e586cB372Fd0b17ead9F8cb1347BF8a5937f -https://app.optimism.io/retropgf-discovery/0xD131F1BcDd547e067Af447dD3C36C99d6be9FdEB -https://app.optimism.io/retropgf-discovery/0x9cce47E9cF12C6147c9844adBB81fE85880c4df4 -https://app.optimism.io/retropgf-discovery/0x4413E96F6b46e59326a7695eF871FA902Ff7935d -https://app.optimism.io/retropgf-discovery/0x6ef87E0Aaadb2c3d07fD98a098Af5FaD0aD45811 -https://app.optimism.io/retropgf-discovery/0x81B7E9d8409B857D70aD14073E785c486945CaF4 -https://app.optimism.io/retropgf-discovery/0xF86BaD4E03D731de4d67B4f3943743f0B4C2084c -https://app.optimism.io/retropgf-discovery/0xdbE38D1d3631a04875d3FAd945D0dFcb2C20f91c -https://app.optimism.io/retropgf-discovery/0x8dc640a257DE18857F8d24e1Ae2645F8bBa1E034 -https://app.optimism.io/retropgf-discovery/0xD8ce5Ae15E2A9C8528FDce195AD43015782C5079 -https://app.optimism.io/retropgf-discovery/0x6084fBE2Aa96Bb131D6Bc7Bd3BE786882cfA250F -https://app.optimism.io/retropgf-discovery/0x10850762bAc0dc6660630c1EfFe188A7cbFDdc88 -https://app.optimism.io/retropgf-discovery/ambassadors -https://app.optimism.io/retropgf-discovery/0x59E6Ca75DFb201BAFF565303CA52A3113DD6F223 -https://app.optimism.io/retropgf-discovery/0x523d007855B3543797E0d3D462CB44B601274819 -https://app.optimism.io/retropgf-discovery/0x61d10BFDa1aa5010795985FD9a49F21Fb7570982 -https://app.optimism.io/retropgf-discovery/0x09c41efc1C7E2C2A11Bb153eF39AFFeaFf2CeDcD -https://app.optimism.io/retropgf-discovery/0x82D54397B88CE80Ea2Df9aD049213ACb47dc2523 -https://app.optimism.io/retropgf-discovery/0x6e4E55A49a8C8938BD8D8668E18DE95962740Fe1 -https://app.optimism.io/retropgf-discovery/0x8E72a24221517E51502f20f387415a06b27A5b51 -https://app.optimism.io/retropgf-discovery/0x1208a26FAa0F4AC65B42098419EB4dAA5e580AC6 -https://app.optimism.io/retropgf-discovery/0xd923CA098dBBFb0d24677a3150fa3aA97be461b5 -https://app.optimism.io/retropgf-discovery/0x941D8Cd7378432Bc4952bA0Dcc9e120C18C92975 -https://app.optimism.io/retropgf-discovery/0xd31b671F1a398B519222FdAba5aB5464B9F2a3Fa -https://app.optimism.io/retropgf-discovery/0x0AB7C4123e84c975008fcfcb14f07152bb711F82 -https://app.optimism.io/retropgf-discovery/0x4d5Dd4d81D773c05cE27AbA03e2f3E346c3F8E54 -https://app.optimism.io/retropgf-discovery/0x08290908a251119a1C75bb9C36A7A41e9BF2f1E3 -https://app.optimism.io/retropgf-discovery/0xb89e800719a96c609dB746397b7d2c3B917694e0 -https://app.optimism.io/retropgf-discovery/0x429F9aDA43e9F345CbB85EC88681BB70Df808892 -https://app.optimism.io/retropgf-discovery/0xE2d2Ac26Cb9dE9a8BBc6d2698CC40b154fAc920d -https://app.optimism.io/retropgf-discovery/0xFc756d8632A19CEbd76560CE0A6967279E32131b -https://app.optimism.io/retropgf-discovery/0xf21b24E6D87C7e5dEC3e419551829F6B39dBB807 -https://app.optimism.io/retropgf-discovery/0x4C0a466DF0628FE8699051b3Ac6506653191cc21 -https://app.optimism.io/retropgf-discovery/0x5A930B098Ed8D58dD4590577af85a8E864A8F6fE -https://app.optimism.io/retropgf-discovery/0x45755F5e7d3b1cdB1AaF1Fe786c415e47Bed2f43 -https://app.optimism.io/retropgf-discovery/0x3945D766185E2264900C84faC10958B3619C2bD4 -https://app.optimism.io/retropgf-discovery/0x0F9Bd2a9E0D30f121c525DB5419A07b08Fce8440 -https://app.optimism.io/retropgf-discovery/0x400aBc3DAE98Ec5aEEF2681b40D4CEd0A5aff934 -https://app.optimism.io/retropgf-discovery/0x4879DF2Ba195a69C178133F44E278c0f64797Ca5 -https://app.optimism.io/retropgf-discovery/0x2ba1aebA3fBd69aa74944F17326Bfdc229fD986E -https://app.optimism.io/retropgf-discovery/0xe126b3E5d052f1F575828f61fEBA4f4f2603652a -https://app.optimism.io/retropgf-discovery/0xAC4DDaf8FBfFba0f1e8c7619720335FD4f03EaCD -https://app.optimism.io/retropgf-discovery/0x080f08076e8EAdC66006C3CbFEd28a34918A1fA6 -https://app.optimism.io/retropgf-discovery/0x56262562506967a08Bf60a5aC5a5cEEAc02BECD2 -https://app.optimism.io/retropgf-discovery/0x701E37643DADa13DE79e66A74E7d6187FC48faD2 -https://app.optimism.io/retropgf-discovery/0x9531C059098e3d194fF87FebB587aB07B30B1306 -https://app.optimism.io/retropgf-discovery/0xc0017405E287476443Ab1B342B86f2ea92Ef9F73 -https://app.optimism.io/retropgf-discovery/0x9F87C1aCaF3Afc6a5557c58284D9F8609470b571 -https://app.optimism.io/retropgf-discovery/0x9D31e30003f253563Ff108BC60B16Fdf2c93abb5 -https://app.optimism.io/retropgf-discovery/0xbe0fc34488CaA2766C3225B56ade0c1E409c0De7 -https://app.optimism.io/retropgf-discovery/0xA6826463a53bBe3d673f7e61E94a6099581FfC7d -https://app.optimism.io/retropgf-discovery/0xc152Cc22488f1383E675f5738dF9a4244fB113a5 -https://app.optimism.io/retropgf-discovery/0x3B1E17b3FC8B2B2c5FBb995Fb3E1dE95a4D7cF7D -https://app.optimism.io/retropgf-discovery/0xf9551c66995eD3Ff9bb05C9Fd7ff148Bd75dc99a -https://app.optimism.io/retropgf-discovery/0x1F5D295778796a8b9f29600A585Ab73D452AcB1c -https://app.optimism.io/retropgf-discovery/0x5fC34D03cFdf145Db5f3c5B5558e39a4164AAa30 -https://app.optimism.io/retropgf-discovery/0x151EF20A3ADe1CC1161391594f8a32461389a54e -https://app.optimism.io/retropgf-discovery/0xAA6042aa65eb93C6439cDaeBC27B3bd09c5DFe94 -https://app.optimism.io/retropgf-discovery/0x892Ff98a46e5bd141E2D12618f4B2Fe6284debac -https://app.optimism.io/retropgf-discovery/support-nerds -https://app.optimism.io/retropgf-discovery/0xd35E119782059A27FEAd4EddA8B555f393650BC8 -https://app.optimism.io/retropgf-discovery/0x3b067Af83F540cB827825a6Ee5480441a4237E77 -https://app.optimism.io/retropgf-discovery/0xFF7B65dDc2Ffb7f6AC527b4C2F048946B3A5eaF3 -https://app.optimism.io/retropgf-discovery/0x03143EE031AA7bD7b6846750d066A27f18D39edd -https://app.optimism.io/retropgf-discovery/0x00409fC839a2Ec2e6d12305423d37Cd011279C09 -https://app.optimism.io/retropgf-discovery/0x4d85e4F760fb58E380f02657AE5Aafb8bd010601 -https://app.optimism.io/retropgf-discovery/0x005241438cAF3eaCb05bB6543151f7AF894C5B58 -https://app.optimism.io/retropgf-discovery/0xeB67e286faf667A047e435EC90107122b0bC2C01 -https://app.optimism.io/retropgf-discovery/translators -https://app.optimism.io/retropgf-discovery/0xf503017D7baF7FBC0fff7492b751025c6A78179b -https://app.optimism.io/retropgf-discovery/0x4d2F0Efdb2AD1d709d8522E7b5aa9f5181563617 -https://app.optimism.io/retropgf-discovery/0x5C04E7808455ee0e22c2773328C151d0DD79dC62 -https://app.optimism.io/retropgf-discovery/0xAbfA48BCc0F96Fc70be7a4156b0a74Ea350167fD -https://app.optimism.io/retropgf-discovery/0xd2135CfB216b74109775236E36d4b433F1DF507B -https://app.optimism.io/retropgf-discovery/0xab4f5A7fcd1Bb66C8c5f01bB77F6142759f46107 -https://app.optimism.io/retropgf-discovery/0x2Ae8c972fB2E6c00ddED8986E2dc672ED190DA06 -https://app.optimism.io/retropgf-discovery/0xEFEdaf9c07E6eB56BB8F82f30018e4461B1c5F4c -https://app.optimism.io/retropgf-discovery/0xe8a17e2f1bd4bFcBfBecb8a90be08780949a0cac -https://app.optimism.io/retropgf-discovery/0x13ebd3443fa5575F0Eb173e323D8419F7452CfB1 -https://app.optimism.io/retropgf-discovery/0x4f41877773e44F2275dA1942FEe898556821bf66 -https://app.optimism.io/retropgf-discovery/0x0693401dF5CbAE158be6bbAdDD69d52283a8076E -https://app.optimism.io/retropgf-discovery/0x25df6DA2f4e5C178DdFF45038378C0b08E0Bce54 -https://app.optimism.io/retropgf-discovery/0x9D727911B54C455B0071A7B682FcF4Bc444B5596 -https://app.optimism.io/retropgf-discovery/0x7f9D4208D404d86396F856C4f3db0195bB677f17 \ No newline at end of file diff --git a/utils/optimism/op_scraper.py b/utils/optimism/op_scraper.py deleted file mode 100644 index a42c782..0000000 --- a/utils/optimism/op_scraper.py +++ /dev/null @@ -1,100 +0,0 @@ -import json -from selenium import webdriver -from selenium.webdriver import Chrome -from selenium.webdriver.chrome.service import Service -from selenium.webdriver.common.by import By -import time -from webdriver_manager.chrome import ChromeDriverManager - - -# initialize a headless web scraper - -options = webdriver.ChromeOptions() -options.headless = True -options.page_load_strategy = 'none' - -chrome_path = ChromeDriverManager().install() -chrome_service = Service(chrome_path) - -driver = Chrome(options=options, service=chrome_service) -driver.implicitly_wait(5) - -# local path names - -LINKS_PATH = 'links.txt' -DATA_PATH = 'optimism/data/projects/' - - -# module for extracting fields from a given project page -def extract_fields(link): - - driver.get(link) - content = driver.find_element(By.CSS_SELECTOR, "div[class^='_content'") - project = content.find_element(By.CSS_SELECTOR, "h1[class^='_header'").text - socials = [s.get_property("href") - for s in content.find_elements(By.CSS_SELECTOR, "a[class^='_socialLink'")] - responses = content.find_elements(By.TAG_NAME, "section") - description = responses[0].find_element(By.TAG_NAME, "p").text - category = responses[1].find_element(By.CSS_SELECTOR, "span[class^='_label'").text - try: - address = content.find_element(By.CSS_SELECTOR, "div[class^='_addressWrapper'").text - except: - print("No address:", link) - address = None - p_grabber = lambda r: "\n".join([t.text for t in r.find_elements(By.TAG_NAME, "p")]) - logo = driver.find_element(By.CSS_SELECTOR, "img[class^='_image'").get_property("src") - try: - banner = (driver - .find_element(By.CSS_SELECTOR, "div[class^='_banner'") - .find_element(By.TAG_NAME, "img").get_property("src")) - except: - print("No banner:", link) - banner = None - - return { - 'project': project, - 'socials': socials, - 'description': description, - 'category': category, - 'public_goods': p_grabber(responses[2]), - 'sustainability': p_grabber(responses[3]), - 'team_size': p_grabber(responses[4]), - 'address': address, - 'banner': banner, - 'logo': logo - } - - -# process each link and store the data -def process_url(link): - - result = extract_fields(link) - result.update({'project_link': link}) - result.update({'address': link.split("/")[-1]}) - - j = json.dumps(result, indent=4) - outpath = f"{DATA_PATH}{result['address']}.json" - with open(outpath, "w") as outfile: - outfile.write(j) - - return result - - -# read and process all links -def scrape_all_projects(): - - with open(LINKS_PATH, 'r') as txt_file: - links = [f.strip() for f in txt_file.readlines()] - - for project_url in links: - #time.sleep(2) - try: - result = process_url(project_url) - print("✅ Scraped: ", result['project']) - except: - print("❌ Error:", project_url) - - -if __name__ == "__main__": - scrape_all_projects() - driver.quit() \ No newline at end of file diff --git a/utils/optimism/requirements.txt b/utils/optimism/requirements.txt deleted file mode 100644 index 7dedee4..0000000 --- a/utils/optimism/requirements.txt +++ /dev/null @@ -1,34 +0,0 @@ -appnope==0.1.3 -asttokens==2.2.1 -async-generator==1.10 -attrs==22.2.0 -backcall==0.2.0 -certifi==2022.12.7 -decorator==5.1.1 -exceptiongroup==1.1.1 -executing==1.2.0 -h11==0.14.0 -idna==3.4 -ipython==8.11.0 -jedi==0.18.2 -matplotlib-inline==0.1.6 -outcome==1.2.0 -parso==0.8.3 -pexpect==4.8.0 -pickleshare==0.7.5 -prompt-toolkit==3.0.38 -ptyprocess==0.7.0 -pure-eval==0.2.2 -Pygments==2.14.0 -PySocks==1.7.1 -selenium==4.8.2 -six==1.16.0 -sniffio==1.3.0 -sortedcontainers==2.4.0 -stack-data==0.6.2 -traitlets==5.9.0 -trio==0.22.0 -trio-websocket==0.10.1 -urllib3==1.26.15 -wcwidth==0.2.6 -wsproto==1.2.0 \ No newline at end of file diff --git a/utils/optimism/serialize_address_data.py b/utils/optimism/serialize_address_data.py deleted file mode 100644 index 722b65f..0000000 --- a/utils/optimism/serialize_address_data.py +++ /dev/null @@ -1,69 +0,0 @@ -from dotenv import load_dotenv -import json -import os -import requests - - -load_dotenv() -OPTIMISM_KEY = os.environ['OPTIMISM_ETHERSCAN_API_KEY'] -ETHERSCAN_KEY = os.environ['ETHERSCAN_KEY'] -HEADERS = { - "Accept": "application/json", - "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36" -} - -PROJECT_DATA = "data/projects/" -JSONDATA_PATH = "data/optimism_project_data.json" - - -def load_projects(): - paths = [p for p in os.listdir(PROJECT_DATA) if p[-5:] == '.json'] - data = [] - for path in paths: - project = json.load(open(PROJECT_DATA+path)) - project['banner'] = (project['banner'] == None) - project['logo'] = True - data.append(project) - return data - - -def optimism_scan(addr): - - query = "".join(["https://api-optimistic.etherscan.io/api", - "?module=account", - "&action=balancemulti", - f"&address={addr}", - "&tag=latest", - f"&apikey={OPTIMISM_KEY}"]) - - response = requests.get(query, headers=HEADERS) - data = response.json() - - - has_address = data['message'] == 'OK' - balance = float(data['result'][0]['balance']) / 1000000000000000000. if has_address else 0 - - return dict( - optimismAddressFound=has_address, - optimismBalanceEth=balance, - ) - - -def run_address_stats(): - - data = load_projects() - for project in data: - address = project.get("address") - try: - project.update(optimism_scan(address)) - except: - print("Error:", address) - - - out_file = open(JSONDATA_PATH, "w") - json.dump(data, out_file, indent=4) - out_file.close() - - -if __name__ == "__main__": - run_address_stats() \ No newline at end of file diff --git a/utils/supabase/.env.example b/utils/supabase/.env.example deleted file mode 100644 index b32b854..0000000 --- a/utils/supabase/.env.example +++ /dev/null @@ -1,3 +0,0 @@ -# API settings -SUPABASE_URL= -SUPABASE_KEY= \ No newline at end of file diff --git a/utils/supabase/.gitignore b/utils/supabase/.gitignore deleted file mode 100644 index 7c0840a..0000000 --- a/utils/supabase/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -# ignore local storage artifacts -.env -__pycache__/ -.DS_Store -.ipynb_checkpoints/ -data/ diff --git a/utils/supabase/README.md b/utils/supabase/README.md deleted file mode 100644 index dcedcdd..0000000 --- a/utils/supabase/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Make direct edits to Hypercerts Supabase from a Python client - -# Setup - -1. Set environment variables in a `.env` file. You'll need a login credentials for Supabase. - -url: str = os.environ.get("SUPABASE_URL") -key: str = os.environ.get("SUPABASE_KEY") -supabase: Client = create_client(url, key) - -2. Prepare a list of addresses to add to the allowlist in a CSV file (and a `claimID` for the hypercert. - -3. Executive the script with the following arguments: - - > python insert_allowlist.py `yourdata.csv` optimism-allowlistCache 0x822f17a9a5eecfd66dbaff7946a8071c265d1d07-`claimId` diff --git a/utils/supabase/claim_stats.py b/utils/supabase/claim_stats.py deleted file mode 100644 index 858191e..0000000 --- a/utils/supabase/claim_stats.py +++ /dev/null @@ -1,75 +0,0 @@ -import json -import pandas as pd -import re - -CSV_FILEPATH = "data/claimsData.csv" -OUTPATH = "data/collisionsData.json" -COLS = ['claimId', 'title', 'creatorAddress', 'date', 'totalUnits', 'properties', 'hypercert'] - - -def tagger(x): - search = lambda ss, s: re.search(ss, s, re.IGNORECASE) - if isinstance(x['title'], str): - if isinstance(x['properties'], str) and search("gitcoin", x['properties']): - return "1. Gitcoin" - if search("givegratitude", x['title']): - return "2. GiveGratitude.io" - if search("zuzalu", x['title']) or search("zuzalu", x['hypercert']): - return "3. Zuzalu" - if x['totalUnits'] != 10000: - return "4. Other Community Generated" - return "5. Random (No Collection, No Allowlist)" - - -def load_csv(path=CSV_FILEPATH): - df = pd.read_csv(path, index_col='claimId', usecols=COLS) - df['tag'] = df.apply(tagger, axis=1) - df.sort_values(by='date', inplace=True) - return df - - -def check_collisions(df): - collision_list = [] - collisions = [] - for i, (id1, row1) in enumerate(df.iterrows()): - collision = False - tag = row1['tag'] - for (id2, row2) in df.head(i).iterrows(): - creator = "same" if row1['creatorAddress'] == row2['creatorAddress'] else "diff" - if row1['hypercert'] == row2['hypercert']: - collisions.append({ - 'id': id1, - 'creator': row1['creatorAddress'], - 'collision': id2, - 'case': f'duplicate claim in hyperspace ({creator} creator)', - 'details': row1['hypercert'], - 'tag': tag - }) - collision = True - elif row1['title'] == row2['title'] and row1['title'] != 'The name of your hypercert': - collisions.append({ - 'id': id1, - 'creator': row1['creatorAddress'], - 'collision': id2, - 'case': f'duplicate title in hypercerts ({creator} creator)', - 'details': f"Title is {row1['title']}", - 'tag': tag - }) - collision = True - collision_list.append(collision) - return collision_list, collisions - - -def run_analysis(): - df = load_csv() - collision_list, collisions_data = check_collisions(df) - df['collisions'] = collision_list - - pdf = df.pivot_table(index='tag', columns='collisions', values='date', aggfunc='count') - print(pdf) - with open(OUTPATH, 'w') as f: - json.dump(collisions_data, f, indent=4) - - -if __name__ == "__main__": - run_analysis() diff --git a/utils/supabase/claims_metadata_mapper.py b/utils/supabase/claims_metadata_mapper.py deleted file mode 100644 index 34ddc99..0000000 --- a/utils/supabase/claims_metadata_mapper.py +++ /dev/null @@ -1,181 +0,0 @@ -import os -import json -import pandas as pd -import requests -from datetime import datetime -from dotenv import load_dotenv -from supabase import create_client, Client - -load_dotenv() -SUPABASE_URL = os.environ.get("SUPABASE_URL") -SUPABASE_KEY = os.environ.get("SUPABASE_KEY") -supabase: Client = create_client(SUPABASE_URL, SUPABASE_KEY) - -TABLE_NAME = "claims-metadata-mapping" -CSV_FILEPATH = "data/claimsData.csv" - - -def timestamp_to_date_string(timestamp: str) -> str: - """Converts a Unix timestamp to a formatted date string.""" - fmt = "%Y-%m-%d %H:%M:%S" - return datetime.fromtimestamp(int(timestamp)).strftime(fmt) - - -def get_claims_with_offset(offset: int = 0) -> list: - """Fetches claims from The Graph with a given offset.""" - # query = f''' - # {{ - # claims( - # first: 1000 - # skip: {offset} - # orderBy: creation - # ) {{ - # id - # totalUnits - # uri - # creator - # creation - # }} - # }} - #''' - - query = f'''{{ - allowlists(first: 1000) {{ - claim {{ - id - totalUnits - uri - creator - creation - }} - }} - }} - ''' - - url = "https://api.thegraph.com/subgraphs/name/hypercerts-admin/hypercerts-optimism-mainnet" - response = requests.post(url, json={'query': query}) - json_data = response.json() - data = [x['claim'] for x in json_data['data']['allowlists']] - print(f"Total of {len(data)} claims fetched this request.") - return data - - -def get_all_claims() -> list: - """Fetches all claims from The Graph.""" - all_claims = [] - offset = 0 - while True: - claims = get_claims_with_offset(offset) - if not claims: - break - all_claims.extend(claims) - if len(claims) < 1000: - break - offset += 1000 - print(f"The Graph shows a total of {len(all_claims)} hypercert claims with allowlists.") - return all_claims - - -def retrieve_ipfs_file(cid: str) -> dict: - """Fetches JSON data from IPFS using the given content identifier (CID).""" - url = f"https://cloudflare-ipfs.com/ipfs/{cid}" - print(f"Fetching: {url}") - - try: - response = requests.get(url) - response.raise_for_status() - data = json.loads(response.content) - return data - except requests.exceptions.HTTPError as e: - print(e) - return None - - -def create_claim_record(claim: dict, metadata: dict) -> dict: - """Creates a claim record from the given claim and metadata.""" - record = { - "claimId": claim["id"], - "createdAt": int(claim["creation"]), - "creatorAddress": claim["creator"], - "totalUnits": int(claim["totalUnits"]), - "date": timestamp_to_date_string(claim["creation"]), - } - if metadata: - record.update({ - "title": metadata["name"], - "properties": metadata.get("properties"), - "hypercert": metadata.get("hypercert") - }) - return record - - -def parse_claims(list_of_claims: list, existing_claims: list) -> list: - """Parses claims, filtering out existing ones, and creates claim records.""" - print("Parsing new claims...") - claims = [] - for claim in list_of_claims: - claim_id = claim['id'] - if claim_id not in existing_claims: - cid = claim['uri'].replace("ipfs://", "") - metadata = retrieve_ipfs_file(cid) - claim_record = create_claim_record(claim, metadata) - if claim_record: - claims.append(claim_record) - print(f"Total of {len(claims)} new claims extracted.") - return claims - - -def store_claims_in_supabase(claims: list): - """Stores the claim records in the Supabase table.""" - for claim in claims: - print(f"Adding {claim['title']} claim to Supabase.") - supabase.table(TABLE_NAME).insert(claim).execute() - - -def fetch_claim_ids_from_supabase() -> list: - """Fetches claim IDs from the Supabase table.""" - response = supabase.table(TABLE_NAME).select("claimId").execute() - claims = response.data - claim_ids = [c["claimId"] for c in claims] - print(f"Supabase shows a total of {len(claim_ids)} hypercert claims.") - return claim_ids - - -def save_supabase_snapshot_to_csv(csv_filepath: str = CSV_FILEPATH) -> None: - """Saves a snapshot of the Supabase table to a CSV file.""" - response = supabase.table(TABLE_NAME).select("*").execute() - claims = response.data - df = pd.DataFrame(claims) - df.set_index("claimId", inplace=True) - df.to_csv(csv_filepath) - - -def append_to_csv_file(claims: list, csv_filepath: str = CSV_FILEPATH) -> None: - """Appends the claim records to the local CSV file.""" - if not os.path.exists(csv_filepath): - df = pd.DataFrame(columns=claims[0].keys()) - df.set_index("claimId", inplace=True) - df.to_csv(csv_filepath) - - df = pd.read_csv(csv_filepath, index_col="claimId") - for claim in claims: - new_row = pd.Series(claim, name=claim["claimId"]) - df = pd.concat([df, pd.DataFrame([new_row])], ignore_index=True) - df.to_csv(csv_filepath) - - -def main(): - - save_supabase_snapshot_to_csv() - - claims_data = get_all_claims() - existing_claim_ids = fetch_claim_ids_from_supabase() - new_claims = parse_claims(claims_data, existing_claim_ids) - - if new_claims: - store_claims_in_supabase(new_claims) - append_to_csv_file(new_claims) - - -if __name__ == "__main__": - main() diff --git a/utils/supabase/gtc_collisions.py b/utils/supabase/gtc_collisions.py deleted file mode 100644 index 5bbb261..0000000 --- a/utils/supabase/gtc_collisions.py +++ /dev/null @@ -1,67 +0,0 @@ -import json -import pandas as pd -import re - -from claims_metadata_mapper import save_supabase_snapshot_to_csv - - -CSV_FILEPATH = "data/claimsData.csv" -OUTPATH = "data/gitcoinCollisionsData.json" -COLS = ['claimId', 'title', 'creatorAddress', 'date', 'totalUnits', 'properties', 'hypercert'] - - -def tagger(x): - search = lambda ss, s: re.search(ss, s, re.IGNORECASE) - if isinstance(x['title'], str): - if isinstance(x['properties'], str) and search("gitcoin", x['properties']): - return True - return False - - -def load_csv(path=CSV_FILEPATH): - df = pd.read_csv(path, index_col='claimId', usecols=COLS) - df['tag'] = df.apply(tagger, axis=1) - df = df[df['tag'] == True] - df.sort_values(by='date', inplace=True) - return df - - -def check_collisions(df): - collisions = [] - for i, (id1, row1) in enumerate(df.iterrows()): - tag = row1['tag'] - for (id2, row2) in df.head(i).iterrows(): - if row1['creatorAddress'] == row2['creatorAddress']: - creator = "same creator" - else: - creator = f"by {row1['creatorAddress']} & {row2['creatorAddress']}" - if row1['hypercert'] == row2['hypercert']: - case = f'duplicate claim in hyperspace ({creator} creator)' - elif row1['title'] == row2['title'] and row1['title'] != 'The name of your hypercert': - case = f'duplicate title in hypercerts ({creator})' - else: - continue - collisions.append({ - 'id': id1, - 'collision': id2, - 'creator': row1['creatorAddress'], - 'date': row1['date'], - 'title': row1['title'], - 'case': case - #'details': eval(row1['hypercert']) - }) - - return collisions - - -def run_analysis(): - - save_supabase_snapshot_to_csv() - df = load_csv() - collisions_data = check_collisions(df) - with open(OUTPATH, 'w') as f: - json.dump(collisions_data, f, indent=4) - - -if __name__ == "__main__": - run_analysis() diff --git a/utils/supabase/hypercert_accounting.py b/utils/supabase/hypercert_accounting.py deleted file mode 100644 index 354e2d8..0000000 --- a/utils/supabase/hypercert_accounting.py +++ /dev/null @@ -1,332 +0,0 @@ -import os -import json -import pandas as pd -import requests -from datetime import datetime -from dotenv import load_dotenv -from supabase import create_client, Client - -load_dotenv() -SUPABASE_URL = os.environ.get("SUPABASE_URL") -SUPABASE_KEY = os.environ.get("SUPABASE_KEY") -supabase: Client = create_client(SUPABASE_URL, SUPABASE_KEY) - -JSON_OUTPATH = "data/hypercertAccounting.json" -CSV_OUTPATH = "data/hypercertAccounting.csv" -SUPABASE_UPDATE = "data/hypercertErrors.csv" - -RATE_LIMIT = 1000 - - -def timestamp_to_date_string(timestamp: str) -> str: - """ - Converts a Unix timestamp to a formatted date string. - - Args: - timestamp: Unix timestamp string. - - Returns: - Formatted date string. - """ - fmt = "%Y-%m-%d %H:%M:%S" - return datetime.fromtimestamp(int(timestamp)).strftime(fmt) - - -def get_graph_data(query: str) -> dict: - """ - Sends a POST request to The Graph API and returns the response data. - - Args: - query: The GraphQL query string. - - Returns: - Response data in dictionary format. - """ - url = "https://api.thegraph.com/subgraphs/name/hypercerts-admin/hypercerts-optimism-mainnet" - response = requests.post(url, json={'query': query}) - json_data = response.json() - return json_data.get('data', {}) - - -def get_hypercerts() -> list: - """ - Fetches hypercerts with allowlists from The Graph. - - Returns: - List of hypercert data. - """ - query = ''' - { - allowlists(first: 1000) { - claim { - id - creation - creator - owner - totalUnits - uri - } - } - } - ''' - json_data = get_graph_data(query) - data = json_data.get('allowlists', []) - return data - - -def get_claims(claim_id: str, offset: int = 0) -> list: - """ - Fetches claims for a given claim ID from The Graph. - - Args: - claim_id: The ID of the claim. - offset: Offset value for pagination. - - Returns: - List of claim data. - """ - query = f''' - {{ - claimTokens( - where: {{ - claim_: {{ - id: "{claim_id}" - }} - }} - first: 1000 - skip: {offset} - orderBy: units - orderDirection: desc - ) {{ - id - owner - units - }} - }} - ''' - json_data = get_graph_data(query) - data = json_data.get('claimTokens', []) - return data - - -def retrieve_ipfs_file(uri: str) -> dict: - """ - Fetches JSON data from IPFS using the given content identifier in the URI. - - Args: - uri: The IPFS URI. - - Returns: - JSON data as a dictionary. - """ - cid = uri.replace("ipfs://", "") - url = f"https://cloudflare-ipfs.com/ipfs/{cid}" - - try: - response = requests.get(url) - response.raise_for_status() - data = json.loads(response.content) - return data - except requests.exceptions.HTTPError as e: - print(e) - return None - - -def fetch_addresses_from_supabase(claim_id: str) -> list: - """ - Fetches addresses from the Supabase table. - - Args: - claim_id: The ID of the claim. - - Returns: - List of addresses. - """ - response = (supabase - .table("optimism-allowlistCache") - .select("address") - .eq("claimId", claim_id) - .execute()) - addresses = [x["address"] for x in response.data] - return addresses - - -def fetch_hidden_hypercerts() -> list: - """ - Fetches hypercerts that are supposed to be hidden from users. - - Returns: - List of claimIds. - """ - response = (supabase - .table("claims-metadata-mapping") - .select("claimId") - .eq("hidden", True) - .execute()) - claims = [x["claimId"] for x in response.data] - return claims - - -def create_claim_record(claim: dict) -> dict: - """ - Creates a claim record from the given claim and metadata. - - Args: - claim: Claim data as a dictionary. - - Returns: - Claim record as a dictionary. - """ - metadata_uri = claim["uri"] - print("Fetching claim data from:", metadata_uri) - try: - metadata = retrieve_ipfs_file(metadata_uri) - metadata.pop('image') - except: - print("Error retrieving metadata at:", metadata_uri) - return None - - allowlist_uri = metadata.get("allowList") - try: - merkle_tree = eval(retrieve_ipfs_file(allowlist_uri)) - allowlist = [x['value'] for x in merkle_tree['values']] - except: - print("Error retrieving allowlist at:", allowlist_uri) - return None - - user_claims = get_claims(claim["id"]) - all_user_claims = user_claims - offset = 0 - while len(user_claims) == RATE_LIMIT: - offset += RATE_LIMIT - user_claims = get_claims(claim["id"], offset=offset) - all_user_claims.extend(user_claims) - - supabase_addresses = fetch_addresses_from_supabase(claim["id"]) - - return { - "claimId": claim["id"], - "createdAt": int(claim["creation"]), - "createdDate": timestamp_to_date_string(claim["creation"]), - "creatorAddress": claim["creator"], - "ownerAddress": claim["owner"], - "totalUnits": int(claim["totalUnits"]), - "metadataUri": metadata_uri, - "allowlistUri": allowlist_uri, - "metadata": metadata, - "allowlist": allowlist, - "userClaims": all_user_claims, - "supabaseList": supabase_addresses - } - - -def parse_claims(list_of_claims: list, existing_claims: list) -> list: - """ - Parses claims, filtering out existing ones, and creates claim records. - - Args: - list_of_claims: List of claim data. - existing_claims: List of existing claim IDs. - - Returns: - List of claim records. - """ - print("Parsing new claims...") - claims = [] - for claim_dict in list_of_claims: - claim = claim_dict['claim'] - claim_id = claim['id'] - if claim_id not in existing_claims: - claim_record = create_claim_record(claim) - if claim_record: - claims.append(claim_record) - print(f"Total of {len(claims)} new claims extracted.") - return claims - - -def update_hypercert_accounting(json_filepath: str = JSON_OUTPATH) -> None: - """ - Store hypercert data in a local JSON file. - - Args: - json_filepath: Path to the JSON file. - """ - hypercerts = get_hypercerts() - if not os.path.exists(json_filepath): - claims_data = parse_claims(hypercerts, []) - else: - with open(json_filepath) as f: - claims_data = json.load(f) - existing_claims = [c['claimId'] for c in claims_data] - new_claims = parse_claims(hypercerts, existing_claims) - claims_data.extend(new_claims) - - with open(json_filepath, 'w') as f: - json.dump(claims_data, f, indent=4) - - -def reconcile_claims(json_filepath: str = JSON_OUTPATH) -> None: - """ - Reconciles claims data and generates a CSV report. - - Args: - json_filepath: Path to the JSON file containing claims data. - - Returns: - None - """ - with open(json_filepath) as f: - claims_data = json.load(f) - - hidden_claims = fetch_hidden_hypercerts() - - results = [] - for claim in claims_data: - if claim['claimId'] in hidden_claims: - continue - - allowlist = {} - - def create_entry(address, units, slots): - return { - 'address': address, - 'claimId': claim['claimId'], - 'claimName': claim['metadata']['name'], - 'creator': claim['creatorAddress'] == address, - 'units': units, - 'claimed': 0, - 'supabase': False, - 'slots': slots - } - - for (address, units) in claim['allowlist']: - if address in allowlist: - allowlist[address]['units'] += units - allowlist[address]['slots'] += 1 - else: - allowlist[address] = create_entry(address, units, 1) - - for user_claim in claim['userClaims']: - owner = user_claim['owner'] - num_units = int(user_claim['units']) - if owner not in allowlist: - allowlist[owner] = create_entry(owner, 0, 0) - allowlist[owner]['claimed'] += num_units - - for address in claim['supabaseList']: - if address in allowlist: - allowlist[address]['supabase'] = True - - results.extend(allowlist.values()) - - df = pd.DataFrame(results) - df['error'] = df.apply(lambda x: not(x['supabase']) and not(x['claimed']), axis=1) - df.to_csv(CSV_OUTPATH, index=False) - - df_error = df[df['error']][['address', 'claimId']].sort_values(by='address') - df_error.to_csv(SUPABASE_UPDATE, index=False) - - -if __name__ == "__main__": - update_hypercert_accounting() - reconcile_claims() diff --git a/utils/supabase/insert_allowlist.py b/utils/supabase/insert_allowlist.py deleted file mode 100644 index fb31a3d..0000000 --- a/utils/supabase/insert_allowlist.py +++ /dev/null @@ -1,31 +0,0 @@ -from dotenv import load_dotenv -import os -import pandas as pd -from supabase import create_client, Client -import sys - -load_dotenv() -url = os.environ.get("SUPABASE_URL") -key = os.environ.get("SUPABASE_KEY") -supabase: Client = create_client(url, key) - - -def insert_allowlist(csv_file, table_name, claim_id): - df = pd.read_csv(csv_file) - addresses = list(df["address"]) - for addr in addresses: - data, count = (supabase - .table(table_name) - .insert({"address": addr, "claimId": claim_id}) - .execute()) - print(f"Successfully added {len(addresses)} rows to {table_name}") - - -if __name__ == "__main__": - insert_allowlist( - csv_file=sys.argv[1], - table_name=sys.argv[2], - claim_id=sys.argv[3] - ) - - diff --git a/utils/supabase/lookup_gtc_user.py b/utils/supabase/lookup_gtc_user.py deleted file mode 100644 index a6f98ea..0000000 --- a/utils/supabase/lookup_gtc_user.py +++ /dev/null @@ -1,43 +0,0 @@ -from dotenv import load_dotenv -import os -from supabase import create_client, Client -import sys - -load_dotenv() -url = os.environ.get("SUPABASE_URL") -key = os.environ.get("SUPABASE_KEY") -supabase: Client = create_client(url, key) - -allowlist_source = "gtc-alpha-allowlist" -allowlist_cache = "optimism-allowlistCache" - -def lookup_user(user_address): - - user_address = user_address.lower() - - data, count = (supabase - .table(allowlist_source) - .select('project, address') - .eq('address', user_address) - .execute()) - if count: - project_list = sorted([x["project"] for x in data[1]]) - print("User donated to the following Gitcoin projects:") - for (i,projectId) in enumerate(project_list): - print(f"{i+1}. {projectId}") - - data, count = (supabase - .table(allowlist_cache) - .select('claimId, address') - .eq('address', user_address) - .execute()) - if count: - claim_list = sorted([x["claimId"] for x in data[1]]) - print("User may claim the following hypercerts:") - for (i,claimId) in enumerate(claim_list): - print(f"{i+1}. {claimId}") - - - -if __name__ == "__main__": - lookup_user(user_address=sys.argv[1]) \ No newline at end of file diff --git a/utils/supabase/requirements.txt b/utils/supabase/requirements.txt deleted file mode 100644 index 74a0ad7..0000000 --- a/utils/supabase/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -pandas -python-dotenv -supabase \ No newline at end of file diff --git a/utils/supabase/user_claims.py b/utils/supabase/user_claims.py deleted file mode 100644 index ba0457f..0000000 --- a/utils/supabase/user_claims.py +++ /dev/null @@ -1,127 +0,0 @@ -import os -import json -import pandas as pd -import requests -from datetime import datetime -from dotenv import load_dotenv -from supabase import create_client, Client - -load_dotenv() -SUPABASE_URL = os.environ.get("SUPABASE_URL") -SUPABASE_KEY = os.environ.get("SUPABASE_KEY") -supabase: Client = create_client(SUPABASE_URL, SUPABASE_KEY) - -TABLE_NAME = "claims-metadata-mapping" -CSV_FILEPATH = "data/userTokenData.csv" - -CALL_LIMIT = 1000 - - -def get_tokens_claimed_by_hypercert(claim_id: str, offset: int = 0) -> list: - """Fetches tokens from The Graph for a given hypercert id.""" - query = f''' - {{ - claimTokens( - where: {{ - claim_: {{ - id: "{claim_id}" - }} - }} - first: {CALL_LIMIT} - offset: {offset} - orderBy: units - orderDirection: desc - ) {{ - id - owner - units - claim {{ - id - totalUnits - creator - }} - }} - }} - ''' - url = "https://api.thegraph.com/subgraphs/name/hypercerts-admin/hypercerts-optimism-mainnet" - response = requests.post(url, json={'query': query}) - json_data = response.json() - data = json_data['data']['claimTokens'] - return data - - -def get_all_tokens(list_of_claim_ids: list) -> list: - """Fetches all tokens from The Graph.""" - all_tokens = [] - for claim_id in list_of_claim_ids: - calls = 0 - while True: - tokens = get_tokens_claimed_by_hypercert(claim_id, offset=(calls*CALL_LIMIT)) - if not tokens: - break - all_tokens.extend(tokens) - calls += 1 - if calls >= 5: - break - return all_tokens - - -def create_record(token: dict) -> dict: - """Creates a record from the given token.""" - claim = token["claim"] - return { - "tokenId": token["id"], - "ownerAddress": token["owner"], - "units": int(token["units"]), - "claimId": claim["id"], - "totalUnits": int(claim["totalUnits"]), - "creatorAddress": claim["creator"] - } - - -def parse_tokens(list_of_tokens: list, existing_tokens: list = []) -> list: - """Parses tokens, filtering out existing ones, and creates records.""" - print("Parsing new tokens...") - tokens = [] - for token in list_of_tokens: - token_id = token["id"] - if token_id not in existing_tokens: - record = create_record(token) - if record: - tokens.append(record) - print(f"Total of {len(tokens)} new token claims extracted.") - return tokens - - -def fetch_claim_ids_from_supabase() -> list: - """Fetches claim IDs from the Supabase table.""" - data, _ = supabase.table(TABLE_NAME).select("claimId").execute() - claims = data[1] - claim_ids = [c["claimId"] for c in claims] - print(f"Supabase shows a total of {len(claim_ids)} hypercert claims.") - return claim_ids - - -def append_to_csv_file(tokens: list, csv_filepath: str = CSV_FILEPATH) -> None: - """Appends the token records to the local CSV file.""" - if not os.path.exists(csv_filepath): - df = pd.DataFrame(columns=tokens[0].keys()) - df.set_index("tokenId", inplace=True) - df.to_csv(csv_filepath) - - df = pd.read_csv(csv_filepath, index_col="tokenId") - for token in tokens: - new_row = pd.Series(token, name=token["tokenId"]) - df = pd.concat([df, pd.DataFrame([new_row])], ignore_index=True) - - df.to_csv(csv_filepath) - - -def main(): - claim_ids = fetch_claim_ids_from_supabase() - token_data = parse_tokens(get_all_tokens(claim_ids)) - append_to_csv_file(token_data) - - -if __name__ == "__main__": - main()