From 7f04d5d1c8732adcaea954cadc7c3f64e55a5ac2 Mon Sep 17 00:00:00 2001 From: Burak Benligiray Date: Tue, 7 May 2024 18:59:34 +0300 Subject: [PATCH 01/15] Restructure Actions workflow --- .github/workflows/continuous-build.yml | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/.github/workflows/continuous-build.yml b/.github/workflows/continuous-build.yml index 1fc183e..06b14f1 100644 --- a/.github/workflows/continuous-build.yml +++ b/.github/workflows/continuous-build.yml @@ -9,7 +9,7 @@ on: - main jobs: - test: + pre-build: runs-on: ubuntu-latest steps: - name: Clone @api3/contracts @@ -29,11 +29,23 @@ jobs: - name: Install dependencies run: pnpm install --frozen-lockfile + build: + runs-on: ubuntu-latest + needs: pre-build + steps: - name: Build run: pnpm build + lint: + runs-on: ubuntu-latest + needs: build + steps: - name: Lint run: pnpm lint + test: + runs-on: ubuntu-latest + needs: build + steps: - name: Test run: pnpm test From 85bb688a27e9068f49718dc40fe6e5e541c8c4c9 Mon Sep 17 00:00:00 2001 From: Burak Benligiray Date: Tue, 7 May 2024 19:11:52 +0300 Subject: [PATCH 02/15] Remove redundant --frozen-lockfile --- .github/workflows/continuous-build.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/continuous-build.yml b/.github/workflows/continuous-build.yml index 06b14f1..9d83839 100644 --- a/.github/workflows/continuous-build.yml +++ b/.github/workflows/continuous-build.yml @@ -27,7 +27,7 @@ jobs: cache: 'pnpm' - name: Install dependencies - run: pnpm install --frozen-lockfile + run: pnpm install build: runs-on: ubuntu-latest @@ -38,14 +38,14 @@ jobs: lint: runs-on: ubuntu-latest - needs: build + needs: pre-build steps: - name: Lint run: pnpm lint test: runs-on: ubuntu-latest - needs: build + needs: pre-build steps: - name: Test run: pnpm test From 068574202e8784986d5554c8419364d1be563c36 Mon Sep 17 00:00:00 2001 From: Burak Benligiray Date: Tue, 7 May 2024 19:16:07 +0300 Subject: [PATCH 03/15] Restructure Actions workflow --- .github/workflows/continuous-build.yml | 32 ++++++++++++++------------ 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/.github/workflows/continuous-build.yml b/.github/workflows/continuous-build.yml index 9d83839..1b0ee0d 100644 --- a/.github/workflows/continuous-build.yml +++ b/.github/workflows/continuous-build.yml @@ -9,7 +9,7 @@ on: - main jobs: - pre-build: + lint-build: runs-on: ubuntu-latest steps: - name: Clone @api3/contracts @@ -26,26 +26,28 @@ jobs: node-version: '20.x' cache: 'pnpm' - - name: Install dependencies - run: pnpm install + - name: Lint + run: pnpm lint - build: - runs-on: ubuntu-latest - needs: pre-build - steps: - name: Build run: pnpm build - lint: - runs-on: ubuntu-latest - needs: pre-build - steps: - - name: Lint - run: pnpm lint - test: runs-on: ubuntu-latest - needs: pre-build steps: + - name: Clone @api3/contracts + uses: actions/checkout@v4 + + - name: Set up pnpm + uses: pnpm/action-setup@v3 + with: + version: 8 + + - name: Set up Node + uses: actions/setup-node@v4 + with: + node-version: '20.x' + cache: 'pnpm' + - name: Test run: pnpm test From 45585a1846defdc1ec1a13b5417cea1b781098c7 Mon Sep 17 00:00:00 2001 From: Burak Benligiray Date: Tue, 7 May 2024 19:18:55 +0300 Subject: [PATCH 04/15] Install dependencies as a part CI --- .github/workflows/continuous-build.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/continuous-build.yml b/.github/workflows/continuous-build.yml index 1b0ee0d..d7c99bb 100644 --- a/.github/workflows/continuous-build.yml +++ b/.github/workflows/continuous-build.yml @@ -26,6 +26,9 @@ jobs: node-version: '20.x' cache: 'pnpm' + - name: Install dependencies + run: pnpm install + - name: Lint run: pnpm lint @@ -49,5 +52,8 @@ jobs: node-version: '20.x' cache: 'pnpm' + - name: Install dependencies + run: pnpm install + - name: Test run: pnpm test From c5bbee9dbe36d491980089d93128e20f86edfa54 Mon Sep 17 00:00:00 2001 From: Burak Benligiray Date: Tue, 7 May 2024 19:22:11 +0300 Subject: [PATCH 05/15] Verify vendor contracts in the CI --- .github/workflows/continuous-build.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/continuous-build.yml b/.github/workflows/continuous-build.yml index d7c99bb..4a92c43 100644 --- a/.github/workflows/continuous-build.yml +++ b/.github/workflows/continuous-build.yml @@ -55,5 +55,8 @@ jobs: - name: Install dependencies run: pnpm install + - name: Verify vendor contracts + run: pnpm verify-vendor-contracts + - name: Test run: pnpm test From c9fa07b5233048cb3272ecd73e72b58eac0fac7f Mon Sep 17 00:00:00 2001 From: Burak Benligiray Date: Tue, 7 May 2024 19:25:03 +0300 Subject: [PATCH 06/15] Add the validate-verify CI step --- .github/workflows/continuous-build.yml | 29 ++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/.github/workflows/continuous-build.yml b/.github/workflows/continuous-build.yml index 4a92c43..684cee8 100644 --- a/.github/workflows/continuous-build.yml +++ b/.github/workflows/continuous-build.yml @@ -60,3 +60,32 @@ jobs: - name: Test run: pnpm test + + validate-verify: + runs-on: ubuntu-latest + steps: + - name: Clone @api3/contracts + uses: actions/checkout@v4 + + - name: Set up pnpm + uses: pnpm/action-setup@v3 + with: + version: 8 + + - name: Set up Node + uses: actions/setup-node@v4 + with: + node-version: '20.x' + cache: 'pnpm' + + - name: Install dependencies + run: pnpm install + + - name: Validate deployment config + run: pnpm validate-deployment-config + + - name: Validate deployments + run: pnpm validate-deployments + + - name: Verify deployments + run: pnpm verify-deployments \ No newline at end of file From 5349972eead9467f5db1dc6a3c33f6971c5158d4 Mon Sep 17 00:00:00 2001 From: Burak Benligiray Date: Tue, 7 May 2024 19:47:08 +0300 Subject: [PATCH 07/15] Move test files --- {test => test_}/access/AccessControlRegistry.sol.ts | 0 {test => test_}/access/AccessControlRegistryAdminned.sol.ts | 0 .../access/AccessControlRegistryAdminnedWithManager.sol.ts | 0 {test => test_}/access/HashRegistry.sol.ts | 0 {test => test_}/access/OwnableCallForwarder.sol.ts | 0 {test => test_}/api3-server-v1/AirseekerRegistry.sol.ts | 0 {test => test_}/api3-server-v1/Api3Market.sol.ts | 0 {test => test_}/api3-server-v1/Api3ServerV1.sol.ts | 0 {test => test_}/api3-server-v1/OevAuctionHouse.sol.ts | 0 {test => test_}/api3-server-v1/aggregation/Median.sol.ts | 0 {test => test_}/api3-server-v1/proxies/DapiProxy.sol.ts | 0 {test => test_}/api3-server-v1/proxies/DapiProxyWithOev.sol.ts | 0 {test => test_}/api3-server-v1/proxies/DataFeedProxy.sol.ts | 0 .../api3-server-v1/proxies/DataFeedProxyWithOev.sol.ts | 0 {test => test_}/api3-server-v1/proxies/ProxyFactory.sol.ts | 0 {test => test_}/test-utils.ts | 0 {test => test_}/utils/ExtendedSelfMulticall.sol.ts | 0 {test => test_}/utils/OevSearcherMulticallV1.sol.ts | 0 {test => test_}/utils/SelfMulticall.sol.ts | 0 19 files changed, 0 insertions(+), 0 deletions(-) rename {test => test_}/access/AccessControlRegistry.sol.ts (100%) rename {test => test_}/access/AccessControlRegistryAdminned.sol.ts (100%) rename {test => test_}/access/AccessControlRegistryAdminnedWithManager.sol.ts (100%) rename {test => test_}/access/HashRegistry.sol.ts (100%) rename {test => test_}/access/OwnableCallForwarder.sol.ts (100%) rename {test => test_}/api3-server-v1/AirseekerRegistry.sol.ts (100%) rename {test => test_}/api3-server-v1/Api3Market.sol.ts (100%) rename {test => test_}/api3-server-v1/Api3ServerV1.sol.ts (100%) rename {test => test_}/api3-server-v1/OevAuctionHouse.sol.ts (100%) rename {test => test_}/api3-server-v1/aggregation/Median.sol.ts (100%) rename {test => test_}/api3-server-v1/proxies/DapiProxy.sol.ts (100%) rename {test => test_}/api3-server-v1/proxies/DapiProxyWithOev.sol.ts (100%) rename {test => test_}/api3-server-v1/proxies/DataFeedProxy.sol.ts (100%) rename {test => test_}/api3-server-v1/proxies/DataFeedProxyWithOev.sol.ts (100%) rename {test => test_}/api3-server-v1/proxies/ProxyFactory.sol.ts (100%) rename {test => test_}/test-utils.ts (100%) rename {test => test_}/utils/ExtendedSelfMulticall.sol.ts (100%) rename {test => test_}/utils/OevSearcherMulticallV1.sol.ts (100%) rename {test => test_}/utils/SelfMulticall.sol.ts (100%) diff --git a/test/access/AccessControlRegistry.sol.ts b/test_/access/AccessControlRegistry.sol.ts similarity index 100% rename from test/access/AccessControlRegistry.sol.ts rename to test_/access/AccessControlRegistry.sol.ts diff --git a/test/access/AccessControlRegistryAdminned.sol.ts b/test_/access/AccessControlRegistryAdminned.sol.ts similarity index 100% rename from test/access/AccessControlRegistryAdminned.sol.ts rename to test_/access/AccessControlRegistryAdminned.sol.ts diff --git a/test/access/AccessControlRegistryAdminnedWithManager.sol.ts b/test_/access/AccessControlRegistryAdminnedWithManager.sol.ts similarity index 100% rename from test/access/AccessControlRegistryAdminnedWithManager.sol.ts rename to test_/access/AccessControlRegistryAdminnedWithManager.sol.ts diff --git a/test/access/HashRegistry.sol.ts b/test_/access/HashRegistry.sol.ts similarity index 100% rename from test/access/HashRegistry.sol.ts rename to test_/access/HashRegistry.sol.ts diff --git a/test/access/OwnableCallForwarder.sol.ts b/test_/access/OwnableCallForwarder.sol.ts similarity index 100% rename from test/access/OwnableCallForwarder.sol.ts rename to test_/access/OwnableCallForwarder.sol.ts diff --git a/test/api3-server-v1/AirseekerRegistry.sol.ts b/test_/api3-server-v1/AirseekerRegistry.sol.ts similarity index 100% rename from test/api3-server-v1/AirseekerRegistry.sol.ts rename to test_/api3-server-v1/AirseekerRegistry.sol.ts diff --git a/test/api3-server-v1/Api3Market.sol.ts b/test_/api3-server-v1/Api3Market.sol.ts similarity index 100% rename from test/api3-server-v1/Api3Market.sol.ts rename to test_/api3-server-v1/Api3Market.sol.ts diff --git a/test/api3-server-v1/Api3ServerV1.sol.ts b/test_/api3-server-v1/Api3ServerV1.sol.ts similarity index 100% rename from test/api3-server-v1/Api3ServerV1.sol.ts rename to test_/api3-server-v1/Api3ServerV1.sol.ts diff --git a/test/api3-server-v1/OevAuctionHouse.sol.ts b/test_/api3-server-v1/OevAuctionHouse.sol.ts similarity index 100% rename from test/api3-server-v1/OevAuctionHouse.sol.ts rename to test_/api3-server-v1/OevAuctionHouse.sol.ts diff --git a/test/api3-server-v1/aggregation/Median.sol.ts b/test_/api3-server-v1/aggregation/Median.sol.ts similarity index 100% rename from test/api3-server-v1/aggregation/Median.sol.ts rename to test_/api3-server-v1/aggregation/Median.sol.ts diff --git a/test/api3-server-v1/proxies/DapiProxy.sol.ts b/test_/api3-server-v1/proxies/DapiProxy.sol.ts similarity index 100% rename from test/api3-server-v1/proxies/DapiProxy.sol.ts rename to test_/api3-server-v1/proxies/DapiProxy.sol.ts diff --git a/test/api3-server-v1/proxies/DapiProxyWithOev.sol.ts b/test_/api3-server-v1/proxies/DapiProxyWithOev.sol.ts similarity index 100% rename from test/api3-server-v1/proxies/DapiProxyWithOev.sol.ts rename to test_/api3-server-v1/proxies/DapiProxyWithOev.sol.ts diff --git a/test/api3-server-v1/proxies/DataFeedProxy.sol.ts b/test_/api3-server-v1/proxies/DataFeedProxy.sol.ts similarity index 100% rename from test/api3-server-v1/proxies/DataFeedProxy.sol.ts rename to test_/api3-server-v1/proxies/DataFeedProxy.sol.ts diff --git a/test/api3-server-v1/proxies/DataFeedProxyWithOev.sol.ts b/test_/api3-server-v1/proxies/DataFeedProxyWithOev.sol.ts similarity index 100% rename from test/api3-server-v1/proxies/DataFeedProxyWithOev.sol.ts rename to test_/api3-server-v1/proxies/DataFeedProxyWithOev.sol.ts diff --git a/test/api3-server-v1/proxies/ProxyFactory.sol.ts b/test_/api3-server-v1/proxies/ProxyFactory.sol.ts similarity index 100% rename from test/api3-server-v1/proxies/ProxyFactory.sol.ts rename to test_/api3-server-v1/proxies/ProxyFactory.sol.ts diff --git a/test/test-utils.ts b/test_/test-utils.ts similarity index 100% rename from test/test-utils.ts rename to test_/test-utils.ts diff --git a/test/utils/ExtendedSelfMulticall.sol.ts b/test_/utils/ExtendedSelfMulticall.sol.ts similarity index 100% rename from test/utils/ExtendedSelfMulticall.sol.ts rename to test_/utils/ExtendedSelfMulticall.sol.ts diff --git a/test/utils/OevSearcherMulticallV1.sol.ts b/test_/utils/OevSearcherMulticallV1.sol.ts similarity index 100% rename from test/utils/OevSearcherMulticallV1.sol.ts rename to test_/utils/OevSearcherMulticallV1.sol.ts diff --git a/test/utils/SelfMulticall.sol.ts b/test_/utils/SelfMulticall.sol.ts similarity index 100% rename from test/utils/SelfMulticall.sol.ts rename to test_/utils/SelfMulticall.sol.ts From 6fb1a67485f2df2fe1ca8404cdfa19da365b7d5e Mon Sep 17 00:00:00 2001 From: Burak Benligiray Date: Tue, 7 May 2024 19:47:16 +0300 Subject: [PATCH 08/15] Revert "Move test files" This reverts commit 5349972eead9467f5db1dc6a3c33f6971c5158d4. --- {test_ => test}/access/AccessControlRegistry.sol.ts | 0 {test_ => test}/access/AccessControlRegistryAdminned.sol.ts | 0 .../access/AccessControlRegistryAdminnedWithManager.sol.ts | 0 {test_ => test}/access/HashRegistry.sol.ts | 0 {test_ => test}/access/OwnableCallForwarder.sol.ts | 0 {test_ => test}/api3-server-v1/AirseekerRegistry.sol.ts | 0 {test_ => test}/api3-server-v1/Api3Market.sol.ts | 0 {test_ => test}/api3-server-v1/Api3ServerV1.sol.ts | 0 {test_ => test}/api3-server-v1/OevAuctionHouse.sol.ts | 0 {test_ => test}/api3-server-v1/aggregation/Median.sol.ts | 0 {test_ => test}/api3-server-v1/proxies/DapiProxy.sol.ts | 0 {test_ => test}/api3-server-v1/proxies/DapiProxyWithOev.sol.ts | 0 {test_ => test}/api3-server-v1/proxies/DataFeedProxy.sol.ts | 0 .../api3-server-v1/proxies/DataFeedProxyWithOev.sol.ts | 0 {test_ => test}/api3-server-v1/proxies/ProxyFactory.sol.ts | 0 {test_ => test}/test-utils.ts | 0 {test_ => test}/utils/ExtendedSelfMulticall.sol.ts | 0 {test_ => test}/utils/OevSearcherMulticallV1.sol.ts | 0 {test_ => test}/utils/SelfMulticall.sol.ts | 0 19 files changed, 0 insertions(+), 0 deletions(-) rename {test_ => test}/access/AccessControlRegistry.sol.ts (100%) rename {test_ => test}/access/AccessControlRegistryAdminned.sol.ts (100%) rename {test_ => test}/access/AccessControlRegistryAdminnedWithManager.sol.ts (100%) rename {test_ => test}/access/HashRegistry.sol.ts (100%) rename {test_ => test}/access/OwnableCallForwarder.sol.ts (100%) rename {test_ => test}/api3-server-v1/AirseekerRegistry.sol.ts (100%) rename {test_ => test}/api3-server-v1/Api3Market.sol.ts (100%) rename {test_ => test}/api3-server-v1/Api3ServerV1.sol.ts (100%) rename {test_ => test}/api3-server-v1/OevAuctionHouse.sol.ts (100%) rename {test_ => test}/api3-server-v1/aggregation/Median.sol.ts (100%) rename {test_ => test}/api3-server-v1/proxies/DapiProxy.sol.ts (100%) rename {test_ => test}/api3-server-v1/proxies/DapiProxyWithOev.sol.ts (100%) rename {test_ => test}/api3-server-v1/proxies/DataFeedProxy.sol.ts (100%) rename {test_ => test}/api3-server-v1/proxies/DataFeedProxyWithOev.sol.ts (100%) rename {test_ => test}/api3-server-v1/proxies/ProxyFactory.sol.ts (100%) rename {test_ => test}/test-utils.ts (100%) rename {test_ => test}/utils/ExtendedSelfMulticall.sol.ts (100%) rename {test_ => test}/utils/OevSearcherMulticallV1.sol.ts (100%) rename {test_ => test}/utils/SelfMulticall.sol.ts (100%) diff --git a/test_/access/AccessControlRegistry.sol.ts b/test/access/AccessControlRegistry.sol.ts similarity index 100% rename from test_/access/AccessControlRegistry.sol.ts rename to test/access/AccessControlRegistry.sol.ts diff --git a/test_/access/AccessControlRegistryAdminned.sol.ts b/test/access/AccessControlRegistryAdminned.sol.ts similarity index 100% rename from test_/access/AccessControlRegistryAdminned.sol.ts rename to test/access/AccessControlRegistryAdminned.sol.ts diff --git a/test_/access/AccessControlRegistryAdminnedWithManager.sol.ts b/test/access/AccessControlRegistryAdminnedWithManager.sol.ts similarity index 100% rename from test_/access/AccessControlRegistryAdminnedWithManager.sol.ts rename to test/access/AccessControlRegistryAdminnedWithManager.sol.ts diff --git a/test_/access/HashRegistry.sol.ts b/test/access/HashRegistry.sol.ts similarity index 100% rename from test_/access/HashRegistry.sol.ts rename to test/access/HashRegistry.sol.ts diff --git a/test_/access/OwnableCallForwarder.sol.ts b/test/access/OwnableCallForwarder.sol.ts similarity index 100% rename from test_/access/OwnableCallForwarder.sol.ts rename to test/access/OwnableCallForwarder.sol.ts diff --git a/test_/api3-server-v1/AirseekerRegistry.sol.ts b/test/api3-server-v1/AirseekerRegistry.sol.ts similarity index 100% rename from test_/api3-server-v1/AirseekerRegistry.sol.ts rename to test/api3-server-v1/AirseekerRegistry.sol.ts diff --git a/test_/api3-server-v1/Api3Market.sol.ts b/test/api3-server-v1/Api3Market.sol.ts similarity index 100% rename from test_/api3-server-v1/Api3Market.sol.ts rename to test/api3-server-v1/Api3Market.sol.ts diff --git a/test_/api3-server-v1/Api3ServerV1.sol.ts b/test/api3-server-v1/Api3ServerV1.sol.ts similarity index 100% rename from test_/api3-server-v1/Api3ServerV1.sol.ts rename to test/api3-server-v1/Api3ServerV1.sol.ts diff --git a/test_/api3-server-v1/OevAuctionHouse.sol.ts b/test/api3-server-v1/OevAuctionHouse.sol.ts similarity index 100% rename from test_/api3-server-v1/OevAuctionHouse.sol.ts rename to test/api3-server-v1/OevAuctionHouse.sol.ts diff --git a/test_/api3-server-v1/aggregation/Median.sol.ts b/test/api3-server-v1/aggregation/Median.sol.ts similarity index 100% rename from test_/api3-server-v1/aggregation/Median.sol.ts rename to test/api3-server-v1/aggregation/Median.sol.ts diff --git a/test_/api3-server-v1/proxies/DapiProxy.sol.ts b/test/api3-server-v1/proxies/DapiProxy.sol.ts similarity index 100% rename from test_/api3-server-v1/proxies/DapiProxy.sol.ts rename to test/api3-server-v1/proxies/DapiProxy.sol.ts diff --git a/test_/api3-server-v1/proxies/DapiProxyWithOev.sol.ts b/test/api3-server-v1/proxies/DapiProxyWithOev.sol.ts similarity index 100% rename from test_/api3-server-v1/proxies/DapiProxyWithOev.sol.ts rename to test/api3-server-v1/proxies/DapiProxyWithOev.sol.ts diff --git a/test_/api3-server-v1/proxies/DataFeedProxy.sol.ts b/test/api3-server-v1/proxies/DataFeedProxy.sol.ts similarity index 100% rename from test_/api3-server-v1/proxies/DataFeedProxy.sol.ts rename to test/api3-server-v1/proxies/DataFeedProxy.sol.ts diff --git a/test_/api3-server-v1/proxies/DataFeedProxyWithOev.sol.ts b/test/api3-server-v1/proxies/DataFeedProxyWithOev.sol.ts similarity index 100% rename from test_/api3-server-v1/proxies/DataFeedProxyWithOev.sol.ts rename to test/api3-server-v1/proxies/DataFeedProxyWithOev.sol.ts diff --git a/test_/api3-server-v1/proxies/ProxyFactory.sol.ts b/test/api3-server-v1/proxies/ProxyFactory.sol.ts similarity index 100% rename from test_/api3-server-v1/proxies/ProxyFactory.sol.ts rename to test/api3-server-v1/proxies/ProxyFactory.sol.ts diff --git a/test_/test-utils.ts b/test/test-utils.ts similarity index 100% rename from test_/test-utils.ts rename to test/test-utils.ts diff --git a/test_/utils/ExtendedSelfMulticall.sol.ts b/test/utils/ExtendedSelfMulticall.sol.ts similarity index 100% rename from test_/utils/ExtendedSelfMulticall.sol.ts rename to test/utils/ExtendedSelfMulticall.sol.ts diff --git a/test_/utils/OevSearcherMulticallV1.sol.ts b/test/utils/OevSearcherMulticallV1.sol.ts similarity index 100% rename from test_/utils/OevSearcherMulticallV1.sol.ts rename to test/utils/OevSearcherMulticallV1.sol.ts diff --git a/test_/utils/SelfMulticall.sol.ts b/test/utils/SelfMulticall.sol.ts similarity index 100% rename from test_/utils/SelfMulticall.sol.ts rename to test/utils/SelfMulticall.sol.ts From 06e477e082aee8990a46953c7dc00e3aec03e16a Mon Sep 17 00:00:00 2001 From: Burak Benligiray Date: Tue, 7 May 2024 20:46:22 +0300 Subject: [PATCH 09/15] Override eslint rules --- .eslintrc.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.eslintrc.js b/.eslintrc.js index 5b57ec2..e8aa3b8 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -17,5 +17,7 @@ module.exports = { '@typescript-eslint/max-params': 'off', '@typescript-eslint/no-unsafe-call': 'off', + '@typescript-eslint/no-unnecessary-type-assertion': 'off', + '@typescript-eslint/require-await': 'off', }, }; From 6a771e867e514401d4e69c9cd956cf12df72d6a3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 13 May 2024 15:02:34 +0000 Subject: [PATCH 10/15] Update dependency @api3/chains to ^6.2.1 --- package.json | 2 +- pnpm-lock.yaml | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index dc21ed9..cf4700e 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "write-example-env-file": "hardhat run scripts/write-example-env-file.ts" }, "devDependencies": { - "@api3/chains": "^6.2.0", + "@api3/chains": "^6.2.1", "@api3/commons": "^0.9.0", "@api3/promise-utils": "^0.4.0", "@changesets/cli": "^2.27.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 86c23ff..b9c8b75 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,8 +11,8 @@ dependencies: devDependencies: '@api3/chains': - specifier: ^6.2.0 - version: 6.2.0(typescript@5.4.5) + specifier: ^6.2.1 + version: 6.2.1(typescript@5.4.5) '@api3/commons': specifier: ^0.9.0 version: 0.9.0(eslint@8.57.0)(typescript@5.4.5) @@ -118,8 +118,8 @@ packages: /@adraffy/ens-normalize@1.10.1: resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} - /@api3/chains@6.2.0(typescript@5.4.5): - resolution: {integrity: sha512-TjwOACEO896lBTOFN7sLMn7zsNZkWsBbXN+Y1nf7lyyZTx8GBFx8kLj2eho1jcKa5EPvi3ADUss3L4/6v2s5vw==} + /@api3/chains@6.2.1(typescript@5.4.5): + resolution: {integrity: sha512-0Jr/IOYsHKf/IcD+gXqV55Lw8pcMsrMY/cd1oKO3evlEEeiLT3DQlqOsGby/JiOulKznbHbekD3GLpna2EMxYg==} dependencies: viem: 2.9.31(typescript@5.4.5)(zod@3.23.6) zod: 3.23.6 @@ -176,7 +176,7 @@ packages: resolution: {integrity: sha512-hYQCbCAtWMGKV+pECRY5tbfCSOcheeo9s6wtrhn1dOWw151VeG0sKG3VbBEsyA6cvSaldewBWY3t/JGaupdThg==} dependencies: lodash: 4.17.21 - zod: 3.22.4 + zod: 3.23.6 dev: true /@api3/promise-utils@0.4.0: @@ -3848,7 +3848,6 @@ packages: is-hex-prefixed: 1.0.0 strip-hex-prefix: 1.0.0 dev: true - bundledDependencies: false /evp_bytestokey@1.0.3: resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} From eef50a1bddb0d9b437b4bbca3cf16905632aebb4 Mon Sep 17 00:00:00 2001 From: Burak Benligiray Date: Thu, 16 May 2024 15:09:56 +0300 Subject: [PATCH 11/15] Fix lint --- .eslintrc.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.eslintrc.js b/.eslintrc.js index e8aa3b8..1ae359f 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -16,8 +16,8 @@ module.exports = { 'unicorn/prefer-ternary': 'off', '@typescript-eslint/max-params': 'off', - '@typescript-eslint/no-unsafe-call': 'off', '@typescript-eslint/no-unnecessary-type-assertion': 'off', + '@typescript-eslint/no-unsafe-call': 'off', '@typescript-eslint/require-await': 'off', }, }; From 107c02df7e3e865aa3e6f5a574b7babb034c3873 Mon Sep 17 00:00:00 2001 From: Burak Benligiray Date: Thu, 16 May 2024 15:17:37 +0300 Subject: [PATCH 12/15] Bump @api3/chains --- package.json | 2 +- pnpm-lock.yaml | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index cf4700e..ae44be7 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "write-example-env-file": "hardhat run scripts/write-example-env-file.ts" }, "devDependencies": { - "@api3/chains": "^6.2.1", + "@api3/chains": "^6.3.0", "@api3/commons": "^0.9.0", "@api3/promise-utils": "^0.4.0", "@changesets/cli": "^2.27.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b9c8b75..7058275 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,8 +11,8 @@ dependencies: devDependencies: '@api3/chains': - specifier: ^6.2.1 - version: 6.2.1(typescript@5.4.5) + specifier: ^6.3.0 + version: 6.3.0(typescript@5.4.5) '@api3/commons': specifier: ^0.9.0 version: 0.9.0(eslint@8.57.0)(typescript@5.4.5) @@ -118,8 +118,8 @@ packages: /@adraffy/ens-normalize@1.10.1: resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} - /@api3/chains@6.2.1(typescript@5.4.5): - resolution: {integrity: sha512-0Jr/IOYsHKf/IcD+gXqV55Lw8pcMsrMY/cd1oKO3evlEEeiLT3DQlqOsGby/JiOulKznbHbekD3GLpna2EMxYg==} + /@api3/chains@6.3.0(typescript@5.4.5): + resolution: {integrity: sha512-ZBurUD69aoA4oCuLOOJ/91+9VXYJaXnMz3HkWg+yuiwCK9DaIgpS2Pl6kagga3UDOT80unRXcCwUpTQF5fkYIw==} dependencies: viem: 2.9.31(typescript@5.4.5)(zod@3.23.6) zod: 3.23.6 @@ -3848,6 +3848,7 @@ packages: is-hex-prefixed: 1.0.0 strip-hex-prefix: 1.0.0 dev: true + bundledDependencies: false /evp_bytestokey@1.0.3: resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} From f769af987d0f1c03432ac43cfb072eaf07f7ff41 Mon Sep 17 00:00:00 2001 From: Burak Benligiray Date: Thu, 16 May 2024 15:17:49 +0300 Subject: [PATCH 13/15] Add oev-network deployment metadata --- data/chain-support.json | 3 ++- data/manager-multisig.json | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/data/chain-support.json b/data/chain-support.json index cb91902..24e43da 100644 --- a/data/chain-support.json +++ b/data/chain-support.json @@ -50,6 +50,7 @@ "moonriver", "neon-evm", "neon-evm-testnet", + "oev-network", "oev-network-sepolia-testnet", "opbnb", "opbnb-testnet", @@ -128,5 +129,5 @@ "x-layer-sepolia-testnet", "zircuit-sepolia-testnet" ], - "chainsSupportedByOevAuctions": ["arbitrum-sepolia-testnet", "oev-network-sepolia-testnet"] + "chainsSupportedByOevAuctions": ["arbitrum-sepolia-testnet", "oev-network", "oev-network-sepolia-testnet"] } diff --git a/data/manager-multisig.json b/data/manager-multisig.json index 78d5d76..36d7e8d 100644 --- a/data/manager-multisig.json +++ b/data/manager-multisig.json @@ -49,6 +49,7 @@ "moonriver": "0xCC5005Bd08b8882c9A132C0067E7D3f79796C251", "neon-evm": "0x14A9E40FcAdA95A273ce3c8d4ccF7EA3280BDd26", "neon-evm-testnet": "0x14A9E40FcAdA95A273ce3c8d4ccF7EA3280BDd26", + "oev-network": "0x14A9E40FcAdA95A273ce3c8d4ccF7EA3280BDd26", "oev-network-sepolia-testnet": "0x14A9E40FcAdA95A273ce3c8d4ccF7EA3280BDd26", "opbnb": "0x14A9E40FcAdA95A273ce3c8d4ccF7EA3280BDd26", "opbnb-testnet": "0x14A9E40FcAdA95A273ce3c8d4ccF7EA3280BDd26", From 38f9518aefa0cac5a15554b2a4a3946985159f6f Mon Sep 17 00:00:00 2001 From: Burak Benligiray Date: Thu, 16 May 2024 15:25:24 +0300 Subject: [PATCH 14/15] Deploy contracts --- deployments/addresses.json | 5 + deployments/block-numbers.json | 5 + deployments/oev-network/.chainId | 1 + .../oev-network/AccessControlRegistry.json | 518 ++++ deployments/oev-network/Api3ServerV1.json | 1137 +++++++++ deployments/oev-network/OevAuctionHouse.json | 2087 +++++++++++++++++ .../oev-network/OwnableCallForwarder.json | 202 ++ deployments/oev-network/ProxyFactory.json | 501 ++++ 8 files changed, 4456 insertions(+) create mode 100644 deployments/oev-network/.chainId create mode 100644 deployments/oev-network/AccessControlRegistry.json create mode 100644 deployments/oev-network/Api3ServerV1.json create mode 100644 deployments/oev-network/OevAuctionHouse.json create mode 100644 deployments/oev-network/OwnableCallForwarder.json create mode 100644 deployments/oev-network/ProxyFactory.json diff --git a/deployments/addresses.json b/deployments/addresses.json index 5957f14..b3e043c 100644 --- a/deployments/addresses.json +++ b/deployments/addresses.json @@ -37,6 +37,7 @@ "4002": "0x81bc85f329cDB28936FbB239f734AE495121F9A6", "4200": "0x81bc85f329cDB28936FbB239f734AE495121F9A6", "4201": "0x81bc85f329cDB28936FbB239f734AE495121F9A6", + "4913": "0x81bc85f329cDB28936FbB239f734AE495121F9A6", "5000": "0x81bc85f329cDB28936FbB239f734AE495121F9A6", "5003": "0x1DCE40DC2AfA7131C4838c8BFf635ae9d198d1cE", "5611": "0x81bc85f329cDB28936FbB239f734AE495121F9A6", @@ -104,6 +105,7 @@ "4002": "0xcD7Df573B0F0bb4F2f8dFFF6650cDe8C77431730", "4200": "0xcD7Df573B0F0bb4F2f8dFFF6650cDe8C77431730", "4201": "0xcD7Df573B0F0bb4F2f8dFFF6650cDe8C77431730", + "4913": "0xcD7Df573B0F0bb4F2f8dFFF6650cDe8C77431730", "5000": "0xcD7Df573B0F0bb4F2f8dFFF6650cDe8C77431730", "5003": "0x2b4401E59780e44d3b1Fd2D41FCb3047c830F286", "5611": "0xcD7Df573B0F0bb4F2f8dFFF6650cDe8C77431730", @@ -171,6 +173,7 @@ "4002": "0x709944a48cAf83535e43471680fDA4905FB3920a", "4200": "0x709944a48cAf83535e43471680fDA4905FB3920a", "4201": "0x709944a48cAf83535e43471680fDA4905FB3920a", + "4913": "0x709944a48cAf83535e43471680fDA4905FB3920a", "5000": "0x709944a48cAf83535e43471680fDA4905FB3920a", "5003": "0x5aB00E30453EEAd35025A761ED65d51d74574C24", "5611": "0x709944a48cAf83535e43471680fDA4905FB3920a", @@ -238,6 +241,7 @@ "4002": "0x9EB9798Dc1b602067DFe5A57c3bfc914B965acFD", "4200": "0x9EB9798Dc1b602067DFe5A57c3bfc914B965acFD", "4201": "0x9EB9798Dc1b602067DFe5A57c3bfc914B965acFD", + "4913": "0x9EB9798Dc1b602067DFe5A57c3bfc914B965acFD", "5000": "0x9EB9798Dc1b602067DFe5A57c3bfc914B965acFD", "5003": "0x944609FF0729435F87Ef429EC155d7539A83B9C8", "5611": "0x9EB9798Dc1b602067DFe5A57c3bfc914B965acFD", @@ -331,6 +335,7 @@ "1380012617": "0x9F5223d4a93a771D178992078DB1AbE421Dd4218" }, "OevAuctionHouse": { + "4913": "0x34f13A5C0AD750d212267bcBc230c87AEFD35CC5", "421614": "0x34f13A5C0AD750d212267bcBc230c87AEFD35CC5", "879490799": "0x34f13A5C0AD750d212267bcBc230c87AEFD35CC5" } diff --git a/deployments/block-numbers.json b/deployments/block-numbers.json index 8a2e83e..5e1948a 100644 --- a/deployments/block-numbers.json +++ b/deployments/block-numbers.json @@ -37,6 +37,7 @@ "4002": 14501364, "4200": 10315704, "4201": 2551872, + "4913": 25, "5000": 4272650, "5003": 4359198, "5611": 27082038, @@ -96,6 +97,7 @@ "2522": 6343418, "4002": 22948049, "4200": 10315732, + "4913": 27, "5000": 25122378, "5003": 4359229, "5611": 27082049, @@ -160,6 +162,7 @@ "4002": 22948050, "4200": 10315758, "4201": 2551874, + "4913": 28, "5000": 25122385, "5003": 4359235, "5611": 27082060, @@ -227,6 +230,7 @@ "4002": 22948052, "4200": 10315785, "4201": 2551875, + "4913": 29, "5000": 25122393, "5003": 4359241, "5611": 27082071, @@ -320,6 +324,7 @@ "1380012617": 315653 }, "OevAuctionHouse": { + "4913": 34, "421614": 36946606, "879490799": 165498 } diff --git a/deployments/oev-network/.chainId b/deployments/oev-network/.chainId new file mode 100644 index 0000000..918c59b --- /dev/null +++ b/deployments/oev-network/.chainId @@ -0,0 +1 @@ +4913 \ No newline at end of file diff --git a/deployments/oev-network/AccessControlRegistry.json b/deployments/oev-network/AccessControlRegistry.json new file mode 100644 index 0000000..f3c3246 --- /dev/null +++ b/deployments/oev-network/AccessControlRegistry.json @@ -0,0 +1,518 @@ +{ + "address": "0xcD7Df573B0F0bb4F2f8dFFF6650cDe8C77431730", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "rootRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "manager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "InitializedManager", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "adminRole", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "string", + "name": "description", + "type": "string" + }, + { + "indexed": false, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "InitializedRole", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "manager", + "type": "address" + } + ], + "name": "initializeManager", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "adminRole", + "type": "bytes32" + }, + { + "internalType": "string", + "name": "description", + "type": "string" + } + ], + "name": "initializeRoleAndGrantToSender", + "outputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "data", + "type": "bytes[]" + } + ], + "name": "multicall", + "outputs": [ + { + "internalType": "bytes[]", + "name": "returndata", + "type": "bytes[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "data", + "type": "bytes[]" + } + ], + "name": "tryMulticall", + "outputs": [ + { + "internalType": "bool[]", + "name": "successes", + "type": "bool[]" + }, + { + "internalType": "bytes[]", + "name": "returndata", + "type": "bytes[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0xf4cc783a89e7b621a1481b80ef3c00282a3230fc1d38ff2b5005b17b76c70ebf", + "receipt": { + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "from": "0x07b589f06bD0A5324c4E2376d66d2F4F25921DE1", + "contractAddress": null, + "transactionIndex": 1, + "gasUsed": "1086935", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xa4c5e32a9083e3d402b86786a90d7ec76a0d5c7ebf0242432e56e9e149967ac4", + "transactionHash": "0xf4cc783a89e7b621a1481b80ef3c00282a3230fc1d38ff2b5005b17b76c70ebf", + "logs": [], + "blockNumber": 27, + "cumulativeGasUsed": "1086935", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "244b8e05fc2166c1983c7be433cf9254", + "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"rootRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"manager\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"InitializedManager\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"adminRole\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"InitializedRole\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"manager\",\"type\":\"address\"}],\"name\":\"initializeManager\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"adminRole\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"description\",\"type\":\"string\"}],\"name\":\"initializeRoleAndGrantToSender\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"data\",\"type\":\"bytes[]\"}],\"name\":\"multicall\",\"outputs\":[{\"internalType\":\"bytes[]\",\"name\":\"returndata\",\"type\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"data\",\"type\":\"bytes[]\"}],\"name\":\"tryMulticall\",\"outputs\":[{\"internalType\":\"bool[]\",\"name\":\"successes\",\"type\":\"bool[]\"},{\"internalType\":\"bytes[]\",\"name\":\"returndata\",\"type\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Each user is called a \\\"manager\\\", and is the only member of their root role. Starting from this root role, they can create an arbitrary tree of roles and grant these to accounts. Each role has a description, and roles adminned by the same role cannot have the same description.\",\"kind\":\"dev\",\"methods\":{\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"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.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"initializeManager(address)\":{\"details\":\"Anyone can initialize a manager. An uninitialized manager attempting to initialize a role will be initialized automatically. Once a manager is initialized, subsequent initializations have no effect.\",\"params\":{\"manager\":\"Manager address to be initialized\"}},\"initializeRoleAndGrantToSender(bytes32,string)\":{\"details\":\"If the sender should not have the initialized role, they should explicitly renounce it after initializing it. Once a role is initialized, subsequent initializations have no effect other than granting the role to the sender. The sender must be a member of `adminRole`. `adminRole` value is not validated because the sender cannot have the `bytes32(0)` role. If the sender is an uninitialized manager that is initializing a role directly under their root role, manager initialization will happen automatically, which will grant the sender `adminRole` and allow them to initialize the role.\",\"params\":{\"adminRole\":\"Admin role to be assigned to the initialized role\",\"description\":\"Human-readable description of the initialized role\"},\"returns\":{\"role\":\"Initialized role\"}},\"multicall(bytes[])\":{\"params\":{\"data\":\"Array of calldata of batched calls\"},\"returns\":{\"returndata\":\"Array of returndata of batched calls\"}},\"renounceRole(bytes32,address)\":{\"details\":\"Overriden to disallow managers from renouncing their root roles. `role` and `account` are not validated because `AccessControl.renounceRole` will revert if either of them is zero.\",\"params\":{\"account\":\"Account to renounce the role\",\"role\":\"Role to be renounced\"}},\"revokeRole(bytes32,address)\":{\"details\":\"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.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"tryMulticall(bytes[])\":{\"params\":{\"data\":\"Array of calldata of batched calls\"},\"returns\":{\"returndata\":\"Array of returndata of batched calls\",\"successes\":\"Array of success conditions of batched calls\"}}},\"title\":\"Contract that allows users to manage independent, tree-shaped access control tables\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"initializeManager(address)\":{\"notice\":\"Initializes the manager by initializing its root role and granting it to them\"},\"initializeRoleAndGrantToSender(bytes32,string)\":{\"notice\":\"Initializes a role by setting its admin role and grants it to the sender\"},\"multicall(bytes[])\":{\"notice\":\"Batches calls to the inheriting contract and reverts as soon as one of the batched calls reverts\"},\"renounceRole(bytes32,address)\":{\"notice\":\"Called by the account to renounce the role\"},\"tryMulticall(bytes[])\":{\"notice\":\"Batches calls to the inheriting contract but does not revert if any of the batched calls reverts\"}},\"notice\":\"Multiple contracts can refer to this contract to check if their users have granted accounts specific roles. Therefore, it aims to keep all access control roles of its users in this single contract.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/access/AccessControlRegistry.sol\":\"AccessControlRegistry\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000},\"remappings\":[]},\"sources\":{\"contracts/access/AccessControlRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.17;\\n\\nimport \\\"../vendor/@openzeppelin/contracts@4.8.2/access/AccessControl.sol\\\";\\nimport \\\"../utils/SelfMulticall.sol\\\";\\nimport \\\"./RoleDeriver.sol\\\";\\nimport \\\"./interfaces/IAccessControlRegistry.sol\\\";\\n\\n/// @title Contract that allows users to manage independent, tree-shaped access\\n/// control tables\\n/// @notice Multiple contracts can refer to this contract to check if their\\n/// users have granted accounts specific roles. Therefore, it aims to keep all\\n/// access control roles of its users in this single contract.\\n/// @dev Each user is called a \\\"manager\\\", and is the only member of their root\\n/// role. Starting from this root role, they can create an arbitrary tree of\\n/// roles and grant these to accounts. Each role has a description, and roles\\n/// adminned by the same role cannot have the same description.\\ncontract AccessControlRegistry is\\n AccessControl,\\n SelfMulticall,\\n RoleDeriver,\\n IAccessControlRegistry\\n{\\n /// @notice Initializes the manager by initializing its root role and\\n /// granting it to them\\n /// @dev Anyone can initialize a manager. An uninitialized manager\\n /// attempting to initialize a role will be initialized automatically.\\n /// Once a manager is initialized, subsequent initializations have no\\n /// effect.\\n /// @param manager Manager address to be initialized\\n function initializeManager(address manager) public override {\\n require(manager != address(0), \\\"Manager address zero\\\");\\n bytes32 rootRole = _deriveRootRole(manager);\\n if (!hasRole(rootRole, manager)) {\\n _grantRole(rootRole, manager);\\n emit InitializedManager(rootRole, manager, _msgSender());\\n }\\n }\\n\\n /// @notice Called by the account to renounce the role\\n /// @dev Overriden to disallow managers from renouncing their root roles.\\n /// `role` and `account` are not validated because\\n /// `AccessControl.renounceRole` will revert if either of them is zero.\\n /// @param role Role to be renounced\\n /// @param account Account to renounce the role\\n function renounceRole(\\n bytes32 role,\\n address account\\n ) public override(AccessControl, IAccessControl) {\\n require(\\n role != _deriveRootRole(account),\\n \\\"role is root role of account\\\"\\n );\\n AccessControl.renounceRole(role, account);\\n }\\n\\n /// @notice Initializes a role by setting its admin role and grants it to\\n /// the sender\\n /// @dev If the sender should not have the initialized role, they should\\n /// explicitly renounce it after initializing it.\\n /// Once a role is initialized, subsequent initializations have no effect\\n /// other than granting the role to the sender.\\n /// The sender must be a member of `adminRole`. `adminRole` value is not\\n /// validated because the sender cannot have the `bytes32(0)` role.\\n /// If the sender is an uninitialized manager that is initializing a role\\n /// directly under their root role, manager initialization will happen\\n /// automatically, which will grant the sender `adminRole` and allow them\\n /// to initialize the role.\\n /// @param adminRole Admin role to be assigned to the initialized role\\n /// @param description Human-readable description of the initialized role\\n /// @return role Initialized role\\n function initializeRoleAndGrantToSender(\\n bytes32 adminRole,\\n string calldata description\\n ) external override returns (bytes32 role) {\\n require(bytes(description).length > 0, \\\"Role description empty\\\");\\n role = _deriveRole(adminRole, description);\\n // AccessControl roles have `DEFAULT_ADMIN_ROLE` (i.e., `bytes32(0)`)\\n // as their `adminRole` by default. No account in AccessControlRegistry\\n // can possibly have that role, which means all initialized roles will\\n // have non-default admin roles, and vice versa.\\n if (getRoleAdmin(role) == DEFAULT_ADMIN_ROLE) {\\n if (adminRole == _deriveRootRole(_msgSender())) {\\n initializeManager(_msgSender());\\n }\\n _setRoleAdmin(role, adminRole);\\n emit InitializedRole(role, adminRole, description, _msgSender());\\n }\\n grantRole(role, _msgSender());\\n }\\n}\\n\",\"keccak256\":\"0x86d904bfa0137a90286311c0e03627272ebef61cac537e3aa26b6f992942429b\",\"license\":\"MIT\"},\"contracts/access/RoleDeriver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n/// @title Contract to be inherited by contracts that will derive\\n/// AccessControlRegistry roles\\n/// @notice If a contract interfaces with AccessControlRegistry and needs to\\n/// derive roles, it should inherit this contract instead of re-implementing\\n/// the logic\\ncontract RoleDeriver {\\n /// @notice Derives the root role of the manager\\n /// @param manager Manager address\\n /// @return rootRole Root role\\n function _deriveRootRole(\\n address manager\\n ) internal pure returns (bytes32 rootRole) {\\n rootRole = keccak256(abi.encodePacked(manager));\\n }\\n\\n /// @notice Derives the role using its admin role and description\\n /// @dev This implies that roles adminned by the same role cannot have the\\n /// same description\\n /// @param adminRole Admin role\\n /// @param description Human-readable description of the role\\n /// @return role Role\\n function _deriveRole(\\n bytes32 adminRole,\\n string memory description\\n ) internal pure returns (bytes32 role) {\\n role = _deriveRole(adminRole, keccak256(abi.encodePacked(description)));\\n }\\n\\n /// @notice Derives the role using its admin role and description hash\\n /// @dev This implies that roles adminned by the same role cannot have the\\n /// same description\\n /// @param adminRole Admin role\\n /// @param descriptionHash Hash of the human-readable description of the\\n /// role\\n /// @return role Role\\n function _deriveRole(\\n bytes32 adminRole,\\n bytes32 descriptionHash\\n ) internal pure returns (bytes32 role) {\\n role = keccak256(abi.encodePacked(adminRole, descriptionHash));\\n }\\n}\\n\",\"keccak256\":\"0x488adb3cb7031415d4a195230753a0ac8f9f610e6db7a571529a350e29c97ed6\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControlRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../vendor/@openzeppelin/contracts@4.8.2/access/IAccessControl.sol\\\";\\nimport \\\"../../utils/interfaces/ISelfMulticall.sol\\\";\\n\\ninterface IAccessControlRegistry is IAccessControl, ISelfMulticall {\\n event InitializedManager(\\n bytes32 indexed rootRole,\\n address indexed manager,\\n address sender\\n );\\n\\n event InitializedRole(\\n bytes32 indexed role,\\n bytes32 indexed adminRole,\\n string description,\\n address sender\\n );\\n\\n function initializeManager(address manager) external;\\n\\n function initializeRoleAndGrantToSender(\\n bytes32 adminRole,\\n string calldata description\\n ) external returns (bytes32 role);\\n}\\n\",\"keccak256\":\"0x87066db894a24118df39a557d00c0a6529c39196011c03f809ca8cce1644e027\",\"license\":\"MIT\"},\"contracts/utils/SelfMulticall.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./interfaces/ISelfMulticall.sol\\\";\\n\\n/// @title Contract that enables calls to the inheriting contract to be batched\\n/// @notice Implements two ways of batching, one requires none of the calls to\\n/// revert and the other tolerates individual calls reverting\\n/// @dev This implementation uses delegatecall for individual function calls.\\n/// Since delegatecall is a message call, it can only be made to functions that\\n/// are externally visible. This means that a contract cannot multicall its own\\n/// functions that use internal/private visibility modifiers.\\n/// Refer to OpenZeppelin's Multicall.sol for a similar implementation.\\ncontract SelfMulticall is ISelfMulticall {\\n /// @notice Batches calls to the inheriting contract and reverts as soon as\\n /// one of the batched calls reverts\\n /// @param data Array of calldata of batched calls\\n /// @return returndata Array of returndata of batched calls\\n function multicall(\\n bytes[] calldata data\\n ) external override returns (bytes[] memory returndata) {\\n uint256 callCount = data.length;\\n returndata = new bytes[](callCount);\\n for (uint256 ind = 0; ind < callCount; ) {\\n bool success;\\n // solhint-disable-next-line avoid-low-level-calls\\n (success, returndata[ind]) = address(this).delegatecall(data[ind]);\\n if (!success) {\\n bytes memory returndataWithRevertData = returndata[ind];\\n if (returndataWithRevertData.length > 0) {\\n // Adapted from OpenZeppelin's Address.sol\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n let returndata_size := mload(returndataWithRevertData)\\n revert(\\n add(32, returndataWithRevertData),\\n returndata_size\\n )\\n }\\n } else {\\n revert(\\\"Multicall: No revert string\\\");\\n }\\n }\\n unchecked {\\n ind++;\\n }\\n }\\n }\\n\\n /// @notice Batches calls to the inheriting contract but does not revert if\\n /// any of the batched calls reverts\\n /// @param data Array of calldata of batched calls\\n /// @return successes Array of success conditions of batched calls\\n /// @return returndata Array of returndata of batched calls\\n function tryMulticall(\\n bytes[] calldata data\\n )\\n external\\n override\\n returns (bool[] memory successes, bytes[] memory returndata)\\n {\\n uint256 callCount = data.length;\\n successes = new bool[](callCount);\\n returndata = new bytes[](callCount);\\n for (uint256 ind = 0; ind < callCount; ) {\\n // solhint-disable-next-line avoid-low-level-calls\\n (successes[ind], returndata[ind]) = address(this).delegatecall(\\n data[ind]\\n );\\n unchecked {\\n ind++;\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xb466760f7b5d05a91fb168224952f29db9aa3308f0b83535fd697f3c30281740\",\"license\":\"MIT\"},\"contracts/utils/interfaces/ISelfMulticall.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ninterface ISelfMulticall {\\n function multicall(\\n bytes[] calldata data\\n ) external returns (bytes[] memory returndata);\\n\\n function tryMulticall(\\n bytes[] calldata data\\n ) external returns (bool[] memory successes, bytes[] memory returndata);\\n}\\n\",\"keccak256\":\"0x50b27284f0d5acd8b340836c09d252138ebf059f426e5d90d3f7221e1b7d0817\",\"license\":\"MIT\"},\"contracts/vendor/@openzeppelin/contracts@4.8.2/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(account),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0x67e3daf189111d6d5b0464ed09cf9f0605a22c4b965a7fcecd707101faff008a\",\"license\":\"MIT\"},\"contracts/vendor/@openzeppelin/contracts@4.8.2/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"contracts/vendor/@openzeppelin/contracts@4.8.2/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/vendor/@openzeppelin/contracts@4.8.2/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"contracts/vendor/@openzeppelin/contracts@4.8.2/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"contracts/vendor/@openzeppelin/contracts@4.8.2/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"contracts/vendor/@openzeppelin/contracts@4.8.2/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b50611244806100206000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c806373e9836211610081578063a217fddf1161005b578063a217fddf146101cd578063ac9650d8146101d5578063d547741f146101f557600080fd5b806373e98362146101705780637f7120fe1461018357806391d148541461019657600080fd5b80632f2ff15d116100b25780632f2ff15d1461012757806336568abe1461013c578063437b91161461014f57600080fd5b806301ffc9a7146100ce578063248a9ca3146100f6575b600080fd5b6100e16100dc366004610d7b565b610208565b60405190151581526020015b60405180910390f35b610119610104366004610dbd565b60009081526020819052604090206001015490565b6040519081526020016100ed565b61013a610135366004610df2565b6102a1565b005b61013a61014a366004610df2565b6102cb565b61016261015d366004610e1e565b610364565b6040516100ed929190610f38565b61011961017e366004610f91565b6104ca565b61013a61019136600461100d565b610611565b6100e16101a4366004610df2565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b610119600081565b6101e86101e3366004610e1e565b61071d565b6040516100ed9190611028565b61013a610203366004610df2565b61089e565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061029b57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6000828152602081905260409020600101546102bc816108c3565b6102c683836108d0565b505050565b60408051606083901b6bffffffffffffffffffffffff1916602080830191909152825160148184030181526034909201909252805191012082036103565760405162461bcd60e51b815260206004820152601c60248201527f726f6c6520697320726f6f7420726f6c65206f66206163636f756e740000000060448201526064015b60405180910390fd5b610360828261096e565b5050565b606080828067ffffffffffffffff8111156103815761038161103b565b6040519080825280602002602001820160405280156103aa578160200160208202803683370190505b5092508067ffffffffffffffff8111156103c6576103c661103b565b6040519080825280602002602001820160405280156103f957816020015b60608152602001906001900390816103e45790505b50915060005b818110156104c1573086868381811061041a5761041a611051565b905060200281019061042c9190611067565b60405161043a9291906110b5565b600060405180830381855af49150503d8060008114610475576040519150601f19603f3d011682016040523d82523d6000602084013e61047a565b606091505b5085838151811061048d5761048d611051565b602002602001018584815181106104a6576104a6611051565b602090810291909101019190915290151590526001016103ff565b50509250929050565b6000816105195760405162461bcd60e51b815260206004820152601660248201527f526f6c65206465736372697074696f6e20656d70747900000000000000000000604482015260640161034d565b6105598484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506109f692505050565b60008181526020819052604090206001015490915061060057604080513360601b6bffffffffffffffffffffffff1916602080830191909152825160148184030181526034909201909252805191012084036105b8576105b833610611565b6105c28185610a4b565b83817f532ead3ec09896bef1351791fbaad86ac03f3204090a8e7f173f41414b1fdac08585336040516105f7939291906110c5565b60405180910390a35b61060a81336102a1565b9392505050565b6001600160a01b0381166106675760405162461bcd60e51b815260206004820152601460248201527f4d616e616765722061646472657373207a65726f000000000000000000000000604482015260640161034d565b604080516bffffffffffffffffffffffff19606084901b16602080830191909152825180830360140181526034909201835281519181019190912060008181528083528381206001600160a01b03861682529092529190205460ff16610360576106d181836108d0565b6001600160a01b038216817f875abd51165f03877e956b2e4342de31979d7dd8d271176cf24151278f355a1d336040516001600160a01b03909116815260200160405180910390a35050565b6060818067ffffffffffffffff8111156107395761073961103b565b60405190808252806020026020018201604052801561076c57816020015b60608152602001906001900390816107575790505b50915060005b818110156108965760003086868481811061078f5761078f611051565b90506020028101906107a19190611067565b6040516107af9291906110b5565b600060405180830381855af49150503d80600081146107ea576040519150601f19603f3d011682016040523d82523d6000602084013e6107ef565b606091505b5085848151811061080257610802611051565b602090810291909101015290508061088d57600084838151811061082857610828611051565b602002602001015190506000815111156108455780518082602001fd5b60405162461bcd60e51b815260206004820152601b60248201527f4d756c746963616c6c3a204e6f2072657665727420737472696e670000000000604482015260640161034d565b50600101610772565b505092915050565b6000828152602081905260409020600101546108b9816108c3565b6102c68383610a96565b6108cd8133610b15565b50565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16610360576000828152602081815260408083206001600160a01b03851684529091529020805460ff1916600117905561092a3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6001600160a01b03811633146109ec5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c660000000000000000000000000000000000606482015260840161034d565b6103608282610a96565b600061060a8383604051602001610a0d9190611107565b60408051601f198184030181528282528051602091820120838201949094528282019390935280518083038201815260609092019052805191012090565b600082815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1615610360576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1661036057610b4681610b88565b610b51836020610b9a565b604051602001610b62929190611123565b60408051601f198184030181529082905262461bcd60e51b825261034d916004016111a4565b606061029b6001600160a01b03831660145b60606000610ba98360026111cd565b610bb49060026111e4565b67ffffffffffffffff811115610bcc57610bcc61103b565b6040519080825280601f01601f191660200182016040528015610bf6576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110610c2d57610c2d611051565b60200101906001600160f81b031916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110610c7857610c78611051565b60200101906001600160f81b031916908160001a9053506000610c9c8460026111cd565b610ca79060016111e4565b90505b6001811115610d2c577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110610ce857610ce8611051565b1a60f81b828281518110610cfe57610cfe611051565b60200101906001600160f81b031916908160001a90535060049490941c93610d25816111f7565b9050610caa565b50831561060a5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161034d565b600060208284031215610d8d57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461060a57600080fd5b600060208284031215610dcf57600080fd5b5035919050565b80356001600160a01b0381168114610ded57600080fd5b919050565b60008060408385031215610e0557600080fd5b82359150610e1560208401610dd6565b90509250929050565b60008060208385031215610e3157600080fd5b823567ffffffffffffffff80821115610e4957600080fd5b818501915085601f830112610e5d57600080fd5b813581811115610e6c57600080fd5b8660208260051b8501011115610e8157600080fd5b60209290920196919550909350505050565b60005b83811015610eae578181015183820152602001610e96565b50506000910152565b60008151808452610ecf816020860160208601610e93565b601f01601f19169290920160200192915050565b600081518084526020808501808196508360051b8101915082860160005b85811015610f2b578284038952610f19848351610eb7565b98850198935090840190600101610f01565b5091979650505050505050565b604080825283519082018190526000906020906060840190828701845b82811015610f73578151151584529284019290840190600101610f55565b50505083810382850152610f878186610ee3565b9695505050505050565b600080600060408486031215610fa657600080fd5b83359250602084013567ffffffffffffffff80821115610fc557600080fd5b818601915086601f830112610fd957600080fd5b813581811115610fe857600080fd5b876020828501011115610ffa57600080fd5b6020830194508093505050509250925092565b60006020828403121561101f57600080fd5b61060a82610dd6565b60208152600061060a6020830184610ee3565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261107e57600080fd5b83018035915067ffffffffffffffff82111561109957600080fd5b6020019150368190038213156110ae57600080fd5b9250929050565b8183823760009101908152919050565b604081528260408201528284606083013760006060848301015260006060601f19601f86011683010190506001600160a01b0383166020830152949350505050565b60008251611119818460208701610e93565b9190910192915050565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161115b816017850160208801610e93565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351611198816028840160208801610e93565b01602801949350505050565b60208152600061060a6020830184610eb7565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761029b5761029b6111b7565b8082018082111561029b5761029b6111b7565b600081611206576112066111b7565b50600019019056fea2646970667358221220ae4f3421aaad5b1af12510ac03d7ec2649209de4471e48601a849e44cc2f1d5864736f6c63430008110033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100c95760003560e01c806373e9836211610081578063a217fddf1161005b578063a217fddf146101cd578063ac9650d8146101d5578063d547741f146101f557600080fd5b806373e98362146101705780637f7120fe1461018357806391d148541461019657600080fd5b80632f2ff15d116100b25780632f2ff15d1461012757806336568abe1461013c578063437b91161461014f57600080fd5b806301ffc9a7146100ce578063248a9ca3146100f6575b600080fd5b6100e16100dc366004610d7b565b610208565b60405190151581526020015b60405180910390f35b610119610104366004610dbd565b60009081526020819052604090206001015490565b6040519081526020016100ed565b61013a610135366004610df2565b6102a1565b005b61013a61014a366004610df2565b6102cb565b61016261015d366004610e1e565b610364565b6040516100ed929190610f38565b61011961017e366004610f91565b6104ca565b61013a61019136600461100d565b610611565b6100e16101a4366004610df2565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b610119600081565b6101e86101e3366004610e1e565b61071d565b6040516100ed9190611028565b61013a610203366004610df2565b61089e565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061029b57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6000828152602081905260409020600101546102bc816108c3565b6102c683836108d0565b505050565b60408051606083901b6bffffffffffffffffffffffff1916602080830191909152825160148184030181526034909201909252805191012082036103565760405162461bcd60e51b815260206004820152601c60248201527f726f6c6520697320726f6f7420726f6c65206f66206163636f756e740000000060448201526064015b60405180910390fd5b610360828261096e565b5050565b606080828067ffffffffffffffff8111156103815761038161103b565b6040519080825280602002602001820160405280156103aa578160200160208202803683370190505b5092508067ffffffffffffffff8111156103c6576103c661103b565b6040519080825280602002602001820160405280156103f957816020015b60608152602001906001900390816103e45790505b50915060005b818110156104c1573086868381811061041a5761041a611051565b905060200281019061042c9190611067565b60405161043a9291906110b5565b600060405180830381855af49150503d8060008114610475576040519150601f19603f3d011682016040523d82523d6000602084013e61047a565b606091505b5085838151811061048d5761048d611051565b602002602001018584815181106104a6576104a6611051565b602090810291909101019190915290151590526001016103ff565b50509250929050565b6000816105195760405162461bcd60e51b815260206004820152601660248201527f526f6c65206465736372697074696f6e20656d70747900000000000000000000604482015260640161034d565b6105598484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506109f692505050565b60008181526020819052604090206001015490915061060057604080513360601b6bffffffffffffffffffffffff1916602080830191909152825160148184030181526034909201909252805191012084036105b8576105b833610611565b6105c28185610a4b565b83817f532ead3ec09896bef1351791fbaad86ac03f3204090a8e7f173f41414b1fdac08585336040516105f7939291906110c5565b60405180910390a35b61060a81336102a1565b9392505050565b6001600160a01b0381166106675760405162461bcd60e51b815260206004820152601460248201527f4d616e616765722061646472657373207a65726f000000000000000000000000604482015260640161034d565b604080516bffffffffffffffffffffffff19606084901b16602080830191909152825180830360140181526034909201835281519181019190912060008181528083528381206001600160a01b03861682529092529190205460ff16610360576106d181836108d0565b6001600160a01b038216817f875abd51165f03877e956b2e4342de31979d7dd8d271176cf24151278f355a1d336040516001600160a01b03909116815260200160405180910390a35050565b6060818067ffffffffffffffff8111156107395761073961103b565b60405190808252806020026020018201604052801561076c57816020015b60608152602001906001900390816107575790505b50915060005b818110156108965760003086868481811061078f5761078f611051565b90506020028101906107a19190611067565b6040516107af9291906110b5565b600060405180830381855af49150503d80600081146107ea576040519150601f19603f3d011682016040523d82523d6000602084013e6107ef565b606091505b5085848151811061080257610802611051565b602090810291909101015290508061088d57600084838151811061082857610828611051565b602002602001015190506000815111156108455780518082602001fd5b60405162461bcd60e51b815260206004820152601b60248201527f4d756c746963616c6c3a204e6f2072657665727420737472696e670000000000604482015260640161034d565b50600101610772565b505092915050565b6000828152602081905260409020600101546108b9816108c3565b6102c68383610a96565b6108cd8133610b15565b50565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16610360576000828152602081815260408083206001600160a01b03851684529091529020805460ff1916600117905561092a3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6001600160a01b03811633146109ec5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c660000000000000000000000000000000000606482015260840161034d565b6103608282610a96565b600061060a8383604051602001610a0d9190611107565b60408051601f198184030181528282528051602091820120838201949094528282019390935280518083038201815260609092019052805191012090565b600082815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1615610360576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1661036057610b4681610b88565b610b51836020610b9a565b604051602001610b62929190611123565b60408051601f198184030181529082905262461bcd60e51b825261034d916004016111a4565b606061029b6001600160a01b03831660145b60606000610ba98360026111cd565b610bb49060026111e4565b67ffffffffffffffff811115610bcc57610bcc61103b565b6040519080825280601f01601f191660200182016040528015610bf6576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110610c2d57610c2d611051565b60200101906001600160f81b031916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110610c7857610c78611051565b60200101906001600160f81b031916908160001a9053506000610c9c8460026111cd565b610ca79060016111e4565b90505b6001811115610d2c577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110610ce857610ce8611051565b1a60f81b828281518110610cfe57610cfe611051565b60200101906001600160f81b031916908160001a90535060049490941c93610d25816111f7565b9050610caa565b50831561060a5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161034d565b600060208284031215610d8d57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461060a57600080fd5b600060208284031215610dcf57600080fd5b5035919050565b80356001600160a01b0381168114610ded57600080fd5b919050565b60008060408385031215610e0557600080fd5b82359150610e1560208401610dd6565b90509250929050565b60008060208385031215610e3157600080fd5b823567ffffffffffffffff80821115610e4957600080fd5b818501915085601f830112610e5d57600080fd5b813581811115610e6c57600080fd5b8660208260051b8501011115610e8157600080fd5b60209290920196919550909350505050565b60005b83811015610eae578181015183820152602001610e96565b50506000910152565b60008151808452610ecf816020860160208601610e93565b601f01601f19169290920160200192915050565b600081518084526020808501808196508360051b8101915082860160005b85811015610f2b578284038952610f19848351610eb7565b98850198935090840190600101610f01565b5091979650505050505050565b604080825283519082018190526000906020906060840190828701845b82811015610f73578151151584529284019290840190600101610f55565b50505083810382850152610f878186610ee3565b9695505050505050565b600080600060408486031215610fa657600080fd5b83359250602084013567ffffffffffffffff80821115610fc557600080fd5b818601915086601f830112610fd957600080fd5b813581811115610fe857600080fd5b876020828501011115610ffa57600080fd5b6020830194508093505050509250925092565b60006020828403121561101f57600080fd5b61060a82610dd6565b60208152600061060a6020830184610ee3565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261107e57600080fd5b83018035915067ffffffffffffffff82111561109957600080fd5b6020019150368190038213156110ae57600080fd5b9250929050565b8183823760009101908152919050565b604081528260408201528284606083013760006060848301015260006060601f19601f86011683010190506001600160a01b0383166020830152949350505050565b60008251611119818460208701610e93565b9190910192915050565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161115b816017850160208801610e93565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351611198816028840160208801610e93565b01602801949350505050565b60208152600061060a6020830184610eb7565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761029b5761029b6111b7565b8082018082111561029b5761029b6111b7565b600081611206576112066111b7565b50600019019056fea2646970667358221220ae4f3421aaad5b1af12510ac03d7ec2649209de4471e48601a849e44cc2f1d5864736f6c63430008110033", + "devdoc": { + "details": "Each user is called a \"manager\", and is the only member of their root role. Starting from this root role, they can create an arbitrary tree of roles and grant these to accounts. Each role has a description, and roles adminned by the same role cannot have the same description.", + "kind": "dev", + "methods": { + "getRoleAdmin(bytes32)": { + "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}." + }, + "grantRole(bytes32,address)": { + "details": "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." + }, + "hasRole(bytes32,address)": { + "details": "Returns `true` if `account` has been granted `role`." + }, + "initializeManager(address)": { + "details": "Anyone can initialize a manager. An uninitialized manager attempting to initialize a role will be initialized automatically. Once a manager is initialized, subsequent initializations have no effect.", + "params": { + "manager": "Manager address to be initialized" + } + }, + "initializeRoleAndGrantToSender(bytes32,string)": { + "details": "If the sender should not have the initialized role, they should explicitly renounce it after initializing it. Once a role is initialized, subsequent initializations have no effect other than granting the role to the sender. The sender must be a member of `adminRole`. `adminRole` value is not validated because the sender cannot have the `bytes32(0)` role. If the sender is an uninitialized manager that is initializing a role directly under their root role, manager initialization will happen automatically, which will grant the sender `adminRole` and allow them to initialize the role.", + "params": { + "adminRole": "Admin role to be assigned to the initialized role", + "description": "Human-readable description of the initialized role" + }, + "returns": { + "role": "Initialized role" + } + }, + "multicall(bytes[])": { + "params": { + "data": "Array of calldata of batched calls" + }, + "returns": { + "returndata": "Array of returndata of batched calls" + } + }, + "renounceRole(bytes32,address)": { + "details": "Overriden to disallow managers from renouncing their root roles. `role` and `account` are not validated because `AccessControl.renounceRole` will revert if either of them is zero.", + "params": { + "account": "Account to renounce the role", + "role": "Role to be renounced" + } + }, + "revokeRole(bytes32,address)": { + "details": "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." + }, + "supportsInterface(bytes4)": { + "details": "See {IERC165-supportsInterface}." + }, + "tryMulticall(bytes[])": { + "params": { + "data": "Array of calldata of batched calls" + }, + "returns": { + "returndata": "Array of returndata of batched calls", + "successes": "Array of success conditions of batched calls" + } + } + }, + "title": "Contract that allows users to manage independent, tree-shaped access control tables", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "initializeManager(address)": { + "notice": "Initializes the manager by initializing its root role and granting it to them" + }, + "initializeRoleAndGrantToSender(bytes32,string)": { + "notice": "Initializes a role by setting its admin role and grants it to the sender" + }, + "multicall(bytes[])": { + "notice": "Batches calls to the inheriting contract and reverts as soon as one of the batched calls reverts" + }, + "renounceRole(bytes32,address)": { + "notice": "Called by the account to renounce the role" + }, + "tryMulticall(bytes[])": { + "notice": "Batches calls to the inheriting contract but does not revert if any of the batched calls reverts" + } + }, + "notice": "Multiple contracts can refer to this contract to check if their users have granted accounts specific roles. Therefore, it aims to keep all access control roles of its users in this single contract.", + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 11627, + "contract": "contracts/access/AccessControlRegistry.sol:AccessControlRegistry", + "label": "_roles", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_bytes32,t_struct(RoleData)11622_storage)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_bool)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_mapping(t_bytes32,t_struct(RoleData)11622_storage)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => struct AccessControl.RoleData)", + "numberOfBytes": "32", + "value": "t_struct(RoleData)11622_storage" + }, + "t_struct(RoleData)11622_storage": { + "encoding": "inplace", + "label": "struct AccessControl.RoleData", + "members": [ + { + "astId": 11619, + "contract": "contracts/access/AccessControlRegistry.sol:AccessControlRegistry", + "label": "members", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_bool)" + }, + { + "astId": 11621, + "contract": "contracts/access/AccessControlRegistry.sol:AccessControlRegistry", + "label": "adminRole", + "offset": 0, + "slot": "1", + "type": "t_bytes32" + } + ], + "numberOfBytes": "64" + } + } + } +} diff --git a/deployments/oev-network/Api3ServerV1.json b/deployments/oev-network/Api3ServerV1.json new file mode 100644 index 0000000..68ecf96 --- /dev/null +++ b/deployments/oev-network/Api3ServerV1.json @@ -0,0 +1,1137 @@ +{ + "address": "0x709944a48cAf83535e43471680fDA4905FB3920a", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_accessControlRegistry", + "type": "address" + }, + { + "internalType": "string", + "name": "_adminRoleDescription", + "type": "string" + }, + { + "internalType": "address", + "name": "_manager", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "dataFeedId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "dapiName", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "SetDapiName", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "beaconSetId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "int224", + "name": "value", + "type": "int224" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "timestamp", + "type": "uint32" + } + ], + "name": "UpdatedBeaconSetWithBeacons", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "beaconId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "int224", + "name": "value", + "type": "int224" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "timestamp", + "type": "uint32" + } + ], + "name": "UpdatedBeaconWithSignedData", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "beaconSetId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "proxy", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "updateId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "int224", + "name": "value", + "type": "int224" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "timestamp", + "type": "uint32" + } + ], + "name": "UpdatedOevProxyBeaconSetWithSignedData", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "beaconId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "proxy", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "updateId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "int224", + "name": "value", + "type": "int224" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "timestamp", + "type": "uint32" + } + ], + "name": "UpdatedOevProxyBeaconWithSignedData", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "oevProxy", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "oevBeneficiary", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Withdrew", + "type": "event" + }, + { + "inputs": [], + "name": "DAPI_NAME_SETTER_ROLE_DESCRIPTION", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "accessControlRegistry", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "adminRole", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "adminRoleDescription", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "containsBytecode", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "dapiNameHashToDataFeedId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "dapiNameSetterRole", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "dapiName", + "type": "bytes32" + } + ], + "name": "dapiNameToDataFeedId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "dataFeedId", + "type": "bytes32" + } + ], + "name": "dataFeeds", + "outputs": [ + { + "internalType": "int224", + "name": "value", + "type": "int224" + }, + { + "internalType": "uint32", + "name": "timestamp", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "getBalance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getBlockBasefee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getBlockNumber", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getBlockTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getChainId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "manager", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "data", + "type": "bytes[]" + } + ], + "name": "multicall", + "outputs": [ + { + "internalType": "bytes[]", + "name": "returndata", + "type": "bytes[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "oevProxyToBalance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "proxy", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "dataFeedId", + "type": "bytes32" + } + ], + "name": "oevProxyToIdToDataFeed", + "outputs": [ + { + "internalType": "int224", + "name": "value", + "type": "int224" + }, + { + "internalType": "uint32", + "name": "timestamp", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "dapiNameHash", + "type": "bytes32" + } + ], + "name": "readDataFeedWithDapiNameHash", + "outputs": [ + { + "internalType": "int224", + "name": "value", + "type": "int224" + }, + { + "internalType": "uint32", + "name": "timestamp", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "dapiNameHash", + "type": "bytes32" + } + ], + "name": "readDataFeedWithDapiNameHashAsOevProxy", + "outputs": [ + { + "internalType": "int224", + "name": "value", + "type": "int224" + }, + { + "internalType": "uint32", + "name": "timestamp", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "dataFeedId", + "type": "bytes32" + } + ], + "name": "readDataFeedWithId", + "outputs": [ + { + "internalType": "int224", + "name": "value", + "type": "int224" + }, + { + "internalType": "uint32", + "name": "timestamp", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "dataFeedId", + "type": "bytes32" + } + ], + "name": "readDataFeedWithIdAsOevProxy", + "outputs": [ + { + "internalType": "int224", + "name": "value", + "type": "int224" + }, + { + "internalType": "uint32", + "name": "timestamp", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "dapiName", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "dataFeedId", + "type": "bytes32" + } + ], + "name": "setDapiName", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "data", + "type": "bytes[]" + } + ], + "name": "tryMulticall", + "outputs": [ + { + "internalType": "bool[]", + "name": "successes", + "type": "bool[]" + }, + { + "internalType": "bytes[]", + "name": "returndata", + "type": "bytes[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "beaconIds", + "type": "bytes32[]" + } + ], + "name": "updateBeaconSetWithBeacons", + "outputs": [ + { + "internalType": "bytes32", + "name": "beaconSetId", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "airnode", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "templateId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ], + "name": "updateBeaconWithSignedData", + "outputs": [ + { + "internalType": "bytes32", + "name": "beaconId", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "oevProxy", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "dataFeedId", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "updateId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "bytes[]", + "name": "packedOevUpdateSignatures", + "type": "bytes[]" + } + ], + "name": "updateOevProxyDataFeedWithSignedData", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "oevProxy", + "type": "address" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x8d4b7763812eae369d3c4311da9f84973aa47d656dbea6b2a383ea6729bb36f3", + "receipt": { + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "from": "0x07b589f06bD0A5324c4E2376d66d2F4F25921DE1", + "contractAddress": null, + "transactionIndex": 1, + "gasUsed": "3027569", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x6429062ae5bce3a9fc12b0a52148c4f0d252befeb4ffb642d5643d6007b94949", + "transactionHash": "0x8d4b7763812eae369d3c4311da9f84973aa47d656dbea6b2a383ea6729bb36f3", + "logs": [], + "blockNumber": 28, + "cumulativeGasUsed": "3027569", + "status": 1, + "byzantium": true + }, + "args": [ + "0xcD7Df573B0F0bb4F2f8dFFF6650cDe8C77431730", + "Api3ServerV1 admin", + "0x81bc85f329cDB28936FbB239f734AE495121F9A6" + ], + "numDeployments": 1, + "solcInputHash": "244b8e05fc2166c1983c7be433cf9254", + "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_accessControlRegistry\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_adminRoleDescription\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_manager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"dataFeedId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"dapiName\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SetDapiName\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"beaconSetId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"int224\",\"name\":\"value\",\"type\":\"int224\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"name\":\"UpdatedBeaconSetWithBeacons\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"beaconId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"int224\",\"name\":\"value\",\"type\":\"int224\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"name\":\"UpdatedBeaconWithSignedData\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"beaconSetId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"proxy\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"updateId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"int224\",\"name\":\"value\",\"type\":\"int224\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"name\":\"UpdatedOevProxyBeaconSetWithSignedData\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"beaconId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"proxy\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"updateId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"int224\",\"name\":\"value\",\"type\":\"int224\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"name\":\"UpdatedOevProxyBeaconWithSignedData\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oevProxy\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oevBeneficiary\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdrew\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DAPI_NAME_SETTER_ROLE_DESCRIPTION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"accessControlRegistry\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"adminRole\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"adminRoleDescription\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"containsBytecode\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"dapiNameHashToDataFeedId\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"dapiNameSetterRole\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"dapiName\",\"type\":\"bytes32\"}],\"name\":\"dapiNameToDataFeedId\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"dataFeedId\",\"type\":\"bytes32\"}],\"name\":\"dataFeeds\",\"outputs\":[{\"internalType\":\"int224\",\"name\":\"value\",\"type\":\"int224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBlockBasefee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBlockTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getChainId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"manager\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"data\",\"type\":\"bytes[]\"}],\"name\":\"multicall\",\"outputs\":[{\"internalType\":\"bytes[]\",\"name\":\"returndata\",\"type\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"oevProxyToBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proxy\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"dataFeedId\",\"type\":\"bytes32\"}],\"name\":\"oevProxyToIdToDataFeed\",\"outputs\":[{\"internalType\":\"int224\",\"name\":\"value\",\"type\":\"int224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"dapiNameHash\",\"type\":\"bytes32\"}],\"name\":\"readDataFeedWithDapiNameHash\",\"outputs\":[{\"internalType\":\"int224\",\"name\":\"value\",\"type\":\"int224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"dapiNameHash\",\"type\":\"bytes32\"}],\"name\":\"readDataFeedWithDapiNameHashAsOevProxy\",\"outputs\":[{\"internalType\":\"int224\",\"name\":\"value\",\"type\":\"int224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"dataFeedId\",\"type\":\"bytes32\"}],\"name\":\"readDataFeedWithId\",\"outputs\":[{\"internalType\":\"int224\",\"name\":\"value\",\"type\":\"int224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"dataFeedId\",\"type\":\"bytes32\"}],\"name\":\"readDataFeedWithIdAsOevProxy\",\"outputs\":[{\"internalType\":\"int224\",\"name\":\"value\",\"type\":\"int224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"dapiName\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"dataFeedId\",\"type\":\"bytes32\"}],\"name\":\"setDapiName\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"data\",\"type\":\"bytes[]\"}],\"name\":\"tryMulticall\",\"outputs\":[{\"internalType\":\"bool[]\",\"name\":\"successes\",\"type\":\"bool[]\"},{\"internalType\":\"bytes[]\",\"name\":\"returndata\",\"type\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"beaconIds\",\"type\":\"bytes32[]\"}],\"name\":\"updateBeaconSetWithBeacons\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"beaconSetId\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"airnode\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"templateId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"updateBeaconWithSignedData\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"beaconId\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"oevProxy\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"dataFeedId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"updateId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes[]\",\"name\":\"packedOevUpdateSignatures\",\"type\":\"bytes[]\"}],\"name\":\"updateOevProxyDataFeedWithSignedData\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"oevProxy\",\"type\":\"address\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_accessControlRegistry\":\"AccessControlRegistry contract address\",\"_adminRoleDescription\":\"Admin role description\",\"_manager\":\"Manager address\"}},\"containsBytecode(address)\":{\"details\":\"An account not containing any bytecode does not indicate that it is an EOA or it will not contain any bytecode in the future. Contract construction and `SELFDESTRUCT` updates the bytecode at the end of the transaction.\",\"returns\":{\"_0\":\"If the account contains bytecode\"}},\"dapiNameToDataFeedId(bytes32)\":{\"params\":{\"dapiName\":\"dAPI name\"},\"returns\":{\"_0\":\"Data feed ID\"}},\"getBalance(address)\":{\"params\":{\"account\":\"Account address\"},\"returns\":{\"_0\":\"Account balance\"}},\"getBlockBasefee()\":{\"returns\":{\"_0\":\"Current block basefee\"}},\"getBlockNumber()\":{\"returns\":{\"_0\":\"Current block number\"}},\"getBlockTimestamp()\":{\"returns\":{\"_0\":\"Current block timestamp\"}},\"getChainId()\":{\"returns\":{\"_0\":\"Chain ID\"}},\"multicall(bytes[])\":{\"params\":{\"data\":\"Array of calldata of batched calls\"},\"returns\":{\"returndata\":\"Array of returndata of batched calls\"}},\"readDataFeedWithDapiNameHash(bytes32)\":{\"params\":{\"dapiNameHash\":\"dAPI name hash\"},\"returns\":{\"timestamp\":\"Data feed timestamp\",\"value\":\"Data feed value\"}},\"readDataFeedWithDapiNameHashAsOevProxy(bytes32)\":{\"params\":{\"dapiNameHash\":\"dAPI name hash\"},\"returns\":{\"timestamp\":\"Data feed timestamp\",\"value\":\"Data feed value\"}},\"readDataFeedWithId(bytes32)\":{\"params\":{\"dataFeedId\":\"Data feed ID\"},\"returns\":{\"timestamp\":\"Data feed timestamp\",\"value\":\"Data feed value\"}},\"readDataFeedWithIdAsOevProxy(bytes32)\":{\"params\":{\"dataFeedId\":\"Data feed ID\"},\"returns\":{\"timestamp\":\"Data feed timestamp\",\"value\":\"Data feed value\"}},\"setDapiName(bytes32,bytes32)\":{\"details\":\"While a data feed ID refers to a specific Beacon or Beacon set, dAPI names provide a more abstract interface for convenience. This means a dAPI name that was pointing to a Beacon can be pointed to a Beacon set, then another Beacon set, etc.\",\"params\":{\"dapiName\":\"Human-readable dAPI name\",\"dataFeedId\":\"Data feed ID the dAPI name will point to\"}},\"tryMulticall(bytes[])\":{\"params\":{\"data\":\"Array of calldata of batched calls\"},\"returns\":{\"returndata\":\"Array of returndata of batched calls\",\"successes\":\"Array of success conditions of batched calls\"}},\"updateBeaconSetWithBeacons(bytes32[])\":{\"details\":\"As an oddity, this function still works if some of the IDs in `beaconIds` belong to Beacon sets rather than Beacons. This can be used to implement hierarchical Beacon sets.\",\"params\":{\"beaconIds\":\"Beacon IDs\"},\"returns\":{\"beaconSetId\":\"Beacon set ID\"}},\"updateBeaconWithSignedData(address,bytes32,uint256,bytes,bytes)\":{\"details\":\"The signed data here is intentionally very general for practical reasons. It is less demanding on the signer to have data signed once and use that everywhere.\",\"params\":{\"airnode\":\"Airnode address\",\"data\":\"Update data (an `int256` encoded in contract ABI)\",\"signature\":\"Template ID, timestamp and the update data signed by the Airnode\",\"templateId\":\"Template ID\",\"timestamp\":\"Signature timestamp\"},\"returns\":{\"beaconId\":\"Updated Beacon ID\"}},\"updateOevProxyDataFeedWithSignedData(address,bytes32,bytes32,uint256,bytes,bytes[])\":{\"details\":\"For when the data feed being updated is a Beacon set, an absolute majority of the Airnodes that power the respective Beacons must sign the aggregated value and timestamp. While doing so, the Airnodes should refer to data signed to update an absolute majority of the respective Beacons. The Airnodes should require the data to be fresh enough (e.g., at most 2 minutes-old), and tightly distributed around the resulting aggregation (e.g., within 1% deviation), and reject to provide an OEV proxy data feed update signature if these are not satisfied.\",\"params\":{\"data\":\"Update data (an `int256` encoded in contract ABI)\",\"dataFeedId\":\"Data feed ID\",\"oevProxy\":\"OEV proxy that reads the data feed\",\"packedOevUpdateSignatures\":\"Packed OEV update signatures, which include the Airnode address, template ID and these signed with the OEV update hash\",\"timestamp\":\"Signature timestamp\",\"updateId\":\"Update ID\"}},\"withdraw(address)\":{\"details\":\"This does not require the caller to be the beneficiary because we expect that in most cases, the OEV beneficiary will be a contract that will not be able to make arbitrary calls. Our choice can be worked around by implementing a beneficiary proxy.\",\"params\":{\"oevProxy\":\"OEV proxy\"}}},\"title\":\"First version of the contract that API3 uses to serve data feeds\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"DAPI_NAME_SETTER_ROLE_DESCRIPTION()\":{\"notice\":\"dAPI name setter role description\"},\"accessControlRegistry()\":{\"notice\":\"AccessControlRegistry contract address\"},\"adminRole()\":{\"notice\":\"Admin role\"},\"adminRoleDescription()\":{\"notice\":\"Admin role description\"},\"containsBytecode(address)\":{\"notice\":\"Returns if the account contains bytecode\"},\"dapiNameHashToDataFeedId(bytes32)\":{\"notice\":\"dAPI name hash mapped to the data feed ID\"},\"dapiNameSetterRole()\":{\"notice\":\"dAPI name setter role\"},\"dapiNameToDataFeedId(bytes32)\":{\"notice\":\"Returns the data feed ID the dAPI name is set to\"},\"getBalance(address)\":{\"notice\":\"Returns the account balance\"},\"getBlockBasefee()\":{\"notice\":\"Returns the current block basefee\"},\"getBlockNumber()\":{\"notice\":\"Returns the current block number\"},\"getBlockTimestamp()\":{\"notice\":\"Returns the current block timestamp\"},\"getChainId()\":{\"notice\":\"Returns the chain ID\"},\"manager()\":{\"notice\":\"Address of the manager that manages the related AccessControlRegistry roles\"},\"multicall(bytes[])\":{\"notice\":\"Batches calls to the inheriting contract and reverts as soon as one of the batched calls reverts\"},\"oevProxyToBalance(address)\":{\"notice\":\"Accumulated OEV auction proceeds for the specific proxy\"},\"readDataFeedWithDapiNameHash(bytes32)\":{\"notice\":\"Reads the data feed with dAPI name hash\"},\"readDataFeedWithDapiNameHashAsOevProxy(bytes32)\":{\"notice\":\"Reads the data feed as the OEV proxy with dAPI name hash\"},\"readDataFeedWithId(bytes32)\":{\"notice\":\"Reads the data feed with ID\"},\"readDataFeedWithIdAsOevProxy(bytes32)\":{\"notice\":\"Reads the data feed as the OEV proxy with ID\"},\"setDapiName(bytes32,bytes32)\":{\"notice\":\"Sets the data feed ID the dAPI name points to\"},\"tryMulticall(bytes[])\":{\"notice\":\"Batches calls to the inheriting contract but does not revert if any of the batched calls reverts\"},\"updateBeaconSetWithBeacons(bytes32[])\":{\"notice\":\"Updates the Beacon set using the current values of its Beacons\"},\"updateBeaconWithSignedData(address,bytes32,uint256,bytes,bytes)\":{\"notice\":\"Updates a Beacon using data signed by the Airnode\"},\"updateOevProxyDataFeedWithSignedData(address,bytes32,bytes32,uint256,bytes,bytes[])\":{\"notice\":\"Updates a data feed that the OEV proxy reads using the aggregation signed by the absolute majority of the respective Airnodes for the specific bid\"},\"withdraw(address)\":{\"notice\":\"Withdraws the balance of the OEV proxy to the respective beneficiary account\"}},\"notice\":\"Api3ServerV1 serves data feeds in the form of Beacons, Beacon sets, dAPIs, with optional OEV support for all of these. The base Beacons are only updateable using signed data, and the Beacon sets are updateable based on the Beacons, optionally using PSP. OEV proxy Beacons and Beacon sets are updateable using OEV-signed data. Api3ServerV1 does not support Beacons to be updated using RRP or PSP.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/api3-server-v1/Api3ServerV1.sol\":\"Api3ServerV1\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000},\"remappings\":[]},\"sources\":{\"contracts/access/AccessControlRegistryAdminned.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/SelfMulticall.sol\\\";\\nimport \\\"./RoleDeriver.sol\\\";\\nimport \\\"./interfaces/IAccessControlRegistryAdminned.sol\\\";\\nimport \\\"./interfaces/IAccessControlRegistry.sol\\\";\\n\\n/// @title Contract to be inherited by contracts whose adminship functionality\\n/// will be implemented using AccessControlRegistry\\ncontract AccessControlRegistryAdminned is\\n SelfMulticall,\\n RoleDeriver,\\n IAccessControlRegistryAdminned\\n{\\n /// @notice AccessControlRegistry contract address\\n address public immutable override accessControlRegistry;\\n\\n /// @notice Admin role description\\n string public override adminRoleDescription;\\n\\n bytes32 internal immutable adminRoleDescriptionHash;\\n\\n /// @dev Contracts deployed with the same admin role descriptions will have\\n /// the same roles, meaning that granting an account a role will authorize\\n /// it in multiple contracts. Unless you want your deployed contract to\\n /// share the role configuration of another contract, use a unique admin\\n /// role description.\\n /// @param _accessControlRegistry AccessControlRegistry contract address\\n /// @param _adminRoleDescription Admin role description\\n constructor(\\n address _accessControlRegistry,\\n string memory _adminRoleDescription\\n ) {\\n require(_accessControlRegistry != address(0), \\\"ACR address zero\\\");\\n require(\\n bytes(_adminRoleDescription).length > 0,\\n \\\"Admin role description empty\\\"\\n );\\n accessControlRegistry = _accessControlRegistry;\\n adminRoleDescription = _adminRoleDescription;\\n adminRoleDescriptionHash = keccak256(\\n abi.encodePacked(_adminRoleDescription)\\n );\\n }\\n\\n /// @notice Derives the admin role for the specific manager address\\n /// @param manager Manager address\\n /// @return adminRole Admin role\\n function _deriveAdminRole(\\n address manager\\n ) internal view returns (bytes32 adminRole) {\\n adminRole = _deriveRole(\\n _deriveRootRole(manager),\\n adminRoleDescriptionHash\\n );\\n }\\n}\\n\",\"keccak256\":\"0x813755d99a9d8dd6298720da68fb5a6dd69329ea2dec91da1d09f715d4543c15\",\"license\":\"MIT\"},\"contracts/access/AccessControlRegistryAdminnedWithManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./AccessControlRegistryAdminned.sol\\\";\\nimport \\\"./interfaces/IAccessControlRegistryAdminnedWithManager.sol\\\";\\n\\n/// @title Contract to be inherited by contracts with manager whose adminship\\n/// functionality will be implemented using AccessControlRegistry\\n/// @notice The manager address here is expected to belong to an\\n/// AccessControlRegistry user that is a multisig/DAO\\ncontract AccessControlRegistryAdminnedWithManager is\\n AccessControlRegistryAdminned,\\n IAccessControlRegistryAdminnedWithManager\\n{\\n /// @notice Address of the manager that manages the related\\n /// AccessControlRegistry roles\\n /// @dev The mutability of the manager role can be implemented by\\n /// designating an OwnableCallForwarder contract as the manager. The\\n /// ownership of this contract can then be transferred, effectively\\n /// transferring managership.\\n address public immutable override manager;\\n\\n /// @notice Admin role\\n /// @dev Since `manager` is immutable, so is `adminRole`\\n bytes32 public immutable override adminRole;\\n\\n /// @param _accessControlRegistry AccessControlRegistry contract address\\n /// @param _adminRoleDescription Admin role description\\n /// @param _manager Manager address\\n constructor(\\n address _accessControlRegistry,\\n string memory _adminRoleDescription,\\n address _manager\\n )\\n AccessControlRegistryAdminned(\\n _accessControlRegistry,\\n _adminRoleDescription\\n )\\n {\\n require(_manager != address(0), \\\"Manager address zero\\\");\\n manager = _manager;\\n adminRole = _deriveAdminRole(_manager);\\n }\\n}\\n\",\"keccak256\":\"0xbe5df884327dd7d4e236c105b6ef52cc6db20b452f4cdbe6c50fa506ed66cace\",\"license\":\"MIT\"},\"contracts/access/RoleDeriver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n/// @title Contract to be inherited by contracts that will derive\\n/// AccessControlRegistry roles\\n/// @notice If a contract interfaces with AccessControlRegistry and needs to\\n/// derive roles, it should inherit this contract instead of re-implementing\\n/// the logic\\ncontract RoleDeriver {\\n /// @notice Derives the root role of the manager\\n /// @param manager Manager address\\n /// @return rootRole Root role\\n function _deriveRootRole(\\n address manager\\n ) internal pure returns (bytes32 rootRole) {\\n rootRole = keccak256(abi.encodePacked(manager));\\n }\\n\\n /// @notice Derives the role using its admin role and description\\n /// @dev This implies that roles adminned by the same role cannot have the\\n /// same description\\n /// @param adminRole Admin role\\n /// @param description Human-readable description of the role\\n /// @return role Role\\n function _deriveRole(\\n bytes32 adminRole,\\n string memory description\\n ) internal pure returns (bytes32 role) {\\n role = _deriveRole(adminRole, keccak256(abi.encodePacked(description)));\\n }\\n\\n /// @notice Derives the role using its admin role and description hash\\n /// @dev This implies that roles adminned by the same role cannot have the\\n /// same description\\n /// @param adminRole Admin role\\n /// @param descriptionHash Hash of the human-readable description of the\\n /// role\\n /// @return role Role\\n function _deriveRole(\\n bytes32 adminRole,\\n bytes32 descriptionHash\\n ) internal pure returns (bytes32 role) {\\n role = keccak256(abi.encodePacked(adminRole, descriptionHash));\\n }\\n}\\n\",\"keccak256\":\"0x488adb3cb7031415d4a195230753a0ac8f9f610e6db7a571529a350e29c97ed6\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControlRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../vendor/@openzeppelin/contracts@4.8.2/access/IAccessControl.sol\\\";\\nimport \\\"../../utils/interfaces/ISelfMulticall.sol\\\";\\n\\ninterface IAccessControlRegistry is IAccessControl, ISelfMulticall {\\n event InitializedManager(\\n bytes32 indexed rootRole,\\n address indexed manager,\\n address sender\\n );\\n\\n event InitializedRole(\\n bytes32 indexed role,\\n bytes32 indexed adminRole,\\n string description,\\n address sender\\n );\\n\\n function initializeManager(address manager) external;\\n\\n function initializeRoleAndGrantToSender(\\n bytes32 adminRole,\\n string calldata description\\n ) external returns (bytes32 role);\\n}\\n\",\"keccak256\":\"0x87066db894a24118df39a557d00c0a6529c39196011c03f809ca8cce1644e027\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControlRegistryAdminned.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/interfaces/ISelfMulticall.sol\\\";\\n\\ninterface IAccessControlRegistryAdminned is ISelfMulticall {\\n function accessControlRegistry() external view returns (address);\\n\\n function adminRoleDescription() external view returns (string memory);\\n}\\n\",\"keccak256\":\"0xd71aae2566c019a9b2da5e1ec51421a62898495fa6fd08e2cc39451511dda334\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControlRegistryAdminnedWithManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControlRegistryAdminned.sol\\\";\\n\\ninterface IAccessControlRegistryAdminnedWithManager is\\n IAccessControlRegistryAdminned\\n{\\n function manager() external view returns (address);\\n\\n function adminRole() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x8a8e1756fca81175305755b7a311536132e88173f60b2ac0fdeef92a6236afc5\",\"license\":\"MIT\"},\"contracts/api3-server-v1/Api3ServerV1.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.17;\\n\\nimport \\\"./OevDapiServer.sol\\\";\\nimport \\\"./BeaconUpdatesWithSignedData.sol\\\";\\nimport \\\"./interfaces/IApi3ServerV1.sol\\\";\\n\\n/// @title First version of the contract that API3 uses to serve data feeds\\n/// @notice Api3ServerV1 serves data feeds in the form of Beacons, Beacon sets,\\n/// dAPIs, with optional OEV support for all of these.\\n/// The base Beacons are only updateable using signed data, and the Beacon sets\\n/// are updateable based on the Beacons, optionally using PSP. OEV proxy\\n/// Beacons and Beacon sets are updateable using OEV-signed data.\\n/// Api3ServerV1 does not support Beacons to be updated using RRP or PSP.\\ncontract Api3ServerV1 is\\n OevDapiServer,\\n BeaconUpdatesWithSignedData,\\n IApi3ServerV1\\n{\\n /// @param _accessControlRegistry AccessControlRegistry contract address\\n /// @param _adminRoleDescription Admin role description\\n /// @param _manager Manager address\\n constructor(\\n address _accessControlRegistry,\\n string memory _adminRoleDescription,\\n address _manager\\n ) OevDapiServer(_accessControlRegistry, _adminRoleDescription, _manager) {}\\n\\n /// @notice Reads the data feed with ID\\n /// @param dataFeedId Data feed ID\\n /// @return value Data feed value\\n /// @return timestamp Data feed timestamp\\n function readDataFeedWithId(\\n bytes32 dataFeedId\\n ) external view override returns (int224 value, uint32 timestamp) {\\n return _readDataFeedWithId(dataFeedId);\\n }\\n\\n /// @notice Reads the data feed with dAPI name hash\\n /// @param dapiNameHash dAPI name hash\\n /// @return value Data feed value\\n /// @return timestamp Data feed timestamp\\n function readDataFeedWithDapiNameHash(\\n bytes32 dapiNameHash\\n ) external view override returns (int224 value, uint32 timestamp) {\\n return _readDataFeedWithDapiNameHash(dapiNameHash);\\n }\\n\\n /// @notice Reads the data feed as the OEV proxy with ID\\n /// @param dataFeedId Data feed ID\\n /// @return value Data feed value\\n /// @return timestamp Data feed timestamp\\n function readDataFeedWithIdAsOevProxy(\\n bytes32 dataFeedId\\n ) external view override returns (int224 value, uint32 timestamp) {\\n return _readDataFeedWithIdAsOevProxy(dataFeedId);\\n }\\n\\n /// @notice Reads the data feed as the OEV proxy with dAPI name hash\\n /// @param dapiNameHash dAPI name hash\\n /// @return value Data feed value\\n /// @return timestamp Data feed timestamp\\n function readDataFeedWithDapiNameHashAsOevProxy(\\n bytes32 dapiNameHash\\n ) external view override returns (int224 value, uint32 timestamp) {\\n return _readDataFeedWithDapiNameHashAsOevProxy(dapiNameHash);\\n }\\n\\n function dataFeeds(\\n bytes32 dataFeedId\\n ) external view override returns (int224 value, uint32 timestamp) {\\n DataFeed storage dataFeed = _dataFeeds[dataFeedId];\\n (value, timestamp) = (dataFeed.value, dataFeed.timestamp);\\n }\\n\\n function oevProxyToIdToDataFeed(\\n address proxy,\\n bytes32 dataFeedId\\n ) external view override returns (int224 value, uint32 timestamp) {\\n DataFeed storage dataFeed = _oevProxyToIdToDataFeed[proxy][dataFeedId];\\n (value, timestamp) = (dataFeed.value, dataFeed.timestamp);\\n }\\n}\\n\",\"keccak256\":\"0xa9100269a781dbc267a1de630d333b475efc13cc87bf906de23c21a972a03f41\",\"license\":\"MIT\"},\"contracts/api3-server-v1/BeaconUpdatesWithSignedData.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.17;\\n\\nimport \\\"./DataFeedServer.sol\\\";\\nimport \\\"./interfaces/IBeaconUpdatesWithSignedData.sol\\\";\\nimport \\\"../vendor/@openzeppelin/contracts@4.8.2/utils/cryptography/ECDSA.sol\\\";\\n\\n/// @title Contract that updates Beacons using signed data\\ncontract BeaconUpdatesWithSignedData is\\n DataFeedServer,\\n IBeaconUpdatesWithSignedData\\n{\\n using ECDSA for bytes32;\\n\\n /// @notice Updates a Beacon using data signed by the Airnode\\n /// @dev The signed data here is intentionally very general for practical\\n /// reasons. It is less demanding on the signer to have data signed once\\n /// and use that everywhere.\\n /// @param airnode Airnode address\\n /// @param templateId Template ID\\n /// @param timestamp Signature timestamp\\n /// @param data Update data (an `int256` encoded in contract ABI)\\n /// @param signature Template ID, timestamp and the update data signed by\\n /// the Airnode\\n /// @return beaconId Updated Beacon ID\\n function updateBeaconWithSignedData(\\n address airnode,\\n bytes32 templateId,\\n uint256 timestamp,\\n bytes calldata data,\\n bytes calldata signature\\n ) external override returns (bytes32 beaconId) {\\n require(\\n (\\n keccak256(abi.encodePacked(templateId, timestamp, data))\\n .toEthSignedMessageHash()\\n ).recover(signature) == airnode,\\n \\\"Signature mismatch\\\"\\n );\\n beaconId = deriveBeaconId(airnode, templateId);\\n int224 updatedValue = processBeaconUpdate(beaconId, timestamp, data);\\n emit UpdatedBeaconWithSignedData(\\n beaconId,\\n updatedValue,\\n uint32(timestamp)\\n );\\n }\\n}\\n\",\"keccak256\":\"0xc5caacfa234d89c20a1e4493acbe6256c684558deb5a57a25cfb6314e99895be\",\"license\":\"MIT\"},\"contracts/api3-server-v1/DapiServer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.17;\\n\\nimport \\\"../access/AccessControlRegistryAdminnedWithManager.sol\\\";\\nimport \\\"./DataFeedServer.sol\\\";\\nimport \\\"./interfaces/IDapiServer.sol\\\";\\n\\n/// @title Contract that serves dAPIs mapped to Beacons and Beacon sets\\n/// @notice Beacons and Beacon sets are addressed by immutable IDs. Although\\n/// this is trust-minimized, it requires users to manage the ID of the data\\n/// feed they are using. For when the user does not want to do this, dAPIs can\\n/// be used as an abstraction layer. By using a dAPI, the user delegates this\\n/// responsibility to dAPI management. It is important for dAPI management to\\n/// be restricted by consensus rules (by using a multisig or a DAO) and similar\\n/// trustless security mechanisms.\\ncontract DapiServer is\\n AccessControlRegistryAdminnedWithManager,\\n DataFeedServer,\\n IDapiServer\\n{\\n /// @notice dAPI name setter role description\\n string public constant override DAPI_NAME_SETTER_ROLE_DESCRIPTION =\\n \\\"dAPI name setter\\\";\\n\\n /// @notice dAPI name setter role\\n bytes32 public immutable override dapiNameSetterRole;\\n\\n /// @notice dAPI name hash mapped to the data feed ID\\n mapping(bytes32 => bytes32) public override dapiNameHashToDataFeedId;\\n\\n /// @param _accessControlRegistry AccessControlRegistry contract address\\n /// @param _adminRoleDescription Admin role description\\n /// @param _manager Manager address\\n constructor(\\n address _accessControlRegistry,\\n string memory _adminRoleDescription,\\n address _manager\\n )\\n AccessControlRegistryAdminnedWithManager(\\n _accessControlRegistry,\\n _adminRoleDescription,\\n _manager\\n )\\n {\\n dapiNameSetterRole = _deriveRole(\\n _deriveAdminRole(manager),\\n DAPI_NAME_SETTER_ROLE_DESCRIPTION\\n );\\n }\\n\\n /// @notice Sets the data feed ID the dAPI name points to\\n /// @dev While a data feed ID refers to a specific Beacon or Beacon set,\\n /// dAPI names provide a more abstract interface for convenience. This\\n /// means a dAPI name that was pointing to a Beacon can be pointed to a\\n /// Beacon set, then another Beacon set, etc.\\n /// @param dapiName Human-readable dAPI name\\n /// @param dataFeedId Data feed ID the dAPI name will point to\\n function setDapiName(\\n bytes32 dapiName,\\n bytes32 dataFeedId\\n ) external override {\\n require(dapiName != bytes32(0), \\\"dAPI name zero\\\");\\n require(\\n msg.sender == manager ||\\n IAccessControlRegistry(accessControlRegistry).hasRole(\\n dapiNameSetterRole,\\n msg.sender\\n ),\\n \\\"Sender cannot set dAPI name\\\"\\n );\\n dapiNameHashToDataFeedId[\\n keccak256(abi.encodePacked(dapiName))\\n ] = dataFeedId;\\n emit SetDapiName(dataFeedId, dapiName, msg.sender);\\n }\\n\\n /// @notice Returns the data feed ID the dAPI name is set to\\n /// @param dapiName dAPI name\\n /// @return Data feed ID\\n function dapiNameToDataFeedId(\\n bytes32 dapiName\\n ) external view override returns (bytes32) {\\n return dapiNameHashToDataFeedId[keccak256(abi.encodePacked(dapiName))];\\n }\\n\\n /// @notice Reads the data feed with dAPI name hash\\n /// @param dapiNameHash dAPI name hash\\n /// @return value Data feed value\\n /// @return timestamp Data feed timestamp\\n function _readDataFeedWithDapiNameHash(\\n bytes32 dapiNameHash\\n ) internal view returns (int224 value, uint32 timestamp) {\\n bytes32 dataFeedId = dapiNameHashToDataFeedId[dapiNameHash];\\n require(dataFeedId != bytes32(0), \\\"dAPI name not set\\\");\\n DataFeed storage dataFeed = _dataFeeds[dataFeedId];\\n (value, timestamp) = (dataFeed.value, dataFeed.timestamp);\\n require(timestamp > 0, \\\"Data feed not initialized\\\");\\n }\\n}\\n\",\"keccak256\":\"0x20e4e9b35f34df76875cc2cdc1524f98aaf7002022ea248d5dd7b8c8640716f4\",\"license\":\"MIT\"},\"contracts/api3-server-v1/DataFeedServer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.17;\\n\\nimport \\\"../utils/ExtendedSelfMulticall.sol\\\";\\nimport \\\"./aggregation/Median.sol\\\";\\nimport \\\"./interfaces/IDataFeedServer.sol\\\";\\nimport \\\"../vendor/@openzeppelin/contracts@4.8.2/utils/cryptography/ECDSA.sol\\\";\\n\\n/// @title Contract that serves Beacons and Beacon sets\\n/// @notice A Beacon is a live data feed addressed by an ID, which is derived\\n/// from an Airnode address and a template ID. This is suitable where the more\\n/// recent data point is always more favorable, e.g., in the context of an\\n/// asset price data feed. Beacons can also be seen as one-Airnode data feeds\\n/// that can be used individually or combined to build Beacon sets.\\ncontract DataFeedServer is ExtendedSelfMulticall, Median, IDataFeedServer {\\n using ECDSA for bytes32;\\n\\n // Airnodes serve their fulfillment data along with timestamps. This\\n // contract casts the reported data to `int224` and the timestamp to\\n // `uint32`, which works until year 2106.\\n struct DataFeed {\\n int224 value;\\n uint32 timestamp;\\n }\\n\\n /// @notice Data feed with ID\\n mapping(bytes32 => DataFeed) internal _dataFeeds;\\n\\n /// @dev Reverts if the timestamp is from more than 1 hour in the future\\n modifier onlyValidTimestamp(uint256 timestamp) virtual {\\n unchecked {\\n require(\\n timestamp < block.timestamp + 1 hours,\\n \\\"Timestamp not valid\\\"\\n );\\n }\\n _;\\n }\\n\\n /// @notice Updates the Beacon set using the current values of its Beacons\\n /// @dev As an oddity, this function still works if some of the IDs in\\n /// `beaconIds` belong to Beacon sets rather than Beacons. This can be used\\n /// to implement hierarchical Beacon sets.\\n /// @param beaconIds Beacon IDs\\n /// @return beaconSetId Beacon set ID\\n function updateBeaconSetWithBeacons(\\n bytes32[] memory beaconIds\\n ) public override returns (bytes32 beaconSetId) {\\n (int224 updatedValue, uint32 updatedTimestamp) = aggregateBeacons(\\n beaconIds\\n );\\n beaconSetId = deriveBeaconSetId(beaconIds);\\n DataFeed storage beaconSet = _dataFeeds[beaconSetId];\\n if (beaconSet.timestamp == updatedTimestamp) {\\n require(\\n beaconSet.value != updatedValue,\\n \\\"Does not update Beacon set\\\"\\n );\\n }\\n _dataFeeds[beaconSetId] = DataFeed({\\n value: updatedValue,\\n timestamp: updatedTimestamp\\n });\\n emit UpdatedBeaconSetWithBeacons(\\n beaconSetId,\\n updatedValue,\\n updatedTimestamp\\n );\\n }\\n\\n /// @notice Reads the data feed with ID\\n /// @param dataFeedId Data feed ID\\n /// @return value Data feed value\\n /// @return timestamp Data feed timestamp\\n function _readDataFeedWithId(\\n bytes32 dataFeedId\\n ) internal view returns (int224 value, uint32 timestamp) {\\n DataFeed storage dataFeed = _dataFeeds[dataFeedId];\\n (value, timestamp) = (dataFeed.value, dataFeed.timestamp);\\n require(timestamp > 0, \\\"Data feed not initialized\\\");\\n }\\n\\n /// @notice Derives the Beacon ID from the Airnode address and template ID\\n /// @param airnode Airnode address\\n /// @param templateId Template ID\\n /// @return beaconId Beacon ID\\n function deriveBeaconId(\\n address airnode,\\n bytes32 templateId\\n ) internal pure returns (bytes32 beaconId) {\\n beaconId = keccak256(abi.encodePacked(airnode, templateId));\\n }\\n\\n /// @notice Derives the Beacon set ID from the Beacon IDs\\n /// @dev Notice that `abi.encode()` is used over `abi.encodePacked()`\\n /// @param beaconIds Beacon IDs\\n /// @return beaconSetId Beacon set ID\\n function deriveBeaconSetId(\\n bytes32[] memory beaconIds\\n ) internal pure returns (bytes32 beaconSetId) {\\n beaconSetId = keccak256(abi.encode(beaconIds));\\n }\\n\\n /// @notice Called privately to process the Beacon update\\n /// @param beaconId Beacon ID\\n /// @param timestamp Timestamp used in the signature\\n /// @param data Fulfillment data (an `int256` encoded in contract ABI)\\n /// @return updatedBeaconValue Updated Beacon value\\n function processBeaconUpdate(\\n bytes32 beaconId,\\n uint256 timestamp,\\n bytes calldata data\\n )\\n internal\\n onlyValidTimestamp(timestamp)\\n returns (int224 updatedBeaconValue)\\n {\\n updatedBeaconValue = decodeFulfillmentData(data);\\n require(\\n timestamp > _dataFeeds[beaconId].timestamp,\\n \\\"Does not update timestamp\\\"\\n );\\n _dataFeeds[beaconId] = DataFeed({\\n value: updatedBeaconValue,\\n timestamp: uint32(timestamp)\\n });\\n }\\n\\n /// @notice Called privately to decode the fulfillment data\\n /// @param data Fulfillment data (an `int256` encoded in contract ABI)\\n /// @return decodedData Decoded fulfillment data\\n function decodeFulfillmentData(\\n bytes memory data\\n ) internal pure returns (int224) {\\n require(data.length == 32, \\\"Data length not correct\\\");\\n int256 decodedData = abi.decode(data, (int256));\\n require(\\n decodedData >= type(int224).min && decodedData <= type(int224).max,\\n \\\"Value typecasting error\\\"\\n );\\n return int224(decodedData);\\n }\\n\\n /// @notice Called privately to aggregate the Beacons and return the result\\n /// @param beaconIds Beacon IDs\\n /// @return value Aggregation value\\n /// @return timestamp Aggregation timestamp\\n function aggregateBeacons(\\n bytes32[] memory beaconIds\\n ) internal view returns (int224 value, uint32 timestamp) {\\n uint256 beaconCount = beaconIds.length;\\n require(beaconCount > 1, \\\"Specified less than two Beacons\\\");\\n int256[] memory values = new int256[](beaconCount);\\n int256[] memory timestamps = new int256[](beaconCount);\\n for (uint256 ind = 0; ind < beaconCount; ) {\\n DataFeed storage dataFeed = _dataFeeds[beaconIds[ind]];\\n values[ind] = dataFeed.value;\\n timestamps[ind] = int256(uint256(dataFeed.timestamp));\\n unchecked {\\n ind++;\\n }\\n }\\n value = int224(median(values));\\n timestamp = uint32(uint256(median(timestamps)));\\n }\\n}\\n\",\"keccak256\":\"0xff3172da608fcaa59f17557ff06f8355a90d8cf87c3b3a91b8405ec122a064e3\",\"license\":\"MIT\"},\"contracts/api3-server-v1/OevDapiServer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.17;\\n\\nimport \\\"./OevDataFeedServer.sol\\\";\\nimport \\\"./DapiServer.sol\\\";\\nimport \\\"./interfaces/IOevDapiServer.sol\\\";\\n\\n/// @title Contract that serves OEV dAPIs\\ncontract OevDapiServer is OevDataFeedServer, DapiServer, IOevDapiServer {\\n /// @param _accessControlRegistry AccessControlRegistry contract address\\n /// @param _adminRoleDescription Admin role description\\n /// @param _manager Manager address\\n constructor(\\n address _accessControlRegistry,\\n string memory _adminRoleDescription,\\n address _manager\\n ) DapiServer(_accessControlRegistry, _adminRoleDescription, _manager) {}\\n\\n /// @notice Reads the data feed as the OEV proxy with dAPI name hash\\n /// @param dapiNameHash dAPI name hash\\n /// @return value Data feed value\\n /// @return timestamp Data feed timestamp\\n function _readDataFeedWithDapiNameHashAsOevProxy(\\n bytes32 dapiNameHash\\n ) internal view returns (int224 value, uint32 timestamp) {\\n bytes32 dataFeedId = dapiNameHashToDataFeedId[dapiNameHash];\\n require(dataFeedId != bytes32(0), \\\"dAPI name not set\\\");\\n DataFeed storage oevDataFeed = _oevProxyToIdToDataFeed[msg.sender][\\n dataFeedId\\n ];\\n DataFeed storage dataFeed = _dataFeeds[dataFeedId];\\n if (oevDataFeed.timestamp > dataFeed.timestamp) {\\n (value, timestamp) = (oevDataFeed.value, oevDataFeed.timestamp);\\n } else {\\n (value, timestamp) = (dataFeed.value, dataFeed.timestamp);\\n }\\n require(timestamp > 0, \\\"Data feed not initialized\\\");\\n }\\n}\\n\",\"keccak256\":\"0x7e506b1a9248563d4873159a40e5c2ce46ad0e24ad833d62610669a7dea8f137\",\"license\":\"MIT\"},\"contracts/api3-server-v1/OevDataFeedServer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.17;\\n\\nimport \\\"./DataFeedServer.sol\\\";\\nimport \\\"./interfaces/IOevDataFeedServer.sol\\\";\\nimport \\\"../vendor/@openzeppelin/contracts@4.8.2/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"./proxies/interfaces/IOevProxy.sol\\\";\\n\\n/// @title Contract that serves OEV Beacons and Beacon sets\\n/// @notice OEV Beacons and Beacon sets can be updated by the winner of the\\n/// respective OEV auctions. The beneficiary can withdraw the proceeds from\\n/// this contract.\\ncontract OevDataFeedServer is DataFeedServer, IOevDataFeedServer {\\n using ECDSA for bytes32;\\n\\n /// @notice Data feed with ID specific to the OEV proxy\\n /// @dev This implies that an update as a result of an OEV auction only\\n /// affects contracts that read through the respective proxy that the\\n /// auction was being held for\\n mapping(address => mapping(bytes32 => DataFeed))\\n internal _oevProxyToIdToDataFeed;\\n\\n /// @notice Accumulated OEV auction proceeds for the specific proxy\\n mapping(address => uint256) public override oevProxyToBalance;\\n\\n /// @notice Updates a data feed that the OEV proxy reads using the\\n /// aggregation signed by the absolute majority of the respective Airnodes\\n /// for the specific bid\\n /// @dev For when the data feed being updated is a Beacon set, an absolute\\n /// majority of the Airnodes that power the respective Beacons must sign\\n /// the aggregated value and timestamp. While doing so, the Airnodes should\\n /// refer to data signed to update an absolute majority of the respective\\n /// Beacons. The Airnodes should require the data to be fresh enough (e.g.,\\n /// at most 2 minutes-old), and tightly distributed around the resulting\\n /// aggregation (e.g., within 1% deviation), and reject to provide an OEV\\n /// proxy data feed update signature if these are not satisfied.\\n /// @param oevProxy OEV proxy that reads the data feed\\n /// @param dataFeedId Data feed ID\\n /// @param updateId Update ID\\n /// @param timestamp Signature timestamp\\n /// @param data Update data (an `int256` encoded in contract ABI)\\n /// @param packedOevUpdateSignatures Packed OEV update signatures, which\\n /// include the Airnode address, template ID and these signed with the OEV\\n /// update hash\\n function updateOevProxyDataFeedWithSignedData(\\n address oevProxy,\\n bytes32 dataFeedId,\\n bytes32 updateId,\\n uint256 timestamp,\\n bytes calldata data,\\n bytes[] calldata packedOevUpdateSignatures\\n ) external payable override onlyValidTimestamp(timestamp) {\\n require(\\n timestamp > _oevProxyToIdToDataFeed[oevProxy][dataFeedId].timestamp,\\n \\\"Does not update timestamp\\\"\\n );\\n bytes32 oevUpdateHash = keccak256(\\n abi.encodePacked(\\n block.chainid,\\n address(this),\\n oevProxy,\\n dataFeedId,\\n updateId,\\n timestamp,\\n data,\\n msg.sender,\\n msg.value\\n )\\n );\\n int224 updatedValue = decodeFulfillmentData(data);\\n uint32 updatedTimestamp = uint32(timestamp);\\n uint256 beaconCount = packedOevUpdateSignatures.length;\\n if (beaconCount > 1) {\\n bytes32[] memory beaconIds = new bytes32[](beaconCount);\\n uint256 validSignatureCount;\\n for (uint256 ind = 0; ind < beaconCount; ) {\\n bool signatureIsNotOmitted;\\n (\\n signatureIsNotOmitted,\\n beaconIds[ind]\\n ) = unpackAndValidateOevUpdateSignature(\\n oevUpdateHash,\\n packedOevUpdateSignatures[ind]\\n );\\n if (signatureIsNotOmitted) {\\n unchecked {\\n validSignatureCount++;\\n }\\n }\\n unchecked {\\n ind++;\\n }\\n }\\n // \\\"Greater than or equal to\\\" is not enough because full control\\n // of aggregation requires an absolute majority\\n require(\\n validSignatureCount > beaconCount / 2,\\n \\\"Not enough signatures\\\"\\n );\\n require(\\n dataFeedId == deriveBeaconSetId(beaconIds),\\n \\\"Beacon set ID mismatch\\\"\\n );\\n emit UpdatedOevProxyBeaconSetWithSignedData(\\n dataFeedId,\\n oevProxy,\\n updateId,\\n updatedValue,\\n updatedTimestamp\\n );\\n } else if (beaconCount == 1) {\\n {\\n (\\n bool signatureIsNotOmitted,\\n bytes32 beaconId\\n ) = unpackAndValidateOevUpdateSignature(\\n oevUpdateHash,\\n packedOevUpdateSignatures[0]\\n );\\n require(signatureIsNotOmitted, \\\"Missing signature\\\");\\n require(dataFeedId == beaconId, \\\"Beacon ID mismatch\\\");\\n }\\n emit UpdatedOevProxyBeaconWithSignedData(\\n dataFeedId,\\n oevProxy,\\n updateId,\\n updatedValue,\\n updatedTimestamp\\n );\\n } else {\\n revert(\\\"Did not specify any Beacons\\\");\\n }\\n _oevProxyToIdToDataFeed[oevProxy][dataFeedId] = DataFeed({\\n value: updatedValue,\\n timestamp: updatedTimestamp\\n });\\n oevProxyToBalance[oevProxy] += msg.value;\\n }\\n\\n /// @notice Withdraws the balance of the OEV proxy to the respective\\n /// beneficiary account\\n /// @dev This does not require the caller to be the beneficiary because we\\n /// expect that in most cases, the OEV beneficiary will be a contract that\\n /// will not be able to make arbitrary calls. Our choice can be worked\\n /// around by implementing a beneficiary proxy.\\n /// @param oevProxy OEV proxy\\n function withdraw(address oevProxy) external override {\\n address oevBeneficiary = IOevProxy(oevProxy).oevBeneficiary();\\n require(oevBeneficiary != address(0), \\\"Beneficiary address zero\\\");\\n uint256 balance = oevProxyToBalance[oevProxy];\\n require(balance != 0, \\\"OEV proxy balance zero\\\");\\n oevProxyToBalance[oevProxy] = 0;\\n emit Withdrew(oevProxy, oevBeneficiary, balance);\\n // solhint-disable-next-line avoid-low-level-calls\\n (bool success, ) = oevBeneficiary.call{value: balance}(\\\"\\\");\\n require(success, \\\"Withdrawal reverted\\\");\\n }\\n\\n /// @notice Reads the data feed as the OEV proxy with ID\\n /// @param dataFeedId Data feed ID\\n /// @return value Data feed value\\n /// @return timestamp Data feed timestamp\\n function _readDataFeedWithIdAsOevProxy(\\n bytes32 dataFeedId\\n ) internal view returns (int224 value, uint32 timestamp) {\\n DataFeed storage oevDataFeed = _oevProxyToIdToDataFeed[msg.sender][\\n dataFeedId\\n ];\\n DataFeed storage dataFeed = _dataFeeds[dataFeedId];\\n if (oevDataFeed.timestamp > dataFeed.timestamp) {\\n (value, timestamp) = (oevDataFeed.value, oevDataFeed.timestamp);\\n } else {\\n (value, timestamp) = (dataFeed.value, dataFeed.timestamp);\\n }\\n require(timestamp > 0, \\\"Data feed not initialized\\\");\\n }\\n\\n /// @notice Called privately to unpack and validate the OEV update\\n /// signature\\n /// @param oevUpdateHash OEV update hash\\n /// @param packedOevUpdateSignature Packed OEV update signature, which\\n /// includes the Airnode address, template ID and these signed with the OEV\\n /// update hash\\n /// @return signatureIsNotOmitted If the signature is omitted in\\n /// `packedOevUpdateSignature`\\n /// @return beaconId Beacon ID\\n function unpackAndValidateOevUpdateSignature(\\n bytes32 oevUpdateHash,\\n bytes calldata packedOevUpdateSignature\\n ) private pure returns (bool signatureIsNotOmitted, bytes32 beaconId) {\\n (address airnode, bytes32 templateId, bytes memory signature) = abi\\n .decode(packedOevUpdateSignature, (address, bytes32, bytes));\\n beaconId = deriveBeaconId(airnode, templateId);\\n if (signature.length != 0) {\\n require(\\n (\\n keccak256(abi.encodePacked(oevUpdateHash, templateId))\\n .toEthSignedMessageHash()\\n ).recover(signature) == airnode,\\n \\\"Signature mismatch\\\"\\n );\\n signatureIsNotOmitted = true;\\n }\\n }\\n}\\n\",\"keccak256\":\"0x4e8557b0ab232ac721adfedecedb5e182548e04f64794854330d6251d98c538b\",\"license\":\"MIT\"},\"contracts/api3-server-v1/aggregation/Median.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./Sort.sol\\\";\\nimport \\\"./QuickSelect.sol\\\";\\n\\n/// @title Contract to be inherited by contracts that will calculate the median\\n/// of an array\\n/// @notice The operation will be in-place, i.e., the array provided as the\\n/// argument will be modified.\\ncontract Median is Sort, Quickselect {\\n /// @notice Returns the median of the array\\n /// @dev Uses an unrolled sorting implementation for shorter arrays and\\n /// quickselect for longer arrays for gas cost efficiency\\n /// @param array Array whose median is to be calculated\\n /// @return Median of the array\\n function median(int256[] memory array) internal pure returns (int256) {\\n uint256 arrayLength = array.length;\\n if (arrayLength <= MAX_SORT_LENGTH) {\\n sort(array);\\n if (arrayLength % 2 == 1) {\\n return array[arrayLength / 2];\\n } else {\\n assert(arrayLength != 0);\\n unchecked {\\n return\\n average(\\n array[arrayLength / 2 - 1],\\n array[arrayLength / 2]\\n );\\n }\\n }\\n } else {\\n if (arrayLength % 2 == 1) {\\n return array[quickselectK(array, arrayLength / 2)];\\n } else {\\n uint256 mid1;\\n uint256 mid2;\\n unchecked {\\n (mid1, mid2) = quickselectKPlusOne(\\n array,\\n arrayLength / 2 - 1\\n );\\n }\\n return average(array[mid1], array[mid2]);\\n }\\n }\\n }\\n\\n /// @notice Averages two signed integers without overflowing\\n /// @param x Integer x\\n /// @param y Integer y\\n /// @return Average of integers x and y\\n function average(int256 x, int256 y) private pure returns (int256) {\\n unchecked {\\n int256 averageRoundedDownToNegativeInfinity = (x >> 1) +\\n (y >> 1) +\\n (x & y & 1);\\n // If the average rounded down to negative infinity is negative\\n // (i.e., its 256th sign bit is set), and one of (x, y) is even and\\n // the other one is odd (i.e., the 1st bit of their xor is set),\\n // add 1 to round the average down to zero instead.\\n // We will typecast the signed integer to unsigned to logical-shift\\n // int256(uint256(signedInt)) >> 255 ~= signedInt >>> 255\\n return\\n averageRoundedDownToNegativeInfinity +\\n (int256(\\n (uint256(averageRoundedDownToNegativeInfinity) >> 255)\\n ) & (x ^ y));\\n }\\n }\\n}\\n\",\"keccak256\":\"0x84912d10ad5fa4848f2dfbbac40431ccdeb5250c263718b5fbdfeceeb0946524\",\"license\":\"MIT\"},\"contracts/api3-server-v1/aggregation/QuickSelect.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n/// @title Contract to be inherited by contracts that will calculate the index\\n/// of the k-th and optionally (k+1)-th largest elements in the array\\n/// @notice Uses quickselect, which operates in-place, i.e., the array provided\\n/// as the argument will be modified.\\ncontract Quickselect {\\n /// @notice Returns the index of the k-th largest element in the array\\n /// @param array Array in which k-th largest element will be searched\\n /// @param k K\\n /// @return indK Index of the k-th largest element\\n function quickselectK(\\n int256[] memory array,\\n uint256 k\\n ) internal pure returns (uint256 indK) {\\n uint256 arrayLength = array.length;\\n assert(arrayLength > 0);\\n unchecked {\\n (indK, ) = quickselect(array, 0, arrayLength - 1, k, false);\\n }\\n }\\n\\n /// @notice Returns the index of the k-th and (k+1)-th largest elements in\\n /// the array\\n /// @param array Array in which k-th and (k+1)-th largest elements will be\\n /// searched\\n /// @param k K\\n /// @return indK Index of the k-th largest element\\n /// @return indKPlusOne Index of the (k+1)-th largest element\\n function quickselectKPlusOne(\\n int256[] memory array,\\n uint256 k\\n ) internal pure returns (uint256 indK, uint256 indKPlusOne) {\\n uint256 arrayLength = array.length;\\n assert(arrayLength > 1);\\n unchecked {\\n (indK, indKPlusOne) = quickselect(\\n array,\\n 0,\\n arrayLength - 1,\\n k,\\n true\\n );\\n }\\n }\\n\\n /// @notice Returns the index of the k-th largest element in the specified\\n /// section of the (potentially unsorted) array\\n /// @param array Array in which K will be searched for\\n /// @param lo Starting index of the section of the array that K will be\\n /// searched in\\n /// @param hi Last index of the section of the array that K will be\\n /// searched in\\n /// @param k K\\n /// @param selectKPlusOne If the index of the (k+1)-th largest element is\\n /// to be returned\\n /// @return indK Index of the k-th largest element\\n /// @return indKPlusOne Index of the (k+1)-th largest element (only set if\\n /// `selectKPlusOne` is `true`)\\n function quickselect(\\n int256[] memory array,\\n uint256 lo,\\n uint256 hi,\\n uint256 k,\\n bool selectKPlusOne\\n ) private pure returns (uint256 indK, uint256 indKPlusOne) {\\n if (lo == hi) {\\n return (k, 0);\\n }\\n uint256 indPivot = partition(array, lo, hi);\\n if (k < indPivot) {\\n unchecked {\\n (indK, ) = quickselect(array, lo, indPivot - 1, k, false);\\n }\\n } else if (k > indPivot) {\\n unchecked {\\n (indK, ) = quickselect(array, indPivot + 1, hi, k, false);\\n }\\n } else {\\n indK = indPivot;\\n }\\n // Since Quickselect ends in the array being partitioned around the\\n // k-th largest element, we can continue searching towards right for\\n // the (k+1)-th largest element, which is useful in calculating the\\n // median of an array with even length\\n if (selectKPlusOne) {\\n unchecked {\\n indKPlusOne = indK + 1;\\n }\\n uint256 i;\\n unchecked {\\n i = indKPlusOne + 1;\\n }\\n uint256 arrayLength = array.length;\\n for (; i < arrayLength; ) {\\n if (array[i] < array[indKPlusOne]) {\\n indKPlusOne = i;\\n }\\n unchecked {\\n i++;\\n }\\n }\\n }\\n }\\n\\n /// @notice Partitions the array into two around a pivot\\n /// @param array Array that will be partitioned\\n /// @param lo Starting index of the section of the array that will be\\n /// partitioned\\n /// @param hi Last index of the section of the array that will be\\n /// partitioned\\n /// @return pivotInd Pivot index\\n function partition(\\n int256[] memory array,\\n uint256 lo,\\n uint256 hi\\n ) private pure returns (uint256 pivotInd) {\\n if (lo == hi) {\\n return lo;\\n }\\n int256 pivot = array[lo];\\n uint256 i = lo;\\n unchecked {\\n pivotInd = hi + 1;\\n }\\n while (true) {\\n do {\\n unchecked {\\n i++;\\n }\\n } while (i < array.length && array[i] < pivot);\\n do {\\n unchecked {\\n pivotInd--;\\n }\\n } while (array[pivotInd] > pivot);\\n if (i >= pivotInd) {\\n (array[lo], array[pivotInd]) = (array[pivotInd], array[lo]);\\n return pivotInd;\\n }\\n (array[i], array[pivotInd]) = (array[pivotInd], array[i]);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x7f458dd165fed89866c5fe626e3df3c9bf6884498ec1233f4083615084521d6e\",\"license\":\"MIT\"},\"contracts/api3-server-v1/aggregation/Sort.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n/// @title Contract to be inherited by contracts that will sort an array using\\n/// an unrolled implementation\\n/// @notice The operation will be in-place, i.e., the array provided as the\\n/// argument will be modified.\\ncontract Sort {\\n uint256 internal constant MAX_SORT_LENGTH = 9;\\n\\n /// @notice Sorts the array\\n /// @param array Array to be sorted\\n function sort(int256[] memory array) internal pure {\\n uint256 arrayLength = array.length;\\n require(arrayLength <= MAX_SORT_LENGTH, \\\"Array too long to sort\\\");\\n // Do a binary search\\n if (arrayLength < 6) {\\n // Possible lengths: 1, 2, 3, 4, 5\\n if (arrayLength < 4) {\\n // Possible lengths: 1, 2, 3\\n if (arrayLength == 3) {\\n // Length: 3\\n swapIfFirstIsLarger(array, 0, 1);\\n swapIfFirstIsLarger(array, 1, 2);\\n swapIfFirstIsLarger(array, 0, 1);\\n } else if (arrayLength == 2) {\\n // Length: 2\\n swapIfFirstIsLarger(array, 0, 1);\\n }\\n // Do nothing for Length: 1\\n } else {\\n // Possible lengths: 4, 5\\n if (arrayLength == 5) {\\n // Length: 5\\n swapIfFirstIsLarger(array, 1, 2);\\n swapIfFirstIsLarger(array, 3, 4);\\n swapIfFirstIsLarger(array, 1, 3);\\n swapIfFirstIsLarger(array, 0, 2);\\n swapIfFirstIsLarger(array, 2, 4);\\n swapIfFirstIsLarger(array, 0, 3);\\n swapIfFirstIsLarger(array, 0, 1);\\n swapIfFirstIsLarger(array, 2, 3);\\n swapIfFirstIsLarger(array, 1, 2);\\n } else {\\n // Length: 4\\n swapIfFirstIsLarger(array, 0, 1);\\n swapIfFirstIsLarger(array, 2, 3);\\n swapIfFirstIsLarger(array, 1, 3);\\n swapIfFirstIsLarger(array, 0, 2);\\n swapIfFirstIsLarger(array, 1, 2);\\n }\\n }\\n } else {\\n // Possible lengths: 6, 7, 8, 9\\n if (arrayLength < 8) {\\n // Possible lengths: 6, 7\\n if (arrayLength == 7) {\\n // Length: 7\\n swapIfFirstIsLarger(array, 1, 2);\\n swapIfFirstIsLarger(array, 3, 4);\\n swapIfFirstIsLarger(array, 5, 6);\\n swapIfFirstIsLarger(array, 0, 2);\\n swapIfFirstIsLarger(array, 4, 6);\\n swapIfFirstIsLarger(array, 3, 5);\\n swapIfFirstIsLarger(array, 2, 6);\\n swapIfFirstIsLarger(array, 1, 5);\\n swapIfFirstIsLarger(array, 0, 4);\\n swapIfFirstIsLarger(array, 2, 5);\\n swapIfFirstIsLarger(array, 0, 3);\\n swapIfFirstIsLarger(array, 2, 4);\\n swapIfFirstIsLarger(array, 1, 3);\\n swapIfFirstIsLarger(array, 0, 1);\\n swapIfFirstIsLarger(array, 2, 3);\\n swapIfFirstIsLarger(array, 4, 5);\\n } else {\\n // Length: 6\\n swapIfFirstIsLarger(array, 0, 1);\\n swapIfFirstIsLarger(array, 2, 3);\\n swapIfFirstIsLarger(array, 4, 5);\\n swapIfFirstIsLarger(array, 1, 3);\\n swapIfFirstIsLarger(array, 3, 5);\\n swapIfFirstIsLarger(array, 1, 3);\\n swapIfFirstIsLarger(array, 2, 4);\\n swapIfFirstIsLarger(array, 0, 2);\\n swapIfFirstIsLarger(array, 2, 4);\\n swapIfFirstIsLarger(array, 3, 4);\\n swapIfFirstIsLarger(array, 1, 2);\\n swapIfFirstIsLarger(array, 2, 3);\\n }\\n } else {\\n // Possible lengths: 8, 9\\n if (arrayLength == 9) {\\n // Length: 9\\n swapIfFirstIsLarger(array, 1, 8);\\n swapIfFirstIsLarger(array, 2, 7);\\n swapIfFirstIsLarger(array, 3, 6);\\n swapIfFirstIsLarger(array, 4, 5);\\n swapIfFirstIsLarger(array, 1, 4);\\n swapIfFirstIsLarger(array, 5, 8);\\n swapIfFirstIsLarger(array, 0, 2);\\n swapIfFirstIsLarger(array, 6, 7);\\n swapIfFirstIsLarger(array, 2, 6);\\n swapIfFirstIsLarger(array, 7, 8);\\n swapIfFirstIsLarger(array, 0, 3);\\n swapIfFirstIsLarger(array, 4, 5);\\n swapIfFirstIsLarger(array, 0, 1);\\n swapIfFirstIsLarger(array, 3, 5);\\n swapIfFirstIsLarger(array, 6, 7);\\n swapIfFirstIsLarger(array, 2, 4);\\n swapIfFirstIsLarger(array, 1, 3);\\n swapIfFirstIsLarger(array, 5, 7);\\n swapIfFirstIsLarger(array, 4, 6);\\n swapIfFirstIsLarger(array, 1, 2);\\n swapIfFirstIsLarger(array, 3, 4);\\n swapIfFirstIsLarger(array, 5, 6);\\n swapIfFirstIsLarger(array, 7, 8);\\n swapIfFirstIsLarger(array, 2, 3);\\n swapIfFirstIsLarger(array, 4, 5);\\n } else {\\n // Length: 8\\n swapIfFirstIsLarger(array, 0, 7);\\n swapIfFirstIsLarger(array, 1, 6);\\n swapIfFirstIsLarger(array, 2, 5);\\n swapIfFirstIsLarger(array, 3, 4);\\n swapIfFirstIsLarger(array, 0, 3);\\n swapIfFirstIsLarger(array, 4, 7);\\n swapIfFirstIsLarger(array, 1, 2);\\n swapIfFirstIsLarger(array, 5, 6);\\n swapIfFirstIsLarger(array, 0, 1);\\n swapIfFirstIsLarger(array, 2, 3);\\n swapIfFirstIsLarger(array, 4, 5);\\n swapIfFirstIsLarger(array, 6, 7);\\n swapIfFirstIsLarger(array, 3, 5);\\n swapIfFirstIsLarger(array, 2, 4);\\n swapIfFirstIsLarger(array, 1, 2);\\n swapIfFirstIsLarger(array, 3, 4);\\n swapIfFirstIsLarger(array, 5, 6);\\n swapIfFirstIsLarger(array, 2, 3);\\n swapIfFirstIsLarger(array, 4, 5);\\n swapIfFirstIsLarger(array, 3, 4);\\n }\\n }\\n }\\n }\\n\\n /// @notice Swaps two elements of an array if the first element is greater\\n /// than the second\\n /// @param array Array whose elements are to be swapped\\n /// @param ind1 Index of the first element\\n /// @param ind2 Index of the second element\\n function swapIfFirstIsLarger(\\n int256[] memory array,\\n uint256 ind1,\\n uint256 ind2\\n ) private pure {\\n if (array[ind1] > array[ind2]) {\\n (array[ind1], array[ind2]) = (array[ind2], array[ind1]);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x81e3790f7964b0169e60022f00f988a136e37a043053d8b07c794cc1c9b6c510\",\"license\":\"MIT\"},\"contracts/api3-server-v1/interfaces/IApi3ServerV1.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IOevDapiServer.sol\\\";\\nimport \\\"./IBeaconUpdatesWithSignedData.sol\\\";\\n\\ninterface IApi3ServerV1 is IOevDapiServer, IBeaconUpdatesWithSignedData {\\n function readDataFeedWithId(\\n bytes32 dataFeedId\\n ) external view returns (int224 value, uint32 timestamp);\\n\\n function readDataFeedWithDapiNameHash(\\n bytes32 dapiNameHash\\n ) external view returns (int224 value, uint32 timestamp);\\n\\n function readDataFeedWithIdAsOevProxy(\\n bytes32 dataFeedId\\n ) external view returns (int224 value, uint32 timestamp);\\n\\n function readDataFeedWithDapiNameHashAsOevProxy(\\n bytes32 dapiNameHash\\n ) external view returns (int224 value, uint32 timestamp);\\n\\n function dataFeeds(\\n bytes32 dataFeedId\\n ) external view returns (int224 value, uint32 timestamp);\\n\\n function oevProxyToIdToDataFeed(\\n address proxy,\\n bytes32 dataFeedId\\n ) external view returns (int224 value, uint32 timestamp);\\n}\\n\",\"keccak256\":\"0xea2c05eaf2a19c93a9c9b08243fcabd8d7fcf0e4d422f7c687aef693126c1809\",\"license\":\"MIT\"},\"contracts/api3-server-v1/interfaces/IBeaconUpdatesWithSignedData.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IDataFeedServer.sol\\\";\\n\\ninterface IBeaconUpdatesWithSignedData is IDataFeedServer {\\n function updateBeaconWithSignedData(\\n address airnode,\\n bytes32 templateId,\\n uint256 timestamp,\\n bytes calldata data,\\n bytes calldata signature\\n ) external returns (bytes32 beaconId);\\n}\\n\",\"keccak256\":\"0xe2b2530081508baf1323d4c145a688ffd548cf318a8cb67c9ccb4abe1ac81c6e\",\"license\":\"MIT\"},\"contracts/api3-server-v1/interfaces/IDapiServer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../access/interfaces/IAccessControlRegistryAdminnedWithManager.sol\\\";\\nimport \\\"./IDataFeedServer.sol\\\";\\n\\ninterface IDapiServer is\\n IAccessControlRegistryAdminnedWithManager,\\n IDataFeedServer\\n{\\n event SetDapiName(\\n bytes32 indexed dataFeedId,\\n bytes32 indexed dapiName,\\n address sender\\n );\\n\\n function setDapiName(bytes32 dapiName, bytes32 dataFeedId) external;\\n\\n function dapiNameToDataFeedId(\\n bytes32 dapiName\\n ) external view returns (bytes32);\\n\\n // solhint-disable-next-line func-name-mixedcase\\n function DAPI_NAME_SETTER_ROLE_DESCRIPTION()\\n external\\n view\\n returns (string memory);\\n\\n function dapiNameSetterRole() external view returns (bytes32);\\n\\n function dapiNameHashToDataFeedId(\\n bytes32 dapiNameHash\\n ) external view returns (bytes32 dataFeedId);\\n}\\n\",\"keccak256\":\"0x1cf1d7637e2ee1b4f5b99345730183447db78ceb8ce2117cf145d4d375194e71\",\"license\":\"MIT\"},\"contracts/api3-server-v1/interfaces/IDataFeedServer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/interfaces/IExtendedSelfMulticall.sol\\\";\\n\\ninterface IDataFeedServer is IExtendedSelfMulticall {\\n event UpdatedBeaconWithSignedData(\\n bytes32 indexed beaconId,\\n int224 value,\\n uint32 timestamp\\n );\\n\\n event UpdatedBeaconSetWithBeacons(\\n bytes32 indexed beaconSetId,\\n int224 value,\\n uint32 timestamp\\n );\\n\\n function updateBeaconSetWithBeacons(\\n bytes32[] memory beaconIds\\n ) external returns (bytes32 beaconSetId);\\n}\\n\",\"keccak256\":\"0x208f751f71b16d454cafd9188095178fdc776ee0376a85362f6022e7a4f010a3\",\"license\":\"MIT\"},\"contracts/api3-server-v1/interfaces/IOevDapiServer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IOevDataFeedServer.sol\\\";\\nimport \\\"./IDapiServer.sol\\\";\\n\\ninterface IOevDapiServer is IOevDataFeedServer, IDapiServer {}\\n\",\"keccak256\":\"0xf4082c33979785131358a217a8c5cf498a53c04318868eb1cb68e934c33226e3\",\"license\":\"MIT\"},\"contracts/api3-server-v1/interfaces/IOevDataFeedServer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IDataFeedServer.sol\\\";\\n\\ninterface IOevDataFeedServer is IDataFeedServer {\\n event UpdatedOevProxyBeaconWithSignedData(\\n bytes32 indexed beaconId,\\n address indexed proxy,\\n bytes32 indexed updateId,\\n int224 value,\\n uint32 timestamp\\n );\\n\\n event UpdatedOevProxyBeaconSetWithSignedData(\\n bytes32 indexed beaconSetId,\\n address indexed proxy,\\n bytes32 indexed updateId,\\n int224 value,\\n uint32 timestamp\\n );\\n\\n event Withdrew(\\n address indexed oevProxy,\\n address oevBeneficiary,\\n uint256 amount\\n );\\n\\n function updateOevProxyDataFeedWithSignedData(\\n address oevProxy,\\n bytes32 dataFeedId,\\n bytes32 updateId,\\n uint256 timestamp,\\n bytes calldata data,\\n bytes[] calldata packedOevUpdateSignatures\\n ) external payable;\\n\\n function withdraw(address oevProxy) external;\\n\\n function oevProxyToBalance(\\n address oevProxy\\n ) external view returns (uint256 balance);\\n}\\n\",\"keccak256\":\"0x2d162c576bfe5554767bb48758314c3e6f2c509f73203f0e166d1ac5168a1218\",\"license\":\"MIT\"},\"contracts/api3-server-v1/proxies/interfaces/IOevProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ninterface IOevProxy {\\n function oevBeneficiary() external view returns (address);\\n}\\n\",\"keccak256\":\"0xcd9962a465c96e85638eb40775da008f9c86a0ea0c50c7c5fcbb11c55f48fc22\",\"license\":\"MIT\"},\"contracts/utils/ExtendedSelfMulticall.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.7;\\n\\nimport \\\"./SelfMulticall.sol\\\";\\nimport \\\"./interfaces/IExtendedSelfMulticall.sol\\\";\\n\\n/// @title Contract that extends SelfMulticall to fetch some of the global\\n/// variables\\n/// @notice Available global variables are limited to the ones that Airnode\\n/// tends to need\\ncontract ExtendedSelfMulticall is SelfMulticall, IExtendedSelfMulticall {\\n /// @notice Returns the chain ID\\n /// @return Chain ID\\n function getChainId() external view override returns (uint256) {\\n return block.chainid;\\n }\\n\\n /// @notice Returns the account balance\\n /// @param account Account address\\n /// @return Account balance\\n function getBalance(\\n address account\\n ) external view override returns (uint256) {\\n return account.balance;\\n }\\n\\n /// @notice Returns if the account contains bytecode\\n /// @dev An account not containing any bytecode does not indicate that it\\n /// is an EOA or it will not contain any bytecode in the future.\\n /// Contract construction and `SELFDESTRUCT` updates the bytecode at the\\n /// end of the transaction.\\n /// @return If the account contains bytecode\\n function containsBytecode(\\n address account\\n ) external view override returns (bool) {\\n return account.code.length > 0;\\n }\\n\\n /// @notice Returns the current block number\\n /// @return Current block number\\n function getBlockNumber() external view override returns (uint256) {\\n return block.number;\\n }\\n\\n /// @notice Returns the current block timestamp\\n /// @return Current block timestamp\\n function getBlockTimestamp() external view override returns (uint256) {\\n return block.timestamp;\\n }\\n\\n /// @notice Returns the current block basefee\\n /// @return Current block basefee\\n function getBlockBasefee() external view override returns (uint256) {\\n return block.basefee;\\n }\\n}\\n\",\"keccak256\":\"0xada4020386f51e076953a110accf21efc53b82858bb88fc6725591556d86574b\",\"license\":\"MIT\"},\"contracts/utils/SelfMulticall.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./interfaces/ISelfMulticall.sol\\\";\\n\\n/// @title Contract that enables calls to the inheriting contract to be batched\\n/// @notice Implements two ways of batching, one requires none of the calls to\\n/// revert and the other tolerates individual calls reverting\\n/// @dev This implementation uses delegatecall for individual function calls.\\n/// Since delegatecall is a message call, it can only be made to functions that\\n/// are externally visible. This means that a contract cannot multicall its own\\n/// functions that use internal/private visibility modifiers.\\n/// Refer to OpenZeppelin's Multicall.sol for a similar implementation.\\ncontract SelfMulticall is ISelfMulticall {\\n /// @notice Batches calls to the inheriting contract and reverts as soon as\\n /// one of the batched calls reverts\\n /// @param data Array of calldata of batched calls\\n /// @return returndata Array of returndata of batched calls\\n function multicall(\\n bytes[] calldata data\\n ) external override returns (bytes[] memory returndata) {\\n uint256 callCount = data.length;\\n returndata = new bytes[](callCount);\\n for (uint256 ind = 0; ind < callCount; ) {\\n bool success;\\n // solhint-disable-next-line avoid-low-level-calls\\n (success, returndata[ind]) = address(this).delegatecall(data[ind]);\\n if (!success) {\\n bytes memory returndataWithRevertData = returndata[ind];\\n if (returndataWithRevertData.length > 0) {\\n // Adapted from OpenZeppelin's Address.sol\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n let returndata_size := mload(returndataWithRevertData)\\n revert(\\n add(32, returndataWithRevertData),\\n returndata_size\\n )\\n }\\n } else {\\n revert(\\\"Multicall: No revert string\\\");\\n }\\n }\\n unchecked {\\n ind++;\\n }\\n }\\n }\\n\\n /// @notice Batches calls to the inheriting contract but does not revert if\\n /// any of the batched calls reverts\\n /// @param data Array of calldata of batched calls\\n /// @return successes Array of success conditions of batched calls\\n /// @return returndata Array of returndata of batched calls\\n function tryMulticall(\\n bytes[] calldata data\\n )\\n external\\n override\\n returns (bool[] memory successes, bytes[] memory returndata)\\n {\\n uint256 callCount = data.length;\\n successes = new bool[](callCount);\\n returndata = new bytes[](callCount);\\n for (uint256 ind = 0; ind < callCount; ) {\\n // solhint-disable-next-line avoid-low-level-calls\\n (successes[ind], returndata[ind]) = address(this).delegatecall(\\n data[ind]\\n );\\n unchecked {\\n ind++;\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xb466760f7b5d05a91fb168224952f29db9aa3308f0b83535fd697f3c30281740\",\"license\":\"MIT\"},\"contracts/utils/interfaces/IExtendedSelfMulticall.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ISelfMulticall.sol\\\";\\n\\ninterface IExtendedSelfMulticall is ISelfMulticall {\\n function getChainId() external view returns (uint256);\\n\\n function getBalance(address account) external view returns (uint256);\\n\\n function containsBytecode(address account) external view returns (bool);\\n\\n function getBlockNumber() external view returns (uint256);\\n\\n function getBlockTimestamp() external view returns (uint256);\\n\\n function getBlockBasefee() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0xaefe61a623c920d3e39c4779535e280378b44202d11c29a2c96f46f2fe5f420d\",\"license\":\"MIT\"},\"contracts/utils/interfaces/ISelfMulticall.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ninterface ISelfMulticall {\\n function multicall(\\n bytes[] calldata data\\n ) external returns (bytes[] memory returndata);\\n\\n function tryMulticall(\\n bytes[] calldata data\\n ) external returns (bool[] memory successes, bytes[] memory returndata);\\n}\\n\",\"keccak256\":\"0x50b27284f0d5acd8b340836c09d252138ebf059f426e5d90d3f7221e1b7d0817\",\"license\":\"MIT\"},\"contracts/vendor/@openzeppelin/contracts@4.8.2/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"contracts/vendor/@openzeppelin/contracts@4.8.2/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xa4d1d62251f8574deb032a35fc948386a9b4de74b812d4f545a1ac120486b48a\",\"license\":\"MIT\"},\"contracts/vendor/@openzeppelin/contracts@4.8.2/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(\\n bytes32 hash,\\n bytes32 r,\\n bytes32 vs\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(\\n bytes32 hash,\\n uint8 v,\\n bytes32 r,\\n bytes32 s\\n ) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n32\\\", hash));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x01\\\", domainSeparator, structHash));\\n }\\n}\\n\",\"keccak256\":\"0xda898fa084aa1ddfdb346e6a40459e00a59d87071cce7c315a46d648dd71d0ba\",\"license\":\"MIT\"},\"contracts/vendor/@openzeppelin/contracts@4.8.2/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator\\n ) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1);\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(\\n uint256 x,\\n uint256 y,\\n uint256 denominator,\\n Rounding rounding\\n ) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10**64) {\\n value /= 10**64;\\n result += 64;\\n }\\n if (value >= 10**32) {\\n value /= 10**32;\\n result += 32;\\n }\\n if (value >= 10**16) {\\n value /= 10**16;\\n result += 16;\\n }\\n if (value >= 10**8) {\\n value /= 10**8;\\n result += 8;\\n }\\n if (value >= 10**4) {\\n value /= 10**4;\\n result += 4;\\n }\\n if (value >= 10**2) {\\n value /= 10**2;\\n result += 2;\\n }\\n if (value >= 10**1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xa1e8e83cd0087785df04ac79fb395d9f3684caeaf973d9e2c71caef723a3a5d6\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x6101206040523480156200001257600080fd5b50604051620039a2380380620039a283398101604081905262000035916200033a565b82828282828282828282826001600160a01b0382166200008f5760405162461bcd60e51b815260206004820152601060248201526f4143522061646472657373207a65726f60801b60448201526064015b60405180910390fd5b6000815111620000e25760405162461bcd60e51b815260206004820152601c60248201527f41646d696e20726f6c65206465736372697074696f6e20656d70747900000000604482015260640162000086565b6001600160a01b0382166080526000620000fd8282620004a9565b508060405160200162000111919062000575565b60408051601f19818403018152919052805160209091012060a05250506001600160a01b038116620001865760405162461bcd60e51b815260206004820152601460248201527f4d616e616765722061646472657373207a65726f000000000000000000000000604482015260640162000086565b6001600160a01b03811660c0526200019e81620001f8565b60e052505060c051620001e49150620001b790620001f8565b60408051808201909152601081526f3220a824903730b6b29039b2ba3a32b960811b602082015262000272565b610100525062000593975050505050505050565b60006200026c6200023d836040516001600160601b0319606083901b166020820152600090603401604051602081830303815290604052805190602001209050919050565b60a051604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b92915050565b6000620002ae83836040516020016200028c919062000575565b60405160208183030381529060405280519060200120620002b560201b60201c565b9392505050565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b80516001600160a01b0381168114620002f957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200033157818101518382015260200162000317565b50506000910152565b6000806000606084860312156200035057600080fd5b6200035b84620002e1565b60208501519093506001600160401b03808211156200037957600080fd5b818601915086601f8301126200038e57600080fd5b815181811115620003a357620003a3620002fe565b604051601f8201601f19908116603f01168101908382118183101715620003ce57620003ce620002fe565b81604052828152896020848701011115620003e857600080fd5b620003fb83602083016020880162000314565b80965050505050506200041160408501620002e1565b90509250925092565b600181811c908216806200042f57607f821691505b6020821081036200045057634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620004a457600081815260208120601f850160051c810160208610156200047f5750805b601f850160051c820191505b81811015620004a0578281556001016200048b565b5050505b505050565b81516001600160401b03811115620004c557620004c5620002fe565b620004dd81620004d684546200041a565b8462000456565b602080601f831160018114620005155760008415620004fc5750858301515b600019600386901b1c1916600185901b178555620004a0565b600085815260208120601f198616915b82811015620005465788860151825594840194600190910190840162000525565b5085821015620005655787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600082516200058981846020870162000314565b9190910192915050565b60805160a05160c05160e051610100516133b8620005ea600039600081816104650152610e31015260006101cc01526000818161035f0152610de2015260005050600081816102530152610e5d01526133b86000f3fe6080604052600436106101b55760003560e01c806367a7cfb7116100ec578063ac9650d81161008a578063e6ec76ac11610064578063e6ec76ac14610594578063f83ea108146105a7578063f8b2cb4f146105fe578063fce90be81461062657600080fd5b8063ac9650d814610527578063b62408a314610554578063cfaf49711461057457600080fd5b80638e6ddc27116100c65780638e6ddc271461049a5780638fca9ab9146104c757806391eed085146104e7578063a5fc076f1461050757600080fd5b806367a7cfb7146104125780637512449b14610453578063796b89b91461048757600080fd5b8063437b9116116101595780634c8f1d8d116101335780634c8f1d8d146103815780634dcc19fe146103a357806351cff8d9146103b65780635989eaeb146103d857600080fd5b8063437b9116146102f2578063472c22f114610320578063481c6a751461034d57600080fd5b80631ce9ae07116101955780631ce9ae071461024157806332be8f0b1461028d5780633408e470146102cc57806342cbb15c146102df57600080fd5b80629f2f3c146101ba578062aae33f146102015780631a0a0b3e14610221575b600080fd5b3480156101c657600080fd5b506101ee7f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b34801561020d57600080fd5b506101ee61021c366004612c34565b61066f565b34801561022d57600080fd5b506101ee61023c366004612d31565b61079c565b34801561024d57600080fd5b506102757f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101f8565b34801561029957600080fd5b506102ad6102a8366004612dc7565b610915565b60408051601b9390930b835263ffffffff9091166020830152016101f8565b3480156102d857600080fd5b50466101ee565b3480156102eb57600080fd5b50436101ee565b3480156102fe57600080fd5b5061031261030d366004612e25565b61092a565b6040516101f8929190612ef6565b34801561032c57600080fd5b506101ee61033b366004612dc7565b60046020526000908152604090205481565b34801561035957600080fd5b506102757f000000000000000000000000000000000000000000000000000000000000000081565b34801561038d57600080fd5b50610396610a90565b6040516101f89190612f4f565b3480156103af57600080fd5b50486101ee565b3480156103c257600080fd5b506103d66103d1366004612f62565b610b1e565b005b3480156103e457600080fd5b506104026103f3366004612f62565b6001600160a01b03163b151590565b60405190151581526020016101f8565b34801561041e57600080fd5b506102ad61042d366004612dc7565b600090815260016020526040902054601b81900b91600160e01b90910463ffffffff1690565b34801561045f57600080fd5b506101ee7f000000000000000000000000000000000000000000000000000000000000000081565b34801561049357600080fd5b50426101ee565b3480156104a657600080fd5b506101ee6104b5366004612f62565b60036020526000908152604090205481565b3480156104d357600080fd5b506101ee6104e2366004612dc7565b610d45565b3480156104f357600080fd5b506103d6610502366004612f7f565b610d8a565b34801561051357600080fd5b506102ad610522366004612dc7565b610f96565b34801561053357600080fd5b50610547610542366004612e25565b610fa2565b6040516101f89190612fa1565b34801561056057600080fd5b506102ad61056f366004612dc7565b611123565b34801561058057600080fd5b506102ad61058f366004612dc7565b61112f565b6103d66105a2366004612fb4565b61113b565b3480156105b357600080fd5b506102ad6105c2366004613053565b6001600160a01b039190911660009081526002602090815260408083209383529290522054601b81900b91600160e01b90910463ffffffff1690565b34801561060a57600080fd5b506101ee610619366004612f62565b6001600160a01b03163190565b34801561063257600080fd5b506103966040518060400160405280601081526020017f64415049206e616d65207365747465720000000000000000000000000000000081525081565b600080600061067d846116c2565b9150915061068a84611864565b600081815260016020526040902080549194509063ffffffff808416600160e01b9092041603610710578054601b84810b91900b036107105760405162461bcd60e51b815260206004820152601a60248201527f446f6573206e6f742075706461746520426561636f6e2073657400000000000060448201526064015b60405180910390fd5b604080518082018252601b85900b80825263ffffffff858116602080850182815260008b81526001835287902095519051909316600160e01b026001600160e01b0390931692909217909355835191825281019190915285917fb7712be6248d021e8c56ac9613c09491354a4d0f4ad0b7db1a664b35be4b2349910160405180910390a2505050919050565b6000876001600160a01b031661081d84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060405161081792506107fc91508c908c908c908c9060200161307f565b60405160208183030381529060405280519060200120611894565b906118cf565b6001600160a01b0316146108735760405162461bcd60e51b815260206004820152601260248201527f5369676e6174757265206d69736d6174636800000000000000000000000000006044820152606401610707565b50604080516bffffffffffffffffffffffff1960608a901b1660208083019190915260348083018a9052835180840390910181526054909201909252805191012060006108c2828888886118f5565b60408051601b83900b815263ffffffff8a16602082015291925083917f1ffdb573afe7273932e253bc4b8a17b9da4d37d7219ba05e464358975b36efb7910160405180910390a250979650505050505050565b60008061092183611a4a565b91509150915091565b606080828067ffffffffffffffff81111561094757610947612bed565b604051908082528060200260200182016040528015610970578160200160208202803683370190505b5092508067ffffffffffffffff81111561098c5761098c612bed565b6040519080825280602002602001820160405280156109bf57816020015b60608152602001906001900390816109aa5790505b50915060005b81811015610a8757308686838181106109e0576109e06130a0565b90506020028101906109f291906130b6565b604051610a009291906130fd565b600060405180830381855af49150503d8060008114610a3b576040519150601f19603f3d011682016040523d82523d6000602084013e610a40565b606091505b50858381518110610a5357610a536130a0565b60200260200101858481518110610a6c57610a6c6130a0565b602090810291909101019190915290151590526001016109c5565b50509250929050565b60008054610a9d9061310d565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac99061310d565b8015610b165780601f10610aeb57610100808354040283529160200191610b16565b820191906000526020600020905b815481529060010190602001808311610af957829003601f168201915b505050505081565b6000816001600160a01b0316630e15999d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b829190613141565b90506001600160a01b038116610bda5760405162461bcd60e51b815260206004820152601860248201527f42656e65666963696172792061646472657373207a65726f00000000000000006044820152606401610707565b6001600160a01b03821660009081526003602052604081205490819003610c435760405162461bcd60e51b815260206004820152601660248201527f4f45562070726f78792062616c616e6365207a65726f000000000000000000006044820152606401610707565b6001600160a01b0383811660008181526003602090815260408083209290925581519386168452830184905290917f0472be967f9a37138dfea1875af44784cafb79f92044ab33d7d6958eddd9ca6c910160405180910390a26000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610ce9576040519150601f19603f3d011682016040523d82523d6000602084013e610cee565b606091505b5050905080610d3f5760405162461bcd60e51b815260206004820152601360248201527f5769746864726177616c207265766572746564000000000000000000000000006044820152606401610707565b50505050565b60006004600083604051602001610d5e91815260200190565b604051602081830303815290604052805190602001208152602001908152602001600020549050919050565b81610dd75760405162461bcd60e51b815260206004820152600e60248201527f64415049206e616d65207a65726f0000000000000000000000000000000000006044820152606401610707565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610ed057506040517f91d148540000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201523360248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906391d1485490604401602060405180830381865afa158015610eac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed0919061315e565b610f1c5760405162461bcd60e51b815260206004820152601b60248201527f53656e6465722063616e6e6f74207365742064415049206e616d6500000000006044820152606401610707565b806004600084604051602001610f3491815260200190565b60408051601f1981840301815291815281516020928301208352828201939093529082016000209290925551338152839183917ff3a9aac9b6ac0f842cb5d9b3491cd5fc1b6a6778d97fd9529f587339865294f5910160405180910390a35050565b60008061092183611b7d565b6060818067ffffffffffffffff811115610fbe57610fbe612bed565b604051908082528060200260200182016040528015610ff157816020015b6060815260200190600190039081610fdc5790505b50915060005b8181101561111b57600030868684818110611014576110146130a0565b905060200281019061102691906130b6565b6040516110349291906130fd565b600060405180830381855af49150503d806000811461106f576040519150601f19603f3d011682016040523d82523d6000602084013e611074565b606091505b50858481518110611087576110876130a0565b60209081029190910101529050806111125760008483815181106110ad576110ad6130a0565b602002602001015190506000815111156110ca5780518082602001fd5b60405162461bcd60e51b815260206004820152601b60248201527f4d756c746963616c6c3a204e6f2072657665727420737472696e6700000000006044820152606401610707565b50600101610ff7565b505092915050565b60008061092183611bf5565b60008061092183611ccd565b8442610e1001811061118f5760405162461bcd60e51b815260206004820152601360248201527f54696d657374616d70206e6f742076616c6964000000000000000000000000006044820152606401610707565b6001600160a01b03891660009081526002602090815260408083208b8452909152902054600160e01b900463ffffffff16861161120e5760405162461bcd60e51b815260206004820152601960248201527f446f6573206e6f74207570646174652074696d657374616d70000000000000006044820152606401610707565b600046308b8b8b8b8b8b33346040516020016112339a99989796959493929190613180565b604051602081830303815290604052805190602001209050600061128c87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611d9f92505050565b9050878460018111156114615760008167ffffffffffffffff8111156112b4576112b4612bed565b6040519080825280602002602001820160405280156112dd578160200160208202803683370190505b5090506000805b8381101561135057600061131b888c8c85818110611304576113046130a0565b905060200281019061131691906130b6565b611ea2565b85848151811061132d5761132d6130a0565b602090810291909101015290508015611347576001909201915b506001016112e4565b5061135c6002846131ff565b81116113aa5760405162461bcd60e51b815260206004820152601560248201527f4e6f7420656e6f756768207369676e61747572657300000000000000000000006044820152606401610707565b6113b382611864565b8e146114015760405162461bcd60e51b815260206004820152601660248201527f426561636f6e20736574204944206d69736d61746368000000000000000000006044820152606401610707565b8c8f6001600160a01b03168f7fdd29860e0772a39dea2ff0520d79f8efdffe48c903d6bbbc0c2cc65dc6568a7f8888604051611452929190601b9290920b825263ffffffff16602082015260400190565b60405180910390a450506115cb565b8060010361158357600080611483868a8a6000818110611304576113046130a0565b91509150816114d45760405162461bcd60e51b815260206004820152601160248201527f4d697373696e67207369676e61747572650000000000000000000000000000006044820152606401610707565b808e146115235760405162461bcd60e51b815260206004820152601260248201527f426561636f6e204944206d69736d6174636800000000000000000000000000006044820152606401610707565b50508a8d6001600160a01b03168d7fc856aaa4e639403f366ad68f07eb69bad4c044a35b0369c4ef1ea3a427a6a0ee8686604051611576929190601b9290920b825263ffffffff16602082015260400190565b60405180910390a46115cb565b60405162461bcd60e51b815260206004820152601b60248201527f446964206e6f74207370656369667920616e7920426561636f6e7300000000006044820152606401610707565b604051806040016040528084601b0b81526020018363ffffffff16815250600260008f6001600160a01b03166001600160a01b0316815260200190815260200160002060008e815260200190815260200160002060008201518160000160006101000a8154816001600160e01b030219169083601b0b6001600160e01b03160217905550602082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555090505034600360008f6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546116ae9190613213565b909155505050505050505050505050505050565b80516000908190600181116117195760405162461bcd60e51b815260206004820152601f60248201527f537065636966696564206c657373207468616e2074776f20426561636f6e73006044820152606401610707565b60008167ffffffffffffffff81111561173457611734612bed565b60405190808252806020026020018201604052801561175d578160200160208202803683370190505b50905060008267ffffffffffffffff81111561177b5761177b612bed565b6040519080825280602002602001820160405280156117a4578160200160208202803683370190505b50905060005b83811015611845576000600160008984815181106117ca576117ca6130a0565b602090810291909101810151825281019190915260400160002080548551919250601b0b90859084908110611801576118016130a0565b602090810291909101015280548351600160e01b90910463ffffffff1690849084908110611831576118316130a0565b6020908102919091010152506001016117aa565b5061184f82611fa4565b945061185a81611fa4565b9350505050915091565b6000816040516020016118779190613234565b604051602081830303815290604052805190602001209050919050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01611877565b60008060006118de85856120fd565b915091506118eb81612142565b5090505b92915050565b60008342610e1001811061194b5760405162461bcd60e51b815260206004820152601360248201527f54696d657374616d70206e6f742076616c6964000000000000000000000000006044820152606401610707565b61198a84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611d9f92505050565b600087815260016020526040902054909250600160e01b900463ffffffff1685116119f75760405162461bcd60e51b815260206004820152601960248201527f446f6573206e6f74207570646174652074696d657374616d70000000000000006044820152606401610707565b50604080518082018252601b83900b815263ffffffff95861660208083019182526000988952600190529190962095519051909416600160e01b026001600160e01b039094169390931790935550919050565b600081815260046020526040812054819080611aa85760405162461bcd60e51b815260206004820152601160248201527f64415049206e616d65206e6f74207365740000000000000000000000000000006044820152606401610707565b336000908152600260209081526040808320848452825280832060019092529091208054825463ffffffff600160e01b92839004811692909104161115611b06578154601b81900b9550600160e01b900463ffffffff169350611b1f565b8054601b81900b9550600160e01b900463ffffffff1693505b60008463ffffffff1611611b755760405162461bcd60e51b815260206004820152601960248201527f446174612066656564206e6f7420696e697469616c697a6564000000000000006044820152606401610707565b505050915091565b60008181526001602052604090208054601b81900b91600160e01b90910463ffffffff169081611bef5760405162461bcd60e51b815260206004820152601960248201527f446174612066656564206e6f7420696e697469616c697a6564000000000000006044820152606401610707565b50915091565b600081815260046020526040812054819080611c535760405162461bcd60e51b815260206004820152601160248201527f64415049206e616d65206e6f74207365740000000000000000000000000000006044820152606401610707565b60008181526001602052604090208054601b81900b9450600160e01b900463ffffffff16925082611cc65760405162461bcd60e51b815260206004820152601960248201527f446174612066656564206e6f7420696e697469616c697a6564000000000000006044820152606401610707565b5050915091565b336000908152600260209081526040808320848452825280832060019092528220805482548493929163ffffffff600160e01b918290048116919092049091161115611d30578154601b81900b9450600160e01b900463ffffffff169250611d49565b8054601b81900b9450600160e01b900463ffffffff1692505b60008363ffffffff1611611cc65760405162461bcd60e51b815260206004820152601960248201527f446174612066656564206e6f7420696e697469616c697a6564000000000000006044820152606401610707565b60008151602014611df25760405162461bcd60e51b815260206004820152601760248201527f44617461206c656e677468206e6f7420636f72726563740000000000000000006044820152606401610707565b600082806020019051810190611e089190613278565b90507fffffffff800000000000000000000000000000000000000000000000000000008112801590611e5657507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff8113155b6118ef5760405162461bcd60e51b815260206004820152601760248201527f56616c7565207479706563617374696e67206572726f720000000000000000006044820152606401610707565b600080808080611eb486880188613291565b925092509250611f0683836040516bffffffffffffffffffffffff19606084901b1660208201526034810182905260009060540160405160208183030381529060405280519060200120905092915050565b93508051600014611f9957826001600160a01b0316611f3e826108178b866040516020016107fc929190918252602082015260400190565b6001600160a01b031614611f945760405162461bcd60e51b815260206004820152601260248201527f5369676e6174757265206d69736d6174636800000000000000000000000000006044820152606401610707565b600194505b505050935093915050565b80516000906009811161207d57611fba836122aa565b611fc5600282613342565b600103611ff85782611fd86002836131ff565b81518110611fe857611fe86130a0565b6020026020010151915050919050565b8060000361200857612008613356565b612076836001600284040381518110612023576120236130a0565b6020026020010151846002848161203c5761203c6131e9565b048151811061204d5761204d6130a0565b6020026020010151600182811d82821d01838316919091160160ff81901c838318160192915050565b9392505050565b612088600282613342565b6001036120a45782611fd88161209f6002856131ff565b6127bc565b6000806120b785600160028604036127e9565b80925081935050506120ee8583815181106120d4576120d46130a0565b602002602001015186838151811061204d5761204d6130a0565b95945050505050565b50919050565b60008082516041036121335760208301516040840151606085015160001a6121278782858561281e565b9450945050505061213b565b506000905060025b9250929050565b60008160048111156121565761215661336c565b0361215e5750565b60018160048111156121725761217261336c565b036121bf5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610707565b60028160048111156121d3576121d361336c565b036122205760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610707565b60038160048111156122345761223461336c565b036122a75760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610707565b50565b805160098111156122fd5760405162461bcd60e51b815260206004820152601660248201527f417272617920746f6f206c6f6e6720746f20736f7274000000000000000000006044820152606401610707565b600681101561240857600481101561235757806003036123425761232482600060016128e2565b61233182600160026128e2565b61233e82600060016128e2565b5050565b8060020361233e5761233e82600060016128e2565b806005036123d45761236c82600160026128e2565b61237982600360046128e2565b61238682600160036128e2565b61239382600060026128e2565b6123a082600260046128e2565b6123ad82600060036128e2565b6123ba82600060016128e2565b6123c782600260036128e2565b61233e82600160026128e2565b6123e182600060016128e2565b6123ee82600260036128e2565b6123fb82600160036128e2565b6123c782600060026128e2565b600881101561258557806007036124e95761242682600160026128e2565b61243382600360046128e2565b61244082600560066128e2565b61244d82600060026128e2565b61245a82600460066128e2565b61246782600360056128e2565b61247482600260066128e2565b61248182600160056128e2565b61248e82600060046128e2565b61249b82600260056128e2565b6124a882600060036128e2565b6124b582600260046128e2565b6124c282600160036128e2565b6124cf82600060016128e2565b6124dc82600260036128e2565b61233e82600460056128e2565b6124f682600060016128e2565b61250382600260036128e2565b61251082600460056128e2565b61251d82600160036128e2565b61252a82600360056128e2565b61253782600160036128e2565b61254482600260046128e2565b61255182600060026128e2565b61255e82600260046128e2565b61256b82600360046128e2565b61257882600160026128e2565b61233e82600260036128e2565b806009036126b85761259a82600160086128e2565b6125a782600260076128e2565b6125b482600360066128e2565b6125c182600460056128e2565b6125ce82600160046128e2565b6125db82600560086128e2565b6125e882600060026128e2565b6125f582600660076128e2565b61260282600260066128e2565b61260f82600760086128e2565b61261c82600060036128e2565b61262982600460056128e2565b61263682600060016128e2565b61264382600360056128e2565b61265082600660076128e2565b61265d82600260046128e2565b61266a82600160036128e2565b61267782600560076128e2565b61268482600460066128e2565b61269182600160026128e2565b61269e82600360046128e2565b6126ab82600560066128e2565b6124cf82600760086128e2565b6126c582600060076128e2565b6126d282600160066128e2565b6126df82600260056128e2565b6126ec82600360046128e2565b6126f982600060036128e2565b61270682600460076128e2565b61271382600160026128e2565b61272082600560066128e2565b61272d82600060016128e2565b61273a82600260036128e2565b61274782600460056128e2565b61275482600660076128e2565b61276182600360056128e2565b61276e82600260046128e2565b61277b82600160026128e2565b61278882600360046128e2565b61279582600560066128e2565b6127a282600260036128e2565b6127af82600460056128e2565b61233e82600360046128e2565b8151600090806127ce576127ce613356565b6127e084600060018403866000612990565b50949350505050565b815160009081906001811161280057612800613356565b61281285600060018403876001612990565b90969095509350505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561285557506000905060036128d9565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156128a9573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166128d2576000600192509250506128d9565b9150600090505b94509492505050565b8281815181106128f4576128f46130a0565b602002602001015183838151811061290e5761290e6130a0565b6020026020010151131561298b5782818151811061292e5761292e6130a0565b6020026020010151838381518110612948576129486130a0565b6020026020010151848481518110612962576129626130a0565b6020026020010185848151811061297b5761297b6130a0565b6020908102919091010191909152525b505050565b6000808486036129a557508290506000612a5c565b60006129b2888888612a66565b9050808510156129d5576129cd888860018403886000612990565b5092506129f2565b808511156129ee576129cd888260010188886000612990565b8092505b8315612a5a57875160018401925060028401905b80821015612a5757898481518110612a2057612a206130a0565b60200260200101518a8381518110612a3a57612a3a6130a0565b60200260200101511215612a4c578193505b600190910190612a06565b50505b505b9550959350505050565b6000818303612a76575081612076565b6000848481518110612a8a57612a8a6130a0565b6020026020010151905060008490508360010192505b855160019091019081108015612ace575081868281518110612ac457612ac46130a0565b6020026020010151125b612aa0575b82806001900393505081868481518110612aef57612aef6130a0565b602002602001015113612ad357828110612b7a57858381518110612b1557612b156130a0565b6020026020010151868681518110612b2f57612b2f6130a0565b6020026020010151878781518110612b4957612b496130a0565b60200260200101888681518110612b6257612b626130a0565b60200260200101828152508281525050505050612076565b858381518110612b8c57612b8c6130a0565b6020026020010151868281518110612ba657612ba66130a0565b6020026020010151878381518110612bc057612bc06130a0565b60200260200101888681518110612bd957612bd96130a0565b602090810291909101019190915252612aa0565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612c2c57612c2c612bed565b604052919050565b60006020808385031215612c4757600080fd5b823567ffffffffffffffff80821115612c5f57600080fd5b818501915085601f830112612c7357600080fd5b813581811115612c8557612c85612bed565b8060051b9150612c96848301612c03565b8181529183018401918481019088841115612cb057600080fd5b938501935b83851015612cce57843582529385019390850190612cb5565b98975050505050505050565b6001600160a01b03811681146122a757600080fd5b60008083601f840112612d0157600080fd5b50813567ffffffffffffffff811115612d1957600080fd5b60208301915083602082850101111561213b57600080fd5b600080600080600080600060a0888a031215612d4c57600080fd5b8735612d5781612cda565b96506020880135955060408801359450606088013567ffffffffffffffff80821115612d8257600080fd5b612d8e8b838c01612cef565b909650945060808a0135915080821115612da757600080fd5b50612db48a828b01612cef565b989b979a50959850939692959293505050565b600060208284031215612dd957600080fd5b5035919050565b60008083601f840112612df257600080fd5b50813567ffffffffffffffff811115612e0a57600080fd5b6020830191508360208260051b850101111561213b57600080fd5b60008060208385031215612e3857600080fd5b823567ffffffffffffffff811115612e4f57600080fd5b61281285828601612de0565b6000815180845260005b81811015612e8157602081850181015186830182015201612e65565b506000602082860101526020601f19601f83011685010191505092915050565b600081518084526020808501808196508360051b8101915082860160005b85811015612ee9578284038952612ed7848351612e5b565b98850198935090840190600101612ebf565b5091979650505050505050565b604080825283519082018190526000906020906060840190828701845b82811015612f31578151151584529284019290840190600101612f13565b50505083810382850152612f458186612ea1565b9695505050505050565b6020815260006120766020830184612e5b565b600060208284031215612f7457600080fd5b813561207681612cda565b60008060408385031215612f9257600080fd5b50508035926020909101359150565b6020815260006120766020830184612ea1565b60008060008060008060008060c0898b031215612fd057600080fd5b8835612fdb81612cda565b9750602089013596506040890135955060608901359450608089013567ffffffffffffffff8082111561300d57600080fd5b6130198c838d01612cef565b909650945060a08b013591508082111561303257600080fd5b5061303f8b828c01612de0565b999c989b5096995094979396929594505050565b6000806040838503121561306657600080fd5b823561307181612cda565b946020939093013593505050565b84815283602082015281836040830137600091016040019081529392505050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e198436030181126130cd57600080fd5b83018035915067ffffffffffffffff8211156130e857600080fd5b60200191503681900382131561213b57600080fd5b8183823760009101908152919050565b600181811c9082168061312157607f821691505b6020821081036120f757634e487b7160e01b600052602260045260246000fd5b60006020828403121561315357600080fd5b815161207681612cda565b60006020828403121561317057600080fd5b8151801515811461207657600080fd5b8a815260006bffffffffffffffffffffffff19808c60601b166020840152808b60601b166034840152896048840152886068840152876088840152858760a885013760609490941b909316930160a881019390935260bc8301525060dc01979650505050505050565b634e487b7160e01b600052601260045260246000fd5b60008261320e5761320e6131e9565b500490565b808201808211156118ef57634e487b7160e01b600052601160045260246000fd5b6020808252825182820181905260009190848201906040850190845b8181101561326c57835183529284019291840191600101613250565b50909695505050505050565b60006020828403121561328a57600080fd5b5051919050565b6000806000606084860312156132a657600080fd5b83356132b181612cda565b92506020848101359250604085013567ffffffffffffffff808211156132d657600080fd5b818701915087601f8301126132ea57600080fd5b8135818111156132fc576132fc612bed565b61330e601f8201601f19168501612c03565b9150808252888482850101111561332457600080fd5b80848401858401376000848284010152508093505050509250925092565b600082613351576133516131e9565b500690565b634e487b7160e01b600052600160045260246000fd5b634e487b7160e01b600052602160045260246000fdfea2646970667358221220693313c61a998d79d0e9b250367bd14ac439bd3d1d1f36bf50317fc99059456d64736f6c63430008110033", + "deployedBytecode": "0x6080604052600436106101b55760003560e01c806367a7cfb7116100ec578063ac9650d81161008a578063e6ec76ac11610064578063e6ec76ac14610594578063f83ea108146105a7578063f8b2cb4f146105fe578063fce90be81461062657600080fd5b8063ac9650d814610527578063b62408a314610554578063cfaf49711461057457600080fd5b80638e6ddc27116100c65780638e6ddc271461049a5780638fca9ab9146104c757806391eed085146104e7578063a5fc076f1461050757600080fd5b806367a7cfb7146104125780637512449b14610453578063796b89b91461048757600080fd5b8063437b9116116101595780634c8f1d8d116101335780634c8f1d8d146103815780634dcc19fe146103a357806351cff8d9146103b65780635989eaeb146103d857600080fd5b8063437b9116146102f2578063472c22f114610320578063481c6a751461034d57600080fd5b80631ce9ae07116101955780631ce9ae071461024157806332be8f0b1461028d5780633408e470146102cc57806342cbb15c146102df57600080fd5b80629f2f3c146101ba578062aae33f146102015780631a0a0b3e14610221575b600080fd5b3480156101c657600080fd5b506101ee7f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b34801561020d57600080fd5b506101ee61021c366004612c34565b61066f565b34801561022d57600080fd5b506101ee61023c366004612d31565b61079c565b34801561024d57600080fd5b506102757f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101f8565b34801561029957600080fd5b506102ad6102a8366004612dc7565b610915565b60408051601b9390930b835263ffffffff9091166020830152016101f8565b3480156102d857600080fd5b50466101ee565b3480156102eb57600080fd5b50436101ee565b3480156102fe57600080fd5b5061031261030d366004612e25565b61092a565b6040516101f8929190612ef6565b34801561032c57600080fd5b506101ee61033b366004612dc7565b60046020526000908152604090205481565b34801561035957600080fd5b506102757f000000000000000000000000000000000000000000000000000000000000000081565b34801561038d57600080fd5b50610396610a90565b6040516101f89190612f4f565b3480156103af57600080fd5b50486101ee565b3480156103c257600080fd5b506103d66103d1366004612f62565b610b1e565b005b3480156103e457600080fd5b506104026103f3366004612f62565b6001600160a01b03163b151590565b60405190151581526020016101f8565b34801561041e57600080fd5b506102ad61042d366004612dc7565b600090815260016020526040902054601b81900b91600160e01b90910463ffffffff1690565b34801561045f57600080fd5b506101ee7f000000000000000000000000000000000000000000000000000000000000000081565b34801561049357600080fd5b50426101ee565b3480156104a657600080fd5b506101ee6104b5366004612f62565b60036020526000908152604090205481565b3480156104d357600080fd5b506101ee6104e2366004612dc7565b610d45565b3480156104f357600080fd5b506103d6610502366004612f7f565b610d8a565b34801561051357600080fd5b506102ad610522366004612dc7565b610f96565b34801561053357600080fd5b50610547610542366004612e25565b610fa2565b6040516101f89190612fa1565b34801561056057600080fd5b506102ad61056f366004612dc7565b611123565b34801561058057600080fd5b506102ad61058f366004612dc7565b61112f565b6103d66105a2366004612fb4565b61113b565b3480156105b357600080fd5b506102ad6105c2366004613053565b6001600160a01b039190911660009081526002602090815260408083209383529290522054601b81900b91600160e01b90910463ffffffff1690565b34801561060a57600080fd5b506101ee610619366004612f62565b6001600160a01b03163190565b34801561063257600080fd5b506103966040518060400160405280601081526020017f64415049206e616d65207365747465720000000000000000000000000000000081525081565b600080600061067d846116c2565b9150915061068a84611864565b600081815260016020526040902080549194509063ffffffff808416600160e01b9092041603610710578054601b84810b91900b036107105760405162461bcd60e51b815260206004820152601a60248201527f446f6573206e6f742075706461746520426561636f6e2073657400000000000060448201526064015b60405180910390fd5b604080518082018252601b85900b80825263ffffffff858116602080850182815260008b81526001835287902095519051909316600160e01b026001600160e01b0390931692909217909355835191825281019190915285917fb7712be6248d021e8c56ac9613c09491354a4d0f4ad0b7db1a664b35be4b2349910160405180910390a2505050919050565b6000876001600160a01b031661081d84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060405161081792506107fc91508c908c908c908c9060200161307f565b60405160208183030381529060405280519060200120611894565b906118cf565b6001600160a01b0316146108735760405162461bcd60e51b815260206004820152601260248201527f5369676e6174757265206d69736d6174636800000000000000000000000000006044820152606401610707565b50604080516bffffffffffffffffffffffff1960608a901b1660208083019190915260348083018a9052835180840390910181526054909201909252805191012060006108c2828888886118f5565b60408051601b83900b815263ffffffff8a16602082015291925083917f1ffdb573afe7273932e253bc4b8a17b9da4d37d7219ba05e464358975b36efb7910160405180910390a250979650505050505050565b60008061092183611a4a565b91509150915091565b606080828067ffffffffffffffff81111561094757610947612bed565b604051908082528060200260200182016040528015610970578160200160208202803683370190505b5092508067ffffffffffffffff81111561098c5761098c612bed565b6040519080825280602002602001820160405280156109bf57816020015b60608152602001906001900390816109aa5790505b50915060005b81811015610a8757308686838181106109e0576109e06130a0565b90506020028101906109f291906130b6565b604051610a009291906130fd565b600060405180830381855af49150503d8060008114610a3b576040519150601f19603f3d011682016040523d82523d6000602084013e610a40565b606091505b50858381518110610a5357610a536130a0565b60200260200101858481518110610a6c57610a6c6130a0565b602090810291909101019190915290151590526001016109c5565b50509250929050565b60008054610a9d9061310d565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac99061310d565b8015610b165780601f10610aeb57610100808354040283529160200191610b16565b820191906000526020600020905b815481529060010190602001808311610af957829003601f168201915b505050505081565b6000816001600160a01b0316630e15999d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b829190613141565b90506001600160a01b038116610bda5760405162461bcd60e51b815260206004820152601860248201527f42656e65666963696172792061646472657373207a65726f00000000000000006044820152606401610707565b6001600160a01b03821660009081526003602052604081205490819003610c435760405162461bcd60e51b815260206004820152601660248201527f4f45562070726f78792062616c616e6365207a65726f000000000000000000006044820152606401610707565b6001600160a01b0383811660008181526003602090815260408083209290925581519386168452830184905290917f0472be967f9a37138dfea1875af44784cafb79f92044ab33d7d6958eddd9ca6c910160405180910390a26000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610ce9576040519150601f19603f3d011682016040523d82523d6000602084013e610cee565b606091505b5050905080610d3f5760405162461bcd60e51b815260206004820152601360248201527f5769746864726177616c207265766572746564000000000000000000000000006044820152606401610707565b50505050565b60006004600083604051602001610d5e91815260200190565b604051602081830303815290604052805190602001208152602001908152602001600020549050919050565b81610dd75760405162461bcd60e51b815260206004820152600e60248201527f64415049206e616d65207a65726f0000000000000000000000000000000000006044820152606401610707565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610ed057506040517f91d148540000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201523360248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906391d1485490604401602060405180830381865afa158015610eac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed0919061315e565b610f1c5760405162461bcd60e51b815260206004820152601b60248201527f53656e6465722063616e6e6f74207365742064415049206e616d6500000000006044820152606401610707565b806004600084604051602001610f3491815260200190565b60408051601f1981840301815291815281516020928301208352828201939093529082016000209290925551338152839183917ff3a9aac9b6ac0f842cb5d9b3491cd5fc1b6a6778d97fd9529f587339865294f5910160405180910390a35050565b60008061092183611b7d565b6060818067ffffffffffffffff811115610fbe57610fbe612bed565b604051908082528060200260200182016040528015610ff157816020015b6060815260200190600190039081610fdc5790505b50915060005b8181101561111b57600030868684818110611014576110146130a0565b905060200281019061102691906130b6565b6040516110349291906130fd565b600060405180830381855af49150503d806000811461106f576040519150601f19603f3d011682016040523d82523d6000602084013e611074565b606091505b50858481518110611087576110876130a0565b60209081029190910101529050806111125760008483815181106110ad576110ad6130a0565b602002602001015190506000815111156110ca5780518082602001fd5b60405162461bcd60e51b815260206004820152601b60248201527f4d756c746963616c6c3a204e6f2072657665727420737472696e6700000000006044820152606401610707565b50600101610ff7565b505092915050565b60008061092183611bf5565b60008061092183611ccd565b8442610e1001811061118f5760405162461bcd60e51b815260206004820152601360248201527f54696d657374616d70206e6f742076616c6964000000000000000000000000006044820152606401610707565b6001600160a01b03891660009081526002602090815260408083208b8452909152902054600160e01b900463ffffffff16861161120e5760405162461bcd60e51b815260206004820152601960248201527f446f6573206e6f74207570646174652074696d657374616d70000000000000006044820152606401610707565b600046308b8b8b8b8b8b33346040516020016112339a99989796959493929190613180565b604051602081830303815290604052805190602001209050600061128c87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611d9f92505050565b9050878460018111156114615760008167ffffffffffffffff8111156112b4576112b4612bed565b6040519080825280602002602001820160405280156112dd578160200160208202803683370190505b5090506000805b8381101561135057600061131b888c8c85818110611304576113046130a0565b905060200281019061131691906130b6565b611ea2565b85848151811061132d5761132d6130a0565b602090810291909101015290508015611347576001909201915b506001016112e4565b5061135c6002846131ff565b81116113aa5760405162461bcd60e51b815260206004820152601560248201527f4e6f7420656e6f756768207369676e61747572657300000000000000000000006044820152606401610707565b6113b382611864565b8e146114015760405162461bcd60e51b815260206004820152601660248201527f426561636f6e20736574204944206d69736d61746368000000000000000000006044820152606401610707565b8c8f6001600160a01b03168f7fdd29860e0772a39dea2ff0520d79f8efdffe48c903d6bbbc0c2cc65dc6568a7f8888604051611452929190601b9290920b825263ffffffff16602082015260400190565b60405180910390a450506115cb565b8060010361158357600080611483868a8a6000818110611304576113046130a0565b91509150816114d45760405162461bcd60e51b815260206004820152601160248201527f4d697373696e67207369676e61747572650000000000000000000000000000006044820152606401610707565b808e146115235760405162461bcd60e51b815260206004820152601260248201527f426561636f6e204944206d69736d6174636800000000000000000000000000006044820152606401610707565b50508a8d6001600160a01b03168d7fc856aaa4e639403f366ad68f07eb69bad4c044a35b0369c4ef1ea3a427a6a0ee8686604051611576929190601b9290920b825263ffffffff16602082015260400190565b60405180910390a46115cb565b60405162461bcd60e51b815260206004820152601b60248201527f446964206e6f74207370656369667920616e7920426561636f6e7300000000006044820152606401610707565b604051806040016040528084601b0b81526020018363ffffffff16815250600260008f6001600160a01b03166001600160a01b0316815260200190815260200160002060008e815260200190815260200160002060008201518160000160006101000a8154816001600160e01b030219169083601b0b6001600160e01b03160217905550602082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555090505034600360008f6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546116ae9190613213565b909155505050505050505050505050505050565b80516000908190600181116117195760405162461bcd60e51b815260206004820152601f60248201527f537065636966696564206c657373207468616e2074776f20426561636f6e73006044820152606401610707565b60008167ffffffffffffffff81111561173457611734612bed565b60405190808252806020026020018201604052801561175d578160200160208202803683370190505b50905060008267ffffffffffffffff81111561177b5761177b612bed565b6040519080825280602002602001820160405280156117a4578160200160208202803683370190505b50905060005b83811015611845576000600160008984815181106117ca576117ca6130a0565b602090810291909101810151825281019190915260400160002080548551919250601b0b90859084908110611801576118016130a0565b602090810291909101015280548351600160e01b90910463ffffffff1690849084908110611831576118316130a0565b6020908102919091010152506001016117aa565b5061184f82611fa4565b945061185a81611fa4565b9350505050915091565b6000816040516020016118779190613234565b604051602081830303815290604052805190602001209050919050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01611877565b60008060006118de85856120fd565b915091506118eb81612142565b5090505b92915050565b60008342610e1001811061194b5760405162461bcd60e51b815260206004820152601360248201527f54696d657374616d70206e6f742076616c6964000000000000000000000000006044820152606401610707565b61198a84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611d9f92505050565b600087815260016020526040902054909250600160e01b900463ffffffff1685116119f75760405162461bcd60e51b815260206004820152601960248201527f446f6573206e6f74207570646174652074696d657374616d70000000000000006044820152606401610707565b50604080518082018252601b83900b815263ffffffff95861660208083019182526000988952600190529190962095519051909416600160e01b026001600160e01b039094169390931790935550919050565b600081815260046020526040812054819080611aa85760405162461bcd60e51b815260206004820152601160248201527f64415049206e616d65206e6f74207365740000000000000000000000000000006044820152606401610707565b336000908152600260209081526040808320848452825280832060019092529091208054825463ffffffff600160e01b92839004811692909104161115611b06578154601b81900b9550600160e01b900463ffffffff169350611b1f565b8054601b81900b9550600160e01b900463ffffffff1693505b60008463ffffffff1611611b755760405162461bcd60e51b815260206004820152601960248201527f446174612066656564206e6f7420696e697469616c697a6564000000000000006044820152606401610707565b505050915091565b60008181526001602052604090208054601b81900b91600160e01b90910463ffffffff169081611bef5760405162461bcd60e51b815260206004820152601960248201527f446174612066656564206e6f7420696e697469616c697a6564000000000000006044820152606401610707565b50915091565b600081815260046020526040812054819080611c535760405162461bcd60e51b815260206004820152601160248201527f64415049206e616d65206e6f74207365740000000000000000000000000000006044820152606401610707565b60008181526001602052604090208054601b81900b9450600160e01b900463ffffffff16925082611cc65760405162461bcd60e51b815260206004820152601960248201527f446174612066656564206e6f7420696e697469616c697a6564000000000000006044820152606401610707565b5050915091565b336000908152600260209081526040808320848452825280832060019092528220805482548493929163ffffffff600160e01b918290048116919092049091161115611d30578154601b81900b9450600160e01b900463ffffffff169250611d49565b8054601b81900b9450600160e01b900463ffffffff1692505b60008363ffffffff1611611cc65760405162461bcd60e51b815260206004820152601960248201527f446174612066656564206e6f7420696e697469616c697a6564000000000000006044820152606401610707565b60008151602014611df25760405162461bcd60e51b815260206004820152601760248201527f44617461206c656e677468206e6f7420636f72726563740000000000000000006044820152606401610707565b600082806020019051810190611e089190613278565b90507fffffffff800000000000000000000000000000000000000000000000000000008112801590611e5657507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff8113155b6118ef5760405162461bcd60e51b815260206004820152601760248201527f56616c7565207479706563617374696e67206572726f720000000000000000006044820152606401610707565b600080808080611eb486880188613291565b925092509250611f0683836040516bffffffffffffffffffffffff19606084901b1660208201526034810182905260009060540160405160208183030381529060405280519060200120905092915050565b93508051600014611f9957826001600160a01b0316611f3e826108178b866040516020016107fc929190918252602082015260400190565b6001600160a01b031614611f945760405162461bcd60e51b815260206004820152601260248201527f5369676e6174757265206d69736d6174636800000000000000000000000000006044820152606401610707565b600194505b505050935093915050565b80516000906009811161207d57611fba836122aa565b611fc5600282613342565b600103611ff85782611fd86002836131ff565b81518110611fe857611fe86130a0565b6020026020010151915050919050565b8060000361200857612008613356565b612076836001600284040381518110612023576120236130a0565b6020026020010151846002848161203c5761203c6131e9565b048151811061204d5761204d6130a0565b6020026020010151600182811d82821d01838316919091160160ff81901c838318160192915050565b9392505050565b612088600282613342565b6001036120a45782611fd88161209f6002856131ff565b6127bc565b6000806120b785600160028604036127e9565b80925081935050506120ee8583815181106120d4576120d46130a0565b602002602001015186838151811061204d5761204d6130a0565b95945050505050565b50919050565b60008082516041036121335760208301516040840151606085015160001a6121278782858561281e565b9450945050505061213b565b506000905060025b9250929050565b60008160048111156121565761215661336c565b0361215e5750565b60018160048111156121725761217261336c565b036121bf5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610707565b60028160048111156121d3576121d361336c565b036122205760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610707565b60038160048111156122345761223461336c565b036122a75760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610707565b50565b805160098111156122fd5760405162461bcd60e51b815260206004820152601660248201527f417272617920746f6f206c6f6e6720746f20736f7274000000000000000000006044820152606401610707565b600681101561240857600481101561235757806003036123425761232482600060016128e2565b61233182600160026128e2565b61233e82600060016128e2565b5050565b8060020361233e5761233e82600060016128e2565b806005036123d45761236c82600160026128e2565b61237982600360046128e2565b61238682600160036128e2565b61239382600060026128e2565b6123a082600260046128e2565b6123ad82600060036128e2565b6123ba82600060016128e2565b6123c782600260036128e2565b61233e82600160026128e2565b6123e182600060016128e2565b6123ee82600260036128e2565b6123fb82600160036128e2565b6123c782600060026128e2565b600881101561258557806007036124e95761242682600160026128e2565b61243382600360046128e2565b61244082600560066128e2565b61244d82600060026128e2565b61245a82600460066128e2565b61246782600360056128e2565b61247482600260066128e2565b61248182600160056128e2565b61248e82600060046128e2565b61249b82600260056128e2565b6124a882600060036128e2565b6124b582600260046128e2565b6124c282600160036128e2565b6124cf82600060016128e2565b6124dc82600260036128e2565b61233e82600460056128e2565b6124f682600060016128e2565b61250382600260036128e2565b61251082600460056128e2565b61251d82600160036128e2565b61252a82600360056128e2565b61253782600160036128e2565b61254482600260046128e2565b61255182600060026128e2565b61255e82600260046128e2565b61256b82600360046128e2565b61257882600160026128e2565b61233e82600260036128e2565b806009036126b85761259a82600160086128e2565b6125a782600260076128e2565b6125b482600360066128e2565b6125c182600460056128e2565b6125ce82600160046128e2565b6125db82600560086128e2565b6125e882600060026128e2565b6125f582600660076128e2565b61260282600260066128e2565b61260f82600760086128e2565b61261c82600060036128e2565b61262982600460056128e2565b61263682600060016128e2565b61264382600360056128e2565b61265082600660076128e2565b61265d82600260046128e2565b61266a82600160036128e2565b61267782600560076128e2565b61268482600460066128e2565b61269182600160026128e2565b61269e82600360046128e2565b6126ab82600560066128e2565b6124cf82600760086128e2565b6126c582600060076128e2565b6126d282600160066128e2565b6126df82600260056128e2565b6126ec82600360046128e2565b6126f982600060036128e2565b61270682600460076128e2565b61271382600160026128e2565b61272082600560066128e2565b61272d82600060016128e2565b61273a82600260036128e2565b61274782600460056128e2565b61275482600660076128e2565b61276182600360056128e2565b61276e82600260046128e2565b61277b82600160026128e2565b61278882600360046128e2565b61279582600560066128e2565b6127a282600260036128e2565b6127af82600460056128e2565b61233e82600360046128e2565b8151600090806127ce576127ce613356565b6127e084600060018403866000612990565b50949350505050565b815160009081906001811161280057612800613356565b61281285600060018403876001612990565b90969095509350505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561285557506000905060036128d9565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156128a9573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166128d2576000600192509250506128d9565b9150600090505b94509492505050565b8281815181106128f4576128f46130a0565b602002602001015183838151811061290e5761290e6130a0565b6020026020010151131561298b5782818151811061292e5761292e6130a0565b6020026020010151838381518110612948576129486130a0565b6020026020010151848481518110612962576129626130a0565b6020026020010185848151811061297b5761297b6130a0565b6020908102919091010191909152525b505050565b6000808486036129a557508290506000612a5c565b60006129b2888888612a66565b9050808510156129d5576129cd888860018403886000612990565b5092506129f2565b808511156129ee576129cd888260010188886000612990565b8092505b8315612a5a57875160018401925060028401905b80821015612a5757898481518110612a2057612a206130a0565b60200260200101518a8381518110612a3a57612a3a6130a0565b60200260200101511215612a4c578193505b600190910190612a06565b50505b505b9550959350505050565b6000818303612a76575081612076565b6000848481518110612a8a57612a8a6130a0565b6020026020010151905060008490508360010192505b855160019091019081108015612ace575081868281518110612ac457612ac46130a0565b6020026020010151125b612aa0575b82806001900393505081868481518110612aef57612aef6130a0565b602002602001015113612ad357828110612b7a57858381518110612b1557612b156130a0565b6020026020010151868681518110612b2f57612b2f6130a0565b6020026020010151878781518110612b4957612b496130a0565b60200260200101888681518110612b6257612b626130a0565b60200260200101828152508281525050505050612076565b858381518110612b8c57612b8c6130a0565b6020026020010151868281518110612ba657612ba66130a0565b6020026020010151878381518110612bc057612bc06130a0565b60200260200101888681518110612bd957612bd96130a0565b602090810291909101019190915252612aa0565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612c2c57612c2c612bed565b604052919050565b60006020808385031215612c4757600080fd5b823567ffffffffffffffff80821115612c5f57600080fd5b818501915085601f830112612c7357600080fd5b813581811115612c8557612c85612bed565b8060051b9150612c96848301612c03565b8181529183018401918481019088841115612cb057600080fd5b938501935b83851015612cce57843582529385019390850190612cb5565b98975050505050505050565b6001600160a01b03811681146122a757600080fd5b60008083601f840112612d0157600080fd5b50813567ffffffffffffffff811115612d1957600080fd5b60208301915083602082850101111561213b57600080fd5b600080600080600080600060a0888a031215612d4c57600080fd5b8735612d5781612cda565b96506020880135955060408801359450606088013567ffffffffffffffff80821115612d8257600080fd5b612d8e8b838c01612cef565b909650945060808a0135915080821115612da757600080fd5b50612db48a828b01612cef565b989b979a50959850939692959293505050565b600060208284031215612dd957600080fd5b5035919050565b60008083601f840112612df257600080fd5b50813567ffffffffffffffff811115612e0a57600080fd5b6020830191508360208260051b850101111561213b57600080fd5b60008060208385031215612e3857600080fd5b823567ffffffffffffffff811115612e4f57600080fd5b61281285828601612de0565b6000815180845260005b81811015612e8157602081850181015186830182015201612e65565b506000602082860101526020601f19601f83011685010191505092915050565b600081518084526020808501808196508360051b8101915082860160005b85811015612ee9578284038952612ed7848351612e5b565b98850198935090840190600101612ebf565b5091979650505050505050565b604080825283519082018190526000906020906060840190828701845b82811015612f31578151151584529284019290840190600101612f13565b50505083810382850152612f458186612ea1565b9695505050505050565b6020815260006120766020830184612e5b565b600060208284031215612f7457600080fd5b813561207681612cda565b60008060408385031215612f9257600080fd5b50508035926020909101359150565b6020815260006120766020830184612ea1565b60008060008060008060008060c0898b031215612fd057600080fd5b8835612fdb81612cda565b9750602089013596506040890135955060608901359450608089013567ffffffffffffffff8082111561300d57600080fd5b6130198c838d01612cef565b909650945060a08b013591508082111561303257600080fd5b5061303f8b828c01612de0565b999c989b5096995094979396929594505050565b6000806040838503121561306657600080fd5b823561307181612cda565b946020939093013593505050565b84815283602082015281836040830137600091016040019081529392505050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e198436030181126130cd57600080fd5b83018035915067ffffffffffffffff8211156130e857600080fd5b60200191503681900382131561213b57600080fd5b8183823760009101908152919050565b600181811c9082168061312157607f821691505b6020821081036120f757634e487b7160e01b600052602260045260246000fd5b60006020828403121561315357600080fd5b815161207681612cda565b60006020828403121561317057600080fd5b8151801515811461207657600080fd5b8a815260006bffffffffffffffffffffffff19808c60601b166020840152808b60601b166034840152896048840152886068840152876088840152858760a885013760609490941b909316930160a881019390935260bc8301525060dc01979650505050505050565b634e487b7160e01b600052601260045260246000fd5b60008261320e5761320e6131e9565b500490565b808201808211156118ef57634e487b7160e01b600052601160045260246000fd5b6020808252825182820181905260009190848201906040850190845b8181101561326c57835183529284019291840191600101613250565b50909695505050505050565b60006020828403121561328a57600080fd5b5051919050565b6000806000606084860312156132a657600080fd5b83356132b181612cda565b92506020848101359250604085013567ffffffffffffffff808211156132d657600080fd5b818701915087601f8301126132ea57600080fd5b8135818111156132fc576132fc612bed565b61330e601f8201601f19168501612c03565b9150808252888482850101111561332457600080fd5b80848401858401376000848284010152508093505050509250925092565b600082613351576133516131e9565b500690565b634e487b7160e01b600052600160045260246000fd5b634e487b7160e01b600052602160045260246000fdfea2646970667358221220693313c61a998d79d0e9b250367bd14ac439bd3d1d1f36bf50317fc99059456d64736f6c63430008110033", + "devdoc": { + "kind": "dev", + "methods": { + "constructor": { + "params": { + "_accessControlRegistry": "AccessControlRegistry contract address", + "_adminRoleDescription": "Admin role description", + "_manager": "Manager address" + } + }, + "containsBytecode(address)": { + "details": "An account not containing any bytecode does not indicate that it is an EOA or it will not contain any bytecode in the future. Contract construction and `SELFDESTRUCT` updates the bytecode at the end of the transaction.", + "returns": { + "_0": "If the account contains bytecode" + } + }, + "dapiNameToDataFeedId(bytes32)": { + "params": { + "dapiName": "dAPI name" + }, + "returns": { + "_0": "Data feed ID" + } + }, + "getBalance(address)": { + "params": { + "account": "Account address" + }, + "returns": { + "_0": "Account balance" + } + }, + "getBlockBasefee()": { + "returns": { + "_0": "Current block basefee" + } + }, + "getBlockNumber()": { + "returns": { + "_0": "Current block number" + } + }, + "getBlockTimestamp()": { + "returns": { + "_0": "Current block timestamp" + } + }, + "getChainId()": { + "returns": { + "_0": "Chain ID" + } + }, + "multicall(bytes[])": { + "params": { + "data": "Array of calldata of batched calls" + }, + "returns": { + "returndata": "Array of returndata of batched calls" + } + }, + "readDataFeedWithDapiNameHash(bytes32)": { + "params": { + "dapiNameHash": "dAPI name hash" + }, + "returns": { + "timestamp": "Data feed timestamp", + "value": "Data feed value" + } + }, + "readDataFeedWithDapiNameHashAsOevProxy(bytes32)": { + "params": { + "dapiNameHash": "dAPI name hash" + }, + "returns": { + "timestamp": "Data feed timestamp", + "value": "Data feed value" + } + }, + "readDataFeedWithId(bytes32)": { + "params": { + "dataFeedId": "Data feed ID" + }, + "returns": { + "timestamp": "Data feed timestamp", + "value": "Data feed value" + } + }, + "readDataFeedWithIdAsOevProxy(bytes32)": { + "params": { + "dataFeedId": "Data feed ID" + }, + "returns": { + "timestamp": "Data feed timestamp", + "value": "Data feed value" + } + }, + "setDapiName(bytes32,bytes32)": { + "details": "While a data feed ID refers to a specific Beacon or Beacon set, dAPI names provide a more abstract interface for convenience. This means a dAPI name that was pointing to a Beacon can be pointed to a Beacon set, then another Beacon set, etc.", + "params": { + "dapiName": "Human-readable dAPI name", + "dataFeedId": "Data feed ID the dAPI name will point to" + } + }, + "tryMulticall(bytes[])": { + "params": { + "data": "Array of calldata of batched calls" + }, + "returns": { + "returndata": "Array of returndata of batched calls", + "successes": "Array of success conditions of batched calls" + } + }, + "updateBeaconSetWithBeacons(bytes32[])": { + "details": "As an oddity, this function still works if some of the IDs in `beaconIds` belong to Beacon sets rather than Beacons. This can be used to implement hierarchical Beacon sets.", + "params": { + "beaconIds": "Beacon IDs" + }, + "returns": { + "beaconSetId": "Beacon set ID" + } + }, + "updateBeaconWithSignedData(address,bytes32,uint256,bytes,bytes)": { + "details": "The signed data here is intentionally very general for practical reasons. It is less demanding on the signer to have data signed once and use that everywhere.", + "params": { + "airnode": "Airnode address", + "data": "Update data (an `int256` encoded in contract ABI)", + "signature": "Template ID, timestamp and the update data signed by the Airnode", + "templateId": "Template ID", + "timestamp": "Signature timestamp" + }, + "returns": { + "beaconId": "Updated Beacon ID" + } + }, + "updateOevProxyDataFeedWithSignedData(address,bytes32,bytes32,uint256,bytes,bytes[])": { + "details": "For when the data feed being updated is a Beacon set, an absolute majority of the Airnodes that power the respective Beacons must sign the aggregated value and timestamp. While doing so, the Airnodes should refer to data signed to update an absolute majority of the respective Beacons. The Airnodes should require the data to be fresh enough (e.g., at most 2 minutes-old), and tightly distributed around the resulting aggregation (e.g., within 1% deviation), and reject to provide an OEV proxy data feed update signature if these are not satisfied.", + "params": { + "data": "Update data (an `int256` encoded in contract ABI)", + "dataFeedId": "Data feed ID", + "oevProxy": "OEV proxy that reads the data feed", + "packedOevUpdateSignatures": "Packed OEV update signatures, which include the Airnode address, template ID and these signed with the OEV update hash", + "timestamp": "Signature timestamp", + "updateId": "Update ID" + } + }, + "withdraw(address)": { + "details": "This does not require the caller to be the beneficiary because we expect that in most cases, the OEV beneficiary will be a contract that will not be able to make arbitrary calls. Our choice can be worked around by implementing a beneficiary proxy.", + "params": { + "oevProxy": "OEV proxy" + } + } + }, + "title": "First version of the contract that API3 uses to serve data feeds", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "DAPI_NAME_SETTER_ROLE_DESCRIPTION()": { + "notice": "dAPI name setter role description" + }, + "accessControlRegistry()": { + "notice": "AccessControlRegistry contract address" + }, + "adminRole()": { + "notice": "Admin role" + }, + "adminRoleDescription()": { + "notice": "Admin role description" + }, + "containsBytecode(address)": { + "notice": "Returns if the account contains bytecode" + }, + "dapiNameHashToDataFeedId(bytes32)": { + "notice": "dAPI name hash mapped to the data feed ID" + }, + "dapiNameSetterRole()": { + "notice": "dAPI name setter role" + }, + "dapiNameToDataFeedId(bytes32)": { + "notice": "Returns the data feed ID the dAPI name is set to" + }, + "getBalance(address)": { + "notice": "Returns the account balance" + }, + "getBlockBasefee()": { + "notice": "Returns the current block basefee" + }, + "getBlockNumber()": { + "notice": "Returns the current block number" + }, + "getBlockTimestamp()": { + "notice": "Returns the current block timestamp" + }, + "getChainId()": { + "notice": "Returns the chain ID" + }, + "manager()": { + "notice": "Address of the manager that manages the related AccessControlRegistry roles" + }, + "multicall(bytes[])": { + "notice": "Batches calls to the inheriting contract and reverts as soon as one of the batched calls reverts" + }, + "oevProxyToBalance(address)": { + "notice": "Accumulated OEV auction proceeds for the specific proxy" + }, + "readDataFeedWithDapiNameHash(bytes32)": { + "notice": "Reads the data feed with dAPI name hash" + }, + "readDataFeedWithDapiNameHashAsOevProxy(bytes32)": { + "notice": "Reads the data feed as the OEV proxy with dAPI name hash" + }, + "readDataFeedWithId(bytes32)": { + "notice": "Reads the data feed with ID" + }, + "readDataFeedWithIdAsOevProxy(bytes32)": { + "notice": "Reads the data feed as the OEV proxy with ID" + }, + "setDapiName(bytes32,bytes32)": { + "notice": "Sets the data feed ID the dAPI name points to" + }, + "tryMulticall(bytes[])": { + "notice": "Batches calls to the inheriting contract but does not revert if any of the batched calls reverts" + }, + "updateBeaconSetWithBeacons(bytes32[])": { + "notice": "Updates the Beacon set using the current values of its Beacons" + }, + "updateBeaconWithSignedData(address,bytes32,uint256,bytes,bytes)": { + "notice": "Updates a Beacon using data signed by the Airnode" + }, + "updateOevProxyDataFeedWithSignedData(address,bytes32,bytes32,uint256,bytes,bytes[])": { + "notice": "Updates a data feed that the OEV proxy reads using the aggregation signed by the absolute majority of the respective Airnodes for the specific bid" + }, + "withdraw(address)": { + "notice": "Withdraws the balance of the OEV proxy to the respective beneficiary account" + } + }, + "notice": "Api3ServerV1 serves data feeds in the form of Beacons, Beacon sets, dAPIs, with optional OEV support for all of these. The base Beacons are only updateable using signed data, and the Beacon sets are updateable based on the Beacons, optionally using PSP. OEV proxy Beacons and Beacon sets are updateable using OEV-signed data. Api3ServerV1 does not support Beacons to be updated using RRP or PSP.", + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 176, + "contract": "contracts/api3-server-v1/Api3ServerV1.sol:Api3ServerV1", + "label": "adminRoleDescription", + "offset": 0, + "slot": "0", + "type": "t_string_storage" + }, + { + "astId": 4803, + "contract": "contracts/api3-server-v1/Api3ServerV1.sol:Api3ServerV1", + "label": "_dataFeeds", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_bytes32,t_struct(DataFeed)4797_storage)" + }, + { + "astId": 6904, + "contract": "contracts/api3-server-v1/Api3ServerV1.sol:Api3ServerV1", + "label": "_oevProxyToIdToDataFeed", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_mapping(t_bytes32,t_struct(DataFeed)4797_storage))" + }, + { + "astId": 6910, + "contract": "contracts/api3-server-v1/Api3ServerV1.sol:Api3ServerV1", + "label": "oevProxyToBalance", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_uint256)" + }, + { + "astId": 4625, + "contract": "contracts/api3-server-v1/Api3ServerV1.sol:Api3ServerV1", + "label": "dapiNameHashToDataFeedId", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_bytes32,t_bytes32)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_int224": { + "encoding": "inplace", + "label": "int224", + "numberOfBytes": "28" + }, + "t_mapping(t_address,t_mapping(t_bytes32,t_struct(DataFeed)4797_storage))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(bytes32 => struct DataFeedServer.DataFeed))", + "numberOfBytes": "32", + "value": "t_mapping(t_bytes32,t_struct(DataFeed)4797_storage)" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_mapping(t_bytes32,t_bytes32)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => bytes32)", + "numberOfBytes": "32", + "value": "t_bytes32" + }, + "t_mapping(t_bytes32,t_struct(DataFeed)4797_storage)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => struct DataFeedServer.DataFeed)", + "numberOfBytes": "32", + "value": "t_struct(DataFeed)4797_storage" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(DataFeed)4797_storage": { + "encoding": "inplace", + "label": "struct DataFeedServer.DataFeed", + "members": [ + { + "astId": 4794, + "contract": "contracts/api3-server-v1/Api3ServerV1.sol:Api3ServerV1", + "label": "value", + "offset": 0, + "slot": "0", + "type": "t_int224" + }, + { + "astId": 4796, + "contract": "contracts/api3-server-v1/Api3ServerV1.sol:Api3ServerV1", + "label": "timestamp", + "offset": 28, + "slot": "0", + "type": "t_uint32" + } + ], + "numberOfBytes": "32" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "encoding": "inplace", + "label": "uint32", + "numberOfBytes": "4" + } + } + } +} diff --git a/deployments/oev-network/OevAuctionHouse.json b/deployments/oev-network/OevAuctionHouse.json new file mode 100644 index 0000000..30e238a --- /dev/null +++ b/deployments/oev-network/OevAuctionHouse.json @@ -0,0 +1,2087 @@ +{ + "address": "0x34f13A5C0AD750d212267bcBc230c87AEFD35CC5", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_accessControlRegistry", + "type": "address" + }, + { + "internalType": "string", + "name": "_adminRoleDescription", + "type": "string" + }, + { + "internalType": "address", + "name": "_manager", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "AwardDetailsAreEmpty", + "type": "error" + }, + { + "inputs": [], + "name": "AwardHasExpired", + "type": "error" + }, + { + "inputs": [], + "name": "BidAmountIsZero", + "type": "error" + }, + { + "inputs": [], + "name": "BidDetailsAreEmpty", + "type": "error" + }, + { + "inputs": [], + "name": "BidFulfillmentCannotBeConfirmed", + "type": "error" + }, + { + "inputs": [], + "name": "BidFulfillmentCannotBeContradicted", + "type": "error" + }, + { + "inputs": [], + "name": "BidHasExpired", + "type": "error" + }, + { + "inputs": [], + "name": "BidIsAlreadyPlaced", + "type": "error" + }, + { + "inputs": [], + "name": "BidIsNotAwaitingAward", + "type": "error" + }, + { + "inputs": [], + "name": "BidIsNotAwaitingFulfillmentReport", + "type": "error" + }, + { + "inputs": [], + "name": "BidLifetimeIsLongerThanMaximum", + "type": "error" + }, + { + "inputs": [], + "name": "BidLifetimeIsShorterThanMinimum", + "type": "error" + }, + { + "inputs": [], + "name": "BidderAddressIsZero", + "type": "error" + }, + { + "inputs": [], + "name": "BidderBalanceIsLowerThanTheLockedAmount", + "type": "error" + }, + { + "inputs": [], + "name": "BidderCannotWithdrawYet", + "type": "error" + }, + { + "inputs": [], + "name": "BidderHasAlreadyInitiatedWithdrawal", + "type": "error" + }, + { + "inputs": [], + "name": "ChainIdIsZero", + "type": "error" + }, + { + "inputs": [], + "name": "CollateralRateIsNotPositive", + "type": "error" + }, + { + "inputs": [], + "name": "CollateralRateIsStale", + "type": "error" + }, + { + "inputs": [], + "name": "DepositAmountIsZero", + "type": "error" + }, + { + "inputs": [], + "name": "FulfillmentDetailsAreEmpty", + "type": "error" + }, + { + "inputs": [], + "name": "InsufficientBalance", + "type": "error" + }, + { + "inputs": [], + "name": "MaxCollateralAmountIsExceeded", + "type": "error" + }, + { + "inputs": [], + "name": "MaxProtocolFeeAmountIsExceeded", + "type": "error" + }, + { + "inputs": [], + "name": "MaximumAuctioneerDataLengthIsExceeded", + "type": "error" + }, + { + "inputs": [], + "name": "MaximumBidderDataLengthIsExceeded", + "type": "error" + }, + { + "inputs": [], + "name": "NativeCurrencyRateIsNotPositive", + "type": "error" + }, + { + "inputs": [], + "name": "NativeCurrencyRateIsStale", + "type": "error" + }, + { + "inputs": [], + "name": "ProxyAddressIsZero", + "type": "error" + }, + { + "inputs": [], + "name": "RecipientAddressIsZero", + "type": "error" + }, + { + "inputs": [], + "name": "SenderHasNotInitiatedWithdrawal", + "type": "error" + }, + { + "inputs": [], + "name": "SenderIsNotAProxySetterOrTheManager", + "type": "error" + }, + { + "inputs": [], + "name": "SenderIsNotAWithdrawerOrTheManager", + "type": "error" + }, + { + "inputs": [], + "name": "SenderIsNotAnAuctioneer", + "type": "error" + }, + { + "inputs": [], + "name": "SenderIsNotTheManager", + "type": "error" + }, + { + "inputs": [], + "name": "TimestampDoesNotExpediteExpiration", + "type": "error" + }, + { + "inputs": [], + "name": "WithdrawalAmountIsZero", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "bidder", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "bidTopic", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "bidId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "awardDetails", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "bidderBalance", + "type": "uint256" + } + ], + "name": "AwardedBid", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "bidder", + "type": "address" + } + ], + "name": "CanceledWithdrawal", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "bidder", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "bidTopic", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "bidId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "bidderBalance", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "accumulatedProtocolFees", + "type": "uint256" + } + ], + "name": "ConfirmedFulfillment", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "bidder", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "bidTopic", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "bidId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "bidderBalance", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "accumulatedSlashedCollateral", + "type": "uint256" + } + ], + "name": "ContradictedFulfillment", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "bidder", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "bidderBalance", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "Deposited", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "bidder", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "bidTopic", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "bidId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "expirationTimestamp", + "type": "uint32" + } + ], + "name": "ExpeditedBidExpiration", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "bidder", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "earliestWithdrawalTimestamp", + "type": "uint256" + } + ], + "name": "InitiatedWithdrawal", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "bidder", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "bidTopic", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "bidId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "bidAmount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "bidDetails", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint32", + "name": "expirationTimestamp", + "type": "uint32" + }, + { + "indexed": false, + "internalType": "uint104", + "name": "collateralAmount", + "type": "uint104" + }, + { + "indexed": false, + "internalType": "uint104", + "name": "protocolFeeAmount", + "type": "uint104" + } + ], + "name": "PlacedBid", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "bidder", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "bidTopic", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "bidId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "fulfillmentDetails", + "type": "bytes" + } + ], + "name": "ReportedFulfillment", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "nativeCurrencyRateProxy", + "type": "address" + } + ], + "name": "SetChainNativeCurrencyRateProxy", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "collateralInBasisPoints", + "type": "uint256" + } + ], + "name": "SetCollateralInBasisPoints", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "collateralRateProxy", + "type": "address" + } + ], + "name": "SetCollateralRateProxy", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "protocolFeeInBasisPoints", + "type": "uint256" + } + ], + "name": "SetProtocolFeeInBasisPoints", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "bidder", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Withdrew", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "WithdrewAccumulatedProtocolFees", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "WithdrewAccumulatedSlashedCollateral", + "type": "event" + }, + { + "inputs": [], + "name": "AUCTIONEER_ROLE_DESCRIPTION", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "FULFILLMENT_REPORTING_PERIOD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAXIMUM_AUCTIONEER_DATA_LENGTH", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAXIMUM_BIDDER_DATA_LENGTH", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAXIMUM_BID_LIFETIME", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MINIMUM_BID_LIFETIME", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PROXY_SETTER_ROLE_DESCRIPTION", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "WITHDRAWAL_WAITING_PERIOD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "WITHDRAWER_ROLE_DESCRIPTION", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "accessControlRegistry", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "accumulatedProtocolFees", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "accumulatedSlashedCollateral", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "adminRole", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "adminRoleDescription", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "auctioneerRole", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "bidder", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "bidTopic", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "bidDetailsHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "awardDetails", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "awardExpirationTimestamp", + "type": "uint256" + } + ], + "name": "awardBid", + "outputs": [ + { + "internalType": "uint256", + "name": "bidderBalance", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "bidderToBalance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "bidderToEarliestWithdrawalTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "bids", + "outputs": [ + { + "internalType": "enum IOevAuctionHouse.BidStatus", + "name": "status", + "type": "uint8" + }, + { + "internalType": "uint32", + "name": "expirationTimestamp", + "type": "uint32" + }, + { + "internalType": "uint104", + "name": "collateralAmount", + "type": "uint104" + }, + { + "internalType": "uint104", + "name": "protocolFeeAmount", + "type": "uint104" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "cancelWithdrawal", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "chainIdToNativeCurrencyRateProxy", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralInBasisPoints", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "collateralRateProxy", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "bidder", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "bidTopic", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "bidDetailsHash", + "type": "bytes32" + } + ], + "name": "confirmFulfillment", + "outputs": [ + { + "internalType": "uint256", + "name": "bidderBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "accumulatedProtocolFees_", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "bidder", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "bidTopic", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "bidDetailsHash", + "type": "bytes32" + } + ], + "name": "contradictFulfillment", + "outputs": [ + { + "internalType": "uint256", + "name": "bidderBalance", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "accumulatedSlashedCollateral_", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "deposit", + "outputs": [ + { + "internalType": "uint256", + "name": "bidderBalance", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "bidder", + "type": "address" + } + ], + "name": "depositForBidder", + "outputs": [ + { + "internalType": "uint256", + "name": "bidderBalance", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "bidTopic", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "bidDetailsHash", + "type": "bytes32" + }, + { + "internalType": "uint32", + "name": "expirationTimestamp", + "type": "uint32" + } + ], + "name": "expediteBidExpiration", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "bidTopic", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "bidDetailsHash", + "type": "bytes32" + } + ], + "name": "expediteBidExpirationMaximally", + "outputs": [ + { + "internalType": "uint32", + "name": "expirationTimestamp", + "type": "uint32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bidAmount", + "type": "uint256" + } + ], + "name": "getCurrentCollateralAndProtocolFeeAmounts", + "outputs": [ + { + "internalType": "uint104", + "name": "collateralAmount", + "type": "uint104" + }, + { + "internalType": "uint104", + "name": "protocolFeeAmount", + "type": "uint104" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "initiateWithdrawal", + "outputs": [ + { + "internalType": "uint256", + "name": "earliestWithdrawalTimestamp", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "manager", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "data", + "type": "bytes[]" + } + ], + "name": "multicall", + "outputs": [ + { + "internalType": "bytes[]", + "name": "returndata", + "type": "bytes[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "bidTopic", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bidAmount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "bidDetails", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "maxCollateralAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxProtocolFeeAmount", + "type": "uint256" + } + ], + "name": "placeBid", + "outputs": [ + { + "internalType": "uint32", + "name": "expirationTimestamp", + "type": "uint32" + }, + { + "internalType": "uint104", + "name": "collateralAmount", + "type": "uint104" + }, + { + "internalType": "uint104", + "name": "protocolFeeAmount", + "type": "uint104" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "bidTopic", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "bidAmount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "bidDetails", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "maxCollateralAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxProtocolFeeAmount", + "type": "uint256" + }, + { + "internalType": "uint32", + "name": "expirationTimestamp", + "type": "uint32" + } + ], + "name": "placeBidWithExpiration", + "outputs": [ + { + "internalType": "uint104", + "name": "collateralAmount", + "type": "uint104" + }, + { + "internalType": "uint104", + "name": "protocolFeeAmount", + "type": "uint104" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "protocolFeeInBasisPoints", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proxySetterRole", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "bidTopic", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "bidDetailsHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "fulfillmentDetails", + "type": "bytes" + } + ], + "name": "reportFulfillment", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "nativeCurrencyRateProxy", + "type": "address" + } + ], + "name": "setChainNativeCurrencyRateProxy", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "collateralInBasisPoints_", + "type": "uint256" + } + ], + "name": "setCollateralInBasisPoints", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "collateralRateProxy_", + "type": "address" + } + ], + "name": "setCollateralRateProxy", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "protocolFeeInBasisPoints_", + "type": "uint256" + } + ], + "name": "setProtocolFeeInBasisPoints", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "data", + "type": "bytes[]" + } + ], + "name": "tryMulticall", + "outputs": [ + { + "internalType": "bool[]", + "name": "successes", + "type": "bool[]" + }, + { + "internalType": "bytes[]", + "name": "returndata", + "type": "bytes[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "withdrawAccumulatedProtocolFees", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "withdrawAccumulatedSlashedCollateral", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "withdrawerRole", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x0d82dca948f243f853cd8c4d27423a0352bc4e9be8a20f522be904fbae3a82c5", + "receipt": { + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "from": "0x07b589f06bD0A5324c4E2376d66d2F4F25921DE1", + "contractAddress": null, + "transactionIndex": 1, + "gasUsed": "3089533", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x66ada99390d316fa2f6c604367815d0597c7bcba5e55319785a7ad1073c0d63a", + "transactionHash": "0x0d82dca948f243f853cd8c4d27423a0352bc4e9be8a20f522be904fbae3a82c5", + "logs": [], + "blockNumber": 34, + "cumulativeGasUsed": "3089533", + "status": 1, + "byzantium": true + }, + "args": [ + "0xcD7Df573B0F0bb4F2f8dFFF6650cDe8C77431730", + "OevAuctionHouse admin", + "0x81bc85f329cDB28936FbB239f734AE495121F9A6" + ], + "numDeployments": 1, + "solcInputHash": "244b8e05fc2166c1983c7be433cf9254", + "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_accessControlRegistry\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_adminRoleDescription\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_manager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AwardDetailsAreEmpty\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AwardHasExpired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BidAmountIsZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BidDetailsAreEmpty\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BidFulfillmentCannotBeConfirmed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BidFulfillmentCannotBeContradicted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BidHasExpired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BidIsAlreadyPlaced\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BidIsNotAwaitingAward\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BidIsNotAwaitingFulfillmentReport\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BidLifetimeIsLongerThanMaximum\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BidLifetimeIsShorterThanMinimum\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BidderAddressIsZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BidderBalanceIsLowerThanTheLockedAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BidderCannotWithdrawYet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BidderHasAlreadyInitiatedWithdrawal\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ChainIdIsZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CollateralRateIsNotPositive\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CollateralRateIsStale\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DepositAmountIsZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FulfillmentDetailsAreEmpty\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MaxCollateralAmountIsExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MaxProtocolFeeAmountIsExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MaximumAuctioneerDataLengthIsExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MaximumBidderDataLengthIsExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NativeCurrencyRateIsNotPositive\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NativeCurrencyRateIsStale\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ProxyAddressIsZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RecipientAddressIsZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SenderHasNotInitiatedWithdrawal\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SenderIsNotAProxySetterOrTheManager\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SenderIsNotAWithdrawerOrTheManager\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SenderIsNotAnAuctioneer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SenderIsNotTheManager\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TimestampDoesNotExpediteExpiration\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WithdrawalAmountIsZero\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"bidder\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"bidTopic\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"bidId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"awardDetails\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"bidderBalance\",\"type\":\"uint256\"}],\"name\":\"AwardedBid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"bidder\",\"type\":\"address\"}],\"name\":\"CanceledWithdrawal\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"bidder\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"bidTopic\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"bidId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"bidderBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"accumulatedProtocolFees\",\"type\":\"uint256\"}],\"name\":\"ConfirmedFulfillment\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"bidder\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"bidTopic\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"bidId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"bidderBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"accumulatedSlashedCollateral\",\"type\":\"uint256\"}],\"name\":\"ContradictedFulfillment\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"bidder\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"bidderBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"Deposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"bidder\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"bidTopic\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"bidId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"expirationTimestamp\",\"type\":\"uint32\"}],\"name\":\"ExpeditedBidExpiration\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"bidder\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"earliestWithdrawalTimestamp\",\"type\":\"uint256\"}],\"name\":\"InitiatedWithdrawal\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"bidder\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"bidTopic\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"bidId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"bidAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"bidDetails\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"expirationTimestamp\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint104\",\"name\":\"collateralAmount\",\"type\":\"uint104\"},{\"indexed\":false,\"internalType\":\"uint104\",\"name\":\"protocolFeeAmount\",\"type\":\"uint104\"}],\"name\":\"PlacedBid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"bidder\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"bidTopic\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"bidId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"fulfillmentDetails\",\"type\":\"bytes\"}],\"name\":\"ReportedFulfillment\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"nativeCurrencyRateProxy\",\"type\":\"address\"}],\"name\":\"SetChainNativeCurrencyRateProxy\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"collateralInBasisPoints\",\"type\":\"uint256\"}],\"name\":\"SetCollateralInBasisPoints\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"collateralRateProxy\",\"type\":\"address\"}],\"name\":\"SetCollateralRateProxy\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"protocolFeeInBasisPoints\",\"type\":\"uint256\"}],\"name\":\"SetProtocolFeeInBasisPoints\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"bidder\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Withdrew\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"WithdrewAccumulatedProtocolFees\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"WithdrewAccumulatedSlashedCollateral\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"AUCTIONEER_ROLE_DESCRIPTION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"FULFILLMENT_REPORTING_PERIOD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_AUCTIONEER_DATA_LENGTH\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_BIDDER_DATA_LENGTH\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_BID_LIFETIME\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINIMUM_BID_LIFETIME\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PROXY_SETTER_ROLE_DESCRIPTION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WITHDRAWAL_WAITING_PERIOD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WITHDRAWER_ROLE_DESCRIPTION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"accessControlRegistry\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"accumulatedProtocolFees\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"accumulatedSlashedCollateral\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"adminRole\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"adminRoleDescription\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"auctioneerRole\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"bidder\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"bidTopic\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"bidDetailsHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"awardDetails\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"awardExpirationTimestamp\",\"type\":\"uint256\"}],\"name\":\"awardBid\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"bidderBalance\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"bidderToBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"bidderToEarliestWithdrawalTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"bids\",\"outputs\":[{\"internalType\":\"enum IOevAuctionHouse.BidStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"expirationTimestamp\",\"type\":\"uint32\"},{\"internalType\":\"uint104\",\"name\":\"collateralAmount\",\"type\":\"uint104\"},{\"internalType\":\"uint104\",\"name\":\"protocolFeeAmount\",\"type\":\"uint104\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"cancelWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"chainIdToNativeCurrencyRateProxy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"collateralInBasisPoints\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"collateralRateProxy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"bidder\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"bidTopic\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"bidDetailsHash\",\"type\":\"bytes32\"}],\"name\":\"confirmFulfillment\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"bidderBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"accumulatedProtocolFees_\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"bidder\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"bidTopic\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"bidDetailsHash\",\"type\":\"bytes32\"}],\"name\":\"contradictFulfillment\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"bidderBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"accumulatedSlashedCollateral_\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"bidderBalance\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"bidder\",\"type\":\"address\"}],\"name\":\"depositForBidder\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"bidderBalance\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"bidTopic\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"bidDetailsHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"expirationTimestamp\",\"type\":\"uint32\"}],\"name\":\"expediteBidExpiration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"bidTopic\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"bidDetailsHash\",\"type\":\"bytes32\"}],\"name\":\"expediteBidExpirationMaximally\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"expirationTimestamp\",\"type\":\"uint32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"bidAmount\",\"type\":\"uint256\"}],\"name\":\"getCurrentCollateralAndProtocolFeeAmounts\",\"outputs\":[{\"internalType\":\"uint104\",\"name\":\"collateralAmount\",\"type\":\"uint104\"},{\"internalType\":\"uint104\",\"name\":\"protocolFeeAmount\",\"type\":\"uint104\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initiateWithdrawal\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"earliestWithdrawalTimestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"manager\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"data\",\"type\":\"bytes[]\"}],\"name\":\"multicall\",\"outputs\":[{\"internalType\":\"bytes[]\",\"name\":\"returndata\",\"type\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"bidTopic\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"bidAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"bidDetails\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"maxCollateralAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxProtocolFeeAmount\",\"type\":\"uint256\"}],\"name\":\"placeBid\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"expirationTimestamp\",\"type\":\"uint32\"},{\"internalType\":\"uint104\",\"name\":\"collateralAmount\",\"type\":\"uint104\"},{\"internalType\":\"uint104\",\"name\":\"protocolFeeAmount\",\"type\":\"uint104\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"bidTopic\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"bidAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"bidDetails\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"maxCollateralAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxProtocolFeeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"expirationTimestamp\",\"type\":\"uint32\"}],\"name\":\"placeBidWithExpiration\",\"outputs\":[{\"internalType\":\"uint104\",\"name\":\"collateralAmount\",\"type\":\"uint104\"},{\"internalType\":\"uint104\",\"name\":\"protocolFeeAmount\",\"type\":\"uint104\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"protocolFeeInBasisPoints\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxySetterRole\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"bidTopic\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"bidDetailsHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"fulfillmentDetails\",\"type\":\"bytes\"}],\"name\":\"reportFulfillment\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"nativeCurrencyRateProxy\",\"type\":\"address\"}],\"name\":\"setChainNativeCurrencyRateProxy\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"collateralInBasisPoints_\",\"type\":\"uint256\"}],\"name\":\"setCollateralInBasisPoints\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"collateralRateProxy_\",\"type\":\"address\"}],\"name\":\"setCollateralRateProxy\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"protocolFeeInBasisPoints_\",\"type\":\"uint256\"}],\"name\":\"setProtocolFeeInBasisPoints\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"data\",\"type\":\"bytes[]\"}],\"name\":\"tryMulticall\",\"outputs\":[{\"internalType\":\"bool[]\",\"name\":\"successes\",\"type\":\"bool[]\"},{\"internalType\":\"bytes[]\",\"name\":\"returndata\",\"type\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawAccumulatedProtocolFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawAccumulatedSlashedCollateral\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawerRole\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"OevAuctionHouse is intended to be deployed on a single chain, while Api3ServerV1 (the API3 data feed contract) is deployed on the chains that the respective user dApps are deployed on. An OEV searcher bids on an update at OevAuctionHouse, gets the larger of the collateral and protocol fee locked up at OevAuctionHouse when they are awarded the update, fulfill the update and pay their bid amount at Api3ServerV1, and report back to OevAuctionHouse to have their locked funds released and the protocol fee charged. This flow implies the need for a certain kind of a cross-chain oracle functionality (to check if the awarded update is fulfilled), which is provided by the auctioneer role in this contract. The same auctioneer role is also assigned to award the individual updates to the winning bids. This means that the trustlessness of the auctions is limited by the trustlessness of the auctioneer implementation. Although trustlessness of OEV auctions is ideal, the primary goal of OevAuctionHouse is to facilitate auctions in a transparent and accountable manner.\",\"kind\":\"dev\",\"methods\":{\"awardBid(address,bytes32,bytes32,bytes,uint256)\":{\"details\":\"`awardDetails` is an arbitrary description of how to claim the award. Refer to the documentation that the auctioneer provides for the bidders for how to use it. The bidder receiving `awardDetails` is typically time-critical. However, the bid awarding transaction may not always be confirmed immediately. To avoid unjust collateral lockups or slashings, auctioneers should use an appropriate `awardExpirationTimestamp` that will cause such transactions to revert.\",\"params\":{\"awardDetails\":\"Award details\",\"awardExpirationTimestamp\":\"Award expiration timestamp\",\"bidDetailsHash\":\"Bid details hash\",\"bidTopic\":\"Bid topic\",\"bidder\":\"Bidder address\"},\"returns\":{\"bidderBalance\":\"Bidder balance after the lockup\"}},\"confirmFulfillment(address,bytes32,bytes32)\":{\"details\":\"A fulfillment does not have to be reported to be confirmed. A bid can be confirmed to be fulfilled even after it has expired.\",\"params\":{\"bidDetailsHash\":\"Bid details hash\",\"bidTopic\":\"Bid topic\",\"bidder\":\"Bidder address\"},\"returns\":{\"accumulatedProtocolFees_\":\"Accumulated protocol fees\",\"bidderBalance\":\"Bidder balance after the collateral release\"}},\"constructor\":{\"params\":{\"_accessControlRegistry\":\"AccessControlRegistry contract address\",\"_adminRoleDescription\":\"Admin role description\",\"_manager\":\"Manager address\"}},\"contradictFulfillment(address,bytes32,bytes32)\":{\"details\":\"Fulfillments that have not been reported can only be contradicted after the reporting period is over\",\"params\":{\"bidDetailsHash\":\"Bid details hash\",\"bidTopic\":\"Bid topic\",\"bidder\":\"Bidder address\"},\"returns\":{\"accumulatedSlashedCollateral_\":\"Accumulated slashed collateral\",\"bidderBalance\":\"Bidder balance after the protocol fee release\"}},\"deposit()\":{\"returns\":{\"bidderBalance\":\"Bidder balance after the deposit\"}},\"depositForBidder(address)\":{\"params\":{\"bidder\":\"Bidder address\"},\"returns\":{\"bidderBalance\":\"Bidder balance after the deposit\"}},\"expediteBidExpiration(bytes32,bytes32,uint32)\":{\"params\":{\"bidDetailsHash\":\"Bid details hash\",\"bidTopic\":\"Bid topic\",\"expirationTimestamp\":\"Expiration timestamp after which the bid cannot be awarded\"}},\"expediteBidExpirationMaximally(bytes32,bytes32)\":{\"params\":{\"bidDetailsHash\":\"Bid details hash\",\"bidTopic\":\"Bid topic\"},\"returns\":{\"expirationTimestamp\":\"Expiration timestamp after which the bid cannot be awarded\"}},\"getCurrentCollateralAndProtocolFeeAmounts(uint256,uint256)\":{\"params\":{\"bidAmount\":\"Bid amount in the native currency of the chain with ID\",\"chainId\":\"Chain ID\"},\"returns\":{\"collateralAmount\":\"Collateral amount in the currency of the chain that OevAuctionHouse is deployed on\",\"protocolFeeAmount\":\"Protocol fee amount in the currency of the chain that OevAuctionHouse is deployed on\"}},\"initiateWithdrawal()\":{\"details\":\"A two-step withdrawal process is implemented to prevent the bidders from frontrunning bid awarding transactions with withdrawals to deny service\",\"returns\":{\"earliestWithdrawalTimestamp\":\"Earliest time that the bidder can execute the initiated withdrawal\"}},\"multicall(bytes[])\":{\"params\":{\"data\":\"Array of calldata of batched calls\"},\"returns\":{\"returndata\":\"Array of returndata of batched calls\"}},\"placeBid(bytes32,uint256,uint256,bytes,uint256,uint256)\":{\"params\":{\"bidAmount\":\"Bid amount in the native currency of the chain with ID\",\"bidDetails\":\"Bid details\",\"bidTopic\":\"Bid topic\",\"chainId\":\"Chain ID\",\"maxCollateralAmount\":\"Maximum collateral amount in the currency of the chain that OevAuctionHouse is deployed on\",\"maxProtocolFeeAmount\":\"Maximum protocol fee amount in the currency of the chain that OevAuctionHouse is deployed on\"},\"returns\":{\"collateralAmount\":\"Collateral amount in the currency of the chain that OevAuctionHouse is deployed on\",\"expirationTimestamp\":\"Expiration timestamp after which the bid cannot be awarded\",\"protocolFeeAmount\":\"Protocol fee amount in the currency of the chain that OevAuctionHouse is deployed on\"}},\"placeBidWithExpiration(bytes32,uint256,uint256,bytes,uint256,uint256,uint32)\":{\"details\":\"`bidTopic` is an arbitrary identifier of the bid type. `bidDetails` is an arbitrary description of the bid details. Refer to the documentation that the auctioneer provides for the bidders for how these parameters should be set.\",\"params\":{\"bidAmount\":\"Bid amount in the native currency of the chain with ID\",\"bidDetails\":\"Bid details\",\"bidTopic\":\"Bid topic\",\"chainId\":\"Chain ID\",\"expirationTimestamp\":\"Expiration timestamp after which the bid cannot be awarded\",\"maxCollateralAmount\":\"Maximum collateral amount in the currency of the chain that OevAuctionHouse is deployed on\",\"maxProtocolFeeAmount\":\"Maximum protocol fee amount in the currency of the chain that OevAuctionHouse is deployed on\"},\"returns\":{\"collateralAmount\":\"Collateral amount in the currency of the chain that OevAuctionHouse is deployed on\",\"protocolFeeAmount\":\"Protocol fee amount in the currency of the chain that OevAuctionHouse is deployed on\"}},\"reportFulfillment(bytes32,bytes32,bytes)\":{\"details\":\"`fulfillmentDetails` is an arbitrary description of how the fulfillment is to be verified. Refer to the documentation that the auctioneer provides for the bidders for how this parameter should be set.\",\"params\":{\"bidDetailsHash\":\"Bid details hash\",\"bidTopic\":\"Bid topic\",\"fulfillmentDetails\":\"Fulfillment details\"}},\"setChainNativeCurrencyRateProxy(uint256,address)\":{\"details\":\"The data feed proxy contract is expected to implement the IProxy interface and the respective data feed to be active with at most a 1-day heartbeat interval. Only use trusted contracts (e.g., contracts deployed by API3's ProxyFactory) to avoid reentrancy risks. The collateral rate denomination must match the native curreny rate denomination, e.g., if the collateral rate is in the form of ETH/USD, the native currency rates should be in the form of */USD.\",\"params\":{\"chainId\":\"Chain ID\",\"nativeCurrencyRateProxy\":\"Native currency rate proxy address\"}},\"setCollateralInBasisPoints(uint256)\":{\"details\":\"The collateral requirement can range from 0% (0 in basis points) to values larger than 100% (10000 in basis points). The contract manager is recommended to tune this parameter to maximize the extracted OEV. The optimal value will be defined by bidder behavior and may change over time. In the absence of additional incentives (e.g., a reputation system that refers to confirmed fulfillments), a collateral requirement that is not larger than the protocol fee may result in fulfillments going unreported (as being slashed would not be more punitive than being charged the protocol fee).\",\"params\":{\"collateralInBasisPoints_\":\"Collateral requirement in basis points\"}},\"setCollateralRateProxy(address)\":{\"details\":\"The data feed proxy contract is expected to implement the IProxy interface and the respective data feed to be active with at most a 1-day heartbeat interval. Only use trusted contracts (e.g., contracts deployed by API3's ProxyFactory) to avoid reentrancy risks. The collateral rate denomination must match the native curreny rate denomination, e.g., if the collateral rate is in the form of ETH/USD, the native currency rates should be in the form of */USD.\",\"params\":{\"collateralRateProxy_\":\"Collateral rate proxy address\"}},\"setProtocolFeeInBasisPoints(uint256)\":{\"details\":\"The protocol fee can range from 0% (0 in basis points) to values larger than 100% (10000 in basis points)\",\"params\":{\"protocolFeeInBasisPoints_\":\"Protocol fee in basis points\"}},\"tryMulticall(bytes[])\":{\"params\":{\"data\":\"Array of calldata of batched calls\"},\"returns\":{\"returndata\":\"Array of returndata of batched calls\",\"successes\":\"Array of success conditions of batched calls\"}},\"withdraw(address,uint256)\":{\"params\":{\"amount\":\"Amount\",\"recipient\":\"Recipient address\"}},\"withdrawAccumulatedProtocolFees(address,uint256)\":{\"params\":{\"amount\":\"Amount\",\"recipient\":\"Recipient address\"}},\"withdrawAccumulatedSlashedCollateral(address,uint256)\":{\"params\":{\"amount\":\"Amount\",\"recipient\":\"Recipient address\"}}},\"stateVariables\":{\"FULFILLMENT_REPORTING_PERIOD\":{\"details\":\"The bidder should execute the won update in a matter of seconds, and the fulfillment report can follow right after. However, the fulfillment reporting period is kept long enough to accomodate for a more relaxed workflow, e.g., the bidder multi-calls their fulfillment reports every hour.\"},\"MAXIMUM_BID_LIFETIME\":{\"details\":\"Considering each bid for each auction incurs a (computational, network, etc.) cost to the auctioneer, the bids need to automatically fall out of scope over time or they will eventually accumulate to an unmanageable amount\"},\"MINIMUM_BID_LIFETIME\":{\"details\":\"This is enforced to prevent bidders from frontrunning bid awarding transactions with bid expiration expedition transactions to deny service\"},\"WITHDRAWAL_WAITING_PERIOD\":{\"details\":\"This is enforced to prevent the bidders from frontrunning bid awarding transactions with withdrawals to deny service\"},\"collateralInBasisPoints\":{\"details\":\"The collateral requirement can range from 0% to values larger than 100%. This is because one can hypothesize cases where denying service by being slashed by the full bid amount is still profitable, in which case a collateral requirement that is larger than 100% would be justifiable.\"},\"collateralRateProxy\":{\"details\":\"The collateral is denominated in the native currency of the chain that OevAuctionHouse is deployed on. Bid amounts are specified and paid in the native currency of the chain that the dApp (from which OEV is being extracted from) is deployed on. This means that a common base is needed for the collateral rate and the native currency rates. For example, if the collateral rate proxy provides the ETH/USD rate, the native currency rate proxies should provide */USD rates.\"},\"protocolFeeInBasisPoints\":{\"details\":\"The protocol fee is not necessarily bounded by the bid amount, which means that this value is not necessarily bounded by 100%\"}},\"title\":\"OEV Auction House contract\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"AUCTIONEER_ROLE_DESCRIPTION()\":{\"notice\":\"Auctioneer role description\"},\"FULFILLMENT_REPORTING_PERIOD()\":{\"notice\":\"Period during which a bidder is allowed to report the fulfillment after the bid award\"},\"MAXIMUM_AUCTIONEER_DATA_LENGTH()\":{\"notice\":\"Maximum data length that an auctioneer can submit while awarding a bid\"},\"MAXIMUM_BIDDER_DATA_LENGTH()\":{\"notice\":\"Maximum data length that a bidder can submit while placing a bid or reporting a fulfillment\"},\"MAXIMUM_BID_LIFETIME()\":{\"notice\":\"Longest period during which a bid can be awarded after it has been placed\"},\"MINIMUM_BID_LIFETIME()\":{\"notice\":\"Minimum lifetime that a bid can be specified to have\"},\"PROXY_SETTER_ROLE_DESCRIPTION()\":{\"notice\":\"Proxy setter role description\"},\"WITHDRAWAL_WAITING_PERIOD()\":{\"notice\":\"Amount of time that the bidders are required to wait after initiating a withdrawal to execute it\"},\"WITHDRAWER_ROLE_DESCRIPTION()\":{\"notice\":\"Withdrawer role description\"},\"accessControlRegistry()\":{\"notice\":\"AccessControlRegistry contract address\"},\"accumulatedProtocolFees()\":{\"notice\":\"Accumulated protocol fees charged by auctioneers by confirming fulfillments\"},\"accumulatedSlashedCollateral()\":{\"notice\":\"Accumulated collateral funds slashed by auctioneers by contradicting fulfillments\"},\"adminRole()\":{\"notice\":\"Admin role\"},\"adminRoleDescription()\":{\"notice\":\"Admin role description\"},\"auctioneerRole()\":{\"notice\":\"Auctioneer role\"},\"awardBid(address,bytes32,bytes32,bytes,uint256)\":{\"notice\":\"Called by an auctioneer to award the bid\"},\"bidderToBalance(address)\":{\"notice\":\"Deposited funds of the bidder, excluding the amount that is currently locked up for awarded bids awaiting fulfillment confirmation\"},\"bidderToEarliestWithdrawalTimestamp(address)\":{\"notice\":\"Earliest time that the bidder can execute the initiated withdrawal. A timestamp of zero means that there is no ongoing withdrawal.\"},\"bids(bytes32)\":{\"notice\":\"Status, expiration timestamp, collateral amount and protocol fee amount of the bid with ID\"},\"cancelWithdrawal()\":{\"notice\":\"Called by the bidder to cancel a withdrawal that they have initiated\"},\"chainIdToNativeCurrencyRateProxy(uint256)\":{\"notice\":\"Data feed proxy address for the native currency of the chain with the ID\"},\"collateralInBasisPoints()\":{\"notice\":\"Collateral requirement in relation to the bid amount in basis points\"},\"collateralRateProxy()\":{\"notice\":\"Data feed proxy address for the collateral rate\"},\"confirmFulfillment(address,bytes32,bytes32)\":{\"notice\":\"Called by an auctioneer to confirm a fulfillment, and release the collateral and charge the protocol fee\"},\"contradictFulfillment(address,bytes32,bytes32)\":{\"notice\":\"Called by an auctioneer to contradict a fulfillment, and slash the collateral and release the protocol fee\"},\"deposit()\":{\"notice\":\"Called by the bidder to deposit funds\"},\"depositForBidder(address)\":{\"notice\":\"Called to deposit funds for a bidder\"},\"expediteBidExpiration(bytes32,bytes32,uint32)\":{\"notice\":\"Called to update the bid expiration timestamp to a specific value to expedite its expiration\"},\"expediteBidExpirationMaximally(bytes32,bytes32)\":{\"notice\":\"Called to decrease the bid expiration timestamp as much as possible to maximally expedite its expiration\"},\"getCurrentCollateralAndProtocolFeeAmounts(uint256,uint256)\":{\"notice\":\"Gets the collateral amount and the protocol fee amount for a bid with the chain ID and amount parameters based on the current rates, collateral requirement and protocol fee\"},\"initiateWithdrawal()\":{\"notice\":\"Called by the bidder to initiate a withdrawal of their funds\"},\"manager()\":{\"notice\":\"Address of the manager that manages the related AccessControlRegistry roles\"},\"multicall(bytes[])\":{\"notice\":\"Batches calls to the inheriting contract and reverts as soon as one of the batched calls reverts\"},\"placeBid(bytes32,uint256,uint256,bytes,uint256,uint256)\":{\"notice\":\"Called to place a bid with the longest possible lifetime. The searcher should determine maximum collateral and protocol fees that they will tolerate, and specify them in the arguments. Upon the awarding of the bid, the larger of the collateral amount and protocol fee amount will be locked. Upon confirmation or contradiction of the respective fulfillment, the locked amount will be released, and the protocol fee will be charged or the collateral amount will be slashed, respectively.\"},\"placeBidWithExpiration(bytes32,uint256,uint256,bytes,uint256,uint256,uint32)\":{\"notice\":\"Called to place a bid with an expiration timestamp. Searchers should use this over `placeBid()` if they expect the OEV opportunity to disappear at a specific time before the maximum bid lifetime. The searcher should determine maximum collateral and protocol fees that they will tolerate, and specify them in the arguments. Upon the awarding of the bid, the larger of the collateral amount and protocol fee amount will be locked. Upon confirmation or contradiction of the respective fulfillment, the locked amount will be released, and the protocol fee will be charged or the collateral amount will be slashed, respectively.\"},\"protocolFeeInBasisPoints()\":{\"notice\":\"Protocol fee in relation to the bid amount in basis points\"},\"proxySetterRole()\":{\"notice\":\"Proxy setter role\"},\"reportFulfillment(bytes32,bytes32,bytes)\":{\"notice\":\"Called by the owner of the awarded bid to report its fulfillment\"},\"setChainNativeCurrencyRateProxy(uint256,address)\":{\"notice\":\"Sets native currency rate proxy for the chain with ID\"},\"setCollateralInBasisPoints(uint256)\":{\"notice\":\"Called by the manager to set the collateral requirement in basis points\"},\"setCollateralRateProxy(address)\":{\"notice\":\"Sets collateral rate proxy\"},\"setProtocolFeeInBasisPoints(uint256)\":{\"notice\":\"Called by the manager to set the protocol fee in basis points\"},\"tryMulticall(bytes[])\":{\"notice\":\"Batches calls to the inheriting contract but does not revert if any of the batched calls reverts\"},\"withdraw(address,uint256)\":{\"notice\":\"Called by the bidder to execute a withdrawal that they have initiated\"},\"withdrawAccumulatedProtocolFees(address,uint256)\":{\"notice\":\"Called by the contract manager to withdraw the accumulated protocol fees charged by auctioneers by confirming fulfillments\"},\"withdrawAccumulatedSlashedCollateral(address,uint256)\":{\"notice\":\"Called by the contract manager to withdraw the accumulated collateral slashed by auctioneers by contradicting fulfillments\"},\"withdrawerRole()\":{\"notice\":\"Withdrawer role\"}},\"notice\":\"OEV is a subset of MEV that oracles have exclusive priority of extraction. API3 holds OEV auctions for its data feed services and forwards the proceeds to the respective user dApps. OevAuctionHouse is the platform that OEV searchers can bid on data feed updates that satisfy specific conditions, and report that they have fulfilled the updates that they are awarded. Refer to Api3ServerV1.sol for how the awarded updates are to be fulfilled and how the beneficiaries can withdraw the auction proceeds.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/api3-server-v1/OevAuctionHouse.sol\":\"OevAuctionHouse\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000},\"remappings\":[]},\"sources\":{\"contracts/access/AccessControlRegistryAdminned.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/SelfMulticall.sol\\\";\\nimport \\\"./RoleDeriver.sol\\\";\\nimport \\\"./interfaces/IAccessControlRegistryAdminned.sol\\\";\\nimport \\\"./interfaces/IAccessControlRegistry.sol\\\";\\n\\n/// @title Contract to be inherited by contracts whose adminship functionality\\n/// will be implemented using AccessControlRegistry\\ncontract AccessControlRegistryAdminned is\\n SelfMulticall,\\n RoleDeriver,\\n IAccessControlRegistryAdminned\\n{\\n /// @notice AccessControlRegistry contract address\\n address public immutable override accessControlRegistry;\\n\\n /// @notice Admin role description\\n string public override adminRoleDescription;\\n\\n bytes32 internal immutable adminRoleDescriptionHash;\\n\\n /// @dev Contracts deployed with the same admin role descriptions will have\\n /// the same roles, meaning that granting an account a role will authorize\\n /// it in multiple contracts. Unless you want your deployed contract to\\n /// share the role configuration of another contract, use a unique admin\\n /// role description.\\n /// @param _accessControlRegistry AccessControlRegistry contract address\\n /// @param _adminRoleDescription Admin role description\\n constructor(\\n address _accessControlRegistry,\\n string memory _adminRoleDescription\\n ) {\\n require(_accessControlRegistry != address(0), \\\"ACR address zero\\\");\\n require(\\n bytes(_adminRoleDescription).length > 0,\\n \\\"Admin role description empty\\\"\\n );\\n accessControlRegistry = _accessControlRegistry;\\n adminRoleDescription = _adminRoleDescription;\\n adminRoleDescriptionHash = keccak256(\\n abi.encodePacked(_adminRoleDescription)\\n );\\n }\\n\\n /// @notice Derives the admin role for the specific manager address\\n /// @param manager Manager address\\n /// @return adminRole Admin role\\n function _deriveAdminRole(\\n address manager\\n ) internal view returns (bytes32 adminRole) {\\n adminRole = _deriveRole(\\n _deriveRootRole(manager),\\n adminRoleDescriptionHash\\n );\\n }\\n}\\n\",\"keccak256\":\"0x813755d99a9d8dd6298720da68fb5a6dd69329ea2dec91da1d09f715d4543c15\",\"license\":\"MIT\"},\"contracts/access/AccessControlRegistryAdminnedWithManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./AccessControlRegistryAdminned.sol\\\";\\nimport \\\"./interfaces/IAccessControlRegistryAdminnedWithManager.sol\\\";\\n\\n/// @title Contract to be inherited by contracts with manager whose adminship\\n/// functionality will be implemented using AccessControlRegistry\\n/// @notice The manager address here is expected to belong to an\\n/// AccessControlRegistry user that is a multisig/DAO\\ncontract AccessControlRegistryAdminnedWithManager is\\n AccessControlRegistryAdminned,\\n IAccessControlRegistryAdminnedWithManager\\n{\\n /// @notice Address of the manager that manages the related\\n /// AccessControlRegistry roles\\n /// @dev The mutability of the manager role can be implemented by\\n /// designating an OwnableCallForwarder contract as the manager. The\\n /// ownership of this contract can then be transferred, effectively\\n /// transferring managership.\\n address public immutable override manager;\\n\\n /// @notice Admin role\\n /// @dev Since `manager` is immutable, so is `adminRole`\\n bytes32 public immutable override adminRole;\\n\\n /// @param _accessControlRegistry AccessControlRegistry contract address\\n /// @param _adminRoleDescription Admin role description\\n /// @param _manager Manager address\\n constructor(\\n address _accessControlRegistry,\\n string memory _adminRoleDescription,\\n address _manager\\n )\\n AccessControlRegistryAdminned(\\n _accessControlRegistry,\\n _adminRoleDescription\\n )\\n {\\n require(_manager != address(0), \\\"Manager address zero\\\");\\n manager = _manager;\\n adminRole = _deriveAdminRole(_manager);\\n }\\n}\\n\",\"keccak256\":\"0xbe5df884327dd7d4e236c105b6ef52cc6db20b452f4cdbe6c50fa506ed66cace\",\"license\":\"MIT\"},\"contracts/access/RoleDeriver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n/// @title Contract to be inherited by contracts that will derive\\n/// AccessControlRegistry roles\\n/// @notice If a contract interfaces with AccessControlRegistry and needs to\\n/// derive roles, it should inherit this contract instead of re-implementing\\n/// the logic\\ncontract RoleDeriver {\\n /// @notice Derives the root role of the manager\\n /// @param manager Manager address\\n /// @return rootRole Root role\\n function _deriveRootRole(\\n address manager\\n ) internal pure returns (bytes32 rootRole) {\\n rootRole = keccak256(abi.encodePacked(manager));\\n }\\n\\n /// @notice Derives the role using its admin role and description\\n /// @dev This implies that roles adminned by the same role cannot have the\\n /// same description\\n /// @param adminRole Admin role\\n /// @param description Human-readable description of the role\\n /// @return role Role\\n function _deriveRole(\\n bytes32 adminRole,\\n string memory description\\n ) internal pure returns (bytes32 role) {\\n role = _deriveRole(adminRole, keccak256(abi.encodePacked(description)));\\n }\\n\\n /// @notice Derives the role using its admin role and description hash\\n /// @dev This implies that roles adminned by the same role cannot have the\\n /// same description\\n /// @param adminRole Admin role\\n /// @param descriptionHash Hash of the human-readable description of the\\n /// role\\n /// @return role Role\\n function _deriveRole(\\n bytes32 adminRole,\\n bytes32 descriptionHash\\n ) internal pure returns (bytes32 role) {\\n role = keccak256(abi.encodePacked(adminRole, descriptionHash));\\n }\\n}\\n\",\"keccak256\":\"0x488adb3cb7031415d4a195230753a0ac8f9f610e6db7a571529a350e29c97ed6\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControlRegistry.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../vendor/@openzeppelin/contracts@4.8.2/access/IAccessControl.sol\\\";\\nimport \\\"../../utils/interfaces/ISelfMulticall.sol\\\";\\n\\ninterface IAccessControlRegistry is IAccessControl, ISelfMulticall {\\n event InitializedManager(\\n bytes32 indexed rootRole,\\n address indexed manager,\\n address sender\\n );\\n\\n event InitializedRole(\\n bytes32 indexed role,\\n bytes32 indexed adminRole,\\n string description,\\n address sender\\n );\\n\\n function initializeManager(address manager) external;\\n\\n function initializeRoleAndGrantToSender(\\n bytes32 adminRole,\\n string calldata description\\n ) external returns (bytes32 role);\\n}\\n\",\"keccak256\":\"0x87066db894a24118df39a557d00c0a6529c39196011c03f809ca8cce1644e027\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControlRegistryAdminned.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/interfaces/ISelfMulticall.sol\\\";\\n\\ninterface IAccessControlRegistryAdminned is ISelfMulticall {\\n function accessControlRegistry() external view returns (address);\\n\\n function adminRoleDescription() external view returns (string memory);\\n}\\n\",\"keccak256\":\"0xd71aae2566c019a9b2da5e1ec51421a62898495fa6fd08e2cc39451511dda334\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControlRegistryAdminnedWithManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControlRegistryAdminned.sol\\\";\\n\\ninterface IAccessControlRegistryAdminnedWithManager is\\n IAccessControlRegistryAdminned\\n{\\n function manager() external view returns (address);\\n\\n function adminRole() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x8a8e1756fca81175305755b7a311536132e88173f60b2ac0fdeef92a6236afc5\",\"license\":\"MIT\"},\"contracts/api3-server-v1/OevAuctionHouse.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.17;\\n\\nimport \\\"../access/AccessControlRegistryAdminnedWithManager.sol\\\";\\nimport \\\"./interfaces/IOevAuctionHouse.sol\\\";\\nimport \\\"./proxies/interfaces/IProxy.sol\\\";\\n\\n/// @title OEV Auction House contract\\n/// @notice OEV is a subset of MEV that oracles have exclusive priority of\\n/// extraction. API3 holds OEV auctions for its data feed services and forwards\\n/// the proceeds to the respective user dApps. OevAuctionHouse is the platform\\n/// that OEV searchers can bid on data feed updates that satisfy specific\\n/// conditions, and report that they have fulfilled the updates that they are\\n/// awarded. Refer to Api3ServerV1.sol for how the awarded updates are to be\\n/// fulfilled and how the beneficiaries can withdraw the auction proceeds.\\n/// @dev OevAuctionHouse is intended to be deployed on a single chain, while\\n/// Api3ServerV1 (the API3 data feed contract) is deployed on the chains that\\n/// the respective user dApps are deployed on. An OEV searcher bids on an\\n/// update at OevAuctionHouse, gets the larger of the collateral and protocol\\n/// fee locked up at OevAuctionHouse when they are awarded the update, fulfill\\n/// the update and pay their bid amount at Api3ServerV1, and report back to\\n/// OevAuctionHouse to have their locked funds released and the protocol fee\\n/// charged. This flow implies the need for a certain kind of a cross-chain\\n/// oracle functionality (to check if the awarded update is fulfilled), which\\n/// is provided by the auctioneer role in this contract. The same auctioneer\\n/// role is also assigned to award the individual updates to the winning bids.\\n/// This means that the trustlessness of the auctions is limited by the\\n/// trustlessness of the auctioneer implementation. Although trustlessness of\\n/// OEV auctions is ideal, the primary goal of OevAuctionHouse is to facilitate\\n/// auctions in a transparent and accountable manner.\\ncontract OevAuctionHouse is\\n AccessControlRegistryAdminnedWithManager,\\n IOevAuctionHouse\\n{\\n // The collateral and protocol fee amounts are denominated in the native\\n // currency of the chain that OevAuctionHouse is deployed on. In the case\\n // that this currency is ETH, the variable sizes below for collateral and\\n // protocol fee are expected to be sufficient.\\n struct Bid {\\n BidStatus status;\\n uint32 expirationTimestamp;\\n uint104 collateralAmount;\\n uint104 protocolFeeAmount;\\n }\\n\\n /// @notice Proxy setter role description\\n string public constant override PROXY_SETTER_ROLE_DESCRIPTION =\\n \\\"Proxy setter\\\";\\n\\n /// @notice Withdrawer role description\\n string public constant override WITHDRAWER_ROLE_DESCRIPTION = \\\"Withdrawer\\\";\\n\\n /// @notice Auctioneer role description\\n string public constant override AUCTIONEER_ROLE_DESCRIPTION = \\\"Auctioneer\\\";\\n\\n /// @notice Amount of time that the bidders are required to wait after\\n /// initiating a withdrawal to execute it\\n /// @dev This is enforced to prevent the bidders from frontrunning bid\\n /// awarding transactions with withdrawals to deny service\\n uint256 public constant override WITHDRAWAL_WAITING_PERIOD = 15 seconds;\\n\\n /// @notice Longest period during which a bid can be awarded after it has\\n /// been placed\\n /// @dev Considering each bid for each auction incurs a (computational,\\n /// network, etc.) cost to the auctioneer, the bids need to automatically\\n /// fall out of scope over time or they will eventually accumulate to an\\n /// unmanageable amount\\n uint256 public constant override MAXIMUM_BID_LIFETIME = 1 days;\\n\\n /// @notice Minimum lifetime that a bid can be specified to have\\n /// @dev This is enforced to prevent bidders from frontrunning bid awarding\\n /// transactions with bid expiration expedition transactions to deny\\n /// service\\n uint256 public constant override MINIMUM_BID_LIFETIME = 15 seconds;\\n\\n /// @notice Period during which a bidder is allowed to report the\\n /// fulfillment after the bid award\\n /// @dev The bidder should execute the won update in a matter of seconds,\\n /// and the fulfillment report can follow right after. However, the\\n /// fulfillment reporting period is kept long enough to accomodate for a\\n /// more relaxed workflow, e.g., the bidder multi-calls their fulfillment\\n /// reports every hour.\\n uint256 public constant override FULFILLMENT_REPORTING_PERIOD = 1 days;\\n\\n /// @notice Maximum data length that a bidder can submit while placing a\\n /// bid or reporting a fulfillment\\n uint256 public constant override MAXIMUM_BIDDER_DATA_LENGTH = 1024;\\n\\n /// @notice Maximum data length that an auctioneer can submit while\\n /// awarding a bid\\n uint256 public constant override MAXIMUM_AUCTIONEER_DATA_LENGTH = 8192;\\n\\n /// @notice Proxy setter role\\n bytes32 public immutable override proxySetterRole;\\n\\n /// @notice Withdrawer role\\n bytes32 public immutable override withdrawerRole;\\n\\n /// @notice Auctioneer role\\n bytes32 public immutable override auctioneerRole;\\n\\n /// @notice Collateral requirement in relation to the bid amount in basis\\n /// points\\n /// @dev The collateral requirement can range from 0% to values larger than\\n /// 100%. This is because one can hypothesize cases where denying service\\n /// by being slashed by the full bid amount is still profitable, in which\\n /// case a collateral requirement that is larger than 100% would be\\n /// justifiable.\\n uint256 public override collateralInBasisPoints;\\n\\n /// @notice Protocol fee in relation to the bid amount in basis points\\n /// @dev The protocol fee is not necessarily bounded by the bid amount,\\n /// which means that this value is not necessarily bounded by 100%\\n uint256 public override protocolFeeInBasisPoints;\\n\\n /// @notice Data feed proxy address for the collateral rate\\n /// @dev The collateral is denominated in the native currency of the chain\\n /// that OevAuctionHouse is deployed on. Bid amounts are specified and paid\\n /// in the native currency of the chain that the dApp (from which OEV is\\n /// being extracted from) is deployed on. This means that a common base is\\n /// needed for the collateral rate and the native currency rates. For\\n /// example, if the collateral rate proxy provides the ETH/USD rate, the\\n /// native currency rate proxies should provide */USD rates.\\n address public override collateralRateProxy;\\n\\n /// @notice Data feed proxy address for the native currency of the chain\\n /// with the ID\\n mapping(uint256 => address)\\n public\\n override chainIdToNativeCurrencyRateProxy;\\n\\n /// @notice Accumulated collateral funds slashed by auctioneers by\\n /// contradicting fulfillments\\n uint256 public override accumulatedSlashedCollateral;\\n\\n /// @notice Accumulated protocol fees charged by auctioneers by confirming\\n /// fulfillments\\n uint256 public override accumulatedProtocolFees;\\n\\n /// @notice Deposited funds of the bidder, excluding the amount that is\\n /// currently locked up for awarded bids awaiting fulfillment confirmation\\n mapping(address => uint256) public override bidderToBalance;\\n\\n /// @notice Earliest time that the bidder can execute the initiated\\n /// withdrawal. A timestamp of zero means that there is no ongoing\\n /// withdrawal.\\n mapping(address => uint256)\\n public\\n override bidderToEarliestWithdrawalTimestamp;\\n\\n /// @notice Status, expiration timestamp, collateral amount and protocol\\n /// fee amount of the bid with ID\\n mapping(bytes32 => Bid) public override bids;\\n\\n uint256 private constant HUNDRED_PERCENT_IN_BASIS_POINTS = 100 * 100;\\n\\n uint256 private constant MAXIMUM_RATE_AGE = 1 days;\\n\\n /// @dev Reverts if the sender is not the contract manager\\n modifier onlyManager() {\\n if (msg.sender != manager) revert SenderIsNotTheManager();\\n _;\\n }\\n\\n /// @dev Reverts if the sender is not a proxy setter or the contract\\n /// manager\\n modifier onlyProxySetterOrManager() {\\n if (\\n !IAccessControlRegistry(accessControlRegistry).hasRole(\\n proxySetterRole,\\n msg.sender\\n ) && msg.sender != manager\\n ) revert SenderIsNotAProxySetterOrTheManager();\\n _;\\n }\\n\\n /// @dev Reverts if the sender is not a withdrawer or the contract manager\\n modifier onlyWithdrawerOrManager() {\\n if (\\n !IAccessControlRegistry(accessControlRegistry).hasRole(\\n withdrawerRole,\\n msg.sender\\n ) && msg.sender != manager\\n ) revert SenderIsNotAWithdrawerOrTheManager();\\n _;\\n }\\n\\n /// @dev Reverts if the sender is not an auctioneer\\n modifier onlyAuctioneer() {\\n if (\\n !IAccessControlRegistry(accessControlRegistry).hasRole(\\n auctioneerRole,\\n msg.sender\\n )\\n ) revert SenderIsNotAnAuctioneer();\\n _;\\n }\\n\\n /// @dev Reverts if the withdrawal parameters are not valid\\n /// @param recipient Recipient address\\n /// @param amount Amount\\n modifier onlyValidWithdrawalParameters(\\n address payable recipient,\\n uint256 amount\\n ) {\\n if (recipient == address(0)) revert RecipientAddressIsZero();\\n if (amount == 0) revert WithdrawalAmountIsZero();\\n _;\\n }\\n\\n /// @param _accessControlRegistry AccessControlRegistry contract address\\n /// @param _adminRoleDescription Admin role description\\n /// @param _manager Manager address\\n constructor(\\n address _accessControlRegistry,\\n string memory _adminRoleDescription,\\n address _manager\\n )\\n AccessControlRegistryAdminnedWithManager(\\n _accessControlRegistry,\\n _adminRoleDescription,\\n _manager\\n )\\n {\\n proxySetterRole = _deriveRole(\\n _deriveAdminRole(manager),\\n PROXY_SETTER_ROLE_DESCRIPTION\\n );\\n withdrawerRole = _deriveRole(\\n _deriveAdminRole(manager),\\n WITHDRAWER_ROLE_DESCRIPTION\\n );\\n auctioneerRole = _deriveRole(\\n _deriveAdminRole(manager),\\n AUCTIONEER_ROLE_DESCRIPTION\\n );\\n }\\n\\n /// @notice Called by the manager to set the collateral requirement in\\n /// basis points\\n /// @dev The collateral requirement can range from 0% (0 in basis points)\\n /// to values larger than 100% (10000 in basis points).\\n /// The contract manager is recommended to tune this parameter to maximize\\n /// the extracted OEV. The optimal value will be defined by bidder behavior\\n /// and may change over time.\\n /// In the absence of additional incentives (e.g., a reputation system that\\n /// refers to confirmed fulfillments), a collateral requirement that is not\\n /// larger than the protocol fee may result in fulfillments going\\n /// unreported (as being slashed would not be more punitive than being\\n /// charged the protocol fee).\\n /// @param collateralInBasisPoints_ Collateral requirement in basis points\\n function setCollateralInBasisPoints(\\n uint256 collateralInBasisPoints_\\n ) external override onlyManager {\\n collateralInBasisPoints = collateralInBasisPoints_;\\n emit SetCollateralInBasisPoints(collateralInBasisPoints_);\\n }\\n\\n /// @notice Called by the manager to set the protocol fee in basis points\\n /// @dev The protocol fee can range from 0% (0 in basis points) to values\\n /// larger than 100% (10000 in basis points)\\n /// @param protocolFeeInBasisPoints_ Protocol fee in basis points\\n function setProtocolFeeInBasisPoints(\\n uint256 protocolFeeInBasisPoints_\\n ) external override onlyManager {\\n protocolFeeInBasisPoints = protocolFeeInBasisPoints_;\\n emit SetProtocolFeeInBasisPoints(protocolFeeInBasisPoints_);\\n }\\n\\n /// @notice Sets collateral rate proxy\\n /// @dev The data feed proxy contract is expected to implement the IProxy\\n /// interface and the respective data feed to be active with at most a\\n /// 1-day heartbeat interval. Only use trusted contracts (e.g., contracts\\n /// deployed by API3's ProxyFactory) to avoid reentrancy risks.\\n /// The collateral rate denomination must match the native curreny rate\\n /// denomination, e.g., if the collateral rate is in the form of ETH/USD,\\n /// the native currency rates should be in the form of */USD.\\n /// @param collateralRateProxy_ Collateral rate proxy address\\n function setCollateralRateProxy(\\n address collateralRateProxy_\\n ) external override onlyProxySetterOrManager {\\n if (collateralRateProxy_ == address(0)) revert ProxyAddressIsZero();\\n collateralRateProxy = collateralRateProxy_;\\n emit SetCollateralRateProxy(collateralRateProxy_);\\n }\\n\\n /// @notice Sets native currency rate proxy for the chain with ID\\n /// @dev The data feed proxy contract is expected to implement the IProxy\\n /// interface and the respective data feed to be active with at most a\\n /// 1-day heartbeat interval. Only use trusted contracts (e.g., contracts\\n /// deployed by API3's ProxyFactory) to avoid reentrancy risks.\\n /// The collateral rate denomination must match the native curreny rate\\n /// denomination, e.g., if the collateral rate is in the form of ETH/USD,\\n /// the native currency rates should be in the form of */USD.\\n /// @param chainId Chain ID\\n /// @param nativeCurrencyRateProxy Native currency rate proxy address\\n function setChainNativeCurrencyRateProxy(\\n uint256 chainId,\\n address nativeCurrencyRateProxy\\n ) external override onlyProxySetterOrManager {\\n if (chainId == 0) revert ChainIdIsZero();\\n if (nativeCurrencyRateProxy == address(0)) revert ProxyAddressIsZero();\\n chainIdToNativeCurrencyRateProxy[chainId] = nativeCurrencyRateProxy;\\n emit SetChainNativeCurrencyRateProxy(chainId, nativeCurrencyRateProxy);\\n }\\n\\n /// @notice Called by the contract manager to withdraw the accumulated\\n /// collateral slashed by auctioneers by contradicting fulfillments\\n /// @param recipient Recipient address\\n /// @param amount Amount\\n function withdrawAccumulatedSlashedCollateral(\\n address payable recipient,\\n uint256 amount\\n )\\n external\\n override\\n onlyWithdrawerOrManager\\n onlyValidWithdrawalParameters(recipient, amount)\\n {\\n if (amount > accumulatedSlashedCollateral) revert InsufficientBalance();\\n accumulatedSlashedCollateral -= amount;\\n emit WithdrewAccumulatedSlashedCollateral(recipient, amount);\\n sendValue(recipient, amount);\\n }\\n\\n /// @notice Called by the contract manager to withdraw the accumulated\\n /// protocol fees charged by auctioneers by confirming fulfillments\\n /// @param recipient Recipient address\\n /// @param amount Amount\\n function withdrawAccumulatedProtocolFees(\\n address payable recipient,\\n uint256 amount\\n )\\n external\\n override\\n onlyWithdrawerOrManager\\n onlyValidWithdrawalParameters(recipient, amount)\\n {\\n if (amount > accumulatedProtocolFees) revert InsufficientBalance();\\n accumulatedProtocolFees -= amount;\\n emit WithdrewAccumulatedProtocolFees(recipient, amount);\\n sendValue(recipient, amount);\\n }\\n\\n /// @notice Called to deposit funds for a bidder\\n /// @param bidder Bidder address\\n /// @return bidderBalance Bidder balance after the deposit\\n function depositForBidder(\\n address bidder\\n ) public payable override returns (uint256 bidderBalance) {\\n if (bidder == address(0)) revert BidderAddressIsZero();\\n if (msg.value == 0) revert DepositAmountIsZero();\\n bidderBalance = bidderToBalance[bidder] + msg.value;\\n bidderToBalance[bidder] = bidderBalance;\\n emit Deposited(bidder, msg.value, bidderBalance, msg.sender);\\n }\\n\\n /// @notice Called by the bidder to deposit funds\\n /// @return bidderBalance Bidder balance after the deposit\\n function deposit()\\n external\\n payable\\n override\\n returns (uint256 bidderBalance)\\n {\\n bidderBalance = depositForBidder(msg.sender);\\n }\\n\\n /// @notice Called by the bidder to initiate a withdrawal of their funds\\n /// @dev A two-step withdrawal process is implemented to prevent the\\n /// bidders from frontrunning bid awarding transactions with withdrawals to\\n /// deny service\\n /// @return earliestWithdrawalTimestamp Earliest time that the bidder can\\n /// execute the initiated withdrawal\\n function initiateWithdrawal()\\n external\\n override\\n returns (uint256 earliestWithdrawalTimestamp)\\n {\\n if (bidderToEarliestWithdrawalTimestamp[msg.sender] != 0)\\n revert BidderHasAlreadyInitiatedWithdrawal();\\n earliestWithdrawalTimestamp =\\n block.timestamp +\\n WITHDRAWAL_WAITING_PERIOD;\\n bidderToEarliestWithdrawalTimestamp[\\n msg.sender\\n ] = earliestWithdrawalTimestamp;\\n emit InitiatedWithdrawal(msg.sender, earliestWithdrawalTimestamp);\\n }\\n\\n /// @notice Called by the bidder to execute a withdrawal that they have\\n /// initiated\\n /// @param recipient Recipient address\\n /// @param amount Amount\\n function withdraw(\\n address payable recipient,\\n uint256 amount\\n ) external override onlyValidWithdrawalParameters(recipient, amount) {\\n uint256 balance = bidderToBalance[msg.sender];\\n if (amount > balance) revert InsufficientBalance();\\n uint256 earliestWithdrawalTimestamp = bidderToEarliestWithdrawalTimestamp[\\n msg.sender\\n ];\\n if (earliestWithdrawalTimestamp == 0)\\n revert SenderHasNotInitiatedWithdrawal();\\n if (block.timestamp < earliestWithdrawalTimestamp)\\n revert BidderCannotWithdrawYet();\\n bidderToBalance[msg.sender] = balance - amount;\\n bidderToEarliestWithdrawalTimestamp[msg.sender] = 0;\\n emit Withdrew(msg.sender, recipient, amount);\\n sendValue(recipient, amount);\\n }\\n\\n /// @notice Called by the bidder to cancel a withdrawal that they have\\n /// initiated\\n function cancelWithdrawal() external override {\\n if (bidderToEarliestWithdrawalTimestamp[msg.sender] == 0)\\n revert SenderHasNotInitiatedWithdrawal();\\n bidderToEarliestWithdrawalTimestamp[msg.sender] = 0;\\n emit CanceledWithdrawal(msg.sender);\\n }\\n\\n /// @notice Called to place a bid with an expiration timestamp. Searchers\\n /// should use this over `placeBid()` if they expect the OEV opportunity to\\n /// disappear at a specific time before the maximum bid lifetime.\\n /// The searcher should determine maximum collateral and protocol fees that\\n /// they will tolerate, and specify them in the arguments.\\n /// Upon the awarding of the bid, the larger of the collateral amount and\\n /// protocol fee amount will be locked. Upon confirmation or contradiction\\n /// of the respective fulfillment, the locked amount will be released, and\\n /// the protocol fee will be charged or the collateral amount will be\\n /// slashed, respectively.\\n /// @dev `bidTopic` is an arbitrary identifier of the bid type.\\n /// `bidDetails` is an arbitrary description of the bid details. Refer to\\n /// the documentation that the auctioneer provides for the bidders for how\\n /// these parameters should be set.\\n /// @param bidTopic Bid topic\\n /// @param chainId Chain ID\\n /// @param bidAmount Bid amount in the native currency of the chain with ID\\n /// @param bidDetails Bid details\\n /// @param maxCollateralAmount Maximum collateral amount in the currency of\\n /// the chain that OevAuctionHouse is deployed on\\n /// @param maxProtocolFeeAmount Maximum protocol fee amount in the currency\\n /// of the chain that OevAuctionHouse is deployed on\\n /// @param expirationTimestamp Expiration timestamp after which the bid\\n /// cannot be awarded\\n /// @return collateralAmount Collateral amount in the currency of the chain\\n /// that OevAuctionHouse is deployed on\\n /// @return protocolFeeAmount Protocol fee amount in the currency of the\\n /// chain that OevAuctionHouse is deployed on\\n function placeBidWithExpiration(\\n bytes32 bidTopic,\\n uint256 chainId,\\n uint256 bidAmount,\\n bytes calldata bidDetails,\\n uint256 maxCollateralAmount,\\n uint256 maxProtocolFeeAmount,\\n uint32 expirationTimestamp\\n )\\n public\\n override\\n returns (uint104 collateralAmount, uint104 protocolFeeAmount)\\n {\\n if (chainId == 0) revert ChainIdIsZero();\\n if (bidAmount == 0) revert BidAmountIsZero();\\n uint256 bidDetailsLength = bidDetails.length;\\n if (bidDetailsLength > MAXIMUM_BIDDER_DATA_LENGTH)\\n revert MaximumBidderDataLengthIsExceeded();\\n if (bidDetailsLength == 0) revert BidDetailsAreEmpty();\\n if (block.timestamp + MAXIMUM_BID_LIFETIME < expirationTimestamp)\\n revert BidLifetimeIsLongerThanMaximum();\\n if (block.timestamp + MINIMUM_BID_LIFETIME > expirationTimestamp)\\n revert BidLifetimeIsShorterThanMinimum();\\n // The bid details should be specified to include a salt field to allow\\n // bids that otherwise would have identical IDs\\n bytes32 bidId = keccak256(\\n abi.encodePacked(msg.sender, bidTopic, keccak256(bidDetails))\\n );\\n if (bids[bidId].status != BidStatus.None) revert BidIsAlreadyPlaced();\\n (\\n collateralAmount,\\n protocolFeeAmount\\n ) = getCurrentCollateralAndProtocolFeeAmounts(chainId, bidAmount);\\n if (collateralAmount > maxCollateralAmount)\\n revert MaxCollateralAmountIsExceeded();\\n if (protocolFeeAmount > maxProtocolFeeAmount)\\n revert MaxProtocolFeeAmountIsExceeded();\\n bids[bidId] = Bid({\\n status: BidStatus.Placed,\\n expirationTimestamp: expirationTimestamp,\\n collateralAmount: collateralAmount,\\n protocolFeeAmount: protocolFeeAmount\\n });\\n emit PlacedBid(\\n msg.sender,\\n bidTopic,\\n bidId,\\n chainId,\\n bidAmount,\\n bidDetails,\\n expirationTimestamp,\\n collateralAmount,\\n protocolFeeAmount\\n );\\n }\\n\\n /// @notice Called to place a bid with the longest possible lifetime.\\n /// The searcher should determine maximum collateral and protocol fees that\\n /// they will tolerate, and specify them in the arguments.\\n /// Upon the awarding of the bid, the larger of the collateral amount and\\n /// protocol fee amount will be locked. Upon confirmation or contradiction\\n /// of the respective fulfillment, the locked amount will be released, and\\n /// the protocol fee will be charged or the collateral amount will be\\n /// slashed, respectively.\\n /// @param bidTopic Bid topic\\n /// @param chainId Chain ID\\n /// @param bidAmount Bid amount in the native currency of the chain with ID\\n /// @param bidDetails Bid details\\n /// @param maxCollateralAmount Maximum collateral amount in the currency of\\n /// the chain that OevAuctionHouse is deployed on\\n /// @param maxProtocolFeeAmount Maximum protocol fee amount in the currency\\n /// of the chain that OevAuctionHouse is deployed on\\n /// @return expirationTimestamp Expiration timestamp after which the bid\\n /// cannot be awarded\\n /// @return collateralAmount Collateral amount in the currency of the chain\\n /// that OevAuctionHouse is deployed on\\n /// @return protocolFeeAmount Protocol fee amount in the currency of the\\n /// chain that OevAuctionHouse is deployed on\\n function placeBid(\\n bytes32 bidTopic,\\n uint256 chainId,\\n uint256 bidAmount,\\n bytes calldata bidDetails,\\n uint256 maxCollateralAmount,\\n uint256 maxProtocolFeeAmount\\n )\\n external\\n override\\n returns (\\n uint32 expirationTimestamp,\\n uint104 collateralAmount,\\n uint104 protocolFeeAmount\\n )\\n {\\n expirationTimestamp = uint32(block.timestamp + MAXIMUM_BID_LIFETIME);\\n (collateralAmount, protocolFeeAmount) = placeBidWithExpiration(\\n bidTopic,\\n chainId,\\n bidAmount,\\n bidDetails,\\n maxCollateralAmount,\\n maxProtocolFeeAmount,\\n expirationTimestamp\\n );\\n }\\n\\n /// @notice Called to update the bid expiration timestamp to a specific\\n /// value to expedite its expiration\\n /// @param bidTopic Bid topic\\n /// @param bidDetailsHash Bid details hash\\n /// @param expirationTimestamp Expiration timestamp after which the bid\\n /// cannot be awarded\\n function expediteBidExpiration(\\n bytes32 bidTopic,\\n bytes32 bidDetailsHash,\\n uint32 expirationTimestamp\\n ) public override {\\n bytes32 bidId = keccak256(\\n abi.encodePacked(msg.sender, bidTopic, bidDetailsHash)\\n );\\n Bid storage bid = bids[bidId];\\n if (bid.status != BidStatus.Placed) revert BidIsNotAwaitingAward();\\n uint32 bidExpirationTimestamp = bid.expirationTimestamp;\\n if (block.timestamp >= bidExpirationTimestamp) revert BidHasExpired();\\n if (expirationTimestamp >= bidExpirationTimestamp)\\n revert TimestampDoesNotExpediteExpiration();\\n if (block.timestamp + MINIMUM_BID_LIFETIME > expirationTimestamp)\\n revert BidLifetimeIsShorterThanMinimum();\\n bid.expirationTimestamp = expirationTimestamp;\\n emit ExpeditedBidExpiration(\\n msg.sender,\\n bidTopic,\\n bidId,\\n expirationTimestamp\\n );\\n }\\n\\n /// @notice Called to decrease the bid expiration timestamp as much as\\n /// possible to maximally expedite its expiration\\n /// @param bidTopic Bid topic\\n /// @param bidDetailsHash Bid details hash\\n /// @return expirationTimestamp Expiration timestamp after which the bid\\n /// cannot be awarded\\n function expediteBidExpirationMaximally(\\n bytes32 bidTopic,\\n bytes32 bidDetailsHash\\n ) external override returns (uint32 expirationTimestamp) {\\n expirationTimestamp = uint32(block.timestamp + MINIMUM_BID_LIFETIME);\\n expediteBidExpiration(bidTopic, bidDetailsHash, expirationTimestamp);\\n }\\n\\n /// @notice Called by an auctioneer to award the bid\\n /// @dev `awardDetails` is an arbitrary description of how to claim the\\n /// award. Refer to the documentation that the auctioneer provides for the\\n /// bidders for how to use it.\\n /// The bidder receiving `awardDetails` is typically time-critical.\\n /// However, the bid awarding transaction may not always be confirmed\\n /// immediately. To avoid unjust collateral lockups or slashings,\\n /// auctioneers should use an appropriate `awardExpirationTimestamp` that\\n /// will cause such transactions to revert.\\n /// @param bidder Bidder address\\n /// @param bidTopic Bid topic\\n /// @param bidDetailsHash Bid details hash\\n /// @param awardDetails Award details\\n /// @param awardExpirationTimestamp Award expiration timestamp\\n /// @return bidderBalance Bidder balance after the lockup\\n function awardBid(\\n address bidder,\\n bytes32 bidTopic,\\n bytes32 bidDetailsHash,\\n bytes calldata awardDetails,\\n uint256 awardExpirationTimestamp\\n ) external override onlyAuctioneer returns (uint256 bidderBalance) {\\n uint256 awardDetailsLength = awardDetails.length;\\n if (awardDetailsLength > MAXIMUM_AUCTIONEER_DATA_LENGTH)\\n revert MaximumAuctioneerDataLengthIsExceeded();\\n if (awardDetailsLength == 0) revert AwardDetailsAreEmpty();\\n if (block.timestamp >= awardExpirationTimestamp)\\n revert AwardHasExpired();\\n bytes32 bidId = keccak256(\\n abi.encodePacked(bidder, bidTopic, bidDetailsHash)\\n );\\n Bid storage bid = bids[bidId];\\n if (bid.status != BidStatus.Placed) revert BidIsNotAwaitingAward();\\n if (block.timestamp >= bid.expirationTimestamp) revert BidHasExpired();\\n bid.status = BidStatus.Awarded;\\n // Refresh the expiration timestamp for the fulfillment report\\n bid.expirationTimestamp = uint32(\\n block.timestamp + FULFILLMENT_REPORTING_PERIOD\\n );\\n bidderBalance = bidderToBalance[bidder];\\n uint256 lockedAmount = bid.collateralAmount > bid.protocolFeeAmount\\n ? bid.collateralAmount\\n : bid.protocolFeeAmount;\\n if (bidderBalance < lockedAmount)\\n revert BidderBalanceIsLowerThanTheLockedAmount();\\n bidderBalance -= lockedAmount;\\n bidderToBalance[bidder] = bidderBalance;\\n emit AwardedBid(bidder, bidTopic, bidId, awardDetails, bidderBalance);\\n }\\n\\n /// @notice Called by the owner of the awarded bid to report its\\n /// fulfillment\\n /// @dev `fulfillmentDetails` is an arbitrary description of how the\\n /// fulfillment is to be verified. Refer to the documentation that the\\n /// auctioneer provides for the bidders for how this parameter should be\\n /// set.\\n /// @param bidTopic Bid topic\\n /// @param bidDetailsHash Bid details hash\\n /// @param fulfillmentDetails Fulfillment details\\n function reportFulfillment(\\n bytes32 bidTopic,\\n bytes32 bidDetailsHash,\\n bytes calldata fulfillmentDetails\\n ) external override {\\n uint256 fulfillmentDetailsLength = fulfillmentDetails.length;\\n if (fulfillmentDetailsLength > MAXIMUM_BIDDER_DATA_LENGTH)\\n revert MaximumBidderDataLengthIsExceeded();\\n if (fulfillmentDetailsLength == 0) revert FulfillmentDetailsAreEmpty();\\n bytes32 bidId = keccak256(\\n abi.encodePacked(msg.sender, bidTopic, bidDetailsHash)\\n );\\n Bid storage bid = bids[bidId];\\n if (bid.status != BidStatus.Awarded)\\n revert BidIsNotAwaitingFulfillmentReport();\\n if (block.timestamp >= bid.expirationTimestamp) revert BidHasExpired();\\n bid.status = BidStatus.FulfillmentReported;\\n emit ReportedFulfillment(\\n msg.sender,\\n bidTopic,\\n bidId,\\n fulfillmentDetails\\n );\\n }\\n\\n /// @notice Called by an auctioneer to confirm a fulfillment, and release\\n /// the collateral and charge the protocol fee\\n /// @dev A fulfillment does not have to be reported to be confirmed. A bid\\n /// can be confirmed to be fulfilled even after it has expired.\\n /// @param bidder Bidder address\\n /// @param bidTopic Bid topic\\n /// @param bidDetailsHash Bid details hash\\n /// @return bidderBalance Bidder balance after the collateral release\\n /// @return accumulatedProtocolFees_ Accumulated protocol fees\\n function confirmFulfillment(\\n address bidder,\\n bytes32 bidTopic,\\n bytes32 bidDetailsHash\\n )\\n external\\n override\\n onlyAuctioneer\\n returns (uint256 bidderBalance, uint256 accumulatedProtocolFees_)\\n {\\n bytes32 bidId = keccak256(\\n abi.encodePacked(bidder, bidTopic, bidDetailsHash)\\n );\\n Bid storage bid = bids[bidId];\\n if (\\n bid.status != BidStatus.FulfillmentReported &&\\n bid.status != BidStatus.Awarded\\n ) revert BidFulfillmentCannotBeConfirmed();\\n bid.status = BidStatus.FulfillmentConfirmed;\\n bidderBalance =\\n bidderToBalance[bidder] +\\n (\\n bid.collateralAmount > bid.protocolFeeAmount\\n ? bid.collateralAmount\\n : bid.protocolFeeAmount\\n ) -\\n bid.protocolFeeAmount;\\n bidderToBalance[bidder] = bidderBalance;\\n accumulatedProtocolFees_ =\\n accumulatedProtocolFees +\\n bid.protocolFeeAmount;\\n accumulatedProtocolFees = accumulatedProtocolFees_;\\n emit ConfirmedFulfillment(\\n bidder,\\n bidTopic,\\n bidId,\\n bidderBalance,\\n accumulatedProtocolFees_\\n );\\n }\\n\\n /// @notice Called by an auctioneer to contradict a fulfillment, and slash\\n /// the collateral and release the protocol fee\\n /// @dev Fulfillments that have not been reported can only be contradicted\\n /// after the reporting period is over\\n /// @param bidder Bidder address\\n /// @param bidTopic Bid topic\\n /// @param bidDetailsHash Bid details hash\\n /// @return bidderBalance Bidder balance after the protocol fee release\\n /// @return accumulatedSlashedCollateral_ Accumulated slashed collateral\\n function contradictFulfillment(\\n address bidder,\\n bytes32 bidTopic,\\n bytes32 bidDetailsHash\\n )\\n external\\n override\\n onlyAuctioneer\\n returns (uint256 bidderBalance, uint256 accumulatedSlashedCollateral_)\\n {\\n bytes32 bidId = keccak256(\\n abi.encodePacked(bidder, bidTopic, bidDetailsHash)\\n );\\n Bid storage bid = bids[bidId];\\n BidStatus bidStatus = bid.status;\\n if (\\n bidStatus != BidStatus.FulfillmentReported &&\\n !(bidStatus == BidStatus.Awarded &&\\n block.timestamp >= bid.expirationTimestamp)\\n ) revert BidFulfillmentCannotBeContradicted();\\n bid.status = BidStatus.FulfillmentContradicted;\\n bidderBalance =\\n bidderToBalance[bidder] +\\n (\\n bid.collateralAmount > bid.protocolFeeAmount\\n ? bid.collateralAmount\\n : bid.protocolFeeAmount\\n ) -\\n bid.collateralAmount;\\n bidderToBalance[bidder] = bidderBalance;\\n accumulatedSlashedCollateral_ =\\n accumulatedSlashedCollateral +\\n bid.collateralAmount;\\n accumulatedSlashedCollateral = accumulatedSlashedCollateral_;\\n emit ContradictedFulfillment(\\n bidder,\\n bidTopic,\\n bidId,\\n bidderBalance,\\n accumulatedSlashedCollateral_\\n );\\n }\\n\\n /// @notice Gets the collateral amount and the protocol fee amount for a\\n /// bid with the chain ID and amount parameters based on the current rates,\\n /// collateral requirement and protocol fee\\n /// @param chainId Chain ID\\n /// @param bidAmount Bid amount in the native currency of the chain with ID\\n /// @return collateralAmount Collateral amount in the currency of the chain\\n /// that OevAuctionHouse is deployed on\\n /// @return protocolFeeAmount Protocol fee amount in the currency of the\\n /// chain that OevAuctionHouse is deployed on\\n function getCurrentCollateralAndProtocolFeeAmounts(\\n uint256 chainId,\\n uint256 bidAmount\\n )\\n public\\n view\\n override\\n returns (uint104 collateralAmount, uint104 protocolFeeAmount)\\n {\\n if (collateralInBasisPoints == 0 && protocolFeeInBasisPoints == 0) {\\n return (0, 0);\\n }\\n (int224 collateralRateValue, uint32 collateralRateTimestamp) = IProxy(\\n collateralRateProxy\\n ).read();\\n if (collateralRateValue <= 0) revert CollateralRateIsNotPositive();\\n if (block.timestamp >= collateralRateTimestamp + MAXIMUM_RATE_AGE)\\n revert CollateralRateIsStale();\\n (\\n int224 nativeCurrencyRateValue,\\n uint32 nativeCurrencyRateTimestamp\\n ) = IProxy(chainIdToNativeCurrencyRateProxy[chainId]).read();\\n if (nativeCurrencyRateValue <= 0)\\n revert NativeCurrencyRateIsNotPositive();\\n if (block.timestamp >= nativeCurrencyRateTimestamp + MAXIMUM_RATE_AGE)\\n revert NativeCurrencyRateIsStale();\\n collateralAmount = safeCastToUint104(\\n (bidAmount *\\n uint256(int256(nativeCurrencyRateValue)) *\\n collateralInBasisPoints) /\\n uint256(int256(collateralRateValue)) /\\n HUNDRED_PERCENT_IN_BASIS_POINTS\\n );\\n protocolFeeAmount = safeCastToUint104(\\n (bidAmount *\\n uint256(int256(nativeCurrencyRateValue)) *\\n protocolFeeInBasisPoints) /\\n uint256(int256(collateralRateValue)) /\\n HUNDRED_PERCENT_IN_BASIS_POINTS\\n );\\n }\\n\\n /// @notice Sends value to recipient\\n /// @dev In the contexts that this function is used, the balance will\\n /// always be sufficient and thus is not checked\\n /// @param recipient Recipient address\\n /// @param amount Amount to be sent\\n function sendValue(address payable recipient, uint256 amount) private {\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Transfer unsuccessful\\\");\\n }\\n\\n /// @notice Safe-casts the value from uint256 to uint104\\n /// @param valueInUint256 Value in uint256\\n /// @return valueInUint104 Value safe-cast to uint256\\n function safeCastToUint104(\\n uint256 valueInUint256\\n ) private pure returns (uint104 valueInUint104) {\\n require(\\n valueInUint256 <= type(uint104).max,\\n \\\"Value does not fit in uint104\\\"\\n );\\n valueInUint104 = uint104(valueInUint256);\\n }\\n}\\n\",\"keccak256\":\"0x96ae15fbd74ea779795ca812607435cdb6480df29a553ab68e9fa2ca0e346c5d\",\"license\":\"MIT\"},\"contracts/api3-server-v1/interfaces/IOevAuctionHouse.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport \\\"../../access/interfaces/IAccessControlRegistryAdminnedWithManager.sol\\\";\\n\\ninterface IOevAuctionHouse is IAccessControlRegistryAdminnedWithManager {\\n enum BidStatus {\\n None,\\n Placed,\\n Awarded,\\n FulfillmentReported,\\n FulfillmentConfirmed,\\n FulfillmentContradicted\\n }\\n\\n event SetCollateralInBasisPoints(uint256 collateralInBasisPoints);\\n\\n event SetProtocolFeeInBasisPoints(uint256 protocolFeeInBasisPoints);\\n\\n event SetCollateralRateProxy(address collateralRateProxy);\\n\\n event SetChainNativeCurrencyRateProxy(\\n uint256 indexed chainId,\\n address nativeCurrencyRateProxy\\n );\\n\\n event WithdrewAccumulatedSlashedCollateral(\\n address recipient,\\n uint256 amount\\n );\\n\\n event WithdrewAccumulatedProtocolFees(address recipient, uint256 amount);\\n\\n event Deposited(\\n address indexed bidder,\\n uint256 amount,\\n uint256 bidderBalance,\\n address sender\\n );\\n\\n event InitiatedWithdrawal(\\n address indexed bidder,\\n uint256 earliestWithdrawalTimestamp\\n );\\n\\n event Withdrew(address indexed bidder, address recipient, uint256 amount);\\n\\n event CanceledWithdrawal(address indexed bidder);\\n\\n event PlacedBid(\\n address indexed bidder,\\n bytes32 indexed bidTopic,\\n bytes32 indexed bidId,\\n uint256 chainId,\\n uint256 bidAmount,\\n bytes bidDetails,\\n uint32 expirationTimestamp,\\n uint104 collateralAmount,\\n uint104 protocolFeeAmount\\n );\\n\\n event ExpeditedBidExpiration(\\n address indexed bidder,\\n bytes32 indexed bidTopic,\\n bytes32 indexed bidId,\\n uint32 expirationTimestamp\\n );\\n\\n event AwardedBid(\\n address indexed bidder,\\n bytes32 indexed bidTopic,\\n bytes32 indexed bidId,\\n bytes awardDetails,\\n uint256 bidderBalance\\n );\\n\\n event ReportedFulfillment(\\n address indexed bidder,\\n bytes32 indexed bidTopic,\\n bytes32 indexed bidId,\\n bytes fulfillmentDetails\\n );\\n\\n event ConfirmedFulfillment(\\n address indexed bidder,\\n bytes32 indexed bidTopic,\\n bytes32 indexed bidId,\\n uint256 bidderBalance,\\n uint256 accumulatedProtocolFees\\n );\\n\\n event ContradictedFulfillment(\\n address indexed bidder,\\n bytes32 indexed bidTopic,\\n bytes32 indexed bidId,\\n uint256 bidderBalance,\\n uint256 accumulatedSlashedCollateral\\n );\\n\\n error SenderIsNotTheManager();\\n\\n error SenderIsNotAProxySetterOrTheManager();\\n\\n error SenderIsNotAWithdrawerOrTheManager();\\n\\n error SenderIsNotAnAuctioneer();\\n\\n error ProxyAddressIsZero();\\n\\n error ChainIdIsZero();\\n\\n error RecipientAddressIsZero();\\n\\n error WithdrawalAmountIsZero();\\n\\n error InsufficientBalance();\\n\\n error BidderAddressIsZero();\\n\\n error DepositAmountIsZero();\\n\\n error BidderHasAlreadyInitiatedWithdrawal();\\n\\n error SenderHasNotInitiatedWithdrawal();\\n\\n error BidderCannotWithdrawYet();\\n\\n error BidAmountIsZero();\\n\\n error BidDetailsAreEmpty();\\n\\n error MaximumBidderDataLengthIsExceeded();\\n\\n error BidLifetimeIsLongerThanMaximum();\\n\\n error BidLifetimeIsShorterThanMinimum();\\n\\n error BidIsAlreadyPlaced();\\n\\n error MaxCollateralAmountIsExceeded();\\n\\n error MaxProtocolFeeAmountIsExceeded();\\n\\n error BidIsNotAwaitingAward();\\n\\n error BidHasExpired();\\n\\n error TimestampDoesNotExpediteExpiration();\\n\\n error MaximumAuctioneerDataLengthIsExceeded();\\n\\n error AwardDetailsAreEmpty();\\n\\n error AwardHasExpired();\\n\\n error BidderBalanceIsLowerThanTheLockedAmount();\\n\\n error FulfillmentDetailsAreEmpty();\\n\\n error BidIsNotAwaitingFulfillmentReport();\\n\\n error BidFulfillmentCannotBeConfirmed();\\n\\n error BidFulfillmentCannotBeContradicted();\\n\\n error CollateralRateIsNotPositive();\\n\\n error CollateralRateIsStale();\\n\\n error NativeCurrencyRateIsNotPositive();\\n\\n error NativeCurrencyRateIsStale();\\n\\n function setProtocolFeeInBasisPoints(\\n uint256 protocolFeeInBasisPoints_\\n ) external;\\n\\n function setCollateralInBasisPoints(\\n uint256 collateralInBasisPoints_\\n ) external;\\n\\n function setCollateralRateProxy(address collateralRateProxy_) external;\\n\\n function setChainNativeCurrencyRateProxy(\\n uint256 chainId,\\n address nativeCurrencyRateProxy\\n ) external;\\n\\n function withdrawAccumulatedSlashedCollateral(\\n address payable recipient,\\n uint256 amount\\n ) external;\\n\\n function withdrawAccumulatedProtocolFees(\\n address payable recipient,\\n uint256 amount\\n ) external;\\n\\n function depositForBidder(\\n address bidder\\n ) external payable returns (uint256 bidderBalance);\\n\\n function deposit() external payable returns (uint256 bidderBalance);\\n\\n function initiateWithdrawal()\\n external\\n returns (uint256 earliestWithdrawalTimestamp);\\n\\n function withdraw(address payable recipient, uint256 amount) external;\\n\\n function cancelWithdrawal() external;\\n\\n function placeBidWithExpiration(\\n bytes32 bidTopic,\\n uint256 chainId,\\n uint256 bidAmount,\\n bytes calldata bidDetails,\\n uint256 maxCollateralAmount,\\n uint256 maxProtocolFeeAmount,\\n uint32 expirationTimestamp\\n ) external returns (uint104 collateralAmount, uint104 protocolFeeAmount);\\n\\n function placeBid(\\n bytes32 bidTopic,\\n uint256 chainId,\\n uint256 bidAmount,\\n bytes calldata bidDetails,\\n uint256 maxCollateralAmount,\\n uint256 maxProtocolFeeAmount\\n )\\n external\\n returns (\\n uint32 expirationTimestamp,\\n uint104 collateralAmount,\\n uint104 protocolFeeAmount\\n );\\n\\n function expediteBidExpiration(\\n bytes32 bidTopic,\\n bytes32 bidDetailsHash,\\n uint32 expirationTimestamp\\n ) external;\\n\\n function expediteBidExpirationMaximally(\\n bytes32 bidTopic,\\n bytes32 bidDetailsHash\\n ) external returns (uint32 expirationTimestamp);\\n\\n function awardBid(\\n address bidder,\\n bytes32 bidTopic,\\n bytes32 bidDetailsHash,\\n bytes calldata awardDetails,\\n uint256 awardExpirationTimestamp\\n ) external returns (uint256 bidderBalance);\\n\\n function reportFulfillment(\\n bytes32 bidTopic,\\n bytes32 bidDetailsHash,\\n bytes calldata fulfillmentDetails\\n ) external;\\n\\n function confirmFulfillment(\\n address bidder,\\n bytes32 bidTopic,\\n bytes32 bidDetailsHash\\n )\\n external\\n returns (uint256 bidderBalance, uint256 accumulatedProtocolFees_);\\n\\n function contradictFulfillment(\\n address bidder,\\n bytes32 bidTopic,\\n bytes32 bidDetailsHash\\n )\\n external\\n returns (uint256 bidderBalance, uint256 accumulatedSlashedCollateral_);\\n\\n function getCurrentCollateralAndProtocolFeeAmounts(\\n uint256 chainId,\\n uint256 bidAmount\\n )\\n external\\n view\\n returns (uint104 collateralAmount, uint104 protocolFeeAmount);\\n\\n function PROXY_SETTER_ROLE_DESCRIPTION() external returns (string memory);\\n\\n function WITHDRAWER_ROLE_DESCRIPTION() external returns (string memory);\\n\\n function AUCTIONEER_ROLE_DESCRIPTION() external returns (string memory);\\n\\n function WITHDRAWAL_WAITING_PERIOD() external returns (uint256);\\n\\n function MAXIMUM_BID_LIFETIME() external returns (uint256);\\n\\n function MINIMUM_BID_LIFETIME() external returns (uint256);\\n\\n function FULFILLMENT_REPORTING_PERIOD() external returns (uint256);\\n\\n function MAXIMUM_BIDDER_DATA_LENGTH() external returns (uint256);\\n\\n function MAXIMUM_AUCTIONEER_DATA_LENGTH() external returns (uint256);\\n\\n function proxySetterRole() external returns (bytes32);\\n\\n function withdrawerRole() external returns (bytes32);\\n\\n function auctioneerRole() external returns (bytes32);\\n\\n function protocolFeeInBasisPoints() external returns (uint256);\\n\\n function collateralInBasisPoints() external returns (uint256);\\n\\n function collateralRateProxy() external returns (address);\\n\\n function chainIdToNativeCurrencyRateProxy(\\n uint256 chainId\\n ) external returns (address nativeCurrencyRateProxy);\\n\\n function accumulatedSlashedCollateral() external returns (uint256);\\n\\n function accumulatedProtocolFees() external returns (uint256);\\n\\n function bidderToBalance(address bidder) external returns (uint256 balance);\\n\\n function bidderToEarliestWithdrawalTimestamp(\\n address bidder\\n ) external returns (uint256 earliestWithdrawalTimestamp);\\n\\n function bids(\\n bytes32 bidId\\n )\\n external\\n returns (\\n BidStatus status,\\n uint32 expirationTimestamp,\\n uint104 collateralAmount,\\n uint104 protocolFeeAmount\\n );\\n}\\n\",\"keccak256\":\"0xb95ef9d4a9a63d7a692eb30ac9e02677087292186e3c2acb951a3f4bc6c5c54f\",\"license\":\"MIT\"},\"contracts/api3-server-v1/proxies/interfaces/IProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n/// @dev See DapiProxy.sol for comments about usage\\ninterface IProxy {\\n function read() external view returns (int224 value, uint32 timestamp);\\n\\n function api3ServerV1() external view returns (address);\\n}\\n\",\"keccak256\":\"0x3ad69ef6ff3de4056ec43eb8b47465f3d896f88e95cfffb909a6d057b91db17b\",\"license\":\"MIT\"},\"contracts/utils/SelfMulticall.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./interfaces/ISelfMulticall.sol\\\";\\n\\n/// @title Contract that enables calls to the inheriting contract to be batched\\n/// @notice Implements two ways of batching, one requires none of the calls to\\n/// revert and the other tolerates individual calls reverting\\n/// @dev This implementation uses delegatecall for individual function calls.\\n/// Since delegatecall is a message call, it can only be made to functions that\\n/// are externally visible. This means that a contract cannot multicall its own\\n/// functions that use internal/private visibility modifiers.\\n/// Refer to OpenZeppelin's Multicall.sol for a similar implementation.\\ncontract SelfMulticall is ISelfMulticall {\\n /// @notice Batches calls to the inheriting contract and reverts as soon as\\n /// one of the batched calls reverts\\n /// @param data Array of calldata of batched calls\\n /// @return returndata Array of returndata of batched calls\\n function multicall(\\n bytes[] calldata data\\n ) external override returns (bytes[] memory returndata) {\\n uint256 callCount = data.length;\\n returndata = new bytes[](callCount);\\n for (uint256 ind = 0; ind < callCount; ) {\\n bool success;\\n // solhint-disable-next-line avoid-low-level-calls\\n (success, returndata[ind]) = address(this).delegatecall(data[ind]);\\n if (!success) {\\n bytes memory returndataWithRevertData = returndata[ind];\\n if (returndataWithRevertData.length > 0) {\\n // Adapted from OpenZeppelin's Address.sol\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n let returndata_size := mload(returndataWithRevertData)\\n revert(\\n add(32, returndataWithRevertData),\\n returndata_size\\n )\\n }\\n } else {\\n revert(\\\"Multicall: No revert string\\\");\\n }\\n }\\n unchecked {\\n ind++;\\n }\\n }\\n }\\n\\n /// @notice Batches calls to the inheriting contract but does not revert if\\n /// any of the batched calls reverts\\n /// @param data Array of calldata of batched calls\\n /// @return successes Array of success conditions of batched calls\\n /// @return returndata Array of returndata of batched calls\\n function tryMulticall(\\n bytes[] calldata data\\n )\\n external\\n override\\n returns (bool[] memory successes, bytes[] memory returndata)\\n {\\n uint256 callCount = data.length;\\n successes = new bool[](callCount);\\n returndata = new bytes[](callCount);\\n for (uint256 ind = 0; ind < callCount; ) {\\n // solhint-disable-next-line avoid-low-level-calls\\n (successes[ind], returndata[ind]) = address(this).delegatecall(\\n data[ind]\\n );\\n unchecked {\\n ind++;\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xb466760f7b5d05a91fb168224952f29db9aa3308f0b83535fd697f3c30281740\",\"license\":\"MIT\"},\"contracts/utils/interfaces/ISelfMulticall.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ninterface ISelfMulticall {\\n function multicall(\\n bytes[] calldata data\\n ) external returns (bytes[] memory returndata);\\n\\n function tryMulticall(\\n bytes[] calldata data\\n ) external returns (bool[] memory successes, bytes[] memory returndata);\\n}\\n\",\"keccak256\":\"0x50b27284f0d5acd8b340836c09d252138ebf059f426e5d90d3f7221e1b7d0817\",\"license\":\"MIT\"},\"contracts/vendor/@openzeppelin/contracts@4.8.2/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x6101606040523480156200001257600080fd5b5060405162003bd538038062003bd58339810160408190526200003591620003a6565b82828282826001600160a01b038216620000895760405162461bcd60e51b815260206004820152601060248201526f4143522061646472657373207a65726f60801b60448201526064015b60405180910390fd5b6000815111620000dc5760405162461bcd60e51b815260206004820152601c60248201527f41646d696e20726f6c65206465736372697074696f6e20656d70747900000000604482015260640162000080565b6001600160a01b0382166080526000620000f7828262000515565b50806040516020016200010b9190620005e1565b60408051601f19818403018152919052805160209091012060a05250506001600160a01b038116620001805760405162461bcd60e51b815260206004820152601460248201527f4d616e616765722061646472657373207a65726f000000000000000000000000604482015260640162000080565b6001600160a01b03811660c052620001988162000264565b60e052505060c051620001da9150620001b19062000264565b60408051808201909152600c81526b283937bc3c9039b2ba3a32b960a11b6020820152620002de565b6101005260c0516200021890620001f19062000264565b60408051808201909152600a8152692bb4ba34323930bbb2b960b11b6020820152620002de565b6101205260c05162000256906200022f9062000264565b60408051808201909152600a81526920bab1ba34b7b732b2b960b11b6020820152620002de565b6101405250620005ff915050565b6000620002d8620002a9836040516001600160601b0319606083901b166020820152600090603401604051602081830303815290604052805190602001209050919050565b60a051604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b92915050565b60006200031a8383604051602001620002f89190620005e1565b604051602081830303815290604052805190602001206200032160201b60201c565b9392505050565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b80516001600160a01b03811681146200036557600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200039d57818101518382015260200162000383565b50506000910152565b600080600060608486031215620003bc57600080fd5b620003c7846200034d565b60208501519093506001600160401b0380821115620003e557600080fd5b818601915086601f830112620003fa57600080fd5b8151818111156200040f576200040f6200036a565b604051601f8201601f19908116603f011681019083821181831017156200043a576200043a6200036a565b816040528281528960208487010111156200045457600080fd5b6200046783602083016020880162000380565b80965050505050506200047d604085016200034d565b90509250925092565b600181811c908216806200049b57607f821691505b602082108103620004bc57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200051057600081815260208120601f850160051c81016020861015620004eb5750805b601f850160051c820191505b818110156200050c57828155600101620004f7565b5050505b505050565b81516001600160401b038111156200053157620005316200036a565b620005498162000542845462000486565b84620004c2565b602080601f831160018114620005815760008415620005685750858301515b600019600386901b1c1916600185901b1785556200050c565b600085815260208120601f198616915b82811015620005b25788860151825594840194600190910190840162000591565b5085821015620005d15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008251620005f581846020870162000380565b9190910192915050565b60805160a05160c05160e0516101005161012051610140516134f2620006e36000396000818161038701528181610e0c01528181611cbd015261263d01526000818161095a015281816124540152612a7d01526000818161081e0152818161149401526121060152600061031e0152600081816105bc015281816111990152818161138401528181611546015281816121b8015281816125060152612b2f015260005050600081816103bb01528181610e3b015281816114c001528181611cf60152818161213201528181612480015281816126760152612aa901526134f26000f3fe6080604052600436106103075760003560e01c80636e6a0ed11161019a578063b51d1d4f116100e1578063dc6c94511161008a578063f1bbe0a611610064578063f1bbe0a6146109c5578063f3fef3a314610a0e578063fc4b450314610a2e57600080fd5b8063dc6c945114610928578063e8597c3714610948578063f1939bd01461097c57600080fd5b8063bc6b39d7116100bb578063bc6b39d7146108cb578063c3535ea714610900578063d0e30db01461092057600080fd5b8063b51d1d4f1461088d578063b988cc5b146108a2578063ba09b169146108b557600080fd5b80639fa4fa3b11610143578063a7277fb51161011d578063a7277fb51461080c578063ac9650d814610840578063af2b3be11461086d57600080fd5b80639fa4fa3b146107c1578063a319af61146106cc578063a64195f6146107f657600080fd5b80638891603f116101745780638891603f146107215780638f98eeda1461073757806396c582c3146107a157600080fd5b80636e6a0ed1146106cc57806372f93ed3146106e1578063816df6b91461059357600080fd5b806331d1c1b31161025e5780634af9efe21161020757806361a58734116101e157806361a58734146106695780636a9566da1461067f5780636acab84a1461069f57600080fd5b80634af9efe2146105de5780634c8f1d8d146105fe5780635ae647121461062057600080fd5b8063437b911611610238578063437b91161461056557806343cde18114610593578063481c6a75146105aa57600080fd5b806331d1c1b31461050f5780633cddb966146105255780633d73d5eb1461054557600080fd5b806322611280116102c057806328fc2dfd1161029a57806328fc2dfd1461048d5780632ba248a0146104ad5780632ddc06a8146104c357600080fd5b80632261128014610422578063244ce2951461043757806327356bdc1461046d57600080fd5b80631be8d01f116102f15780631be8d01f146103755780631ce9ae07146103a95780631f4c9fd6146103f557600080fd5b80629f2f3c1461030c578063192af35b14610353575b600080fd5b34801561031857600080fd5b506103407f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b34801561035f57600080fd5b5061037361036e366004612d4d565b610a4e565b005b34801561038157600080fd5b506103407f000000000000000000000000000000000000000000000000000000000000000081565b3480156103b557600080fd5b506103dd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161034a565b34801561040157600080fd5b50610340610410366004612d9b565b60086020526000908152604090205481565b34801561042e57600080fd5b50610373610bdb565b34801561044357600080fd5b506103dd610452366004612dbf565b6004602052600090815260409020546001600160a01b031681565b34801561047957600080fd5b506003546103dd906001600160a01b031681565b34801561049957600080fd5b506103736104a8366004612e1a565b610c44565b3480156104b957600080fd5b5061034060015481565b3480156104cf57600080fd5b506104e36104de366004612e6d565b610dc7565b6040805163ffffffff90941684526001600160681b03928316602085015291169082015260600161034a565b34801561051b57600080fd5b5061034060065481565b34801561053157600080fd5b50610340610540366004612edd565b610dfd565b34801561055157600080fd5b50610373610560366004612dbf565b61118e565b34801561057157600080fd5b50610585610580366004612f4f565b611213565b60405161034a92919061305f565b34801561059f57600080fd5b506103406201518081565b3480156105b657600080fd5b506103dd7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105ea57600080fd5b506103736105f9366004612dbf565b611379565b34801561060a57600080fd5b506106136113f7565b60405161034a91906130b8565b34801561062c57600080fd5b506106136040518060400160405280600a81526020017f41756374696f6e6565720000000000000000000000000000000000000000000081525081565b34801561067557600080fd5b5061034061200081565b34801561068b57600080fd5b5061037361069a3660046130cb565b611485565b3480156106ab57600080fd5b506103406106ba366004612d9b565b60076020526000908152604090205481565b3480156106d857600080fd5b50610340600f81565b3480156106ed57600080fd5b506107016106fc3660046130fb565b611640565b604080516001600160681b0393841681529290911660208301520161034a565b34801561072d57600080fd5b5061034060025481565b34801561074357600080fd5b50610791610752366004612dbf565b60096020526000908152604090205460ff81169063ffffffff610100820416906001600160681b03650100000000008204811691600160901b90041684565b60405161034a9493929190613198565b3480156107ad57600080fd5b506107016107bc3660046131e5565b611a20565b3480156107cd57600080fd5b506107e16107dc366004613207565b611cae565b6040805192835260208301919091520161034a565b34801561080257600080fd5b5061034061040081565b34801561081857600080fd5b506103407f000000000000000000000000000000000000000000000000000000000000000081565b34801561084c57600080fd5b5061086061085b366004612f4f565b611f71565b60405161034a919061323c565b34801561087957600080fd5b50610373610888366004612d9b565b6120f7565b34801561089957600080fd5b5061034061227b565b6103406108b0366004612d9b565b612320565b3480156108c157600080fd5b5061034060055481565b3480156108d757600080fd5b506108eb6108e63660046131e5565b612425565b60405163ffffffff909116815260200161034a565b34801561090c57600080fd5b5061037361091b36600461324f565b612445565b61034061261e565b34801561093457600080fd5b506107e1610943366004613207565b61262e565b34801561095457600080fd5b506103407f000000000000000000000000000000000000000000000000000000000000000081565b34801561098857600080fd5b506106136040518060400160405280600a81526020017f576974686472617765720000000000000000000000000000000000000000000081525081565b3480156109d157600080fd5b506106136040518060400160405280600c81526020017f50726f787920736574746572000000000000000000000000000000000000000081525081565b348015610a1a57600080fd5b50610373610a2936600461324f565b61290a565b348015610a3a57600080fd5b50610373610a4936600461324f565b612a6e565b6040516bffffffffffffffffffffffff193360601b166020820152603481018490526054810183905260009060740160408051601f1981840301815291815281516020928301206000818152600990935291209091506001815460ff166005811115610abc57610abc613182565b14610ada57604051630b81931d60e21b815260040160405180910390fd5b8054610100900463ffffffff16428111610b0757604051633b22c4bd60e11b815260040160405180910390fd5b8063ffffffff168463ffffffff1610610b4c576040517f49f5248900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff8416610b5e600f42613291565b1115610b7d57604051633b3c39b960e11b815260040160405180910390fd5b815464ffffffff00191661010063ffffffff86169081029190911783556040519081528390879033907fad172d956e009833b7054eb5d06c71894361f7b40acf8723ee9eef1f186da6d99060200160405180910390a4505050505050565b336000908152600860205260408120549003610c0a576040516368bd4d5960e11b815260040160405180910390fd5b33600081815260086020526040808220829055517f500572b5a70142dde0ddd81903df55b60342fdee762c7fca563110ac3b27f70f9190a2565b80610400811115610c6857604051634e5cbcb160e11b815260040160405180910390fd5b80600003610ca2576040517f08a2ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516bffffffffffffffffffffffff193360601b166020820152603481018690526054810185905260009060740160408051601f1981840301815291815281516020928301206000818152600990935291209091506002815460ff166005811115610d1057610d10613182565b14610d47576040517fbc9198ae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8054610100900463ffffffff164210610d7357604051633b22c4bd60e11b815260040160405180910390fd5b805460ff191660031781556040518290889033907f5f2a3d550310a3ef3bad3aa794b62ddf0e11059244785e167041c746996ad51c90610db6908a908a906132cd565b60405180910390a450505050505050565b60008080610dd86201518042613291565b9250610dea8a8a8a8a8a8a8a8a611640565b939b909a50929850919650505050505050565b604051632474521560e21b81527f000000000000000000000000000000000000000000000000000000000000000060048201523360248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906391d1485490604401602060405180830381865afa158015610e8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eae91906132e9565b610ecb57604051637dd15b0d60e11b815260040160405180910390fd5b82612000811115610f08576040517f2edda7ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600003610f42576040517f0b83231e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b824210610f7b576040517f756dd9e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516bffffffffffffffffffffffff1960608a901b166020820152603481018890526054810187905260009060740160408051601f1981840301815291815281516020928301206000818152600990935291209091506001815460ff166005811115610fea57610fea613182565b1461100857604051630b81931d60e21b815260040160405180910390fd5b8054610100900463ffffffff16421061103457604051633b22c4bd60e11b815260040160405180910390fd5b805460ff1916600217815561104c6201518042613291565b815463ffffffff919091166101000264ffffffff0019909116178082556001600160a01b038b166000908152600760205260408120549550906001600160681b03600160901b820481166501000000000090920416116110bd578154600160901b90046001600160681b03166110d2565b81546501000000000090046001600160681b03165b6001600160681b0316905080851015611117576040517f3d5ad20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611121818661330b565b6001600160a01b038c16600081815260076020526040908190208390555191965084918c91907fd6a2a9b03edbda2093822585a736f8b6377d318f22f5fdf2d1aa6961af70915990611178908d908d908c9061331e565b60405180910390a4505050509695505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111d757604051634a528f2960e01b815260040160405180910390fd5b60018190556040518181527f7ac0ef59f7d9dbb2580761b96d65e7c918d07c131fd85bf7440899f06fdf62c6906020015b60405180910390a150565b606080828067ffffffffffffffff81111561123057611230613342565b604051908082528060200260200182016040528015611259578160200160208202803683370190505b5092508067ffffffffffffffff81111561127557611275613342565b6040519080825280602002602001820160405280156112a857816020015b60608152602001906001900390816112935790505b50915060005b8181101561137057308686838181106112c9576112c9613358565b90506020028101906112db919061336e565b6040516112e99291906133b5565b600060405180830381855af49150503d8060008114611324576040519150601f19603f3d011682016040523d82523d6000602084013e611329565b606091505b5085838151811061133c5761133c613358565b6020026020010185848151811061135557611355613358565b602090810291909101019190915290151590526001016112ae565b50509250929050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113c257604051634a528f2960e01b815260040160405180910390fd5b60028190556040518181527ffe379dc6526029f01338af94ab9eba70b7d899d38f3e3b541f816fe5dd33355690602001611208565b60008054611404906133c5565b80601f0160208091040260200160405190810160405280929190818152602001828054611430906133c5565b801561147d5780601f106114525761010080835404028352916020019161147d565b820191906000526020600020905b81548152906001019060200180831161146057829003601f168201915b505050505081565b604051632474521560e21b81527f000000000000000000000000000000000000000000000000000000000000000060048201523360248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906391d1485490604401602060405180830381865afa15801561150f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153391906132e9565b1580156115695750336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614155b156115875760405163e8aa7abd60e01b815260040160405180910390fd5b816000036115a857604051631b1be67360e21b815260040160405180910390fd5b6001600160a01b0381166115cf57604051635217ecab60e01b815260040160405180910390fd5b600082815260046020908152604091829020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038516908117909155915191825283917f334709a0109e14e225a6c8fa70049361a4aede0b7ed95981bc15705ed8682ddf910160405180910390a25050565b6000808860000361166457604051631b1be67360e21b815260040160405180910390fd5b8760000361169e576040517ff3f1583600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b856104008111156116c257604051634e5cbcb160e11b815260040160405180910390fd5b806000036116fc576040517f9385e6c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff84166117106201518042613291565b1015611748576040517f319cc89100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff841661175a600f42613291565b111561177957604051633b3c39b960e11b815260040160405180910390fd5b6000338c8a8a60405161178d9291906133b5565b6040519081900381206117c993929160200160609390931b6bffffffffffffffffffffffff191683526014830191909152603482015260540190565b60408051601f19818403018152919052805160209091012090506000808281526009602052604090205460ff16600581111561180757611807613182565b1461183e576040517fd33fe06a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118488b8b611a20565b90945092506001600160681b038416871015611890576040517f156dc28c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85836001600160681b031611156118d3576040517f58317de300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051608081018252600180825263ffffffff88166020808401919091526001600160681b038881168486015287166060840152600085815260099091529290922081518154929391929091839160ff19169083600581111561193957611939613182565b021790555060208201518160000160016101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160056101000a8154816001600160681b0302191690836001600160681b0316021790555060608201518160000160126101000a8154816001600160681b0302191690836001600160681b03160217905550905050808c336001600160a01b03167f37d580e87cc06489401e512a96663a7330c5096febe57bd356f5f2a327994c108e8e8e8e8c8c8c604051611a0997969594939291906133ff565b60405180910390a450509850989650505050505050565b6000806001546000148015611a355750600254155b15611a4557506000905080611ca7565b600354604080516315f789a960e21b8152815160009384936001600160a01b03909116926357de26a492600480830193928290030181865afa158015611a8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab3919061344e565b91509150600082601b0b13611af4576040517fae619ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b076201518063ffffffff8316613291565b4210611b3f576040517ff83eafd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008681526004602081905260408083205481516315f789a960e21b8152825185946001600160a01b03909316936357de26a493838101939192918290030181865afa158015611b93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb7919061344e565b91509150600082601b0b13611bf8576040517f2582719b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c0b6201518063ffffffff8316613291565b4210611c43576040517f8c54366400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c8261271085601b0b60015485601b0b8b611c5f9190613483565b611c699190613483565b611c73919061349a565b611c7d919061349a565b612c33565b9550611ca061271085601b0b60025485601b0b8b611c5f9190613483565b9450505050505b9250929050565b604051632474521560e21b81527f0000000000000000000000000000000000000000000000000000000000000000600482015233602482015260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906391d1485490604401602060405180830381865afa158015611d3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d6191906132e9565b611d7e57604051637dd15b0d60e11b815260040160405180910390fd5b6040516bffffffffffffffffffffffff19606087901b166020820152603481018590526054810184905260009060740160408051601f1981840301815291815281516020928301206000818152600990935291209091506003815460ff166005811115611ded57611ded613182565b14158015611e1157506002815460ff166005811115611e0e57611e0e613182565b14155b15611e48576040517fc92f3a2100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805460ff1916600417808255600160901b81046001600160681b0390811691650100000000009004168110611e8e578154600160901b90046001600160681b0316611ea3565b81546501000000000090046001600160681b03165b6001600160a01b038916600090815260076020526040902054611ecf916001600160681b031690613291565b611ed9919061330b565b6001600160a01b03881660009081526007602052604090208190558154600654919550611f1791600160901b9091046001600160681b031690613291565b60068190556040805186815260208101839052919450839188916001600160a01b038b16917fb53fb71ac8f6f5f82ce788eb23961b3d41ac795fbe2090e39b19545c2239038d910160405180910390a45050935093915050565b6060818067ffffffffffffffff811115611f8d57611f8d613342565b604051908082528060200260200182016040528015611fc057816020015b6060815260200190600190039081611fab5790505b50915060005b818110156120ef57600030868684818110611fe357611fe3613358565b9050602002810190611ff5919061336e565b6040516120039291906133b5565b600060405180830381855af49150503d806000811461203e576040519150601f19603f3d011682016040523d82523d6000602084013e612043565b606091505b5085848151811061205657612056613358565b60209081029190910101529050806120e657600084838151811061207c5761207c613358565b602002602001015190506000815111156120995780518082602001fd5b60405162461bcd60e51b815260206004820152601b60248201527f4d756c746963616c6c3a204e6f2072657665727420737472696e67000000000060448201526064015b60405180910390fd5b50600101611fc6565b505092915050565b604051632474521560e21b81527f000000000000000000000000000000000000000000000000000000000000000060048201523360248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906391d1485490604401602060405180830381865afa158015612181573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a591906132e9565b1580156121db5750336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614155b156121f95760405163e8aa7abd60e01b815260040160405180910390fd5b6001600160a01b03811661222057604051635217ecab60e01b815260040160405180910390fd5b6003805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527fd0a9b70d8c3c5a433365db2d8bcb54cd69fc08e26e5b7916fc56f1b3d79987bf90602001611208565b33600090815260086020526040812054156122c2576040517fca2698d500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122cd600f42613291565b336000818152600860205260409081902083905551919250907fb4e65442cbc6906b8324895f42a05f58deb8c1036c6b082583276fa4e146830b906123159084815260200190565b60405180910390a290565b60006001600160a01b038216612362576040517ffdedd70700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3460000361239c576040517f0ddbd93400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166000908152600760205260409020546123c0903490613291565b6001600160a01b03831660008181526007602090815260409182902084905581513481529081018490523381830152905192935090917fa49637e3f6491de6c2c23c5006bef69df603d0dba9d65c8b756fe46ac29810b99181900360600190a2919050565b6000612432600f42613291565b905061243f838383610a4e565b92915050565b604051632474521560e21b81527f000000000000000000000000000000000000000000000000000000000000000060048201523360248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906391d1485490604401602060405180830381865afa1580156124cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f391906132e9565b1580156125295750336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614155b156125475760405163e664e62b60e01b815260040160405180910390fd5b81816001600160a01b03821661257057604051632c351b1f60e21b815260040160405180910390fd5b806000036125915760405163332c7a0560e21b815260040160405180910390fd5b6005548311156125b457604051631e9acf1760e31b815260040160405180910390fd5b82600560008282546125c6919061330b565b9091555050604080516001600160a01b0386168152602081018590527f5ce3d29f115fec5dcc2069f8615b2d241f4985b795ddb80168278c946375332691015b60405180910390a16126188484612c90565b50505050565b600061262933612320565b905090565b604051632474521560e21b81527f0000000000000000000000000000000000000000000000000000000000000000600482015233602482015260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906391d1485490604401602060405180830381865afa1580156126bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e191906132e9565b6126fe57604051637dd15b0d60e11b815260040160405180910390fd5b6040516bffffffffffffffffffffffff19606087901b166020820152603481018590526054810184905260009060740160408051601f19818403018152918152815160209283012060008181526009909352912080549192509060ff16600381600581111561276f5761276f613182565b141580156127a75750600281600581111561278c5761278c613182565b1480156127a557508154610100900463ffffffff164210155b155b156127de576040517f6101cf0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815460ff19166005178083556501000000000081046001600160681b0390811691600160901b9004168111612824578254600160901b90046001600160681b0316612839565b82546501000000000090046001600160681b03165b6001600160a01b038a16600090815260076020526040902054612865916001600160681b031690613291565b61286f919061330b565b6001600160a01b038916600090815260076020526040902081905582546005549196506128af91650100000000009091046001600160681b031690613291565b60058190556040805187815260208101839052919550849189916001600160a01b038c16917fffcfcd8812260e146345078a507c94303e19dcbd6bbc7412fd14c8bd7664f4b7910160405180910390a4505050935093915050565b81816001600160a01b03821661293357604051632c351b1f60e21b815260040160405180910390fd5b806000036129545760405163332c7a0560e21b815260040160405180910390fd5b336000908152600760205260409020548084111561298557604051631e9acf1760e31b815260040160405180910390fd5b33600090815260086020526040812054908190036129b6576040516368bd4d5960e11b815260040160405180910390fd5b804210156129f0576040517ff88fda5800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129fa858361330b565b33600081815260076020908152604080832094909455600881528382209190915582516001600160a01b038a16815290810188905290917f0472be967f9a37138dfea1875af44784cafb79f92044ab33d7d6958eddd9ca6c910160405180910390a2612a668686612c90565b505050505050565b604051632474521560e21b81527f000000000000000000000000000000000000000000000000000000000000000060048201523360248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906391d1485490604401602060405180830381865afa158015612af8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b1c91906132e9565b158015612b525750336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614155b15612b705760405163e664e62b60e01b815260040160405180910390fd5b81816001600160a01b038216612b9957604051632c351b1f60e21b815260040160405180910390fd5b80600003612bba5760405163332c7a0560e21b815260040160405180910390fd5b600654831115612bdd57604051631e9acf1760e31b815260040160405180910390fd5b8260066000828254612bef919061330b565b9091555050604080516001600160a01b0386168152602081018590527f3ad34b02a1ed9c4eac723078193ba769026fa0d127a407bb9a4941395ead48b89101612606565b60006001600160681b03821115612c8c5760405162461bcd60e51b815260206004820152601d60248201527f56616c756520646f6573206e6f742066697420696e2075696e7431303400000060448201526064016120dd565b5090565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612cdd576040519150601f19603f3d011682016040523d82523d6000602084013e612ce2565b606091505b5050905080612d335760405162461bcd60e51b815260206004820152601560248201527f5472616e7366657220756e7375636365737366756c000000000000000000000060448201526064016120dd565b505050565b63ffffffff81168114612d4a57600080fd5b50565b600080600060608486031215612d6257600080fd5b83359250602084013591506040840135612d7b81612d38565b809150509250925092565b6001600160a01b0381168114612d4a57600080fd5b600060208284031215612dad57600080fd5b8135612db881612d86565b9392505050565b600060208284031215612dd157600080fd5b5035919050565b60008083601f840112612dea57600080fd5b50813567ffffffffffffffff811115612e0257600080fd5b602083019150836020828501011115611ca757600080fd5b60008060008060608587031215612e3057600080fd5b8435935060208501359250604085013567ffffffffffffffff811115612e5557600080fd5b612e6187828801612dd8565b95989497509550505050565b600080600080600080600060c0888a031215612e8857600080fd5b873596506020880135955060408801359450606088013567ffffffffffffffff811115612eb457600080fd5b612ec08a828b01612dd8565b989b979a50959895979660808701359660a0013595509350505050565b60008060008060008060a08789031215612ef657600080fd5b8635612f0181612d86565b95506020870135945060408701359350606087013567ffffffffffffffff811115612f2b57600080fd5b612f3789828a01612dd8565b979a9699509497949695608090950135949350505050565b60008060208385031215612f6257600080fd5b823567ffffffffffffffff80821115612f7a57600080fd5b818501915085601f830112612f8e57600080fd5b813581811115612f9d57600080fd5b8660208260051b8501011115612fb257600080fd5b60209290920196919550909350505050565b6000815180845260005b81811015612fea57602081850181015186830182015201612fce565b506000602082860101526020601f19601f83011685010191505092915050565b600081518084526020808501808196508360051b8101915082860160005b85811015613052578284038952613040848351612fc4565b98850198935090840190600101613028565b5091979650505050505050565b604080825283519082018190526000906020906060840190828701845b8281101561309a57815115158452928401929084019060010161307c565b505050838103828501526130ae818661300a565b9695505050505050565b602081526000612db86020830184612fc4565b600080604083850312156130de57600080fd5b8235915060208301356130f081612d86565b809150509250929050565b60008060008060008060008060e0898b03121561311757600080fd5b883597506020890135965060408901359550606089013567ffffffffffffffff81111561314357600080fd5b61314f8b828c01612dd8565b9096509450506080890135925060a0890135915060c089013561317181612d38565b809150509295985092959890939650565b634e487b7160e01b600052602160045260246000fd5b60808101600686106131ba57634e487b7160e01b600052602160045260246000fd5b94815263ffffffff9390931660208401526001600160681b0391821660408401521660609091015290565b600080604083850312156131f857600080fd5b50508035926020909101359150565b60008060006060848603121561321c57600080fd5b833561322781612d86565b95602085013595506040909401359392505050565b602081526000612db8602083018461300a565b6000806040838503121561326257600080fd5b823561326d81612d86565b946020939093013593505050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561243f5761243f61327b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6020815260006132e16020830184866132a4565b949350505050565b6000602082840312156132fb57600080fd5b81518015158114612db857600080fd5b8181038181111561243f5761243f61327b565b6040815260006133326040830185876132a4565b9050826020830152949350505050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261338557600080fd5b83018035915067ffffffffffffffff8211156133a057600080fd5b602001915036819003821315611ca757600080fd5b8183823760009101908152919050565b600181811c908216806133d957607f821691505b6020821081036133f957634e487b7160e01b600052602260045260246000fd5b50919050565b87815286602082015260c06040820152600061341f60c0830187896132a4565b63ffffffff959095166060830152506001600160681b039283166080820152911660a090910152949350505050565b6000806040838503121561346157600080fd5b825180601b0b811461347257600080fd5b60208401519092506130f081612d38565b808202811582820484141761243f5761243f61327b565b6000826134b757634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220e0282c4b28bcd64e0580ac99e4962a8553a56549368be583e0c5a31160df2b9764736f6c63430008110033", + "deployedBytecode": "0x6080604052600436106103075760003560e01c80636e6a0ed11161019a578063b51d1d4f116100e1578063dc6c94511161008a578063f1bbe0a611610064578063f1bbe0a6146109c5578063f3fef3a314610a0e578063fc4b450314610a2e57600080fd5b8063dc6c945114610928578063e8597c3714610948578063f1939bd01461097c57600080fd5b8063bc6b39d7116100bb578063bc6b39d7146108cb578063c3535ea714610900578063d0e30db01461092057600080fd5b8063b51d1d4f1461088d578063b988cc5b146108a2578063ba09b169146108b557600080fd5b80639fa4fa3b11610143578063a7277fb51161011d578063a7277fb51461080c578063ac9650d814610840578063af2b3be11461086d57600080fd5b80639fa4fa3b146107c1578063a319af61146106cc578063a64195f6146107f657600080fd5b80638891603f116101745780638891603f146107215780638f98eeda1461073757806396c582c3146107a157600080fd5b80636e6a0ed1146106cc57806372f93ed3146106e1578063816df6b91461059357600080fd5b806331d1c1b31161025e5780634af9efe21161020757806361a58734116101e157806361a58734146106695780636a9566da1461067f5780636acab84a1461069f57600080fd5b80634af9efe2146105de5780634c8f1d8d146105fe5780635ae647121461062057600080fd5b8063437b911611610238578063437b91161461056557806343cde18114610593578063481c6a75146105aa57600080fd5b806331d1c1b31461050f5780633cddb966146105255780633d73d5eb1461054557600080fd5b806322611280116102c057806328fc2dfd1161029a57806328fc2dfd1461048d5780632ba248a0146104ad5780632ddc06a8146104c357600080fd5b80632261128014610422578063244ce2951461043757806327356bdc1461046d57600080fd5b80631be8d01f116102f15780631be8d01f146103755780631ce9ae07146103a95780631f4c9fd6146103f557600080fd5b80629f2f3c1461030c578063192af35b14610353575b600080fd5b34801561031857600080fd5b506103407f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b34801561035f57600080fd5b5061037361036e366004612d4d565b610a4e565b005b34801561038157600080fd5b506103407f000000000000000000000000000000000000000000000000000000000000000081565b3480156103b557600080fd5b506103dd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161034a565b34801561040157600080fd5b50610340610410366004612d9b565b60086020526000908152604090205481565b34801561042e57600080fd5b50610373610bdb565b34801561044357600080fd5b506103dd610452366004612dbf565b6004602052600090815260409020546001600160a01b031681565b34801561047957600080fd5b506003546103dd906001600160a01b031681565b34801561049957600080fd5b506103736104a8366004612e1a565b610c44565b3480156104b957600080fd5b5061034060015481565b3480156104cf57600080fd5b506104e36104de366004612e6d565b610dc7565b6040805163ffffffff90941684526001600160681b03928316602085015291169082015260600161034a565b34801561051b57600080fd5b5061034060065481565b34801561053157600080fd5b50610340610540366004612edd565b610dfd565b34801561055157600080fd5b50610373610560366004612dbf565b61118e565b34801561057157600080fd5b50610585610580366004612f4f565b611213565b60405161034a92919061305f565b34801561059f57600080fd5b506103406201518081565b3480156105b657600080fd5b506103dd7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105ea57600080fd5b506103736105f9366004612dbf565b611379565b34801561060a57600080fd5b506106136113f7565b60405161034a91906130b8565b34801561062c57600080fd5b506106136040518060400160405280600a81526020017f41756374696f6e6565720000000000000000000000000000000000000000000081525081565b34801561067557600080fd5b5061034061200081565b34801561068b57600080fd5b5061037361069a3660046130cb565b611485565b3480156106ab57600080fd5b506103406106ba366004612d9b565b60076020526000908152604090205481565b3480156106d857600080fd5b50610340600f81565b3480156106ed57600080fd5b506107016106fc3660046130fb565b611640565b604080516001600160681b0393841681529290911660208301520161034a565b34801561072d57600080fd5b5061034060025481565b34801561074357600080fd5b50610791610752366004612dbf565b60096020526000908152604090205460ff81169063ffffffff610100820416906001600160681b03650100000000008204811691600160901b90041684565b60405161034a9493929190613198565b3480156107ad57600080fd5b506107016107bc3660046131e5565b611a20565b3480156107cd57600080fd5b506107e16107dc366004613207565b611cae565b6040805192835260208301919091520161034a565b34801561080257600080fd5b5061034061040081565b34801561081857600080fd5b506103407f000000000000000000000000000000000000000000000000000000000000000081565b34801561084c57600080fd5b5061086061085b366004612f4f565b611f71565b60405161034a919061323c565b34801561087957600080fd5b50610373610888366004612d9b565b6120f7565b34801561089957600080fd5b5061034061227b565b6103406108b0366004612d9b565b612320565b3480156108c157600080fd5b5061034060055481565b3480156108d757600080fd5b506108eb6108e63660046131e5565b612425565b60405163ffffffff909116815260200161034a565b34801561090c57600080fd5b5061037361091b36600461324f565b612445565b61034061261e565b34801561093457600080fd5b506107e1610943366004613207565b61262e565b34801561095457600080fd5b506103407f000000000000000000000000000000000000000000000000000000000000000081565b34801561098857600080fd5b506106136040518060400160405280600a81526020017f576974686472617765720000000000000000000000000000000000000000000081525081565b3480156109d157600080fd5b506106136040518060400160405280600c81526020017f50726f787920736574746572000000000000000000000000000000000000000081525081565b348015610a1a57600080fd5b50610373610a2936600461324f565b61290a565b348015610a3a57600080fd5b50610373610a4936600461324f565b612a6e565b6040516bffffffffffffffffffffffff193360601b166020820152603481018490526054810183905260009060740160408051601f1981840301815291815281516020928301206000818152600990935291209091506001815460ff166005811115610abc57610abc613182565b14610ada57604051630b81931d60e21b815260040160405180910390fd5b8054610100900463ffffffff16428111610b0757604051633b22c4bd60e11b815260040160405180910390fd5b8063ffffffff168463ffffffff1610610b4c576040517f49f5248900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff8416610b5e600f42613291565b1115610b7d57604051633b3c39b960e11b815260040160405180910390fd5b815464ffffffff00191661010063ffffffff86169081029190911783556040519081528390879033907fad172d956e009833b7054eb5d06c71894361f7b40acf8723ee9eef1f186da6d99060200160405180910390a4505050505050565b336000908152600860205260408120549003610c0a576040516368bd4d5960e11b815260040160405180910390fd5b33600081815260086020526040808220829055517f500572b5a70142dde0ddd81903df55b60342fdee762c7fca563110ac3b27f70f9190a2565b80610400811115610c6857604051634e5cbcb160e11b815260040160405180910390fd5b80600003610ca2576040517f08a2ef3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516bffffffffffffffffffffffff193360601b166020820152603481018690526054810185905260009060740160408051601f1981840301815291815281516020928301206000818152600990935291209091506002815460ff166005811115610d1057610d10613182565b14610d47576040517fbc9198ae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8054610100900463ffffffff164210610d7357604051633b22c4bd60e11b815260040160405180910390fd5b805460ff191660031781556040518290889033907f5f2a3d550310a3ef3bad3aa794b62ddf0e11059244785e167041c746996ad51c90610db6908a908a906132cd565b60405180910390a450505050505050565b60008080610dd86201518042613291565b9250610dea8a8a8a8a8a8a8a8a611640565b939b909a50929850919650505050505050565b604051632474521560e21b81527f000000000000000000000000000000000000000000000000000000000000000060048201523360248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906391d1485490604401602060405180830381865afa158015610e8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eae91906132e9565b610ecb57604051637dd15b0d60e11b815260040160405180910390fd5b82612000811115610f08576040517f2edda7ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600003610f42576040517f0b83231e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b824210610f7b576040517f756dd9e500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516bffffffffffffffffffffffff1960608a901b166020820152603481018890526054810187905260009060740160408051601f1981840301815291815281516020928301206000818152600990935291209091506001815460ff166005811115610fea57610fea613182565b1461100857604051630b81931d60e21b815260040160405180910390fd5b8054610100900463ffffffff16421061103457604051633b22c4bd60e11b815260040160405180910390fd5b805460ff1916600217815561104c6201518042613291565b815463ffffffff919091166101000264ffffffff0019909116178082556001600160a01b038b166000908152600760205260408120549550906001600160681b03600160901b820481166501000000000090920416116110bd578154600160901b90046001600160681b03166110d2565b81546501000000000090046001600160681b03165b6001600160681b0316905080851015611117576040517f3d5ad20500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611121818661330b565b6001600160a01b038c16600081815260076020526040908190208390555191965084918c91907fd6a2a9b03edbda2093822585a736f8b6377d318f22f5fdf2d1aa6961af70915990611178908d908d908c9061331e565b60405180910390a4505050509695505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111d757604051634a528f2960e01b815260040160405180910390fd5b60018190556040518181527f7ac0ef59f7d9dbb2580761b96d65e7c918d07c131fd85bf7440899f06fdf62c6906020015b60405180910390a150565b606080828067ffffffffffffffff81111561123057611230613342565b604051908082528060200260200182016040528015611259578160200160208202803683370190505b5092508067ffffffffffffffff81111561127557611275613342565b6040519080825280602002602001820160405280156112a857816020015b60608152602001906001900390816112935790505b50915060005b8181101561137057308686838181106112c9576112c9613358565b90506020028101906112db919061336e565b6040516112e99291906133b5565b600060405180830381855af49150503d8060008114611324576040519150601f19603f3d011682016040523d82523d6000602084013e611329565b606091505b5085838151811061133c5761133c613358565b6020026020010185848151811061135557611355613358565b602090810291909101019190915290151590526001016112ae565b50509250929050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113c257604051634a528f2960e01b815260040160405180910390fd5b60028190556040518181527ffe379dc6526029f01338af94ab9eba70b7d899d38f3e3b541f816fe5dd33355690602001611208565b60008054611404906133c5565b80601f0160208091040260200160405190810160405280929190818152602001828054611430906133c5565b801561147d5780601f106114525761010080835404028352916020019161147d565b820191906000526020600020905b81548152906001019060200180831161146057829003601f168201915b505050505081565b604051632474521560e21b81527f000000000000000000000000000000000000000000000000000000000000000060048201523360248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906391d1485490604401602060405180830381865afa15801561150f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153391906132e9565b1580156115695750336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614155b156115875760405163e8aa7abd60e01b815260040160405180910390fd5b816000036115a857604051631b1be67360e21b815260040160405180910390fd5b6001600160a01b0381166115cf57604051635217ecab60e01b815260040160405180910390fd5b600082815260046020908152604091829020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038516908117909155915191825283917f334709a0109e14e225a6c8fa70049361a4aede0b7ed95981bc15705ed8682ddf910160405180910390a25050565b6000808860000361166457604051631b1be67360e21b815260040160405180910390fd5b8760000361169e576040517ff3f1583600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b856104008111156116c257604051634e5cbcb160e11b815260040160405180910390fd5b806000036116fc576040517f9385e6c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff84166117106201518042613291565b1015611748576040517f319cc89100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff841661175a600f42613291565b111561177957604051633b3c39b960e11b815260040160405180910390fd5b6000338c8a8a60405161178d9291906133b5565b6040519081900381206117c993929160200160609390931b6bffffffffffffffffffffffff191683526014830191909152603482015260540190565b60408051601f19818403018152919052805160209091012090506000808281526009602052604090205460ff16600581111561180757611807613182565b1461183e576040517fd33fe06a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118488b8b611a20565b90945092506001600160681b038416871015611890576040517f156dc28c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85836001600160681b031611156118d3576040517f58317de300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051608081018252600180825263ffffffff88166020808401919091526001600160681b038881168486015287166060840152600085815260099091529290922081518154929391929091839160ff19169083600581111561193957611939613182565b021790555060208201518160000160016101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160056101000a8154816001600160681b0302191690836001600160681b0316021790555060608201518160000160126101000a8154816001600160681b0302191690836001600160681b03160217905550905050808c336001600160a01b03167f37d580e87cc06489401e512a96663a7330c5096febe57bd356f5f2a327994c108e8e8e8e8c8c8c604051611a0997969594939291906133ff565b60405180910390a450509850989650505050505050565b6000806001546000148015611a355750600254155b15611a4557506000905080611ca7565b600354604080516315f789a960e21b8152815160009384936001600160a01b03909116926357de26a492600480830193928290030181865afa158015611a8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab3919061344e565b91509150600082601b0b13611af4576040517fae619ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b076201518063ffffffff8316613291565b4210611b3f576040517ff83eafd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008681526004602081905260408083205481516315f789a960e21b8152825185946001600160a01b03909316936357de26a493838101939192918290030181865afa158015611b93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb7919061344e565b91509150600082601b0b13611bf8576040517f2582719b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c0b6201518063ffffffff8316613291565b4210611c43576040517f8c54366400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c8261271085601b0b60015485601b0b8b611c5f9190613483565b611c699190613483565b611c73919061349a565b611c7d919061349a565b612c33565b9550611ca061271085601b0b60025485601b0b8b611c5f9190613483565b9450505050505b9250929050565b604051632474521560e21b81527f0000000000000000000000000000000000000000000000000000000000000000600482015233602482015260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906391d1485490604401602060405180830381865afa158015611d3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d6191906132e9565b611d7e57604051637dd15b0d60e11b815260040160405180910390fd5b6040516bffffffffffffffffffffffff19606087901b166020820152603481018590526054810184905260009060740160408051601f1981840301815291815281516020928301206000818152600990935291209091506003815460ff166005811115611ded57611ded613182565b14158015611e1157506002815460ff166005811115611e0e57611e0e613182565b14155b15611e48576040517fc92f3a2100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805460ff1916600417808255600160901b81046001600160681b0390811691650100000000009004168110611e8e578154600160901b90046001600160681b0316611ea3565b81546501000000000090046001600160681b03165b6001600160a01b038916600090815260076020526040902054611ecf916001600160681b031690613291565b611ed9919061330b565b6001600160a01b03881660009081526007602052604090208190558154600654919550611f1791600160901b9091046001600160681b031690613291565b60068190556040805186815260208101839052919450839188916001600160a01b038b16917fb53fb71ac8f6f5f82ce788eb23961b3d41ac795fbe2090e39b19545c2239038d910160405180910390a45050935093915050565b6060818067ffffffffffffffff811115611f8d57611f8d613342565b604051908082528060200260200182016040528015611fc057816020015b6060815260200190600190039081611fab5790505b50915060005b818110156120ef57600030868684818110611fe357611fe3613358565b9050602002810190611ff5919061336e565b6040516120039291906133b5565b600060405180830381855af49150503d806000811461203e576040519150601f19603f3d011682016040523d82523d6000602084013e612043565b606091505b5085848151811061205657612056613358565b60209081029190910101529050806120e657600084838151811061207c5761207c613358565b602002602001015190506000815111156120995780518082602001fd5b60405162461bcd60e51b815260206004820152601b60248201527f4d756c746963616c6c3a204e6f2072657665727420737472696e67000000000060448201526064015b60405180910390fd5b50600101611fc6565b505092915050565b604051632474521560e21b81527f000000000000000000000000000000000000000000000000000000000000000060048201523360248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906391d1485490604401602060405180830381865afa158015612181573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a591906132e9565b1580156121db5750336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614155b156121f95760405163e8aa7abd60e01b815260040160405180910390fd5b6001600160a01b03811661222057604051635217ecab60e01b815260040160405180910390fd5b6003805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527fd0a9b70d8c3c5a433365db2d8bcb54cd69fc08e26e5b7916fc56f1b3d79987bf90602001611208565b33600090815260086020526040812054156122c2576040517fca2698d500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122cd600f42613291565b336000818152600860205260409081902083905551919250907fb4e65442cbc6906b8324895f42a05f58deb8c1036c6b082583276fa4e146830b906123159084815260200190565b60405180910390a290565b60006001600160a01b038216612362576040517ffdedd70700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3460000361239c576040517f0ddbd93400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166000908152600760205260409020546123c0903490613291565b6001600160a01b03831660008181526007602090815260409182902084905581513481529081018490523381830152905192935090917fa49637e3f6491de6c2c23c5006bef69df603d0dba9d65c8b756fe46ac29810b99181900360600190a2919050565b6000612432600f42613291565b905061243f838383610a4e565b92915050565b604051632474521560e21b81527f000000000000000000000000000000000000000000000000000000000000000060048201523360248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906391d1485490604401602060405180830381865afa1580156124cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f391906132e9565b1580156125295750336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614155b156125475760405163e664e62b60e01b815260040160405180910390fd5b81816001600160a01b03821661257057604051632c351b1f60e21b815260040160405180910390fd5b806000036125915760405163332c7a0560e21b815260040160405180910390fd5b6005548311156125b457604051631e9acf1760e31b815260040160405180910390fd5b82600560008282546125c6919061330b565b9091555050604080516001600160a01b0386168152602081018590527f5ce3d29f115fec5dcc2069f8615b2d241f4985b795ddb80168278c946375332691015b60405180910390a16126188484612c90565b50505050565b600061262933612320565b905090565b604051632474521560e21b81527f0000000000000000000000000000000000000000000000000000000000000000600482015233602482015260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906391d1485490604401602060405180830381865afa1580156126bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e191906132e9565b6126fe57604051637dd15b0d60e11b815260040160405180910390fd5b6040516bffffffffffffffffffffffff19606087901b166020820152603481018590526054810184905260009060740160408051601f19818403018152918152815160209283012060008181526009909352912080549192509060ff16600381600581111561276f5761276f613182565b141580156127a75750600281600581111561278c5761278c613182565b1480156127a557508154610100900463ffffffff164210155b155b156127de576040517f6101cf0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815460ff19166005178083556501000000000081046001600160681b0390811691600160901b9004168111612824578254600160901b90046001600160681b0316612839565b82546501000000000090046001600160681b03165b6001600160a01b038a16600090815260076020526040902054612865916001600160681b031690613291565b61286f919061330b565b6001600160a01b038916600090815260076020526040902081905582546005549196506128af91650100000000009091046001600160681b031690613291565b60058190556040805187815260208101839052919550849189916001600160a01b038c16917fffcfcd8812260e146345078a507c94303e19dcbd6bbc7412fd14c8bd7664f4b7910160405180910390a4505050935093915050565b81816001600160a01b03821661293357604051632c351b1f60e21b815260040160405180910390fd5b806000036129545760405163332c7a0560e21b815260040160405180910390fd5b336000908152600760205260409020548084111561298557604051631e9acf1760e31b815260040160405180910390fd5b33600090815260086020526040812054908190036129b6576040516368bd4d5960e11b815260040160405180910390fd5b804210156129f0576040517ff88fda5800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129fa858361330b565b33600081815260076020908152604080832094909455600881528382209190915582516001600160a01b038a16815290810188905290917f0472be967f9a37138dfea1875af44784cafb79f92044ab33d7d6958eddd9ca6c910160405180910390a2612a668686612c90565b505050505050565b604051632474521560e21b81527f000000000000000000000000000000000000000000000000000000000000000060048201523360248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906391d1485490604401602060405180830381865afa158015612af8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b1c91906132e9565b158015612b525750336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614155b15612b705760405163e664e62b60e01b815260040160405180910390fd5b81816001600160a01b038216612b9957604051632c351b1f60e21b815260040160405180910390fd5b80600003612bba5760405163332c7a0560e21b815260040160405180910390fd5b600654831115612bdd57604051631e9acf1760e31b815260040160405180910390fd5b8260066000828254612bef919061330b565b9091555050604080516001600160a01b0386168152602081018590527f3ad34b02a1ed9c4eac723078193ba769026fa0d127a407bb9a4941395ead48b89101612606565b60006001600160681b03821115612c8c5760405162461bcd60e51b815260206004820152601d60248201527f56616c756520646f6573206e6f742066697420696e2075696e7431303400000060448201526064016120dd565b5090565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612cdd576040519150601f19603f3d011682016040523d82523d6000602084013e612ce2565b606091505b5050905080612d335760405162461bcd60e51b815260206004820152601560248201527f5472616e7366657220756e7375636365737366756c000000000000000000000060448201526064016120dd565b505050565b63ffffffff81168114612d4a57600080fd5b50565b600080600060608486031215612d6257600080fd5b83359250602084013591506040840135612d7b81612d38565b809150509250925092565b6001600160a01b0381168114612d4a57600080fd5b600060208284031215612dad57600080fd5b8135612db881612d86565b9392505050565b600060208284031215612dd157600080fd5b5035919050565b60008083601f840112612dea57600080fd5b50813567ffffffffffffffff811115612e0257600080fd5b602083019150836020828501011115611ca757600080fd5b60008060008060608587031215612e3057600080fd5b8435935060208501359250604085013567ffffffffffffffff811115612e5557600080fd5b612e6187828801612dd8565b95989497509550505050565b600080600080600080600060c0888a031215612e8857600080fd5b873596506020880135955060408801359450606088013567ffffffffffffffff811115612eb457600080fd5b612ec08a828b01612dd8565b989b979a50959895979660808701359660a0013595509350505050565b60008060008060008060a08789031215612ef657600080fd5b8635612f0181612d86565b95506020870135945060408701359350606087013567ffffffffffffffff811115612f2b57600080fd5b612f3789828a01612dd8565b979a9699509497949695608090950135949350505050565b60008060208385031215612f6257600080fd5b823567ffffffffffffffff80821115612f7a57600080fd5b818501915085601f830112612f8e57600080fd5b813581811115612f9d57600080fd5b8660208260051b8501011115612fb257600080fd5b60209290920196919550909350505050565b6000815180845260005b81811015612fea57602081850181015186830182015201612fce565b506000602082860101526020601f19601f83011685010191505092915050565b600081518084526020808501808196508360051b8101915082860160005b85811015613052578284038952613040848351612fc4565b98850198935090840190600101613028565b5091979650505050505050565b604080825283519082018190526000906020906060840190828701845b8281101561309a57815115158452928401929084019060010161307c565b505050838103828501526130ae818661300a565b9695505050505050565b602081526000612db86020830184612fc4565b600080604083850312156130de57600080fd5b8235915060208301356130f081612d86565b809150509250929050565b60008060008060008060008060e0898b03121561311757600080fd5b883597506020890135965060408901359550606089013567ffffffffffffffff81111561314357600080fd5b61314f8b828c01612dd8565b9096509450506080890135925060a0890135915060c089013561317181612d38565b809150509295985092959890939650565b634e487b7160e01b600052602160045260246000fd5b60808101600686106131ba57634e487b7160e01b600052602160045260246000fd5b94815263ffffffff9390931660208401526001600160681b0391821660408401521660609091015290565b600080604083850312156131f857600080fd5b50508035926020909101359150565b60008060006060848603121561321c57600080fd5b833561322781612d86565b95602085013595506040909401359392505050565b602081526000612db8602083018461300a565b6000806040838503121561326257600080fd5b823561326d81612d86565b946020939093013593505050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561243f5761243f61327b565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6020815260006132e16020830184866132a4565b949350505050565b6000602082840312156132fb57600080fd5b81518015158114612db857600080fd5b8181038181111561243f5761243f61327b565b6040815260006133326040830185876132a4565b9050826020830152949350505050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261338557600080fd5b83018035915067ffffffffffffffff8211156133a057600080fd5b602001915036819003821315611ca757600080fd5b8183823760009101908152919050565b600181811c908216806133d957607f821691505b6020821081036133f957634e487b7160e01b600052602260045260246000fd5b50919050565b87815286602082015260c06040820152600061341f60c0830187896132a4565b63ffffffff959095166060830152506001600160681b039283166080820152911660a090910152949350505050565b6000806040838503121561346157600080fd5b825180601b0b811461347257600080fd5b60208401519092506130f081612d38565b808202811582820484141761243f5761243f61327b565b6000826134b757634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220e0282c4b28bcd64e0580ac99e4962a8553a56549368be583e0c5a31160df2b9764736f6c63430008110033", + "devdoc": { + "details": "OevAuctionHouse is intended to be deployed on a single chain, while Api3ServerV1 (the API3 data feed contract) is deployed on the chains that the respective user dApps are deployed on. An OEV searcher bids on an update at OevAuctionHouse, gets the larger of the collateral and protocol fee locked up at OevAuctionHouse when they are awarded the update, fulfill the update and pay their bid amount at Api3ServerV1, and report back to OevAuctionHouse to have their locked funds released and the protocol fee charged. This flow implies the need for a certain kind of a cross-chain oracle functionality (to check if the awarded update is fulfilled), which is provided by the auctioneer role in this contract. The same auctioneer role is also assigned to award the individual updates to the winning bids. This means that the trustlessness of the auctions is limited by the trustlessness of the auctioneer implementation. Although trustlessness of OEV auctions is ideal, the primary goal of OevAuctionHouse is to facilitate auctions in a transparent and accountable manner.", + "kind": "dev", + "methods": { + "awardBid(address,bytes32,bytes32,bytes,uint256)": { + "details": "`awardDetails` is an arbitrary description of how to claim the award. Refer to the documentation that the auctioneer provides for the bidders for how to use it. The bidder receiving `awardDetails` is typically time-critical. However, the bid awarding transaction may not always be confirmed immediately. To avoid unjust collateral lockups or slashings, auctioneers should use an appropriate `awardExpirationTimestamp` that will cause such transactions to revert.", + "params": { + "awardDetails": "Award details", + "awardExpirationTimestamp": "Award expiration timestamp", + "bidDetailsHash": "Bid details hash", + "bidTopic": "Bid topic", + "bidder": "Bidder address" + }, + "returns": { + "bidderBalance": "Bidder balance after the lockup" + } + }, + "confirmFulfillment(address,bytes32,bytes32)": { + "details": "A fulfillment does not have to be reported to be confirmed. A bid can be confirmed to be fulfilled even after it has expired.", + "params": { + "bidDetailsHash": "Bid details hash", + "bidTopic": "Bid topic", + "bidder": "Bidder address" + }, + "returns": { + "accumulatedProtocolFees_": "Accumulated protocol fees", + "bidderBalance": "Bidder balance after the collateral release" + } + }, + "constructor": { + "params": { + "_accessControlRegistry": "AccessControlRegistry contract address", + "_adminRoleDescription": "Admin role description", + "_manager": "Manager address" + } + }, + "contradictFulfillment(address,bytes32,bytes32)": { + "details": "Fulfillments that have not been reported can only be contradicted after the reporting period is over", + "params": { + "bidDetailsHash": "Bid details hash", + "bidTopic": "Bid topic", + "bidder": "Bidder address" + }, + "returns": { + "accumulatedSlashedCollateral_": "Accumulated slashed collateral", + "bidderBalance": "Bidder balance after the protocol fee release" + } + }, + "deposit()": { + "returns": { + "bidderBalance": "Bidder balance after the deposit" + } + }, + "depositForBidder(address)": { + "params": { + "bidder": "Bidder address" + }, + "returns": { + "bidderBalance": "Bidder balance after the deposit" + } + }, + "expediteBidExpiration(bytes32,bytes32,uint32)": { + "params": { + "bidDetailsHash": "Bid details hash", + "bidTopic": "Bid topic", + "expirationTimestamp": "Expiration timestamp after which the bid cannot be awarded" + } + }, + "expediteBidExpirationMaximally(bytes32,bytes32)": { + "params": { + "bidDetailsHash": "Bid details hash", + "bidTopic": "Bid topic" + }, + "returns": { + "expirationTimestamp": "Expiration timestamp after which the bid cannot be awarded" + } + }, + "getCurrentCollateralAndProtocolFeeAmounts(uint256,uint256)": { + "params": { + "bidAmount": "Bid amount in the native currency of the chain with ID", + "chainId": "Chain ID" + }, + "returns": { + "collateralAmount": "Collateral amount in the currency of the chain that OevAuctionHouse is deployed on", + "protocolFeeAmount": "Protocol fee amount in the currency of the chain that OevAuctionHouse is deployed on" + } + }, + "initiateWithdrawal()": { + "details": "A two-step withdrawal process is implemented to prevent the bidders from frontrunning bid awarding transactions with withdrawals to deny service", + "returns": { + "earliestWithdrawalTimestamp": "Earliest time that the bidder can execute the initiated withdrawal" + } + }, + "multicall(bytes[])": { + "params": { + "data": "Array of calldata of batched calls" + }, + "returns": { + "returndata": "Array of returndata of batched calls" + } + }, + "placeBid(bytes32,uint256,uint256,bytes,uint256,uint256)": { + "params": { + "bidAmount": "Bid amount in the native currency of the chain with ID", + "bidDetails": "Bid details", + "bidTopic": "Bid topic", + "chainId": "Chain ID", + "maxCollateralAmount": "Maximum collateral amount in the currency of the chain that OevAuctionHouse is deployed on", + "maxProtocolFeeAmount": "Maximum protocol fee amount in the currency of the chain that OevAuctionHouse is deployed on" + }, + "returns": { + "collateralAmount": "Collateral amount in the currency of the chain that OevAuctionHouse is deployed on", + "expirationTimestamp": "Expiration timestamp after which the bid cannot be awarded", + "protocolFeeAmount": "Protocol fee amount in the currency of the chain that OevAuctionHouse is deployed on" + } + }, + "placeBidWithExpiration(bytes32,uint256,uint256,bytes,uint256,uint256,uint32)": { + "details": "`bidTopic` is an arbitrary identifier of the bid type. `bidDetails` is an arbitrary description of the bid details. Refer to the documentation that the auctioneer provides for the bidders for how these parameters should be set.", + "params": { + "bidAmount": "Bid amount in the native currency of the chain with ID", + "bidDetails": "Bid details", + "bidTopic": "Bid topic", + "chainId": "Chain ID", + "expirationTimestamp": "Expiration timestamp after which the bid cannot be awarded", + "maxCollateralAmount": "Maximum collateral amount in the currency of the chain that OevAuctionHouse is deployed on", + "maxProtocolFeeAmount": "Maximum protocol fee amount in the currency of the chain that OevAuctionHouse is deployed on" + }, + "returns": { + "collateralAmount": "Collateral amount in the currency of the chain that OevAuctionHouse is deployed on", + "protocolFeeAmount": "Protocol fee amount in the currency of the chain that OevAuctionHouse is deployed on" + } + }, + "reportFulfillment(bytes32,bytes32,bytes)": { + "details": "`fulfillmentDetails` is an arbitrary description of how the fulfillment is to be verified. Refer to the documentation that the auctioneer provides for the bidders for how this parameter should be set.", + "params": { + "bidDetailsHash": "Bid details hash", + "bidTopic": "Bid topic", + "fulfillmentDetails": "Fulfillment details" + } + }, + "setChainNativeCurrencyRateProxy(uint256,address)": { + "details": "The data feed proxy contract is expected to implement the IProxy interface and the respective data feed to be active with at most a 1-day heartbeat interval. Only use trusted contracts (e.g., contracts deployed by API3's ProxyFactory) to avoid reentrancy risks. The collateral rate denomination must match the native curreny rate denomination, e.g., if the collateral rate is in the form of ETH/USD, the native currency rates should be in the form of */USD.", + "params": { + "chainId": "Chain ID", + "nativeCurrencyRateProxy": "Native currency rate proxy address" + } + }, + "setCollateralInBasisPoints(uint256)": { + "details": "The collateral requirement can range from 0% (0 in basis points) to values larger than 100% (10000 in basis points). The contract manager is recommended to tune this parameter to maximize the extracted OEV. The optimal value will be defined by bidder behavior and may change over time. In the absence of additional incentives (e.g., a reputation system that refers to confirmed fulfillments), a collateral requirement that is not larger than the protocol fee may result in fulfillments going unreported (as being slashed would not be more punitive than being charged the protocol fee).", + "params": { + "collateralInBasisPoints_": "Collateral requirement in basis points" + } + }, + "setCollateralRateProxy(address)": { + "details": "The data feed proxy contract is expected to implement the IProxy interface and the respective data feed to be active with at most a 1-day heartbeat interval. Only use trusted contracts (e.g., contracts deployed by API3's ProxyFactory) to avoid reentrancy risks. The collateral rate denomination must match the native curreny rate denomination, e.g., if the collateral rate is in the form of ETH/USD, the native currency rates should be in the form of */USD.", + "params": { + "collateralRateProxy_": "Collateral rate proxy address" + } + }, + "setProtocolFeeInBasisPoints(uint256)": { + "details": "The protocol fee can range from 0% (0 in basis points) to values larger than 100% (10000 in basis points)", + "params": { + "protocolFeeInBasisPoints_": "Protocol fee in basis points" + } + }, + "tryMulticall(bytes[])": { + "params": { + "data": "Array of calldata of batched calls" + }, + "returns": { + "returndata": "Array of returndata of batched calls", + "successes": "Array of success conditions of batched calls" + } + }, + "withdraw(address,uint256)": { + "params": { + "amount": "Amount", + "recipient": "Recipient address" + } + }, + "withdrawAccumulatedProtocolFees(address,uint256)": { + "params": { + "amount": "Amount", + "recipient": "Recipient address" + } + }, + "withdrawAccumulatedSlashedCollateral(address,uint256)": { + "params": { + "amount": "Amount", + "recipient": "Recipient address" + } + } + }, + "stateVariables": { + "FULFILLMENT_REPORTING_PERIOD": { + "details": "The bidder should execute the won update in a matter of seconds, and the fulfillment report can follow right after. However, the fulfillment reporting period is kept long enough to accomodate for a more relaxed workflow, e.g., the bidder multi-calls their fulfillment reports every hour." + }, + "MAXIMUM_BID_LIFETIME": { + "details": "Considering each bid for each auction incurs a (computational, network, etc.) cost to the auctioneer, the bids need to automatically fall out of scope over time or they will eventually accumulate to an unmanageable amount" + }, + "MINIMUM_BID_LIFETIME": { + "details": "This is enforced to prevent bidders from frontrunning bid awarding transactions with bid expiration expedition transactions to deny service" + }, + "WITHDRAWAL_WAITING_PERIOD": { + "details": "This is enforced to prevent the bidders from frontrunning bid awarding transactions with withdrawals to deny service" + }, + "collateralInBasisPoints": { + "details": "The collateral requirement can range from 0% to values larger than 100%. This is because one can hypothesize cases where denying service by being slashed by the full bid amount is still profitable, in which case a collateral requirement that is larger than 100% would be justifiable." + }, + "collateralRateProxy": { + "details": "The collateral is denominated in the native currency of the chain that OevAuctionHouse is deployed on. Bid amounts are specified and paid in the native currency of the chain that the dApp (from which OEV is being extracted from) is deployed on. This means that a common base is needed for the collateral rate and the native currency rates. For example, if the collateral rate proxy provides the ETH/USD rate, the native currency rate proxies should provide */USD rates." + }, + "protocolFeeInBasisPoints": { + "details": "The protocol fee is not necessarily bounded by the bid amount, which means that this value is not necessarily bounded by 100%" + } + }, + "title": "OEV Auction House contract", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "AUCTIONEER_ROLE_DESCRIPTION()": { + "notice": "Auctioneer role description" + }, + "FULFILLMENT_REPORTING_PERIOD()": { + "notice": "Period during which a bidder is allowed to report the fulfillment after the bid award" + }, + "MAXIMUM_AUCTIONEER_DATA_LENGTH()": { + "notice": "Maximum data length that an auctioneer can submit while awarding a bid" + }, + "MAXIMUM_BIDDER_DATA_LENGTH()": { + "notice": "Maximum data length that a bidder can submit while placing a bid or reporting a fulfillment" + }, + "MAXIMUM_BID_LIFETIME()": { + "notice": "Longest period during which a bid can be awarded after it has been placed" + }, + "MINIMUM_BID_LIFETIME()": { + "notice": "Minimum lifetime that a bid can be specified to have" + }, + "PROXY_SETTER_ROLE_DESCRIPTION()": { + "notice": "Proxy setter role description" + }, + "WITHDRAWAL_WAITING_PERIOD()": { + "notice": "Amount of time that the bidders are required to wait after initiating a withdrawal to execute it" + }, + "WITHDRAWER_ROLE_DESCRIPTION()": { + "notice": "Withdrawer role description" + }, + "accessControlRegistry()": { + "notice": "AccessControlRegistry contract address" + }, + "accumulatedProtocolFees()": { + "notice": "Accumulated protocol fees charged by auctioneers by confirming fulfillments" + }, + "accumulatedSlashedCollateral()": { + "notice": "Accumulated collateral funds slashed by auctioneers by contradicting fulfillments" + }, + "adminRole()": { + "notice": "Admin role" + }, + "adminRoleDescription()": { + "notice": "Admin role description" + }, + "auctioneerRole()": { + "notice": "Auctioneer role" + }, + "awardBid(address,bytes32,bytes32,bytes,uint256)": { + "notice": "Called by an auctioneer to award the bid" + }, + "bidderToBalance(address)": { + "notice": "Deposited funds of the bidder, excluding the amount that is currently locked up for awarded bids awaiting fulfillment confirmation" + }, + "bidderToEarliestWithdrawalTimestamp(address)": { + "notice": "Earliest time that the bidder can execute the initiated withdrawal. A timestamp of zero means that there is no ongoing withdrawal." + }, + "bids(bytes32)": { + "notice": "Status, expiration timestamp, collateral amount and protocol fee amount of the bid with ID" + }, + "cancelWithdrawal()": { + "notice": "Called by the bidder to cancel a withdrawal that they have initiated" + }, + "chainIdToNativeCurrencyRateProxy(uint256)": { + "notice": "Data feed proxy address for the native currency of the chain with the ID" + }, + "collateralInBasisPoints()": { + "notice": "Collateral requirement in relation to the bid amount in basis points" + }, + "collateralRateProxy()": { + "notice": "Data feed proxy address for the collateral rate" + }, + "confirmFulfillment(address,bytes32,bytes32)": { + "notice": "Called by an auctioneer to confirm a fulfillment, and release the collateral and charge the protocol fee" + }, + "contradictFulfillment(address,bytes32,bytes32)": { + "notice": "Called by an auctioneer to contradict a fulfillment, and slash the collateral and release the protocol fee" + }, + "deposit()": { + "notice": "Called by the bidder to deposit funds" + }, + "depositForBidder(address)": { + "notice": "Called to deposit funds for a bidder" + }, + "expediteBidExpiration(bytes32,bytes32,uint32)": { + "notice": "Called to update the bid expiration timestamp to a specific value to expedite its expiration" + }, + "expediteBidExpirationMaximally(bytes32,bytes32)": { + "notice": "Called to decrease the bid expiration timestamp as much as possible to maximally expedite its expiration" + }, + "getCurrentCollateralAndProtocolFeeAmounts(uint256,uint256)": { + "notice": "Gets the collateral amount and the protocol fee amount for a bid with the chain ID and amount parameters based on the current rates, collateral requirement and protocol fee" + }, + "initiateWithdrawal()": { + "notice": "Called by the bidder to initiate a withdrawal of their funds" + }, + "manager()": { + "notice": "Address of the manager that manages the related AccessControlRegistry roles" + }, + "multicall(bytes[])": { + "notice": "Batches calls to the inheriting contract and reverts as soon as one of the batched calls reverts" + }, + "placeBid(bytes32,uint256,uint256,bytes,uint256,uint256)": { + "notice": "Called to place a bid with the longest possible lifetime. The searcher should determine maximum collateral and protocol fees that they will tolerate, and specify them in the arguments. Upon the awarding of the bid, the larger of the collateral amount and protocol fee amount will be locked. Upon confirmation or contradiction of the respective fulfillment, the locked amount will be released, and the protocol fee will be charged or the collateral amount will be slashed, respectively." + }, + "placeBidWithExpiration(bytes32,uint256,uint256,bytes,uint256,uint256,uint32)": { + "notice": "Called to place a bid with an expiration timestamp. Searchers should use this over `placeBid()` if they expect the OEV opportunity to disappear at a specific time before the maximum bid lifetime. The searcher should determine maximum collateral and protocol fees that they will tolerate, and specify them in the arguments. Upon the awarding of the bid, the larger of the collateral amount and protocol fee amount will be locked. Upon confirmation or contradiction of the respective fulfillment, the locked amount will be released, and the protocol fee will be charged or the collateral amount will be slashed, respectively." + }, + "protocolFeeInBasisPoints()": { + "notice": "Protocol fee in relation to the bid amount in basis points" + }, + "proxySetterRole()": { + "notice": "Proxy setter role" + }, + "reportFulfillment(bytes32,bytes32,bytes)": { + "notice": "Called by the owner of the awarded bid to report its fulfillment" + }, + "setChainNativeCurrencyRateProxy(uint256,address)": { + "notice": "Sets native currency rate proxy for the chain with ID" + }, + "setCollateralInBasisPoints(uint256)": { + "notice": "Called by the manager to set the collateral requirement in basis points" + }, + "setCollateralRateProxy(address)": { + "notice": "Sets collateral rate proxy" + }, + "setProtocolFeeInBasisPoints(uint256)": { + "notice": "Called by the manager to set the protocol fee in basis points" + }, + "tryMulticall(bytes[])": { + "notice": "Batches calls to the inheriting contract but does not revert if any of the batched calls reverts" + }, + "withdraw(address,uint256)": { + "notice": "Called by the bidder to execute a withdrawal that they have initiated" + }, + "withdrawAccumulatedProtocolFees(address,uint256)": { + "notice": "Called by the contract manager to withdraw the accumulated protocol fees charged by auctioneers by confirming fulfillments" + }, + "withdrawAccumulatedSlashedCollateral(address,uint256)": { + "notice": "Called by the contract manager to withdraw the accumulated collateral slashed by auctioneers by contradicting fulfillments" + }, + "withdrawerRole()": { + "notice": "Withdrawer role" + } + }, + "notice": "OEV is a subset of MEV that oracles have exclusive priority of extraction. API3 holds OEV auctions for its data feed services and forwards the proceeds to the respective user dApps. OevAuctionHouse is the platform that OEV searchers can bid on data feed updates that satisfy specific conditions, and report that they have fulfilled the updates that they are awarded. Refer to Api3ServerV1.sol for how the awarded updates are to be fulfilled and how the beneficiaries can withdraw the auction proceeds.", + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 176, + "contract": "contracts/api3-server-v1/OevAuctionHouse.sol:OevAuctionHouse", + "label": "adminRoleDescription", + "offset": 0, + "slot": "0", + "type": "t_string_storage" + }, + { + "astId": 5243, + "contract": "contracts/api3-server-v1/OevAuctionHouse.sol:OevAuctionHouse", + "label": "collateralInBasisPoints", + "offset": 0, + "slot": "1", + "type": "t_uint256" + }, + { + "astId": 5247, + "contract": "contracts/api3-server-v1/OevAuctionHouse.sol:OevAuctionHouse", + "label": "protocolFeeInBasisPoints", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 5251, + "contract": "contracts/api3-server-v1/OevAuctionHouse.sol:OevAuctionHouse", + "label": "collateralRateProxy", + "offset": 0, + "slot": "3", + "type": "t_address" + }, + { + "astId": 5257, + "contract": "contracts/api3-server-v1/OevAuctionHouse.sol:OevAuctionHouse", + "label": "chainIdToNativeCurrencyRateProxy", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_uint256,t_address)" + }, + { + "astId": 5261, + "contract": "contracts/api3-server-v1/OevAuctionHouse.sol:OevAuctionHouse", + "label": "accumulatedSlashedCollateral", + "offset": 0, + "slot": "5", + "type": "t_uint256" + }, + { + "astId": 5265, + "contract": "contracts/api3-server-v1/OevAuctionHouse.sol:OevAuctionHouse", + "label": "accumulatedProtocolFees", + "offset": 0, + "slot": "6", + "type": "t_uint256" + }, + { + "astId": 5271, + "contract": "contracts/api3-server-v1/OevAuctionHouse.sol:OevAuctionHouse", + "label": "bidderToBalance", + "offset": 0, + "slot": "7", + "type": "t_mapping(t_address,t_uint256)" + }, + { + "astId": 5277, + "contract": "contracts/api3-server-v1/OevAuctionHouse.sol:OevAuctionHouse", + "label": "bidderToEarliestWithdrawalTimestamp", + "offset": 0, + "slot": "8", + "type": "t_mapping(t_address,t_uint256)" + }, + { + "astId": 5284, + "contract": "contracts/api3-server-v1/OevAuctionHouse.sol:OevAuctionHouse", + "label": "bids", + "offset": 0, + "slot": "9", + "type": "t_mapping(t_bytes32,t_struct(Bid)5182_storage)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_enum(BidStatus)9148": { + "encoding": "inplace", + "label": "enum IOevAuctionHouse.BidStatus", + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_mapping(t_bytes32,t_struct(Bid)5182_storage)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => struct OevAuctionHouse.Bid)", + "numberOfBytes": "32", + "value": "t_struct(Bid)5182_storage" + }, + "t_mapping(t_uint256,t_address)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => address)", + "numberOfBytes": "32", + "value": "t_address" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(Bid)5182_storage": { + "encoding": "inplace", + "label": "struct OevAuctionHouse.Bid", + "members": [ + { + "astId": 5175, + "contract": "contracts/api3-server-v1/OevAuctionHouse.sol:OevAuctionHouse", + "label": "status", + "offset": 0, + "slot": "0", + "type": "t_enum(BidStatus)9148" + }, + { + "astId": 5177, + "contract": "contracts/api3-server-v1/OevAuctionHouse.sol:OevAuctionHouse", + "label": "expirationTimestamp", + "offset": 1, + "slot": "0", + "type": "t_uint32" + }, + { + "astId": 5179, + "contract": "contracts/api3-server-v1/OevAuctionHouse.sol:OevAuctionHouse", + "label": "collateralAmount", + "offset": 5, + "slot": "0", + "type": "t_uint104" + }, + { + "astId": 5181, + "contract": "contracts/api3-server-v1/OevAuctionHouse.sol:OevAuctionHouse", + "label": "protocolFeeAmount", + "offset": 18, + "slot": "0", + "type": "t_uint104" + } + ], + "numberOfBytes": "32" + }, + "t_uint104": { + "encoding": "inplace", + "label": "uint104", + "numberOfBytes": "13" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "encoding": "inplace", + "label": "uint32", + "numberOfBytes": "4" + } + } + } +} diff --git a/deployments/oev-network/OwnableCallForwarder.json b/deployments/oev-network/OwnableCallForwarder.json new file mode 100644 index 0000000..ba74370 --- /dev/null +++ b/deployments/oev-network/OwnableCallForwarder.json @@ -0,0 +1,202 @@ +{ + "address": "0x81bc85f329cDB28936FbB239f734AE495121F9A6", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "forwardTarget", + "type": "address" + }, + { + "internalType": "bytes", + "name": "forwardedCalldata", + "type": "bytes" + } + ], + "name": "forwardCall", + "outputs": [ + { + "internalType": "bytes", + "name": "returnedData", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x700a16d301c078e7fcc6a238d724227182194999552f0abaa984c69e147b2cc5", + "receipt": { + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "from": "0x07b589f06bD0A5324c4E2376d66d2F4F25921DE1", + "contractAddress": null, + "transactionIndex": 1, + "gasUsed": "422775", + "logsBloom": "0x00000080000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000040000000000020000000000000000000000000000000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000001000000000000000000000000000000001000000000000000000020000000000000000000010000000000000000000000000000000000000000000000000000010000000000000000020000000000000000000000000000000000080000000000000000000000000000000", + "blockHash": "0x8898f76a4c29e1aa99ee86e9a54b11ac20aadec0070a2c907c51246b7520e362", + "transactionHash": "0x700a16d301c078e7fcc6a238d724227182194999552f0abaa984c69e147b2cc5", + "logs": [ + { + "transactionIndex": 1, + "blockNumber": 25, + "transactionHash": "0x700a16d301c078e7fcc6a238d724227182194999552f0abaa984c69e147b2cc5", + "address": "0x81bc85f329cDB28936FbB239f734AE495121F9A6", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000004e59b44847b379578588920ca78fbf26c0b4956c" + ], + "data": "0x", + "logIndex": 0, + "blockHash": "0x8898f76a4c29e1aa99ee86e9a54b11ac20aadec0070a2c907c51246b7520e362" + }, + { + "transactionIndex": 1, + "blockNumber": 25, + "transactionHash": "0x700a16d301c078e7fcc6a238d724227182194999552f0abaa984c69e147b2cc5", + "address": "0x81bc85f329cDB28936FbB239f734AE495121F9A6", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000004e59b44847b379578588920ca78fbf26c0b4956c", + "0x00000000000000000000000007b589f06bd0a5324c4e2376d66d2f4f25921de1" + ], + "data": "0x", + "logIndex": 1, + "blockHash": "0x8898f76a4c29e1aa99ee86e9a54b11ac20aadec0070a2c907c51246b7520e362" + } + ], + "blockNumber": 25, + "cumulativeGasUsed": "422775", + "status": 1, + "byzantium": true + }, + "args": ["0x07b589f06bD0A5324c4E2376d66d2F4F25921DE1"], + "numDeployments": 1, + "solcInputHash": "244b8e05fc2166c1983c7be433cf9254", + "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"forwardTarget\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"forwardedCalldata\",\"type\":\"bytes\"}],\"name\":\"forwardCall\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"returnedData\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_owner\":\"Owner address\"}},\"forwardCall(address,bytes)\":{\"params\":{\"forwardTarget\":\"Target address that the calldata will be forwarded to\",\"forwardedCalldata\":\"Calldata to be forwarded to the target address\"},\"returns\":{\"returnedData\":\"Data returned by the forwarded call\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"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.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"Contract that forwards the calls that its owner sends\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"forwardCall(address,bytes)\":{\"notice\":\"Forwards the calldata and the value to the target address if the sender is the owner and returns the data\"}},\"notice\":\"AccessControlRegistry users that want their access control tables to be transferrable (e.g., a DAO) will use this forwarder instead of interacting with it directly. There are cases where this transferrability is not desired, e.g., if the user is an Airnode and is immutably associated with a single address, in which case the manager will interact with AccessControlRegistry directly.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/access/OwnableCallForwarder.sol\":\"OwnableCallForwarder\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000},\"remappings\":[]},\"sources\":{\"contracts/access/OwnableCallForwarder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.17;\\n\\nimport \\\"../vendor/@openzeppelin/contracts@4.8.2/access/Ownable.sol\\\";\\nimport \\\"../vendor/@openzeppelin/contracts@4.8.2/utils/Address.sol\\\";\\nimport \\\"./interfaces/IOwnableCallForwarder.sol\\\";\\n\\n/// @title Contract that forwards the calls that its owner sends\\n/// @notice AccessControlRegistry users that want their access control tables\\n/// to be transferrable (e.g., a DAO) will use this forwarder instead of\\n/// interacting with it directly. There are cases where this transferrability\\n/// is not desired, e.g., if the user is an Airnode and is immutably associated\\n/// with a single address, in which case the manager will interact with\\n/// AccessControlRegistry directly.\\ncontract OwnableCallForwarder is Ownable, IOwnableCallForwarder {\\n /// @param _owner Owner address\\n constructor(address _owner) {\\n transferOwnership(_owner);\\n }\\n\\n /// @notice Forwards the calldata and the value to the target address if\\n /// the sender is the owner and returns the data\\n /// @param forwardTarget Target address that the calldata will be forwarded\\n /// to\\n /// @param forwardedCalldata Calldata to be forwarded to the target address\\n /// @return returnedData Data returned by the forwarded call\\n function forwardCall(\\n address forwardTarget,\\n bytes calldata forwardedCalldata\\n ) external payable override onlyOwner returns (bytes memory returnedData) {\\n returnedData = Address.functionCallWithValue(\\n forwardTarget,\\n forwardedCalldata,\\n msg.value\\n );\\n }\\n}\\n\",\"keccak256\":\"0x8ae5a7cd680c844985a7f74550e5144ac5250e25d30bbee35b68d23d77c02e31\",\"license\":\"MIT\"},\"contracts/access/interfaces/IOwnableCallForwarder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ninterface IOwnableCallForwarder {\\n function forwardCall(\\n address forwardTarget,\\n bytes calldata forwardedCalldata\\n ) external payable returns (bytes memory returnedData);\\n}\\n\",\"keccak256\":\"0x13e5e17e12d5d907f72ac1f52d88592903755edafe1162b7cb68700c93d1ba1c\",\"license\":\"MIT\"},\"contracts/vendor/@openzeppelin/contracts@4.8.2/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"contracts/vendor/@openzeppelin/contracts@4.8.2/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\"},\"contracts/vendor/@openzeppelin/contracts@4.8.2/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b5060405161079038038061079083398101604081905261002f91610171565b61003833610047565b61004181610097565b506101a1565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61009f610115565b6001600160a01b0381166101095760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61011281610047565b50565b6000546001600160a01b0316331461016f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610100565b565b60006020828403121561018357600080fd5b81516001600160a01b038116811461019a57600080fd5b9392505050565b6105e0806101b06000396000f3fe60806040526004361061003f5760003560e01c806322bee49414610044578063715018a61461006d5780638da5cb5b14610084578063f2fde38b146100ac575b600080fd5b61005761005236600461045d565b6100cc565b6040516100649190610530565b60405180910390f35b34801561007957600080fd5b50610082610120565b005b34801561009057600080fd5b506000546040516001600160a01b039091168152602001610064565b3480156100b857600080fd5b506100826100c736600461054a565b610134565b60606100d66101c9565b6101188484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250349250610223915050565b949350505050565b6101286101c9565b6101326000610249565b565b61013c6101c9565b6001600160a01b0381166101bd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6101c681610249565b50565b6000546001600160a01b031633146101325760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101b4565b6060610118848484604051806060016040528060298152602001610582602991396102b1565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156103295760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016101b4565b600080866001600160a01b031685876040516103459190610565565b60006040518083038185875af1925050503d8060008114610382576040519150601f19603f3d011682016040523d82523d6000602084013e610387565b606091505b5091509150610398878383876103a3565b979650505050505050565b6060831561041257825160000361040b576001600160a01b0385163b61040b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016101b4565b5081610118565b61011883838151156104275781518083602001fd5b8060405162461bcd60e51b81526004016101b49190610530565b80356001600160a01b038116811461045857600080fd5b919050565b60008060006040848603121561047257600080fd5b61047b84610441565b9250602084013567ffffffffffffffff8082111561049857600080fd5b818601915086601f8301126104ac57600080fd5b8135818111156104bb57600080fd5b8760208285010111156104cd57600080fd5b6020830194508093505050509250925092565b60005b838110156104fb5781810151838201526020016104e3565b50506000910152565b6000815180845261051c8160208601602086016104e0565b601f01601f19169290920160200192915050565b6020815260006105436020830184610504565b9392505050565b60006020828403121561055c57600080fd5b61054382610441565b600082516105778184602087016104e0565b919091019291505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a26469706673582212209bc00d30ca9753335445fb76197730f010383979aa0fd4b393e2e8826680071064736f6c63430008110033", + "deployedBytecode": "0x60806040526004361061003f5760003560e01c806322bee49414610044578063715018a61461006d5780638da5cb5b14610084578063f2fde38b146100ac575b600080fd5b61005761005236600461045d565b6100cc565b6040516100649190610530565b60405180910390f35b34801561007957600080fd5b50610082610120565b005b34801561009057600080fd5b506000546040516001600160a01b039091168152602001610064565b3480156100b857600080fd5b506100826100c736600461054a565b610134565b60606100d66101c9565b6101188484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250349250610223915050565b949350505050565b6101286101c9565b6101326000610249565b565b61013c6101c9565b6001600160a01b0381166101bd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6101c681610249565b50565b6000546001600160a01b031633146101325760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101b4565b6060610118848484604051806060016040528060298152602001610582602991396102b1565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156103295760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016101b4565b600080866001600160a01b031685876040516103459190610565565b60006040518083038185875af1925050503d8060008114610382576040519150601f19603f3d011682016040523d82523d6000602084013e610387565b606091505b5091509150610398878383876103a3565b979650505050505050565b6060831561041257825160000361040b576001600160a01b0385163b61040b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016101b4565b5081610118565b61011883838151156104275781518083602001fd5b8060405162461bcd60e51b81526004016101b49190610530565b80356001600160a01b038116811461045857600080fd5b919050565b60008060006040848603121561047257600080fd5b61047b84610441565b9250602084013567ffffffffffffffff8082111561049857600080fd5b818601915086601f8301126104ac57600080fd5b8135818111156104bb57600080fd5b8760208285010111156104cd57600080fd5b6020830194508093505050509250925092565b60005b838110156104fb5781810151838201526020016104e3565b50506000910152565b6000815180845261051c8160208601602086016104e0565b601f01601f19169290920160200192915050565b6020815260006105436020830184610504565b9392505050565b60006020828403121561055c57600080fd5b61054382610441565b600082516105778184602087016104e0565b919091019291505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a26469706673582212209bc00d30ca9753335445fb76197730f010383979aa0fd4b393e2e8826680071064736f6c63430008110033", + "devdoc": { + "kind": "dev", + "methods": { + "constructor": { + "params": { + "_owner": "Owner address" + } + }, + "forwardCall(address,bytes)": { + "params": { + "forwardTarget": "Target address that the calldata will be forwarded to", + "forwardedCalldata": "Calldata to be forwarded to the target address" + }, + "returns": { + "returnedData": "Data returned by the forwarded call" + } + }, + "owner()": { + "details": "Returns the address of the current owner." + }, + "renounceOwnership()": { + "details": "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." + }, + "transferOwnership(address)": { + "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." + } + }, + "title": "Contract that forwards the calls that its owner sends", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "forwardCall(address,bytes)": { + "notice": "Forwards the calldata and the value to the target address if the sender is the owner and returns the data" + } + }, + "notice": "AccessControlRegistry users that want their access control tables to be transferrable (e.g., a DAO) will use this forwarder instead of interacting with it directly. There are cases where this transferrability is not desired, e.g., if the user is an Airnode and is immutably associated with a single address, in which case the manager will interact with AccessControlRegistry directly.", + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 11999, + "contract": "contracts/access/OwnableCallForwarder.sol:OwnableCallForwarder", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + } + } + } +} diff --git a/deployments/oev-network/ProxyFactory.json b/deployments/oev-network/ProxyFactory.json new file mode 100644 index 0000000..82e91e1 --- /dev/null +++ b/deployments/oev-network/ProxyFactory.json @@ -0,0 +1,501 @@ +{ + "address": "0x9EB9798Dc1b602067DFe5A57c3bfc914B965acFD", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_api3ServerV1", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "proxyAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "dapiName", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "metadata", + "type": "bytes" + } + ], + "name": "DeployedDapiProxy", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "proxyAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "dapiName", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "oevBeneficiary", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "metadata", + "type": "bytes" + } + ], + "name": "DeployedDapiProxyWithOev", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "proxyAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "dataFeedId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "metadata", + "type": "bytes" + } + ], + "name": "DeployedDataFeedProxy", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "proxyAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "dataFeedId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "address", + "name": "oevBeneficiary", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "metadata", + "type": "bytes" + } + ], + "name": "DeployedDataFeedProxyWithOev", + "type": "event" + }, + { + "inputs": [], + "name": "api3ServerV1", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "dapiName", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "metadata", + "type": "bytes" + } + ], + "name": "computeDapiProxyAddress", + "outputs": [ + { + "internalType": "address", + "name": "proxyAddress", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "dapiName", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "oevBeneficiary", + "type": "address" + }, + { + "internalType": "bytes", + "name": "metadata", + "type": "bytes" + } + ], + "name": "computeDapiProxyWithOevAddress", + "outputs": [ + { + "internalType": "address", + "name": "proxyAddress", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "dataFeedId", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "metadata", + "type": "bytes" + } + ], + "name": "computeDataFeedProxyAddress", + "outputs": [ + { + "internalType": "address", + "name": "proxyAddress", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "dataFeedId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "oevBeneficiary", + "type": "address" + }, + { + "internalType": "bytes", + "name": "metadata", + "type": "bytes" + } + ], + "name": "computeDataFeedProxyWithOevAddress", + "outputs": [ + { + "internalType": "address", + "name": "proxyAddress", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "dapiName", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "metadata", + "type": "bytes" + } + ], + "name": "deployDapiProxy", + "outputs": [ + { + "internalType": "address", + "name": "proxyAddress", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "dapiName", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "oevBeneficiary", + "type": "address" + }, + { + "internalType": "bytes", + "name": "metadata", + "type": "bytes" + } + ], + "name": "deployDapiProxyWithOev", + "outputs": [ + { + "internalType": "address", + "name": "proxyAddress", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "dataFeedId", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "metadata", + "type": "bytes" + } + ], + "name": "deployDataFeedProxy", + "outputs": [ + { + "internalType": "address", + "name": "proxyAddress", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "dataFeedId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "oevBeneficiary", + "type": "address" + }, + { + "internalType": "bytes", + "name": "metadata", + "type": "bytes" + } + ], + "name": "deployDataFeedProxyWithOev", + "outputs": [ + { + "internalType": "address", + "name": "proxyAddress", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0xec5c15afaee945ea3d07f59f180d391d0881b8523e827c9828200debccd0c754", + "receipt": { + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "from": "0x07b589f06bD0A5324c4E2376d66d2F4F25921DE1", + "contractAddress": null, + "transactionIndex": 1, + "gasUsed": "1495661", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xabdaee1aaf40af9c75f56a3dd14cefb4c23c34e4a2d427733cf9ce0688221b52", + "transactionHash": "0xec5c15afaee945ea3d07f59f180d391d0881b8523e827c9828200debccd0c754", + "logs": [], + "blockNumber": 29, + "cumulativeGasUsed": "1495661", + "status": 1, + "byzantium": true + }, + "args": ["0x709944a48cAf83535e43471680fDA4905FB3920a"], + "numDeployments": 1, + "solcInputHash": "244b8e05fc2166c1983c7be433cf9254", + "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_api3ServerV1\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"proxyAddress\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"dapiName\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"name\":\"DeployedDapiProxy\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"proxyAddress\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"dapiName\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oevBeneficiary\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"name\":\"DeployedDapiProxyWithOev\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"proxyAddress\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"dataFeedId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"name\":\"DeployedDataFeedProxy\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"proxyAddress\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"dataFeedId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oevBeneficiary\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"name\":\"DeployedDataFeedProxyWithOev\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"api3ServerV1\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"dapiName\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"name\":\"computeDapiProxyAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"proxyAddress\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"dapiName\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"oevBeneficiary\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"name\":\"computeDapiProxyWithOevAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"proxyAddress\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"dataFeedId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"name\":\"computeDataFeedProxyAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"proxyAddress\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"dataFeedId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"oevBeneficiary\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"name\":\"computeDataFeedProxyWithOevAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"proxyAddress\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"dapiName\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"name\":\"deployDapiProxy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"proxyAddress\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"dapiName\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"oevBeneficiary\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"name\":\"deployDapiProxyWithOev\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"proxyAddress\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"dataFeedId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"name\":\"deployDataFeedProxy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"proxyAddress\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"dataFeedId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"oevBeneficiary\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"name\":\"deployDataFeedProxyWithOev\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"proxyAddress\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The proxies are deployed normally and not cloned to minimize the gas cost overhead while using them to read data feed values\",\"kind\":\"dev\",\"methods\":{\"computeDapiProxyAddress(bytes32,bytes)\":{\"params\":{\"dapiName\":\"dAPI name\",\"metadata\":\"Metadata associated with the proxy\"},\"returns\":{\"proxyAddress\":\"Proxy address\"}},\"computeDapiProxyWithOevAddress(bytes32,address,bytes)\":{\"params\":{\"dapiName\":\"dAPI name\",\"metadata\":\"Metadata associated with the proxy\",\"oevBeneficiary\":\"OEV beneficiary\"},\"returns\":{\"proxyAddress\":\"Proxy address\"}},\"computeDataFeedProxyAddress(bytes32,bytes)\":{\"params\":{\"dataFeedId\":\"Data feed ID\",\"metadata\":\"Metadata associated with the proxy\"},\"returns\":{\"proxyAddress\":\"Proxy address\"}},\"computeDataFeedProxyWithOevAddress(bytes32,address,bytes)\":{\"params\":{\"dataFeedId\":\"Data feed ID\",\"metadata\":\"Metadata associated with the proxy\",\"oevBeneficiary\":\"OEV beneficiary\"},\"returns\":{\"proxyAddress\":\"Proxy address\"}},\"constructor\":{\"params\":{\"_api3ServerV1\":\"Api3ServerV1 address\"}},\"deployDapiProxy(bytes32,bytes)\":{\"params\":{\"dapiName\":\"dAPI name\",\"metadata\":\"Metadata associated with the proxy\"},\"returns\":{\"proxyAddress\":\"Proxy address\"}},\"deployDapiProxyWithOev(bytes32,address,bytes)\":{\"params\":{\"dapiName\":\"dAPI name\",\"metadata\":\"Metadata associated with the proxy\",\"oevBeneficiary\":\"OEV beneficiary\"},\"returns\":{\"proxyAddress\":\"Proxy address\"}},\"deployDataFeedProxy(bytes32,bytes)\":{\"params\":{\"dataFeedId\":\"Data feed ID\",\"metadata\":\"Metadata associated with the proxy\"},\"returns\":{\"proxyAddress\":\"Proxy address\"}},\"deployDataFeedProxyWithOev(bytes32,address,bytes)\":{\"params\":{\"dataFeedId\":\"Data feed ID\",\"metadata\":\"Metadata associated with the proxy\",\"oevBeneficiary\":\"OEV beneficiary\"},\"returns\":{\"proxyAddress\":\"Proxy address\"}}},\"title\":\"Contract factory that deterministically deploys proxies that read data feeds (Beacons or Beacon sets) or dAPIs, along with optional OEV support\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"api3ServerV1()\":{\"notice\":\"Api3ServerV1 address\"},\"computeDapiProxyAddress(bytes32,bytes)\":{\"notice\":\"Computes the address of the dAPI proxy\"},\"computeDapiProxyWithOevAddress(bytes32,address,bytes)\":{\"notice\":\"Computes the address of the dAPI proxy with OEV support\"},\"computeDataFeedProxyAddress(bytes32,bytes)\":{\"notice\":\"Computes the address of the data feed proxy\"},\"computeDataFeedProxyWithOevAddress(bytes32,address,bytes)\":{\"notice\":\"Computes the address of the data feed proxy with OEV support\"},\"deployDapiProxy(bytes32,bytes)\":{\"notice\":\"Deterministically deploys a dAPI proxy\"},\"deployDapiProxyWithOev(bytes32,address,bytes)\":{\"notice\":\"Deterministically deploys a dAPI proxy with OEV support\"},\"deployDataFeedProxy(bytes32,bytes)\":{\"notice\":\"Deterministically deploys a data feed proxy\"},\"deployDataFeedProxyWithOev(bytes32,address,bytes)\":{\"notice\":\"Deterministically deploys a data feed proxy with OEV support\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/api3-server-v1/proxies/ProxyFactory.sol\":\"ProxyFactory\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000},\"remappings\":[]},\"sources\":{\"contracts/access/interfaces/IAccessControlRegistryAdminned.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/interfaces/ISelfMulticall.sol\\\";\\n\\ninterface IAccessControlRegistryAdminned is ISelfMulticall {\\n function accessControlRegistry() external view returns (address);\\n\\n function adminRoleDescription() external view returns (string memory);\\n}\\n\",\"keccak256\":\"0xd71aae2566c019a9b2da5e1ec51421a62898495fa6fd08e2cc39451511dda334\",\"license\":\"MIT\"},\"contracts/access/interfaces/IAccessControlRegistryAdminnedWithManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControlRegistryAdminned.sol\\\";\\n\\ninterface IAccessControlRegistryAdminnedWithManager is\\n IAccessControlRegistryAdminned\\n{\\n function manager() external view returns (address);\\n\\n function adminRole() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x8a8e1756fca81175305755b7a311536132e88173f60b2ac0fdeef92a6236afc5\",\"license\":\"MIT\"},\"contracts/api3-server-v1/interfaces/IApi3ServerV1.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IOevDapiServer.sol\\\";\\nimport \\\"./IBeaconUpdatesWithSignedData.sol\\\";\\n\\ninterface IApi3ServerV1 is IOevDapiServer, IBeaconUpdatesWithSignedData {\\n function readDataFeedWithId(\\n bytes32 dataFeedId\\n ) external view returns (int224 value, uint32 timestamp);\\n\\n function readDataFeedWithDapiNameHash(\\n bytes32 dapiNameHash\\n ) external view returns (int224 value, uint32 timestamp);\\n\\n function readDataFeedWithIdAsOevProxy(\\n bytes32 dataFeedId\\n ) external view returns (int224 value, uint32 timestamp);\\n\\n function readDataFeedWithDapiNameHashAsOevProxy(\\n bytes32 dapiNameHash\\n ) external view returns (int224 value, uint32 timestamp);\\n\\n function dataFeeds(\\n bytes32 dataFeedId\\n ) external view returns (int224 value, uint32 timestamp);\\n\\n function oevProxyToIdToDataFeed(\\n address proxy,\\n bytes32 dataFeedId\\n ) external view returns (int224 value, uint32 timestamp);\\n}\\n\",\"keccak256\":\"0xea2c05eaf2a19c93a9c9b08243fcabd8d7fcf0e4d422f7c687aef693126c1809\",\"license\":\"MIT\"},\"contracts/api3-server-v1/interfaces/IBeaconUpdatesWithSignedData.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IDataFeedServer.sol\\\";\\n\\ninterface IBeaconUpdatesWithSignedData is IDataFeedServer {\\n function updateBeaconWithSignedData(\\n address airnode,\\n bytes32 templateId,\\n uint256 timestamp,\\n bytes calldata data,\\n bytes calldata signature\\n ) external returns (bytes32 beaconId);\\n}\\n\",\"keccak256\":\"0xe2b2530081508baf1323d4c145a688ffd548cf318a8cb67c9ccb4abe1ac81c6e\",\"license\":\"MIT\"},\"contracts/api3-server-v1/interfaces/IDapiServer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../access/interfaces/IAccessControlRegistryAdminnedWithManager.sol\\\";\\nimport \\\"./IDataFeedServer.sol\\\";\\n\\ninterface IDapiServer is\\n IAccessControlRegistryAdminnedWithManager,\\n IDataFeedServer\\n{\\n event SetDapiName(\\n bytes32 indexed dataFeedId,\\n bytes32 indexed dapiName,\\n address sender\\n );\\n\\n function setDapiName(bytes32 dapiName, bytes32 dataFeedId) external;\\n\\n function dapiNameToDataFeedId(\\n bytes32 dapiName\\n ) external view returns (bytes32);\\n\\n // solhint-disable-next-line func-name-mixedcase\\n function DAPI_NAME_SETTER_ROLE_DESCRIPTION()\\n external\\n view\\n returns (string memory);\\n\\n function dapiNameSetterRole() external view returns (bytes32);\\n\\n function dapiNameHashToDataFeedId(\\n bytes32 dapiNameHash\\n ) external view returns (bytes32 dataFeedId);\\n}\\n\",\"keccak256\":\"0x1cf1d7637e2ee1b4f5b99345730183447db78ceb8ce2117cf145d4d375194e71\",\"license\":\"MIT\"},\"contracts/api3-server-v1/interfaces/IDataFeedServer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/interfaces/IExtendedSelfMulticall.sol\\\";\\n\\ninterface IDataFeedServer is IExtendedSelfMulticall {\\n event UpdatedBeaconWithSignedData(\\n bytes32 indexed beaconId,\\n int224 value,\\n uint32 timestamp\\n );\\n\\n event UpdatedBeaconSetWithBeacons(\\n bytes32 indexed beaconSetId,\\n int224 value,\\n uint32 timestamp\\n );\\n\\n function updateBeaconSetWithBeacons(\\n bytes32[] memory beaconIds\\n ) external returns (bytes32 beaconSetId);\\n}\\n\",\"keccak256\":\"0x208f751f71b16d454cafd9188095178fdc776ee0376a85362f6022e7a4f010a3\",\"license\":\"MIT\"},\"contracts/api3-server-v1/interfaces/IOevDapiServer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IOevDataFeedServer.sol\\\";\\nimport \\\"./IDapiServer.sol\\\";\\n\\ninterface IOevDapiServer is IOevDataFeedServer, IDapiServer {}\\n\",\"keccak256\":\"0xf4082c33979785131358a217a8c5cf498a53c04318868eb1cb68e934c33226e3\",\"license\":\"MIT\"},\"contracts/api3-server-v1/interfaces/IOevDataFeedServer.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IDataFeedServer.sol\\\";\\n\\ninterface IOevDataFeedServer is IDataFeedServer {\\n event UpdatedOevProxyBeaconWithSignedData(\\n bytes32 indexed beaconId,\\n address indexed proxy,\\n bytes32 indexed updateId,\\n int224 value,\\n uint32 timestamp\\n );\\n\\n event UpdatedOevProxyBeaconSetWithSignedData(\\n bytes32 indexed beaconSetId,\\n address indexed proxy,\\n bytes32 indexed updateId,\\n int224 value,\\n uint32 timestamp\\n );\\n\\n event Withdrew(\\n address indexed oevProxy,\\n address oevBeneficiary,\\n uint256 amount\\n );\\n\\n function updateOevProxyDataFeedWithSignedData(\\n address oevProxy,\\n bytes32 dataFeedId,\\n bytes32 updateId,\\n uint256 timestamp,\\n bytes calldata data,\\n bytes[] calldata packedOevUpdateSignatures\\n ) external payable;\\n\\n function withdraw(address oevProxy) external;\\n\\n function oevProxyToBalance(\\n address oevProxy\\n ) external view returns (uint256 balance);\\n}\\n\",\"keccak256\":\"0x2d162c576bfe5554767bb48758314c3e6f2c509f73203f0e166d1ac5168a1218\",\"license\":\"MIT\"},\"contracts/api3-server-v1/proxies/DapiProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./interfaces/IDapiProxy.sol\\\";\\nimport \\\"../interfaces/IApi3ServerV1.sol\\\";\\n\\n/// @title An immutable proxy contract that is used to read a specific dAPI of\\n/// a specific Api3ServerV1 contract\\n/// @notice In an effort to reduce the bytecode of this contract, its\\n/// constructor arguments are validated by ProxyFactory, rather than\\n/// internally. If you intend to deploy this contract without using\\n/// ProxyFactory, you are recommended to implement an equivalent validation.\\n/// @dev The proxy contracts are generalized to support most types of numerical\\n/// data feeds. This means that the user of this proxy is expected to validate\\n/// the read values according to the specific use-case. For example, `value` is\\n/// a signed integer, yet it being negative may not make sense in the case that\\n/// the data feed represents the spot price of an asset. In that case, the user\\n/// is responsible with ensuring that `value` is not negative.\\n/// In the case that the data feed is from a single source, `timestamp` is the\\n/// system time of the Airnode when it signed the data. In the case that the\\n/// data feed is from multiple sources, `timestamp` is the median of system\\n/// times of the Airnodes when they signed the respective data. There are two\\n/// points to consider while using `timestamp` in your contract logic: (1) It\\n/// is based on the system time of the Airnodes, and not the block timestamp.\\n/// This may be relevant when either of them drifts. (2) `timestamp` is an\\n/// off-chain value that is being reported, similar to `value`. Both should\\n/// only be trusted as much as the Airnode(s) that report them.\\ncontract DapiProxy is IDapiProxy {\\n /// @notice Api3ServerV1 address\\n address public immutable override api3ServerV1;\\n /// @notice Hash of the dAPI name\\n bytes32 public immutable override dapiNameHash;\\n\\n /// @param _api3ServerV1 Api3ServerV1 address\\n /// @param _dapiNameHash Hash of the dAPI name\\n constructor(address _api3ServerV1, bytes32 _dapiNameHash) {\\n api3ServerV1 = _api3ServerV1;\\n dapiNameHash = _dapiNameHash;\\n }\\n\\n /// @notice Reads the dAPI that this proxy maps to\\n /// @return value dAPI value\\n /// @return timestamp dAPI timestamp\\n function read()\\n external\\n view\\n virtual\\n override\\n returns (int224 value, uint32 timestamp)\\n {\\n (value, timestamp) = IApi3ServerV1(api3ServerV1)\\n .readDataFeedWithDapiNameHash(dapiNameHash);\\n }\\n}\\n\",\"keccak256\":\"0x7bda11348ffff6be0621803c2ef1e146b9abd55e9b6f35a71392b2ecbf18f8ea\",\"license\":\"MIT\"},\"contracts/api3-server-v1/proxies/DapiProxyWithOev.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./DapiProxy.sol\\\";\\nimport \\\"./interfaces/IOevProxy.sol\\\";\\n\\n/// @title An immutable proxy contract that is used to read a specific dAPI of\\n/// a specific Api3ServerV1 contract and inform Api3ServerV1 about the\\n/// beneficiary of the respective OEV proceeds\\n/// @notice In an effort to reduce the bytecode of this contract, its\\n/// constructor arguments are validated by ProxyFactory, rather than\\n/// internally. If you intend to deploy this contract without using\\n/// ProxyFactory, you are recommended to implement an equivalent validation.\\n/// @dev See DapiProxy.sol for comments about usage\\ncontract DapiProxyWithOev is DapiProxy, IOevProxy {\\n /// @notice OEV beneficiary address\\n address public immutable override oevBeneficiary;\\n\\n /// @param _api3ServerV1 Api3ServerV1 address\\n /// @param _dapiNameHash Hash of the dAPI name\\n /// @param _oevBeneficiary OEV beneficiary\\n constructor(\\n address _api3ServerV1,\\n bytes32 _dapiNameHash,\\n address _oevBeneficiary\\n ) DapiProxy(_api3ServerV1, _dapiNameHash) {\\n oevBeneficiary = _oevBeneficiary;\\n }\\n\\n /// @notice Reads the dAPI that this proxy maps to\\n /// @return value dAPI value\\n /// @return timestamp dAPI timestamp\\n function read()\\n external\\n view\\n virtual\\n override\\n returns (int224 value, uint32 timestamp)\\n {\\n (value, timestamp) = IApi3ServerV1(api3ServerV1)\\n .readDataFeedWithDapiNameHashAsOevProxy(dapiNameHash);\\n }\\n}\\n\",\"keccak256\":\"0x1ebe7b44c0e49d9afc942dc1beea2a0c42ad79bb514086ea9e74d027ec7237c9\",\"license\":\"MIT\"},\"contracts/api3-server-v1/proxies/DataFeedProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./interfaces/IDataFeedProxy.sol\\\";\\nimport \\\"../interfaces/IApi3ServerV1.sol\\\";\\n\\n/// @title An immutable proxy contract that is used to read a specific data\\n/// feed (Beacon or Beacon set) of a specific Api3ServerV1 contract\\n/// @notice In an effort to reduce the bytecode of this contract, its\\n/// constructor arguments are validated by ProxyFactory, rather than\\n/// internally. If you intend to deploy this contract without using\\n/// ProxyFactory, you are recommended to implement an equivalent validation.\\n/// @dev See DapiProxy.sol for comments about usage\\ncontract DataFeedProxy is IDataFeedProxy {\\n /// @notice Api3ServerV1 address\\n address public immutable override api3ServerV1;\\n /// @notice Data feed ID\\n bytes32 public immutable override dataFeedId;\\n\\n /// @param _api3ServerV1 Api3ServerV1 address\\n /// @param _dataFeedId Data feed (Beacon or Beacon set) ID\\n constructor(address _api3ServerV1, bytes32 _dataFeedId) {\\n api3ServerV1 = _api3ServerV1;\\n dataFeedId = _dataFeedId;\\n }\\n\\n /// @notice Reads the data feed that this proxy maps to\\n /// @return value Data feed value\\n /// @return timestamp Data feed timestamp\\n function read()\\n external\\n view\\n virtual\\n override\\n returns (int224 value, uint32 timestamp)\\n {\\n (value, timestamp) = IApi3ServerV1(api3ServerV1).readDataFeedWithId(\\n dataFeedId\\n );\\n }\\n}\\n\",\"keccak256\":\"0x955b09a7777f4c80ebcff66a7e685459b0308a94eb6faf78757274e9dff643d4\",\"license\":\"MIT\"},\"contracts/api3-server-v1/proxies/DataFeedProxyWithOev.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./DataFeedProxy.sol\\\";\\nimport \\\"./interfaces/IOevProxy.sol\\\";\\n\\n/// @title An immutable proxy contract that is used to read a specific data\\n/// feed (Beacon or Beacon set) of a specific Api3ServerV1 contract and inform\\n/// Api3ServerV1 about the beneficiary of the respective OEV proceeds\\n/// @notice In an effort to reduce the bytecode of this contract, its\\n/// constructor arguments are validated by ProxyFactory, rather than\\n/// internally. If you intend to deploy this contract without using\\n/// ProxyFactory, you are recommended to implement an equivalent validation.\\n/// @dev See DapiProxy.sol for comments about usage\\ncontract DataFeedProxyWithOev is DataFeedProxy, IOevProxy {\\n /// @notice OEV beneficiary address\\n address public immutable override oevBeneficiary;\\n\\n /// @param _api3ServerV1 Api3ServerV1 address\\n /// @param _dataFeedId Data feed (Beacon or Beacon set) ID\\n /// @param _oevBeneficiary OEV beneficiary\\n constructor(\\n address _api3ServerV1,\\n bytes32 _dataFeedId,\\n address _oevBeneficiary\\n ) DataFeedProxy(_api3ServerV1, _dataFeedId) {\\n oevBeneficiary = _oevBeneficiary;\\n }\\n\\n /// @notice Reads the data feed that this proxy maps to\\n /// @return value Data feed value\\n /// @return timestamp Data feed timestamp\\n function read()\\n external\\n view\\n virtual\\n override\\n returns (int224 value, uint32 timestamp)\\n {\\n (value, timestamp) = IApi3ServerV1(api3ServerV1)\\n .readDataFeedWithIdAsOevProxy(dataFeedId);\\n }\\n}\\n\",\"keccak256\":\"0xad9ccf4ed36a49e13da6a84bf617b22888d0c5b3db737c139609ee322aa4bff8\",\"license\":\"MIT\"},\"contracts/api3-server-v1/proxies/ProxyFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./DataFeedProxy.sol\\\";\\nimport \\\"./DapiProxy.sol\\\";\\nimport \\\"./DataFeedProxyWithOev.sol\\\";\\nimport \\\"./DapiProxyWithOev.sol\\\";\\nimport \\\"./interfaces/IProxyFactory.sol\\\";\\nimport \\\"../../vendor/@openzeppelin/contracts@4.8.2/utils/Create2.sol\\\";\\n\\n/// @title Contract factory that deterministically deploys proxies that read\\n/// data feeds (Beacons or Beacon sets) or dAPIs, along with optional OEV\\n/// support\\n/// @dev The proxies are deployed normally and not cloned to minimize the gas\\n/// cost overhead while using them to read data feed values\\ncontract ProxyFactory is IProxyFactory {\\n /// @notice Api3ServerV1 address\\n address public immutable override api3ServerV1;\\n\\n /// @param _api3ServerV1 Api3ServerV1 address\\n constructor(address _api3ServerV1) {\\n require(_api3ServerV1 != address(0), \\\"Api3ServerV1 address zero\\\");\\n api3ServerV1 = _api3ServerV1;\\n }\\n\\n /// @notice Deterministically deploys a data feed proxy\\n /// @param dataFeedId Data feed ID\\n /// @param metadata Metadata associated with the proxy\\n /// @return proxyAddress Proxy address\\n function deployDataFeedProxy(\\n bytes32 dataFeedId,\\n bytes calldata metadata\\n ) external override returns (address proxyAddress) {\\n require(dataFeedId != bytes32(0), \\\"Data feed ID zero\\\");\\n proxyAddress = address(\\n new DataFeedProxy{salt: keccak256(metadata)}(\\n api3ServerV1,\\n dataFeedId\\n )\\n );\\n emit DeployedDataFeedProxy(proxyAddress, dataFeedId, metadata);\\n }\\n\\n /// @notice Deterministically deploys a dAPI proxy\\n /// @param dapiName dAPI name\\n /// @param metadata Metadata associated with the proxy\\n /// @return proxyAddress Proxy address\\n function deployDapiProxy(\\n bytes32 dapiName,\\n bytes calldata metadata\\n ) external override returns (address proxyAddress) {\\n require(dapiName != bytes32(0), \\\"dAPI name zero\\\");\\n proxyAddress = address(\\n new DapiProxy{salt: keccak256(metadata)}(\\n api3ServerV1,\\n keccak256(abi.encodePacked(dapiName))\\n )\\n );\\n emit DeployedDapiProxy(proxyAddress, dapiName, metadata);\\n }\\n\\n /// @notice Deterministically deploys a data feed proxy with OEV support\\n /// @param dataFeedId Data feed ID\\n /// @param oevBeneficiary OEV beneficiary\\n /// @param metadata Metadata associated with the proxy\\n /// @return proxyAddress Proxy address\\n function deployDataFeedProxyWithOev(\\n bytes32 dataFeedId,\\n address oevBeneficiary,\\n bytes calldata metadata\\n ) external override returns (address proxyAddress) {\\n require(dataFeedId != bytes32(0), \\\"Data feed ID zero\\\");\\n require(oevBeneficiary != address(0), \\\"OEV beneficiary zero\\\");\\n proxyAddress = address(\\n new DataFeedProxyWithOev{salt: keccak256(metadata)}(\\n api3ServerV1,\\n dataFeedId,\\n oevBeneficiary\\n )\\n );\\n emit DeployedDataFeedProxyWithOev(\\n proxyAddress,\\n dataFeedId,\\n oevBeneficiary,\\n metadata\\n );\\n }\\n\\n /// @notice Deterministically deploys a dAPI proxy with OEV support\\n /// @param dapiName dAPI name\\n /// @param oevBeneficiary OEV beneficiary\\n /// @param metadata Metadata associated with the proxy\\n /// @return proxyAddress Proxy address\\n function deployDapiProxyWithOev(\\n bytes32 dapiName,\\n address oevBeneficiary,\\n bytes calldata metadata\\n ) external override returns (address proxyAddress) {\\n require(dapiName != bytes32(0), \\\"dAPI name zero\\\");\\n require(oevBeneficiary != address(0), \\\"OEV beneficiary zero\\\");\\n proxyAddress = address(\\n new DapiProxyWithOev{salt: keccak256(metadata)}(\\n api3ServerV1,\\n keccak256(abi.encodePacked(dapiName)),\\n oevBeneficiary\\n )\\n );\\n emit DeployedDapiProxyWithOev(\\n proxyAddress,\\n dapiName,\\n oevBeneficiary,\\n metadata\\n );\\n }\\n\\n /// @notice Computes the address of the data feed proxy\\n /// @param dataFeedId Data feed ID\\n /// @param metadata Metadata associated with the proxy\\n /// @return proxyAddress Proxy address\\n function computeDataFeedProxyAddress(\\n bytes32 dataFeedId,\\n bytes calldata metadata\\n ) external view override returns (address proxyAddress) {\\n require(dataFeedId != bytes32(0), \\\"Data feed ID zero\\\");\\n proxyAddress = Create2.computeAddress(\\n keccak256(metadata),\\n keccak256(\\n abi.encodePacked(\\n type(DataFeedProxy).creationCode,\\n abi.encode(api3ServerV1, dataFeedId)\\n )\\n )\\n );\\n }\\n\\n /// @notice Computes the address of the dAPI proxy\\n /// @param dapiName dAPI name\\n /// @param metadata Metadata associated with the proxy\\n /// @return proxyAddress Proxy address\\n function computeDapiProxyAddress(\\n bytes32 dapiName,\\n bytes calldata metadata\\n ) external view override returns (address proxyAddress) {\\n require(dapiName != bytes32(0), \\\"dAPI name zero\\\");\\n proxyAddress = Create2.computeAddress(\\n keccak256(metadata),\\n keccak256(\\n abi.encodePacked(\\n type(DapiProxy).creationCode,\\n abi.encode(\\n api3ServerV1,\\n keccak256(abi.encodePacked(dapiName))\\n )\\n )\\n )\\n );\\n }\\n\\n /// @notice Computes the address of the data feed proxy with OEV support\\n /// @param dataFeedId Data feed ID\\n /// @param oevBeneficiary OEV beneficiary\\n /// @param metadata Metadata associated with the proxy\\n /// @return proxyAddress Proxy address\\n function computeDataFeedProxyWithOevAddress(\\n bytes32 dataFeedId,\\n address oevBeneficiary,\\n bytes calldata metadata\\n ) external view override returns (address proxyAddress) {\\n require(dataFeedId != bytes32(0), \\\"Data feed ID zero\\\");\\n require(oevBeneficiary != address(0), \\\"OEV beneficiary zero\\\");\\n proxyAddress = Create2.computeAddress(\\n keccak256(metadata),\\n keccak256(\\n abi.encodePacked(\\n type(DataFeedProxyWithOev).creationCode,\\n abi.encode(api3ServerV1, dataFeedId, oevBeneficiary)\\n )\\n )\\n );\\n }\\n\\n /// @notice Computes the address of the dAPI proxy with OEV support\\n /// @param dapiName dAPI name\\n /// @param oevBeneficiary OEV beneficiary\\n /// @param metadata Metadata associated with the proxy\\n /// @return proxyAddress Proxy address\\n function computeDapiProxyWithOevAddress(\\n bytes32 dapiName,\\n address oevBeneficiary,\\n bytes calldata metadata\\n ) external view override returns (address proxyAddress) {\\n require(dapiName != bytes32(0), \\\"dAPI name zero\\\");\\n require(oevBeneficiary != address(0), \\\"OEV beneficiary zero\\\");\\n proxyAddress = Create2.computeAddress(\\n keccak256(metadata),\\n keccak256(\\n abi.encodePacked(\\n type(DapiProxyWithOev).creationCode,\\n abi.encode(\\n api3ServerV1,\\n keccak256(abi.encodePacked(dapiName)),\\n oevBeneficiary\\n )\\n )\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xe185b6cd0e887d2c8b9eb89e06ab9fa76e3d7ce2effbfbb701f94a22f1fcd152\",\"license\":\"MIT\"},\"contracts/api3-server-v1/proxies/interfaces/IDapiProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IProxy.sol\\\";\\n\\ninterface IDapiProxy is IProxy {\\n function dapiNameHash() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x7fee704659b2fd4629ce105b686284bb922f73d2261b04ad927f8e4b54479409\",\"license\":\"MIT\"},\"contracts/api3-server-v1/proxies/interfaces/IDataFeedProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IProxy.sol\\\";\\n\\ninterface IDataFeedProxy is IProxy {\\n function dataFeedId() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x114b4d530c3aa4e9359d7d4596170068b294d65ead405dc590b120e991d7b587\",\"license\":\"MIT\"},\"contracts/api3-server-v1/proxies/interfaces/IOevProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ninterface IOevProxy {\\n function oevBeneficiary() external view returns (address);\\n}\\n\",\"keccak256\":\"0xcd9962a465c96e85638eb40775da008f9c86a0ea0c50c7c5fcbb11c55f48fc22\",\"license\":\"MIT\"},\"contracts/api3-server-v1/proxies/interfaces/IProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n/// @dev See DapiProxy.sol for comments about usage\\ninterface IProxy {\\n function read() external view returns (int224 value, uint32 timestamp);\\n\\n function api3ServerV1() external view returns (address);\\n}\\n\",\"keccak256\":\"0x3ad69ef6ff3de4056ec43eb8b47465f3d896f88e95cfffb909a6d057b91db17b\",\"license\":\"MIT\"},\"contracts/api3-server-v1/proxies/interfaces/IProxyFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ninterface IProxyFactory {\\n event DeployedDataFeedProxy(\\n address indexed proxyAddress,\\n bytes32 indexed dataFeedId,\\n bytes metadata\\n );\\n\\n event DeployedDapiProxy(\\n address indexed proxyAddress,\\n bytes32 indexed dapiName,\\n bytes metadata\\n );\\n\\n event DeployedDataFeedProxyWithOev(\\n address indexed proxyAddress,\\n bytes32 indexed dataFeedId,\\n address oevBeneficiary,\\n bytes metadata\\n );\\n\\n event DeployedDapiProxyWithOev(\\n address indexed proxyAddress,\\n bytes32 indexed dapiName,\\n address oevBeneficiary,\\n bytes metadata\\n );\\n\\n function deployDataFeedProxy(\\n bytes32 dataFeedId,\\n bytes calldata metadata\\n ) external returns (address proxyAddress);\\n\\n function deployDapiProxy(\\n bytes32 dapiName,\\n bytes calldata metadata\\n ) external returns (address proxyAddress);\\n\\n function deployDataFeedProxyWithOev(\\n bytes32 dataFeedId,\\n address oevBeneficiary,\\n bytes calldata metadata\\n ) external returns (address proxyAddress);\\n\\n function deployDapiProxyWithOev(\\n bytes32 dapiName,\\n address oevBeneficiary,\\n bytes calldata metadata\\n ) external returns (address proxyAddress);\\n\\n function computeDataFeedProxyAddress(\\n bytes32 dataFeedId,\\n bytes calldata metadata\\n ) external view returns (address proxyAddress);\\n\\n function computeDapiProxyAddress(\\n bytes32 dapiName,\\n bytes calldata metadata\\n ) external view returns (address proxyAddress);\\n\\n function computeDataFeedProxyWithOevAddress(\\n bytes32 dataFeedId,\\n address oevBeneficiary,\\n bytes calldata metadata\\n ) external view returns (address proxyAddress);\\n\\n function computeDapiProxyWithOevAddress(\\n bytes32 dapiName,\\n address oevBeneficiary,\\n bytes calldata metadata\\n ) external view returns (address proxyAddress);\\n\\n function api3ServerV1() external view returns (address);\\n}\\n\",\"keccak256\":\"0x60b3b838b94ead5e5760a897053236ce20954a616a6892c7088ad1cf851290a1\",\"license\":\"MIT\"},\"contracts/utils/interfaces/IExtendedSelfMulticall.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ISelfMulticall.sol\\\";\\n\\ninterface IExtendedSelfMulticall is ISelfMulticall {\\n function getChainId() external view returns (uint256);\\n\\n function getBalance(address account) external view returns (uint256);\\n\\n function containsBytecode(address account) external view returns (bool);\\n\\n function getBlockNumber() external view returns (uint256);\\n\\n function getBlockTimestamp() external view returns (uint256);\\n\\n function getBlockBasefee() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0xaefe61a623c920d3e39c4779535e280378b44202d11c29a2c96f46f2fe5f420d\",\"license\":\"MIT\"},\"contracts/utils/interfaces/ISelfMulticall.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\ninterface ISelfMulticall {\\n function multicall(\\n bytes[] calldata data\\n ) external returns (bytes[] memory returndata);\\n\\n function tryMulticall(\\n bytes[] calldata data\\n ) external returns (bool[] memory successes, bytes[] memory returndata);\\n}\\n\",\"keccak256\":\"0x50b27284f0d5acd8b340836c09d252138ebf059f426e5d90d3f7221e1b7d0817\",\"license\":\"MIT\"},\"contracts/vendor/@openzeppelin/contracts@4.8.2/utils/Create2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Create2.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.\\n * `CREATE2` can be used to compute in advance the address where a smart\\n * contract will be deployed, which allows for interesting new mechanisms known\\n * as 'counterfactual interactions'.\\n *\\n * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more\\n * information.\\n */\\nlibrary Create2 {\\n /**\\n * @dev Deploys a contract using `CREATE2`. The address where the contract\\n * will be deployed can be known in advance via {computeAddress}.\\n *\\n * The bytecode for a contract can be obtained from Solidity with\\n * `type(contractName).creationCode`.\\n *\\n * Requirements:\\n *\\n * - `bytecode` must not be empty.\\n * - `salt` must have not been used for `bytecode` already.\\n * - the factory must have a balance of at least `amount`.\\n * - if `amount` is non-zero, `bytecode` must have a `payable` constructor.\\n */\\n function deploy(\\n uint256 amount,\\n bytes32 salt,\\n bytes memory bytecode\\n ) internal returns (address addr) {\\n require(address(this).balance >= amount, \\\"Create2: insufficient balance\\\");\\n require(bytecode.length != 0, \\\"Create2: bytecode length is zero\\\");\\n /// @solidity memory-safe-assembly\\n assembly {\\n addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)\\n }\\n require(addr != address(0), \\\"Create2: Failed on deploy\\\");\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the\\n * `bytecodeHash` or `salt` will result in a new destination address.\\n */\\n function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {\\n return computeAddress(salt, bytecodeHash, address(this));\\n }\\n\\n /**\\n * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at\\n * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.\\n */\\n function computeAddress(\\n bytes32 salt,\\n bytes32 bytecodeHash,\\n address deployer\\n ) internal pure returns (address addr) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let ptr := mload(0x40) // Get free memory pointer\\n\\n // | | \\u2193 ptr ... \\u2193 ptr + 0x0B (start) ... \\u2193 ptr + 0x20 ... \\u2193 ptr + 0x40 ... |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | bytecodeHash | CCCCCCCCCCCCC...CC |\\n // | salt | BBBBBBBBBBBBB...BB |\\n // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA |\\n // | 0xFF | FF |\\n // |-------------------|---------------------------------------------------------------------------|\\n // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC |\\n // | keccak(start, 85) | \\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191\\u2191 |\\n\\n mstore(add(ptr, 0x40), bytecodeHash)\\n mstore(add(ptr, 0x20), salt)\\n mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes\\n let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff\\n mstore8(start, 0xff)\\n addr := keccak256(start, 85)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xafc07f37809f74d9c66d6461cc0f85fb5147ab855acd0acc30af4b2272130c61\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60a060405234801561001057600080fd5b50604051611ae1380380611ae183398101604081905261002f9161009a565b6001600160a01b0381166100895760405162461bcd60e51b815260206004820152601960248201527f4170693353657276657256312061646472657373207a65726f00000000000000604482015260640160405180910390fd5b6001600160a01b03166080526100ca565b6000602082840312156100ac57600080fd5b81516001600160a01b03811681146100c357600080fd5b9392505050565b6080516119c561011c6000396000818160ad0152818161020b0152818161032901528181610501015281816105a4015281816106fd01528181610805015281816109a60152610a7d01526119c56000f3fe608060405234801561001057600080fd5b50600436106100a35760003560e01c80637dba7458116100765780639ae06c841161005b5780639ae06c841461014a578063d67564bd1461015d578063da1b7d0f1461017057600080fd5b80637dba7458146101245780638dae1a471461013757600080fd5b80632d6a744e146100a857806350763e84146100eb5780635849e5ef146100fe5780636c9d6c0914610111575b600080fd5b6100cf7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100cf6100f9366004610b72565b610183565b6100cf61010c366004610bbe565b610282565b6100cf61011f366004610bbe565b61040f565b6100cf610132366004610b72565b610547565b6100cf610145366004610bbe565b610653565b6100cf610158366004610b72565b6107ab565b6100cf61016b366004610bbe565b6108cd565b6100cf61017e366004610b72565b6109e1565b6000836101cb5760405162461bcd60e51b8152602060048201526011602482015270446174612066656564204944207a65726f60781b60448201526064015b60405180910390fd5b61027a83836040516101de929190610c26565b604051908190038120906101f460208201610af5565b601f1982820381018352601f9091011660408181527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316602083015281018890526060015b60408051601f198184030181529082905261025f9291602001610c66565b60405160208183030381529060405280519060200120610ab7565b949350505050565b6000846102c25760405162461bcd60e51b815260206004820152600e60248201526d64415049206e616d65207a65726f60901b60448201526064016101c2565b6001600160a01b03841661030f5760405162461bcd60e51b81526020600482015260146024820152734f45562062656e6566696369617279207a65726f60601b60448201526064016101c2565b828260405161031f929190610c26565b60405180910390207f00000000000000000000000000000000000000000000000000000000000000008660405160200161035b91815260200190565b604051602081830303815290604052805190602001208660405161037e90610b02565b6001600160a01b039384168152602081019290925290911660408201526060018190604051809103906000f59050801580156103be573d6000803e3d6000fd5b50905084816001600160a01b03167f31d654553da13df7303eb8db83942ff8816845087d3149515a220f5afb37aedd8686866040516103ff93929190610ca4565b60405180910390a3949350505050565b60008461044f5760405162461bcd60e51b815260206004820152600e60248201526d64415049206e616d65207a65726f60901b60448201526064016101c2565b6001600160a01b03841661049c5760405162461bcd60e51b81526020600482015260146024820152734f45562062656e6566696369617279207a65726f60601b60448201526064016101c2565b61053e83836040516104af929190610c26565b604051908190038120906104c560208201610b02565b818103601f199081018352601f90910116604081815260208083018b905281518084038201815282840190925281519101206001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660608401526080830191909152881660a082015260c001610241565b95945050505050565b60008361058a5760405162461bcd60e51b8152602060048201526011602482015270446174612066656564204944207a65726f60781b60448201526064016101c2565b828260405161059a929190610c26565b60405180910390207f0000000000000000000000000000000000000000000000000000000000000000856040516105d090610af5565b6001600160a01b03909216825260208201526040018190604051809103906000f5905080158015610605573d6000803e3d6000fd5b50905083816001600160a01b03167f9a2a9d77287e93a2addaf0c5f3e354d075dfb475f5e197f9abc9b11b922fa9438585604051610644929190610cc7565b60405180910390a39392505050565b6000846106965760405162461bcd60e51b8152602060048201526011602482015270446174612066656564204944207a65726f60781b60448201526064016101c2565b6001600160a01b0384166106e35760405162461bcd60e51b81526020600482015260146024820152734f45562062656e6566696369617279207a65726f60601b60448201526064016101c2565b82826040516106f3929190610c26565b60405180910390207f0000000000000000000000000000000000000000000000000000000000000000868660405161072a90610b0f565b6001600160a01b039384168152602081019290925290911660408201526060018190604051809103906000f590508015801561076a573d6000803e3d6000fd5b50905084816001600160a01b03167fff915717e95cf852fef69474bc2bfb3c26ccc15a6978a90ab0a78bc565644d4e8686866040516103ff93929190610ca4565b6000836107eb5760405162461bcd60e51b815260206004820152600e60248201526d64415049206e616d65207a65726f60901b60448201526064016101c2565b82826040516107fb929190610c26565b60405180910390207f00000000000000000000000000000000000000000000000000000000000000008560405160200161083791815260200190565b6040516020818303038152906040528051906020012060405161085990610b1c565b6001600160a01b03909216825260208201526040018190604051809103906000f590508015801561088e573d6000803e3d6000fd5b50905083816001600160a01b03167f5212a04ae578b0432469e3d61a28f222c00cf2f5e14d69b0f08c7d327b623d1d8585604051610644929190610cc7565b6000846109105760405162461bcd60e51b8152602060048201526011602482015270446174612066656564204944207a65726f60781b60448201526064016101c2565b6001600160a01b03841661095d5760405162461bcd60e51b81526020600482015260146024820152734f45562062656e6566696369617279207a65726f60601b60448201526064016101c2565b61053e8383604051610970929190610c26565b6040519081900381209061098660208201610b0f565b818103601f199081018352601f9091011660408181526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660208401529082018a905288166060820152608001610241565b600083610a215760405162461bcd60e51b815260206004820152600e60248201526d64415049206e616d65207a65726f60901b60448201526064016101c2565b61027a8383604051610a34929190610c26565b60405190819003812090610a4a60208201610b1c565b601f1982820381018352601f90910116604081815260208083018a905281518084038201815282840190925281519101207f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166060830152608082015260a001610241565b6000610ac4838330610acb565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6102fd80610cdc83390190565b61035d80610fd983390190565b61035d8061133683390190565b6102fd8061169383390190565b60008083601f840112610b3b57600080fd5b50813567ffffffffffffffff811115610b5357600080fd5b602083019150836020828501011115610b6b57600080fd5b9250929050565b600080600060408486031215610b8757600080fd5b83359250602084013567ffffffffffffffff811115610ba557600080fd5b610bb186828701610b29565b9497909650939450505050565b60008060008060608587031215610bd457600080fd5b8435935060208501356001600160a01b0381168114610bf257600080fd5b9250604085013567ffffffffffffffff811115610c0e57600080fd5b610c1a87828801610b29565b95989497509550505050565b8183823760009101908152919050565b6000815160005b81811015610c575760208185018101518683015201610c3d565b50600093019283525090919050565b600061027a610c758386610c36565b84610c36565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b038416815260406020820152600061053e604083018486610c7b565b60208152600061027a602083018486610c7b56fe60c060405234801561001057600080fd5b506040516102fd3803806102fd83398101604081905261002f91610045565b6001600160a01b0390911660805260a05261007f565b6000806040838503121561005857600080fd5b82516001600160a01b038116811461006f57600080fd5b6020939093015192949293505050565b60805160a05161024d6100b060003960008181609c015261011b015260008181604b015261015b015261024d6000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80632d6a744e14610046578063370c826b1461009757806357de26a4146100cc575b600080fd5b61006d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100be7f000000000000000000000000000000000000000000000000000000000000000081565b60405190815260200161008e565b6100d46100f3565b60408051601b9390930b835263ffffffff90911660208301520161008e565b6040517fa5fc076f0000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a5fc076f906024016040805180830381865afa1580156101a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101c591906101ce565b90939092509050565b600080604083850312156101e157600080fd5b825180601b0b81146101f257600080fd5b602084015190925063ffffffff8116811461020c57600080fd5b80915050925092905056fea26469706673582212204c00c55f37d9d93afc24a97a86b86c67275c3e6f0288edd31c678400d06b4dcc64736f6c6343000811003360e060405234801561001057600080fd5b5060405161035d38038061035d83398101604081905261002f91610068565b6001600160a01b0392831660805260a0919091521660c0526100a4565b80516001600160a01b038116811461006357600080fd5b919050565b60008060006060848603121561007d57600080fd5b6100868461004c565b92506020840151915061009b6040850161004c565b90509250925092565b60805160a05160c05161027f6100de6000396000605601526000818160f5015261014d01526000818160a7015261018d015261027f6000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80630e15999d146100515780632d6a744e146100a257806357de26a4146100c9578063dcf8da92146100f0575b600080fd5b6100787f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100787f000000000000000000000000000000000000000000000000000000000000000081565b6100d1610125565b60408051601b9390930b835263ffffffff909116602083015201610099565b6101177f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610099565b6040517f32be8f0b0000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906332be8f0b906024016040805180830381865afa1580156101d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f79190610200565b90939092509050565b6000806040838503121561021357600080fd5b825180601b0b811461022457600080fd5b602084015190925063ffffffff8116811461023e57600080fd5b80915050925092905056fea2646970667358221220165f090121acbfb6f16face0e037df12b601e08d2e0fd3fd3f5e021e053308ce64736f6c6343000811003360e060405234801561001057600080fd5b5060405161035d38038061035d83398101604081905261002f91610068565b6001600160a01b0392831660805260a0919091521660c0526100a4565b80516001600160a01b038116811461006357600080fd5b919050565b60008060006060848603121561007d57600080fd5b6100868461004c565b92506020840151915061009b6040850161004c565b90509250925092565b60805160a05160c05161027f6100de6000396000605601526000818160ce015261014d01526000818160a7015261018d015261027f6000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80630e15999d146100515780632d6a744e146100a2578063370c826b146100c957806357de26a4146100fe575b600080fd5b6100787f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100787f000000000000000000000000000000000000000000000000000000000000000081565b6100f07f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610099565b610106610125565b60408051601b9390930b835263ffffffff909116602083015201610099565b6040517fcfaf49710000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063cfaf4971906024016040805180830381865afa1580156101d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f79190610200565b90939092509050565b6000806040838503121561021357600080fd5b825180601b0b811461022457600080fd5b602084015190925063ffffffff8116811461023e57600080fd5b80915050925092905056fea2646970667358221220491c4b81100c410951a4eacc896ef33bf2f2865d87768147c4ca7217d63d79c864736f6c6343000811003360c060405234801561001057600080fd5b506040516102fd3803806102fd83398101604081905261002f91610045565b6001600160a01b0390911660805260a05261007f565b6000806040838503121561005857600080fd5b82516001600160a01b038116811461006f57600080fd5b6020939093015192949293505050565b60805160a05161024d6100b06000396000818160c3015261011b015260008181604b015261015b015261024d6000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80632d6a744e1461004657806357de26a414610097578063dcf8da92146100be575b600080fd5b61006d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61009f6100f3565b60408051601b9390930b835263ffffffff90911660208301520161008e565b6100e57f000000000000000000000000000000000000000000000000000000000000000081565b60405190815260200161008e565b6040517fb62408a30000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063b62408a3906024016040805180830381865afa1580156101a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101c591906101ce565b90939092509050565b600080604083850312156101e157600080fd5b825180601b0b81146101f257600080fd5b602084015190925063ffffffff8116811461020c57600080fd5b80915050925092905056fea26469706673582212201d061d50f160b049953a990ae61794869544bc65e5a0d25812e444c431cb90f964736f6c63430008110033a2646970667358221220c65d86e8fe1882ee9717fe8fadf286e2319482a7213942b09ed85c68e3cb244164736f6c63430008110033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100a35760003560e01c80637dba7458116100765780639ae06c841161005b5780639ae06c841461014a578063d67564bd1461015d578063da1b7d0f1461017057600080fd5b80637dba7458146101245780638dae1a471461013757600080fd5b80632d6a744e146100a857806350763e84146100eb5780635849e5ef146100fe5780636c9d6c0914610111575b600080fd5b6100cf7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b6100cf6100f9366004610b72565b610183565b6100cf61010c366004610bbe565b610282565b6100cf61011f366004610bbe565b61040f565b6100cf610132366004610b72565b610547565b6100cf610145366004610bbe565b610653565b6100cf610158366004610b72565b6107ab565b6100cf61016b366004610bbe565b6108cd565b6100cf61017e366004610b72565b6109e1565b6000836101cb5760405162461bcd60e51b8152602060048201526011602482015270446174612066656564204944207a65726f60781b60448201526064015b60405180910390fd5b61027a83836040516101de929190610c26565b604051908190038120906101f460208201610af5565b601f1982820381018352601f9091011660408181527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316602083015281018890526060015b60408051601f198184030181529082905261025f9291602001610c66565b60405160208183030381529060405280519060200120610ab7565b949350505050565b6000846102c25760405162461bcd60e51b815260206004820152600e60248201526d64415049206e616d65207a65726f60901b60448201526064016101c2565b6001600160a01b03841661030f5760405162461bcd60e51b81526020600482015260146024820152734f45562062656e6566696369617279207a65726f60601b60448201526064016101c2565b828260405161031f929190610c26565b60405180910390207f00000000000000000000000000000000000000000000000000000000000000008660405160200161035b91815260200190565b604051602081830303815290604052805190602001208660405161037e90610b02565b6001600160a01b039384168152602081019290925290911660408201526060018190604051809103906000f59050801580156103be573d6000803e3d6000fd5b50905084816001600160a01b03167f31d654553da13df7303eb8db83942ff8816845087d3149515a220f5afb37aedd8686866040516103ff93929190610ca4565b60405180910390a3949350505050565b60008461044f5760405162461bcd60e51b815260206004820152600e60248201526d64415049206e616d65207a65726f60901b60448201526064016101c2565b6001600160a01b03841661049c5760405162461bcd60e51b81526020600482015260146024820152734f45562062656e6566696369617279207a65726f60601b60448201526064016101c2565b61053e83836040516104af929190610c26565b604051908190038120906104c560208201610b02565b818103601f199081018352601f90910116604081815260208083018b905281518084038201815282840190925281519101206001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660608401526080830191909152881660a082015260c001610241565b95945050505050565b60008361058a5760405162461bcd60e51b8152602060048201526011602482015270446174612066656564204944207a65726f60781b60448201526064016101c2565b828260405161059a929190610c26565b60405180910390207f0000000000000000000000000000000000000000000000000000000000000000856040516105d090610af5565b6001600160a01b03909216825260208201526040018190604051809103906000f5905080158015610605573d6000803e3d6000fd5b50905083816001600160a01b03167f9a2a9d77287e93a2addaf0c5f3e354d075dfb475f5e197f9abc9b11b922fa9438585604051610644929190610cc7565b60405180910390a39392505050565b6000846106965760405162461bcd60e51b8152602060048201526011602482015270446174612066656564204944207a65726f60781b60448201526064016101c2565b6001600160a01b0384166106e35760405162461bcd60e51b81526020600482015260146024820152734f45562062656e6566696369617279207a65726f60601b60448201526064016101c2565b82826040516106f3929190610c26565b60405180910390207f0000000000000000000000000000000000000000000000000000000000000000868660405161072a90610b0f565b6001600160a01b039384168152602081019290925290911660408201526060018190604051809103906000f590508015801561076a573d6000803e3d6000fd5b50905084816001600160a01b03167fff915717e95cf852fef69474bc2bfb3c26ccc15a6978a90ab0a78bc565644d4e8686866040516103ff93929190610ca4565b6000836107eb5760405162461bcd60e51b815260206004820152600e60248201526d64415049206e616d65207a65726f60901b60448201526064016101c2565b82826040516107fb929190610c26565b60405180910390207f00000000000000000000000000000000000000000000000000000000000000008560405160200161083791815260200190565b6040516020818303038152906040528051906020012060405161085990610b1c565b6001600160a01b03909216825260208201526040018190604051809103906000f590508015801561088e573d6000803e3d6000fd5b50905083816001600160a01b03167f5212a04ae578b0432469e3d61a28f222c00cf2f5e14d69b0f08c7d327b623d1d8585604051610644929190610cc7565b6000846109105760405162461bcd60e51b8152602060048201526011602482015270446174612066656564204944207a65726f60781b60448201526064016101c2565b6001600160a01b03841661095d5760405162461bcd60e51b81526020600482015260146024820152734f45562062656e6566696369617279207a65726f60601b60448201526064016101c2565b61053e8383604051610970929190610c26565b6040519081900381209061098660208201610b0f565b818103601f199081018352601f9091011660408181526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660208401529082018a905288166060820152608001610241565b600083610a215760405162461bcd60e51b815260206004820152600e60248201526d64415049206e616d65207a65726f60901b60448201526064016101c2565b61027a8383604051610a34929190610c26565b60405190819003812090610a4a60208201610b1c565b601f1982820381018352601f90910116604081815260208083018a905281518084038201815282840190925281519101207f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166060830152608082015260a001610241565b6000610ac4838330610acb565b9392505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b6102fd80610cdc83390190565b61035d80610fd983390190565b61035d8061133683390190565b6102fd8061169383390190565b60008083601f840112610b3b57600080fd5b50813567ffffffffffffffff811115610b5357600080fd5b602083019150836020828501011115610b6b57600080fd5b9250929050565b600080600060408486031215610b8757600080fd5b83359250602084013567ffffffffffffffff811115610ba557600080fd5b610bb186828701610b29565b9497909650939450505050565b60008060008060608587031215610bd457600080fd5b8435935060208501356001600160a01b0381168114610bf257600080fd5b9250604085013567ffffffffffffffff811115610c0e57600080fd5b610c1a87828801610b29565b95989497509550505050565b8183823760009101908152919050565b6000815160005b81811015610c575760208185018101518683015201610c3d565b50600093019283525090919050565b600061027a610c758386610c36565b84610c36565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b038416815260406020820152600061053e604083018486610c7b565b60208152600061027a602083018486610c7b56fe60c060405234801561001057600080fd5b506040516102fd3803806102fd83398101604081905261002f91610045565b6001600160a01b0390911660805260a05261007f565b6000806040838503121561005857600080fd5b82516001600160a01b038116811461006f57600080fd5b6020939093015192949293505050565b60805160a05161024d6100b060003960008181609c015261011b015260008181604b015261015b015261024d6000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80632d6a744e14610046578063370c826b1461009757806357de26a4146100cc575b600080fd5b61006d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100be7f000000000000000000000000000000000000000000000000000000000000000081565b60405190815260200161008e565b6100d46100f3565b60408051601b9390930b835263ffffffff90911660208301520161008e565b6040517fa5fc076f0000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a5fc076f906024016040805180830381865afa1580156101a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101c591906101ce565b90939092509050565b600080604083850312156101e157600080fd5b825180601b0b81146101f257600080fd5b602084015190925063ffffffff8116811461020c57600080fd5b80915050925092905056fea26469706673582212204c00c55f37d9d93afc24a97a86b86c67275c3e6f0288edd31c678400d06b4dcc64736f6c6343000811003360e060405234801561001057600080fd5b5060405161035d38038061035d83398101604081905261002f91610068565b6001600160a01b0392831660805260a0919091521660c0526100a4565b80516001600160a01b038116811461006357600080fd5b919050565b60008060006060848603121561007d57600080fd5b6100868461004c565b92506020840151915061009b6040850161004c565b90509250925092565b60805160a05160c05161027f6100de6000396000605601526000818160f5015261014d01526000818160a7015261018d015261027f6000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80630e15999d146100515780632d6a744e146100a257806357de26a4146100c9578063dcf8da92146100f0575b600080fd5b6100787f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100787f000000000000000000000000000000000000000000000000000000000000000081565b6100d1610125565b60408051601b9390930b835263ffffffff909116602083015201610099565b6101177f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610099565b6040517f32be8f0b0000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906332be8f0b906024016040805180830381865afa1580156101d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f79190610200565b90939092509050565b6000806040838503121561021357600080fd5b825180601b0b811461022457600080fd5b602084015190925063ffffffff8116811461023e57600080fd5b80915050925092905056fea2646970667358221220165f090121acbfb6f16face0e037df12b601e08d2e0fd3fd3f5e021e053308ce64736f6c6343000811003360e060405234801561001057600080fd5b5060405161035d38038061035d83398101604081905261002f91610068565b6001600160a01b0392831660805260a0919091521660c0526100a4565b80516001600160a01b038116811461006357600080fd5b919050565b60008060006060848603121561007d57600080fd5b6100868461004c565b92506020840151915061009b6040850161004c565b90509250925092565b60805160a05160c05161027f6100de6000396000605601526000818160ce015261014d01526000818160a7015261018d015261027f6000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80630e15999d146100515780632d6a744e146100a2578063370c826b146100c957806357de26a4146100fe575b600080fd5b6100787f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100787f000000000000000000000000000000000000000000000000000000000000000081565b6100f07f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610099565b610106610125565b60408051601b9390930b835263ffffffff909116602083015201610099565b6040517fcfaf49710000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063cfaf4971906024016040805180830381865afa1580156101d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101f79190610200565b90939092509050565b6000806040838503121561021357600080fd5b825180601b0b811461022457600080fd5b602084015190925063ffffffff8116811461023e57600080fd5b80915050925092905056fea2646970667358221220491c4b81100c410951a4eacc896ef33bf2f2865d87768147c4ca7217d63d79c864736f6c6343000811003360c060405234801561001057600080fd5b506040516102fd3803806102fd83398101604081905261002f91610045565b6001600160a01b0390911660805260a05261007f565b6000806040838503121561005857600080fd5b82516001600160a01b038116811461006f57600080fd5b6020939093015192949293505050565b60805160a05161024d6100b06000396000818160c3015261011b015260008181604b015261015b015261024d6000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80632d6a744e1461004657806357de26a414610097578063dcf8da92146100be575b600080fd5b61006d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61009f6100f3565b60408051601b9390930b835263ffffffff90911660208301520161008e565b6100e57f000000000000000000000000000000000000000000000000000000000000000081565b60405190815260200161008e565b6040517fb62408a30000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063b62408a3906024016040805180830381865afa1580156101a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101c591906101ce565b90939092509050565b600080604083850312156101e157600080fd5b825180601b0b81146101f257600080fd5b602084015190925063ffffffff8116811461020c57600080fd5b80915050925092905056fea26469706673582212201d061d50f160b049953a990ae61794869544bc65e5a0d25812e444c431cb90f964736f6c63430008110033a2646970667358221220c65d86e8fe1882ee9717fe8fadf286e2319482a7213942b09ed85c68e3cb244164736f6c63430008110033", + "devdoc": { + "details": "The proxies are deployed normally and not cloned to minimize the gas cost overhead while using them to read data feed values", + "kind": "dev", + "methods": { + "computeDapiProxyAddress(bytes32,bytes)": { + "params": { + "dapiName": "dAPI name", + "metadata": "Metadata associated with the proxy" + }, + "returns": { + "proxyAddress": "Proxy address" + } + }, + "computeDapiProxyWithOevAddress(bytes32,address,bytes)": { + "params": { + "dapiName": "dAPI name", + "metadata": "Metadata associated with the proxy", + "oevBeneficiary": "OEV beneficiary" + }, + "returns": { + "proxyAddress": "Proxy address" + } + }, + "computeDataFeedProxyAddress(bytes32,bytes)": { + "params": { + "dataFeedId": "Data feed ID", + "metadata": "Metadata associated with the proxy" + }, + "returns": { + "proxyAddress": "Proxy address" + } + }, + "computeDataFeedProxyWithOevAddress(bytes32,address,bytes)": { + "params": { + "dataFeedId": "Data feed ID", + "metadata": "Metadata associated with the proxy", + "oevBeneficiary": "OEV beneficiary" + }, + "returns": { + "proxyAddress": "Proxy address" + } + }, + "constructor": { + "params": { + "_api3ServerV1": "Api3ServerV1 address" + } + }, + "deployDapiProxy(bytes32,bytes)": { + "params": { + "dapiName": "dAPI name", + "metadata": "Metadata associated with the proxy" + }, + "returns": { + "proxyAddress": "Proxy address" + } + }, + "deployDapiProxyWithOev(bytes32,address,bytes)": { + "params": { + "dapiName": "dAPI name", + "metadata": "Metadata associated with the proxy", + "oevBeneficiary": "OEV beneficiary" + }, + "returns": { + "proxyAddress": "Proxy address" + } + }, + "deployDataFeedProxy(bytes32,bytes)": { + "params": { + "dataFeedId": "Data feed ID", + "metadata": "Metadata associated with the proxy" + }, + "returns": { + "proxyAddress": "Proxy address" + } + }, + "deployDataFeedProxyWithOev(bytes32,address,bytes)": { + "params": { + "dataFeedId": "Data feed ID", + "metadata": "Metadata associated with the proxy", + "oevBeneficiary": "OEV beneficiary" + }, + "returns": { + "proxyAddress": "Proxy address" + } + } + }, + "title": "Contract factory that deterministically deploys proxies that read data feeds (Beacons or Beacon sets) or dAPIs, along with optional OEV support", + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "api3ServerV1()": { + "notice": "Api3ServerV1 address" + }, + "computeDapiProxyAddress(bytes32,bytes)": { + "notice": "Computes the address of the dAPI proxy" + }, + "computeDapiProxyWithOevAddress(bytes32,address,bytes)": { + "notice": "Computes the address of the dAPI proxy with OEV support" + }, + "computeDataFeedProxyAddress(bytes32,bytes)": { + "notice": "Computes the address of the data feed proxy" + }, + "computeDataFeedProxyWithOevAddress(bytes32,address,bytes)": { + "notice": "Computes the address of the data feed proxy with OEV support" + }, + "deployDapiProxy(bytes32,bytes)": { + "notice": "Deterministically deploys a dAPI proxy" + }, + "deployDapiProxyWithOev(bytes32,address,bytes)": { + "notice": "Deterministically deploys a dAPI proxy with OEV support" + }, + "deployDataFeedProxy(bytes32,bytes)": { + "notice": "Deterministically deploys a data feed proxy" + }, + "deployDataFeedProxyWithOev(bytes32,address,bytes)": { + "notice": "Deterministically deploys a data feed proxy with OEV support" + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} From 6ddadd1027ffdfafd1ee38d3d0588fe23063a08f Mon Sep 17 00:00:00 2001 From: Burak Benligiray Date: Thu, 16 May 2024 15:26:05 +0300 Subject: [PATCH 15/15] Add changeset --- .changeset/giant-boxes-march.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/giant-boxes-march.md diff --git a/.changeset/giant-boxes-march.md b/.changeset/giant-boxes-march.md new file mode 100644 index 0000000..d5313d3 --- /dev/null +++ b/.changeset/giant-boxes-march.md @@ -0,0 +1,5 @@ +--- +'@api3/contracts': minor +--- + +Add dAPI and OEV auction support to oev-network